diff options
author | Milton Miller <miltonm@bga.com> | 2008-10-22 06:39:18 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-10-31 01:11:44 -0400 |
commit | 1767c8f392857694899403a65942cc70b5b7d132 (patch) | |
tree | 609181f519dbf8569808b564a2b15358b79596f5 /arch/powerpc | |
parent | 8694a1c6056f1f5f006a0442428f2df5171b9656 (diff) |
powerpc: Kexec exit should not use magic numbers
Commit 54622f10a6aabb8bb2bdacf3dd070046f03dc246 ("powerpc: Support for
relocatable kdump kernel") added a magic flag value in a register to
tell purgatory that it should be a panic kernel. This part is wrong
and is reverted by this commit.
The kernel gets a list of memory blocks and a entry point from user space.
Its job is to copy the blocks into place and then branch to the designated
entry point (after turning "off" the mmu).
The user space tool inserts a trampoline, called purgatory, that runs
before the user supplied code. Its job is to establish the entry
environment for the new kernel or other application based on the contents
of memory. The purgatory code is compiled and embedded in the tool,
where it is later patched using the elf symbol table using elf symbols.
Since the tool knows it is creating a purgatory that will run after a
kernel crash, it should just patch purgatory (or the kernel directly)
if something needs to happen.
Signed-off-by: Milton Miller <miltonm@bga.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/include/asm/kdump.h | 6 | ||||
-rw-r--r-- | arch/powerpc/kernel/machine_kexec_64.c | 9 | ||||
-rw-r--r-- | arch/powerpc/kernel/misc_64.S | 9 |
3 files changed, 5 insertions, 19 deletions
diff --git a/arch/powerpc/include/asm/kdump.h b/arch/powerpc/include/asm/kdump.h index a503da9d56f3..821ed48c10ed 100644 --- a/arch/powerpc/include/asm/kdump.h +++ b/arch/powerpc/include/asm/kdump.h | |||
@@ -9,12 +9,6 @@ | |||
9 | * Reserve to the end of the FWNMI area, see head_64.S */ | 9 | * Reserve to the end of the FWNMI area, see head_64.S */ |
10 | #define KDUMP_RESERVE_LIMIT 0x10000 /* 64K */ | 10 | #define KDUMP_RESERVE_LIMIT 0x10000 /* 64K */ |
11 | 11 | ||
12 | /* | ||
13 | * Used to differentiate between relocatable kdump kernel and other | ||
14 | * kernels | ||
15 | */ | ||
16 | #define KDUMP_SIGNATURE 0xfeed1234 | ||
17 | |||
18 | #ifdef CONFIG_CRASH_DUMP | 12 | #ifdef CONFIG_CRASH_DUMP |
19 | 13 | ||
20 | #define KDUMP_TRAMPOLINE_START 0x0100 | 14 | #define KDUMP_TRAMPOLINE_START 0x0100 |
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index e6efec788c4d..3c4ca046e854 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c | |||
@@ -255,14 +255,11 @@ static union thread_union kexec_stack | |||
255 | /* Our assembly helper, in kexec_stub.S */ | 255 | /* Our assembly helper, in kexec_stub.S */ |
256 | extern NORET_TYPE void kexec_sequence(void *newstack, unsigned long start, | 256 | extern NORET_TYPE void kexec_sequence(void *newstack, unsigned long start, |
257 | void *image, void *control, | 257 | void *image, void *control, |
258 | void (*clear_all)(void), | 258 | void (*clear_all)(void)) ATTRIB_NORET; |
259 | unsigned long kdump_flag) ATTRIB_NORET; | ||
260 | 259 | ||
261 | /* too late to fail here */ | 260 | /* too late to fail here */ |
262 | void default_machine_kexec(struct kimage *image) | 261 | void default_machine_kexec(struct kimage *image) |
263 | { | 262 | { |
264 | unsigned long kdump_flag = 0; | ||
265 | |||
266 | /* prepare control code if any */ | 263 | /* prepare control code if any */ |
267 | 264 | ||
268 | /* | 265 | /* |
@@ -275,8 +272,6 @@ void default_machine_kexec(struct kimage *image) | |||
275 | 272 | ||
276 | if (crashing_cpu == -1) | 273 | if (crashing_cpu == -1) |
277 | kexec_prepare_cpus(); | 274 | kexec_prepare_cpus(); |
278 | else | ||
279 | kdump_flag = KDUMP_SIGNATURE; | ||
280 | 275 | ||
281 | /* switch to a staticly allocated stack. Based on irq stack code. | 276 | /* switch to a staticly allocated stack. Based on irq stack code. |
282 | * XXX: the task struct will likely be invalid once we do the copy! | 277 | * XXX: the task struct will likely be invalid once we do the copy! |
@@ -289,7 +284,7 @@ void default_machine_kexec(struct kimage *image) | |||
289 | */ | 284 | */ |
290 | kexec_sequence(&kexec_stack, image->start, image, | 285 | kexec_sequence(&kexec_stack, image->start, image, |
291 | page_address(image->control_code_page), | 286 | page_address(image->control_code_page), |
292 | ppc_md.hpte_clear_all, kdump_flag); | 287 | ppc_md.hpte_clear_all); |
293 | /* NOTREACHED */ | 288 | /* NOTREACHED */ |
294 | } | 289 | } |
295 | 290 | ||
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index a243fd072a77..3053fe5c62f2 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -611,12 +611,10 @@ real_mode: /* assume normal blr return */ | |||
611 | 611 | ||
612 | 612 | ||
613 | /* | 613 | /* |
614 | * kexec_sequence(newstack, start, image, control, clear_all(), kdump_flag) | 614 | * kexec_sequence(newstack, start, image, control, clear_all()) |
615 | * | 615 | * |
616 | * does the grungy work with stack switching and real mode switches | 616 | * does the grungy work with stack switching and real mode switches |
617 | * also does simple calls to other code | 617 | * also does simple calls to other code |
618 | * | ||
619 | * kdump_flag says whether the next kernel should be a kdump kernel. | ||
620 | */ | 618 | */ |
621 | 619 | ||
622 | _GLOBAL(kexec_sequence) | 620 | _GLOBAL(kexec_sequence) |
@@ -649,7 +647,7 @@ _GLOBAL(kexec_sequence) | |||
649 | mr r29,r5 /* image (virt) */ | 647 | mr r29,r5 /* image (virt) */ |
650 | mr r28,r6 /* control, unused */ | 648 | mr r28,r6 /* control, unused */ |
651 | mr r27,r7 /* clear_all() fn desc */ | 649 | mr r27,r7 /* clear_all() fn desc */ |
652 | mr r26,r8 /* kdump flag */ | 650 | mr r26,r8 /* spare */ |
653 | lhz r25,PACAHWCPUID(r13) /* get our phys cpu from paca */ | 651 | lhz r25,PACAHWCPUID(r13) /* get our phys cpu from paca */ |
654 | 652 | ||
655 | /* disable interrupts, we are overwriting kernel data next */ | 653 | /* disable interrupts, we are overwriting kernel data next */ |
@@ -711,6 +709,5 @@ _GLOBAL(kexec_sequence) | |||
711 | mr r4,r30 # start, aka phys mem offset | 709 | mr r4,r30 # start, aka phys mem offset |
712 | mtlr 4 | 710 | mtlr 4 |
713 | li r5,0 | 711 | li r5,0 |
714 | mr r6,r26 /* kdump_flag */ | 712 | blr /* image->start(physid, image->start, 0); */ |
715 | blr /* image->start(physid, image->start, 0, kdump_flag); */ | ||
716 | #endif /* CONFIG_KEXEC */ | 713 | #endif /* CONFIG_KEXEC */ |