diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S index 25ad7453531..bd7770b6073 100644 --- a/arch/powerpc/boot/crt0.S +++ b/arch/powerpc/boot/crt0.S @@ -88,5 +88,4 @@ _zimage_start_lib: bl platform_init /* Call start */ - mr r3,r1 b start diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c index 33c73295acf..e1df8feaf16 100644 --- a/arch/powerpc/boot/main.c +++ b/arch/powerpc/boot/main.c @@ -17,6 +17,7 @@ #include "ops.h" #include "gunzip_util.h" #include "flatdevtree.h" +#include "reg.h" extern char _start[]; extern char __bss_start[]; @@ -247,7 +248,7 @@ struct dt_ops dt_ops; struct console_ops console_ops; struct loader_info loader_info; -void start(void *sp) +void start(void) { struct addr_range vmlinux, initrd; kernel_entry_t kentry; @@ -260,7 +261,7 @@ void start(void *sp) platform_ops.fixups(); printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r", - _start, sp); + _start, get_sp()); vmlinux = prep_kernel(); initrd = prep_initrd(vmlinux, loader_info.initrd_addr, diff --git a/arch/powerpc/boot/ops.h b/arch/powerpc/boot/ops.h index ea5368caca5..592dc6c20bd 100644 --- a/arch/powerpc/boot/ops.h +++ b/arch/powerpc/boot/ops.h @@ -73,7 +73,7 @@ struct loader_info { }; extern struct loader_info loader_info; -void start(void *sp); +void start(void); int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device); int serial_console_init(void); int ns16550_console_init(void *devp, struct serial_console_data *scdp); diff --git a/arch/powerpc/boot/reg.h b/arch/powerpc/boot/reg.h new file mode 100644 index 00000000000..d3cd9ee98af --- /dev/null +++ b/arch/powerpc/boot/reg.h @@ -0,0 +1,22 @@ +#ifndef _PPC_BOOT_REG_H +#define _PPC_BOOT_REG_H +/* + * Copyright 2007 Davud Gibson, IBM Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +static inline u32 mfpvr(void) +{ + u32 pvr; + asm volatile ("mfpvr %0" : "=r"(pvr)); + return pvr; +} + +register void *__stack_pointer asm("r1"); +#define get_sp() (__stack_pointer) + +#endif /* _PPC_BOOT_REG_H */