j
: Next unread message k
: Previous unread message j a
: Jump to all threads
j l
: Jump to MailingList overview
Author: blueswirl Date: 2009-01-04 17:01:50 +0100 (Sun, 04 Jan 2009) New Revision: 348
Modified: openbios-devel/arch/ppc/qemu/start.S Log: Fix reset vector 0xfff00100
Move non-vector code to higher memory addresses to free vector area. Rename entry point _start to _entry so that it will not conflict with ldscript _start.
Modified: openbios-devel/arch/ppc/qemu/start.S =================================================================== --- openbios-devel/arch/ppc/qemu/start.S 2009-01-04 14:47:11 UTC (rev 347) +++ openbios-devel/arch/ppc/qemu/start.S 2009-01-04 16:01:50 UTC (rev 348) @@ -58,13 +58,105 @@
/************************************************************************/ -/* entry */ +/* vectors */ /************************************************************************/
- .section .text.vectors, "ax" - .space 0x0100 -GLOBL(_start): +GLOBL(__vectors): + nop // NULL-jmp trap +1: nop // + b 1b + +exception_return: + addi r1,r1,16 // pop ABI frame + + lwz r0,52(r1) + mtlr r0 + lwz r0,56(r1) + mtcr r0 + lwz r0,60(r1) + mtctr r0 + lwz r0,64(r1) + mtxer r0 + + lwz r0,0(r1) // restore r0 + lwz r2,8(r1) // restore r2 + lwz r3,12(r1) // restore r3 + lwz r4,16(r1) + lwz r5,20(r1) + lwz r6,24(r1) + lwz r7,28(r1) + lwz r8,32(r1) + lwz r9,36(r1) + lwz r10,40(r1) + lwz r11,44(r1) + lwz r12,48(r1) + lwz r1,4(r1) // restore r1 + rfi + + .globl __divide_error +__divide_error: +trap_error: + mflr r3 + b unexpected_excep + +VECTOR( 0x100, "SRE" ): + b _entry + +ILLEGAL_VECTOR( 0x200 ) + +VECTOR( 0x300, "DSI" ): + EXCEPTION_PREAMBLE + lis r3,HA(dsi_exception) + addi r3,r3,LO(dsi_exception) + mtctr r3 + bctrl + ba exception_return + +VECTOR( 0x400, "ISI" ): + EXCEPTION_PREAMBLE + lis r3,HA(isi_exception) + addi r3,r3,LO(isi_exception) + mtctr r3 + bctrl + ba exception_return + + ILLEGAL_VECTOR( 0x500 ) + ILLEGAL_VECTOR( 0x600 ) + ILLEGAL_VECTOR( 0x700 ) + +VECTOR( 0x800, "FPU" ): + mtsprg1 r3 + mfsrr1 r3 + ori r3,r3,0x2000 + mtsrr1 r3 + mfsprg1 r3 + rfi + +ILLEGAL_VECTOR( 0x900 ) +ILLEGAL_VECTOR( 0xa00 ) +ILLEGAL_VECTOR( 0xb00 ) +ILLEGAL_VECTOR( 0xc00 ) +ILLEGAL_VECTOR( 0xd00 ) +ILLEGAL_VECTOR( 0xe00 ) +ILLEGAL_VECTOR( 0xf00 ) +ILLEGAL_VECTOR( 0xf20 ) +ILLEGAL_VECTOR( 0x1000 ) +ILLEGAL_VECTOR( 0x1100 ) +ILLEGAL_VECTOR( 0x1200 ) +ILLEGAL_VECTOR( 0x1300 ) +ILLEGAL_VECTOR( 0x1400 ) +ILLEGAL_VECTOR( 0x1500 ) +ILLEGAL_VECTOR( 0x1600 ) +ILLEGAL_VECTOR( 0x1700 ) + +GLOBL(__vectors_end): + +/************************************************************************/ +/* entry */ +/************************************************************************/ + +GLOBL(_entry): /* clear MSR, disable MMU */
li r0,0 @@ -235,102 +327,6 @@ blr GLOBL(timer_calib_end):
- -/************************************************************************/ -/* vectors */ -/************************************************************************/ - -GLOBL(__vectors): - nop // NULL-jmp trap -1: nop // - b 1b - -exception_return: - addi r1,r1,16 // pop ABI frame - - lwz r0,52(r1) - mtlr r0 - lwz r0,56(r1) - mtcr r0 - lwz r0,60(r1) - mtctr r0 - lwz r0,64(r1) - mtxer r0 - - lwz r0,0(r1) // restore r0 - lwz r2,8(r1) // restore r2 - lwz r3,12(r1) // restore r3 - lwz r4,16(r1) - lwz r5,20(r1) - lwz r6,24(r1) - lwz r7,28(r1) - lwz r8,32(r1) - lwz r9,36(r1) - lwz r10,40(r1) - lwz r11,44(r1) - lwz r12,48(r1) - lwz r1,4(r1) // restore r1 - rfi - - .globl __divide_error -__divide_error: -trap_error: - mflr r3 - b unexpected_excep - -VECTOR( 0x100, "SRE" ): - b _start - -ILLEGAL_VECTOR( 0x200 ) - -VECTOR( 0x300, "DSI" ): - EXCEPTION_PREAMBLE - lis r3,HA(dsi_exception) - addi r3,r3,LO(dsi_exception) - mtctr r3 - bctrl - ba exception_return - -VECTOR( 0x400, "ISI" ): - EXCEPTION_PREAMBLE - lis r3,HA(isi_exception) - addi r3,r3,LO(isi_exception) - mtctr r3 - bctrl - ba exception_return - - ILLEGAL_VECTOR( 0x500 ) - ILLEGAL_VECTOR( 0x600 ) - ILLEGAL_VECTOR( 0x700 ) - -VECTOR( 0x800, "FPU" ): - mtsprg1 r3 - mfsrr1 r3 - ori r3,r3,0x2000 - mtsrr1 r3 - mfsprg1 r3 - rfi - -ILLEGAL_VECTOR( 0x900 ) -ILLEGAL_VECTOR( 0xa00 ) -ILLEGAL_VECTOR( 0xb00 ) -ILLEGAL_VECTOR( 0xc00 ) -ILLEGAL_VECTOR( 0xd00 ) -ILLEGAL_VECTOR( 0xe00 ) -ILLEGAL_VECTOR( 0xf00 ) -ILLEGAL_VECTOR( 0xf20 ) -ILLEGAL_VECTOR( 0x1000 ) -ILLEGAL_VECTOR( 0x1100 ) -ILLEGAL_VECTOR( 0x1200 ) -ILLEGAL_VECTOR( 0x1300 ) -ILLEGAL_VECTOR( 0x1400 ) -ILLEGAL_VECTOR( 0x1500 ) -ILLEGAL_VECTOR( 0x1600 ) -ILLEGAL_VECTOR( 0x1700 ) - -GLOBL(__vectors_end): - - #define CACHE_LINE_SIZE 32 #define LG_CACHE_LINE_SIZE 5
@@ -382,4 +378,4 @@
/* Hard reset vector */ .section .romentry,"ax" - bl _start + bl _entry