forked from Minki/linux
[IA64] Put the space for cpu0 per-cpu area into .data section
Initial fix for making sure that we can access percpu variables
in all C code (commit: 10617bbe84
)
inadvertantly allocated the memory in the "percpu" section of
the vmlinux ELF executable. This confused kexec/dump.
Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
parent
94aca1dac6
commit
c459ce8b5a
@ -11,6 +11,9 @@
|
|||||||
#include <asm-generic/sections.h>
|
#include <asm-generic/sections.h>
|
||||||
|
|
||||||
extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[];
|
extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[];
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
extern char __cpu0_per_cpu[];
|
||||||
|
#endif
|
||||||
extern char __start___vtop_patchlist[], __end___vtop_patchlist[];
|
extern char __start___vtop_patchlist[], __end___vtop_patchlist[];
|
||||||
extern char __start___rse_patchlist[], __end___rse_patchlist[];
|
extern char __start___rse_patchlist[], __end___rse_patchlist[];
|
||||||
extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[];
|
extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[];
|
||||||
|
@ -367,16 +367,17 @@ start_ap:
|
|||||||
;;
|
;;
|
||||||
#else
|
#else
|
||||||
(isAP) br.few 2f
|
(isAP) br.few 2f
|
||||||
mov r20=r19
|
movl r20=__cpu0_per_cpu
|
||||||
sub r19=r19,r18
|
|
||||||
;;
|
;;
|
||||||
shr.u r18=r18,3
|
shr.u r18=r18,3
|
||||||
1:
|
1:
|
||||||
ld8 r21=[r20],8;;
|
ld8 r21=[r19],8;;
|
||||||
st8[r19]=r21,8
|
st8[r20]=r21,8
|
||||||
adds r18=-1,r18;;
|
adds r18=-1,r18;;
|
||||||
cmp4.lt p7,p6=0,r18
|
cmp4.lt p7,p6=0,r18
|
||||||
(p7) br.cond.dptk.few 1b
|
(p7) br.cond.dptk.few 1b
|
||||||
|
mov r19=r20
|
||||||
|
;;
|
||||||
2:
|
2:
|
||||||
#endif
|
#endif
|
||||||
tpa r19=r19
|
tpa r19=r19
|
||||||
|
@ -215,9 +215,6 @@ SECTIONS
|
|||||||
/* Per-cpu data: */
|
/* Per-cpu data: */
|
||||||
percpu : { } :percpu
|
percpu : { } :percpu
|
||||||
. = ALIGN(PERCPU_PAGE_SIZE);
|
. = ALIGN(PERCPU_PAGE_SIZE);
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
. = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */
|
|
||||||
#endif
|
|
||||||
__phys_per_cpu_start = .;
|
__phys_per_cpu_start = .;
|
||||||
.data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET)
|
.data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET)
|
||||||
{
|
{
|
||||||
@ -233,6 +230,11 @@ SECTIONS
|
|||||||
data : { } :data
|
data : { } :data
|
||||||
.data : AT(ADDR(.data) - LOAD_OFFSET)
|
.data : AT(ADDR(.data) - LOAD_OFFSET)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
. = ALIGN(PERCPU_PAGE_SIZE);
|
||||||
|
__cpu0_per_cpu = .;
|
||||||
|
. = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */
|
||||||
|
#endif
|
||||||
DATA_DATA
|
DATA_DATA
|
||||||
*(.data1)
|
*(.data1)
|
||||||
*(.gnu.linkonce.d*)
|
*(.gnu.linkonce.d*)
|
||||||
|
@ -163,7 +163,7 @@ per_cpu_init (void)
|
|||||||
* get_zeroed_page().
|
* get_zeroed_page().
|
||||||
*/
|
*/
|
||||||
if (first_time) {
|
if (first_time) {
|
||||||
void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE;
|
void *cpu0_data = __cpu0_per_cpu;
|
||||||
|
|
||||||
first_time=0;
|
first_time=0;
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ static void *per_cpu_node_setup(void *cpu_data, int node)
|
|||||||
|
|
||||||
for_each_possible_early_cpu(cpu) {
|
for_each_possible_early_cpu(cpu) {
|
||||||
if (cpu == 0) {
|
if (cpu == 0) {
|
||||||
void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE;
|
void *cpu0_data = __cpu0_per_cpu;
|
||||||
__per_cpu_offset[cpu] = (char*)cpu0_data -
|
__per_cpu_offset[cpu] = (char*)cpu0_data -
|
||||||
__per_cpu_start;
|
__per_cpu_start;
|
||||||
} else if (node == node_cpuid[cpu].nid) {
|
} else if (node == node_cpuid[cpu].nid) {
|
||||||
|
Loading…
Reference in New Issue
Block a user