diff options
Diffstat (limited to 'arch/ia64/boot')
-rw-r--r-- | arch/ia64/boot/bootloader.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/ia64/boot/bootloader.c b/arch/ia64/boot/bootloader.c index b73f396dc..5d1778ee3 100644 --- a/arch/ia64/boot/bootloader.c +++ b/arch/ia64/boot/bootloader.c @@ -68,15 +68,16 @@ cons_write (const char *buf) void enter_virtual_mode (unsigned long new_psr) { + long tmp; + + asm volatile ("movl %0=1f" : "=r"(tmp)); asm volatile ("mov cr.ipsr=%0" :: "r"(new_psr)); - asm volatile ("mov cr.iip=%0" :: "r"(&&target)); + asm volatile ("mov cr.iip=%0" :: "r"(tmp)); asm volatile ("mov cr.ifs=r0"); - asm volatile ("rfi;;"); /* must be last insn in an insn group */ - - target: + asm volatile ("rfi;;"); + asm volatile ("1:"); } - #define MAX_ARGS 32 void @@ -96,7 +97,7 @@ _start (void) char *kpath, *args; long arglen = 0; - asm volatile ("movl gp=__gp" ::: "memory"); + asm volatile ("movl gp=__gp;;" ::: "memory"); asm volatile ("mov sp=%0" :: "r"(stack) : "memory"); asm volatile ("bsw.1;;"); #ifdef CONFIG_ITANIUM_ASTEP_SPECIFIC |