Messages in this thread Patch in this message | | | Date | Mon, 30 Jun 2008 10:57:31 -0700 | From | Mike Travis <> | Subject | Re: [crash, bisected] Re: [PATCH 3/4] x86_64: Fold pda into per cpu area |
| |
H. Peter Anvin wrote: > Mike Travis wrote: >> >> FYI, I did try this out and it caused the bootloader to scramble the >> loaded data. The first corruption I found was the .x86cpuvendor.init >> section contained all zeroes. >> > > Explain what you mean with "the bootloader" in this context. > > -hpa
After the code was loaded (the compressed code, it seems that my GRUB doesn't support uncompressed loading), the above section contained zeroes. I snapped it fairly early, around secondary_startup_64, and then printed it in x86_64_start_kernel.
The object file had the correct data (as displayed by objdump) so I'm assuming that the bootloading process didn't load the section correctly.
Below was the linker script I used:
--- linux-2.6.tip.orig/include/asm-generic/vmlinux.lds.h +++ linux-2.6.tip/include/asm-generic/vmlinux.lds.h @@ -373,9 +373,13 @@
#ifdef CONFIG_HAVE_ZERO_BASED_PER_CPU #define PERCPU(align) \ - . = ALIGN(align); \ + .data.percpu.abs = .; \ percpu : { } :percpu \ - __per_cpu_load = .; \ + .data.percpu.rel : AT(.data.percpu.abs - LOAD_OFFSET) { \ + BYTE(0) \ + . = ALIGN(align); \ + __per_cpu_load = .; \ + } \ .data.percpu 0 : AT(__per_cpu_load - LOAD_OFFSET) { \ *(.data.percpu.first) \ *(.data.percpu.shared_aligned) \ @@ -383,8 +387,8 @@ *(.data.percpu.page_aligned) \ ____per_cpu_size = .; \ } \ - . = __per_cpu_load + ____per_cpu_size; \ - data : { } :data + . = __per_cpu_load + ____per_cpu_size; + #else #define PERCPU(align) \ . = ALIGN(align); \ It showed all the correct address in the map and __per_cpu_load was a relative symbol (which was the objective.)
Btw, our simulator, which only loads uncompressed code, had the data correct, so it *may* only be a result of the code being compressed.
Thanks, Mike
| |