Commit c459ce8b authored by Tony Luck's avatar Tony Luck

[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: 10617bbe)
inadvertantly allocated the memory in the "percpu" section of
the vmlinux ELF executable.  This confused kexec/dump.
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 94aca1da
...@@ -11,6 +11,9 @@ ...@@ -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: ...@@ -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 ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment