Maybe I'm starting to see what happened ... and it could well be my fault. I wanted to allocate the per-cpu memory for cpu0 statically in the vmlinux ... so it would be available in head.S to set up everything before we move to any C code that might try to access per cpu variables. To make life easy for myself I just made this allocation in vmlinus.lds.S immediately before the initialized block where all the percpu variables live (which means no extra labels ... and I could initialize this data with a simple copy of PERCPU_PAGESIZE bytes from (the poorly named) __phys_per_cpu_start to the unamed block before it that will be the cpu0 copy. But my extra allocation is in the "percpu" block in vmlinux.lds.S, so it ends up in that PT_LOAD section. Which ultimately confuses the kexec code. Probably the cpu0 percpu space should be placed in the data section. -Tony