diff options
| -rw-r--r-- | arch/ia64/include/asm/sections.h | 3 | ||||
| -rw-r--r-- | arch/ia64/kernel/head.S | 9 | ||||
| -rw-r--r-- | arch/ia64/kernel/vmlinux.lds.S | 8 | ||||
| -rw-r--r-- | arch/ia64/mm/contig.c | 2 | ||||
| -rw-r--r-- | arch/ia64/mm/discontig.c | 2 |
5 files changed, 15 insertions, 9 deletions
diff --git a/arch/ia64/include/asm/sections.h b/arch/ia64/include/asm/sections.h index f66799891036..1a873b36a4a1 100644 --- a/arch/ia64/include/asm/sections.h +++ b/arch/ia64/include/asm/sections.h | |||
| @@ -11,6 +11,9 @@ | |||
| 11 | #include <asm-generic/sections.h> | 11 | #include <asm-generic/sections.h> |
| 12 | 12 | ||
| 13 | extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[]; | 13 | extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[]; |
| 14 | #ifdef CONFIG_SMP | ||
| 15 | extern char __cpu0_per_cpu[]; | ||
| 16 | #endif | ||
| 14 | extern char __start___vtop_patchlist[], __end___vtop_patchlist[]; | 17 | extern char __start___vtop_patchlist[], __end___vtop_patchlist[]; |
| 15 | extern char __start___rse_patchlist[], __end___rse_patchlist[]; | 18 | extern char __start___rse_patchlist[], __end___rse_patchlist[]; |
| 16 | extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[]; | 19 | extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[]; |
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 8bdea8eb62e3..66e491d8baac 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
| @@ -367,16 +367,17 @@ start_ap: | |||
| 367 | ;; | 367 | ;; |
| 368 | #else | 368 | #else |
| 369 | (isAP) br.few 2f | 369 | (isAP) br.few 2f |
| 370 | mov r20=r19 | 370 | movl r20=__cpu0_per_cpu |
| 371 | sub r19=r19,r18 | ||
| 372 | ;; | 371 | ;; |
| 373 | shr.u r18=r18,3 | 372 | shr.u r18=r18,3 |
| 374 | 1: | 373 | 1: |
| 375 | ld8 r21=[r20],8;; | 374 | ld8 r21=[r19],8;; |
| 376 | st8[r19]=r21,8 | 375 | st8[r20]=r21,8 |
| 377 | adds r18=-1,r18;; | 376 | adds r18=-1,r18;; |
| 378 | cmp4.lt p7,p6=0,r18 | 377 | cmp4.lt p7,p6=0,r18 |
| 379 | (p7) br.cond.dptk.few 1b | 378 | (p7) br.cond.dptk.few 1b |
| 379 | mov r19=r20 | ||
| 380 | ;; | ||
| 380 | 2: | 381 | 2: |
| 381 | #endif | 382 | #endif |
| 382 | tpa r19=r19 | 383 | tpa r19=r19 |
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index de71da811cd6..10a7d47e8510 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
| @@ -215,9 +215,6 @@ SECTIONS | |||
| 215 | /* Per-cpu data: */ | 215 | /* Per-cpu data: */ |
| 216 | percpu : { } :percpu | 216 | percpu : { } :percpu |
| 217 | . = ALIGN(PERCPU_PAGE_SIZE); | 217 | . = ALIGN(PERCPU_PAGE_SIZE); |
| 218 | #ifdef CONFIG_SMP | ||
| 219 | . = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */ | ||
| 220 | #endif | ||
| 221 | __phys_per_cpu_start = .; | 218 | __phys_per_cpu_start = .; |
| 222 | .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET) | 219 | .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET) |
| 223 | { | 220 | { |
| @@ -233,6 +230,11 @@ SECTIONS | |||
| 233 | data : { } :data | 230 | data : { } :data |
| 234 | .data : AT(ADDR(.data) - LOAD_OFFSET) | 231 | .data : AT(ADDR(.data) - LOAD_OFFSET) |
| 235 | { | 232 | { |
| 233 | #ifdef CONFIG_SMP | ||
| 234 | . = ALIGN(PERCPU_PAGE_SIZE); | ||
| 235 | __cpu0_per_cpu = .; | ||
| 236 | . = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */ | ||
| 237 | #endif | ||
| 236 | DATA_DATA | 238 | DATA_DATA |
| 237 | *(.data1) | 239 | *(.data1) |
| 238 | *(.gnu.linkonce.d*) | 240 | *(.gnu.linkonce.d*) |
diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c index e566ff43884a..0ee085efbe29 100644 --- a/arch/ia64/mm/contig.c +++ b/arch/ia64/mm/contig.c | |||
| @@ -163,7 +163,7 @@ per_cpu_init (void) | |||
| 163 | * get_zeroed_page(). | 163 | * get_zeroed_page(). |
| 164 | */ | 164 | */ |
| 165 | if (first_time) { | 165 | if (first_time) { |
| 166 | void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE; | 166 | void *cpu0_data = __cpu0_per_cpu; |
| 167 | 167 | ||
| 168 | first_time=0; | 168 | first_time=0; |
| 169 | 169 | ||
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 78026aabaa7f..d8c5fcd89e5b 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
| @@ -144,7 +144,7 @@ static void *per_cpu_node_setup(void *cpu_data, int node) | |||
| 144 | 144 | ||
| 145 | for_each_possible_early_cpu(cpu) { | 145 | for_each_possible_early_cpu(cpu) { |
| 146 | if (cpu == 0) { | 146 | if (cpu == 0) { |
| 147 | void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE; | 147 | void *cpu0_data = __cpu0_per_cpu; |
| 148 | __per_cpu_offset[cpu] = (char*)cpu0_data - | 148 | __per_cpu_offset[cpu] = (char*)cpu0_data - |
| 149 | __per_cpu_start; | 149 | __per_cpu_start; |
| 150 | } else if (node == node_cpuid[cpu].nid) { | 150 | } else if (node == node_cpuid[cpu].nid) { |
