From 9765d55ffe5f2a2a36adff5469cf0bb48c8dcd40 Mon Sep 17 00:00:00 2001 From: marcel Date: Sat, 23 Feb 2008 18:42:53 +0000 Subject: o Keep running on U-Boot's stack. o Disable interrupts while not running U-Boot code. We clobber registers that the U-Boot interrupt handlers assume to be fixed as per the U-Boot register usage. At this time this only applies to r14. U-Boot uses r2 now for what they used r29 for. After we restore r14 in preparation of doing the syscall, we re-enable interrupts. When we return from the syscall, we disable interrupts and restore the callee-saved r14. --- sys/boot/powerpc/uboot/start.S | 44 ++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 21 deletions(-) (limited to 'sys/boot/powerpc') diff --git a/sys/boot/powerpc/uboot/start.S b/sys/boot/powerpc/uboot/start.S index 67d1798..cee6db7 100644 --- a/sys/boot/powerpc/uboot/start.S +++ b/sys/boot/powerpc/uboot/start.S @@ -28,23 +28,24 @@ #include -#define STACK_SIZE 8192 - /* * Entry point to the loader that U-Boot passes control to. */ - .text - .globl _start + .text + .globl _start _start: - /* Fix up a stack */ - lis %r1, stack@ha - addi %r1, %r1, stack@l - addi %r1, %r1, (STACK_SIZE - 32) - /* Save U-Boot's r14 and r29 */ + /* Hint where to look for the API signature */ + lis %r11, uboot_address@ha + addi %r11, %r11, uboot_address@l + stw %r2, 0(%r11) + /* Save U-Boot's r14 */ lis %r11, saved_regs@ha addi %r11, %r11, saved_regs@l stw %r14, 0(%r11) - stw %r29, 4(%r11) + /* Disable interrupts */ + mfmsr %r11 + andi. %r11, %r11, ~0x8000@l + mtmsr %r11 b main /* @@ -54,25 +55,30 @@ ENTRY(syscall) stwu %r1, -16(%r1) mflr %r0 stw %r14, 8(%r1) - stw %r29, 12(%r1) stw %r0, 20(%r1) - /* Restore U-Boot's r14 and r29 */ + /* Restore U-Boot's r14 */ lis %r11, saved_regs@ha addi %r11, %r11, saved_regs@l lwz %r14, 0(%r11) - lwz %r29, 4(%r11) - /* Call into u-Boot */ + /* Enable interrupts */ + mfmsr %r11 + ori %r11, %r11, 0x8000@l + mtmsr %r11 + /* Call into U-Boot */ lis %r11, syscall_ptr@ha addi %r11, %r11, syscall_ptr@l lwz %r11, 0(%r11) mtctr %r11 bctrl + /* Disable interrupts */ + mfmsr %r11 + andi. %r11, %r11, ~0x8000@l + mtmsr %r11 /* Epilogue */ lwz %r11, 0(%r1) lwz %r0, 4(%r11) mtlr %r0 lwz %r14, 8(%r1) - lwz %r29, 12(%r1) mr %r1, %r11 blr @@ -80,13 +86,9 @@ ENTRY(syscall) * Data section */ .data - .align 4 -stack: - .space STACK_SIZE - GLOBAL(syscall_ptr) .long 0 GLOBAL(saved_regs) .long 0 /* R14 */ - .long 0 /* R29 */ - +GLOBAL(uboot_address) + .long 0 -- cgit v1.1