The kexec code is doing strange contortions with dtops.finalize and
platform_ops.vmlinux_alloc to manage the slave cpus.   Add a hook
with the needed information.

Signed-off-by: Milton Miller <[EMAIL PROTECTED]>
---
vs 12181
rediff fuzz.

Index: kernel/arch/powerpc/boot/kexec.c
===================================================================
--- kernel.orig/arch/powerpc/boot/kexec.c       2007-09-20 17:49:13.000000000 
-0500
+++ kernel/arch/powerpc/boot/kexec.c    2007-09-20 17:49:19.000000000 -0500
@@ -117,32 +117,11 @@ static void init_flat_tree(struct boot_p
                fatal("Unable to initialize device_tree library!\n\r");
 }
 
-static void *saved_vmlinux_addr;
-
-static void *kexec_vmlinux_alloc(unsigned long size)
-{
-       void *addr;
-
-       addr = ranges_vmlinux_alloc(size);
-
-       saved_vmlinux_addr = addr;
-       return addr;
-}
-
 static void kexec_fixups(void)
 {
        wait_slaves_moved();
 }
 
-static unsigned long (*finalize_chain)(void);
-
-static unsigned long kexec_finalize(void)
-{
-       send_slaves_to_kernel(saved_vmlinux_addr);
-
-       return finalize_chain();
-}
-
 void kexec_platform_init(struct boot_param_header *dt_blob)
 {
        slaves_are_low();
@@ -167,8 +146,7 @@ void kexec_platform_init(struct boot_par
        init_flat_tree(dt_blob);
 
        platform_ops.find_vmlinuz = find_vmlinux_in_initramfs;
-       platform_ops.vmlinux_alloc = kexec_vmlinux_alloc;
+       platform_ops.vmlinux_alloc = ranges_vmlinux_alloc;
        platform_ops.fixups = kexec_fixups;
-       finalize_chain = dt_ops.finalize;
-       dt_ops.finalize = kexec_finalize;
+       platform_ops.start_smp = send_slaves_to_kernel;
 }
Index: kernel/arch/powerpc/boot/main.c
===================================================================
--- kernel.orig/arch/powerpc/boot/main.c        2007-09-20 17:49:10.000000000 
-0500
+++ kernel/arch/powerpc/boot/main.c     2007-09-20 17:49:19.000000000 -0500
@@ -202,6 +202,9 @@ void start(void)
        else
                printf(" using OF tree (promptr=%p)\n\r", loader_info.promptr);
 
+       if (platform_ops.start_smp)
+               platform_ops.start_smp(vmlinux.addr);
+
        if (console_ops.close)
                console_ops.close();
 
Index: kernel/arch/powerpc/boot/ops.h
===================================================================
--- kernel.orig/arch/powerpc/boot/ops.h 2007-09-20 17:49:10.000000000 -0500
+++ kernel/arch/powerpc/boot/ops.h      2007-09-20 17:49:19.000000000 -0500
@@ -35,6 +35,7 @@ struct platform_ops {
        void *  (*realloc)(void *ptr, unsigned long size);
        void    (*exit)(void);
        void *  (*vmlinux_alloc)(unsigned long size);
+       void    (*start_smp)(void *vmlinux);
        void    (*find_vmlinuz)(struct gunzip_state *, void **srcp,
                        unsigned long *lenp);
 };
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to