powerpc/mpc85xx: Don't relocate exception vectors
Booke does not require exception vectors to be located at address zero. U-Boot was doing so anyway, simply because that's how it had been done on other PPC. The downside of this is that once the OS is loaded to address zero, the exception vectors have been overwritten -- which makes it difficult to diagnose a crash that happens after that point. The IVOR setup and trap entry code is simplified somewhat as a result. Also, there is no longer a need to align individual exceptions on 0x100 byte boundaries. Signed-off-by: Scott Wood <scottwood@freescale.com> Reviewed-by: York Sun <yorksun@freescale.com>
This commit is contained in:
parent
4913229ed6
commit
96d2bb952b
3 changed files with 98 additions and 124 deletions
|
@ -252,39 +252,36 @@ l2_disabled:
|
||||||
lis r1,CONFIG_SYS_MONITOR_BASE@h
|
lis r1,CONFIG_SYS_MONITOR_BASE@h
|
||||||
mtspr IVPR,r1
|
mtspr IVPR,r1
|
||||||
|
|
||||||
lis r3,(CONFIG_SYS_MONITOR_BASE & 0xffff)@h
|
li r4,CriticalInput@l
|
||||||
ori r3,r3,(CONFIG_SYS_MONITOR_BASE & 0xffff)@l
|
|
||||||
|
|
||||||
addi r4,r3,CriticalInput - _start + _START_OFFSET
|
|
||||||
mtspr IVOR0,r4 /* 0: Critical input */
|
mtspr IVOR0,r4 /* 0: Critical input */
|
||||||
addi r4,r3,MachineCheck - _start + _START_OFFSET
|
li r4,MachineCheck@l
|
||||||
mtspr IVOR1,r4 /* 1: Machine check */
|
mtspr IVOR1,r4 /* 1: Machine check */
|
||||||
addi r4,r3,DataStorage - _start + _START_OFFSET
|
li r4,DataStorage@l
|
||||||
mtspr IVOR2,r4 /* 2: Data storage */
|
mtspr IVOR2,r4 /* 2: Data storage */
|
||||||
addi r4,r3,InstStorage - _start + _START_OFFSET
|
li r4,InstStorage@l
|
||||||
mtspr IVOR3,r4 /* 3: Instruction storage */
|
mtspr IVOR3,r4 /* 3: Instruction storage */
|
||||||
addi r4,r3,ExtInterrupt - _start + _START_OFFSET
|
li r4,ExtInterrupt@l
|
||||||
mtspr IVOR4,r4 /* 4: External interrupt */
|
mtspr IVOR4,r4 /* 4: External interrupt */
|
||||||
addi r4,r3,Alignment - _start + _START_OFFSET
|
li r4,Alignment@l
|
||||||
mtspr IVOR5,r4 /* 5: Alignment */
|
mtspr IVOR5,r4 /* 5: Alignment */
|
||||||
addi r4,r3,ProgramCheck - _start + _START_OFFSET
|
li r4,ProgramCheck@l
|
||||||
mtspr IVOR6,r4 /* 6: Program check */
|
mtspr IVOR6,r4 /* 6: Program check */
|
||||||
addi r4,r3,FPUnavailable - _start + _START_OFFSET
|
li r4,FPUnavailable@l
|
||||||
mtspr IVOR7,r4 /* 7: floating point unavailable */
|
mtspr IVOR7,r4 /* 7: floating point unavailable */
|
||||||
addi r4,r3,SystemCall - _start + _START_OFFSET
|
li r4,SystemCall@l
|
||||||
mtspr IVOR8,r4 /* 8: System call */
|
mtspr IVOR8,r4 /* 8: System call */
|
||||||
/* 9: Auxiliary processor unavailable(unsupported) */
|
/* 9: Auxiliary processor unavailable(unsupported) */
|
||||||
addi r4,r3,Decrementer - _start + _START_OFFSET
|
li r4,Decrementer@l
|
||||||
mtspr IVOR10,r4 /* 10: Decrementer */
|
mtspr IVOR10,r4 /* 10: Decrementer */
|
||||||
addi r4,r3,IntervalTimer - _start + _START_OFFSET
|
li r4,IntervalTimer@l
|
||||||
mtspr IVOR11,r4 /* 11: Interval timer */
|
mtspr IVOR11,r4 /* 11: Interval timer */
|
||||||
addi r4,r3,WatchdogTimer - _start + _START_OFFSET
|
li r4,WatchdogTimer@l
|
||||||
mtspr IVOR12,r4 /* 12: Watchdog timer */
|
mtspr IVOR12,r4 /* 12: Watchdog timer */
|
||||||
addi r4,r3,DataTLBError - _start + _START_OFFSET
|
li r4,DataTLBError@l
|
||||||
mtspr IVOR13,r4 /* 13: Data TLB error */
|
mtspr IVOR13,r4 /* 13: Data TLB error */
|
||||||
addi r4,r3,InstructionTLBError - _start + _START_OFFSET
|
li r4,InstructionTLBError@l
|
||||||
mtspr IVOR14,r4 /* 14: Instruction TLB error */
|
mtspr IVOR14,r4 /* 14: Instruction TLB error */
|
||||||
addi r4,r3,DebugBreakpoint - _start + _START_OFFSET
|
li r4,DebugBreakpoint@l
|
||||||
mtspr IVOR15,r4 /* 15: Debug */
|
mtspr IVOR15,r4 /* 15: Debug */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1121,7 +1118,7 @@ switch_as:
|
||||||
/*--------------------------------------------------------------*/
|
/*--------------------------------------------------------------*/
|
||||||
lis r3,CONFIG_SYS_MONITOR_BASE@h
|
lis r3,CONFIG_SYS_MONITOR_BASE@h
|
||||||
ori r3,r3,CONFIG_SYS_MONITOR_BASE@l
|
ori r3,r3,CONFIG_SYS_MONITOR_BASE@l
|
||||||
addi r3,r3,_start_cont - _start + _START_OFFSET
|
addi r3,r3,_start_cont - _start
|
||||||
mtlr r3
|
mtlr r3
|
||||||
blr
|
blr
|
||||||
#endif
|
#endif
|
||||||
|
@ -1165,7 +1162,6 @@ _start_cont:
|
||||||
/* NOTREACHED - board_init_f() does not return */
|
/* NOTREACHED - board_init_f() does not return */
|
||||||
|
|
||||||
#ifndef MINIMAL_SPL
|
#ifndef MINIMAL_SPL
|
||||||
. = EXC_OFF_SYS_RESET
|
|
||||||
.globl _start_of_vectors
|
.globl _start_of_vectors
|
||||||
_start_of_vectors:
|
_start_of_vectors:
|
||||||
|
|
||||||
|
@ -1185,7 +1181,6 @@ _start_of_vectors:
|
||||||
STD_EXCEPTION(0x0500, ExtInterrupt, ExtIntException)
|
STD_EXCEPTION(0x0500, ExtInterrupt, ExtIntException)
|
||||||
|
|
||||||
/* Alignment exception. */
|
/* Alignment exception. */
|
||||||
. = 0x0600
|
|
||||||
Alignment:
|
Alignment:
|
||||||
EXCEPTION_PROLOG(SRR0, SRR1)
|
EXCEPTION_PROLOG(SRR0, SRR1)
|
||||||
mfspr r4,DAR
|
mfspr r4,DAR
|
||||||
|
@ -1193,21 +1188,20 @@ Alignment:
|
||||||
mfspr r5,DSISR
|
mfspr r5,DSISR
|
||||||
stw r5,_DSISR(r21)
|
stw r5,_DSISR(r21)
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
|
EXC_XFER_TEMPLATE(0x600, Alignment, AlignmentException,
|
||||||
|
MSR_KERNEL, COPY_EE)
|
||||||
|
|
||||||
/* Program check exception */
|
/* Program check exception */
|
||||||
. = 0x0700
|
|
||||||
ProgramCheck:
|
ProgramCheck:
|
||||||
EXCEPTION_PROLOG(SRR0, SRR1)
|
EXCEPTION_PROLOG(SRR0, SRR1)
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
|
EXC_XFER_TEMPLATE(0x700, ProgramCheck, ProgramCheckException,
|
||||||
MSR_KERNEL, COPY_EE)
|
MSR_KERNEL, COPY_EE)
|
||||||
|
|
||||||
/* No FPU on MPC85xx. This exception is not supposed to happen.
|
/* No FPU on MPC85xx. This exception is not supposed to happen.
|
||||||
*/
|
*/
|
||||||
STD_EXCEPTION(0x0800, FPUnavailable, UnknownException)
|
STD_EXCEPTION(0x0800, FPUnavailable, UnknownException)
|
||||||
|
|
||||||
. = 0x0900
|
|
||||||
/*
|
/*
|
||||||
* r0 - SYSCALL number
|
* r0 - SYSCALL number
|
||||||
* r3-... arguments
|
* r3-... arguments
|
||||||
|
@ -1293,32 +1287,22 @@ _end_of_vectors:
|
||||||
* This code finishes saving the registers to the exception frame
|
* This code finishes saving the registers to the exception frame
|
||||||
* and jumps to the appropriate handler for the exception.
|
* and jumps to the appropriate handler for the exception.
|
||||||
* Register r21 is pointer into trap frame, r1 has new stack pointer.
|
* Register r21 is pointer into trap frame, r1 has new stack pointer.
|
||||||
|
* r23 is the address of the handler.
|
||||||
*/
|
*/
|
||||||
.globl transfer_to_handler
|
.globl transfer_to_handler
|
||||||
transfer_to_handler:
|
transfer_to_handler:
|
||||||
stw r22,_NIP(r21)
|
|
||||||
lis r22,MSR_POW@h
|
|
||||||
andc r23,r23,r22
|
|
||||||
stw r23,_MSR(r21)
|
|
||||||
SAVE_GPR(7, r21)
|
SAVE_GPR(7, r21)
|
||||||
SAVE_4GPRS(8, r21)
|
SAVE_4GPRS(8, r21)
|
||||||
SAVE_8GPRS(12, r21)
|
SAVE_8GPRS(12, r21)
|
||||||
SAVE_8GPRS(24, r21)
|
SAVE_8GPRS(24, r21)
|
||||||
|
|
||||||
mflr r23
|
|
||||||
andi. r24,r23,0x3f00 /* get vector offset */
|
|
||||||
stw r24,TRAP(r21)
|
|
||||||
li r22,0
|
li r22,0
|
||||||
stw r22,RESULT(r21)
|
stw r22,RESULT(r21)
|
||||||
mtspr SPRG2,r22 /* r1 is now kernel sp */
|
mtspr SPRG2,r22 /* r1 is now kernel sp */
|
||||||
|
|
||||||
lwz r24,0(r23) /* virtual address of handler */
|
mtctr r23 /* virtual address of handler */
|
||||||
lwz r23,4(r23) /* where to go when done */
|
mtmsr r20
|
||||||
mtspr SRR0,r24
|
bctrl
|
||||||
mtspr SRR1,r20
|
|
||||||
mtlr r23
|
|
||||||
SYNC
|
|
||||||
rfi /* jump to handler, enable MMU */
|
|
||||||
|
|
||||||
int_return:
|
int_return:
|
||||||
mfmsr r28 /* Disable interrupts */
|
mfmsr r28 /* Disable interrupts */
|
||||||
|
@ -1728,7 +1712,7 @@ relocate_code:
|
||||||
* initialization, now running from RAM.
|
* initialization, now running from RAM.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
addi r0,r10,in_ram - _start + _START_OFFSET
|
addi r0,r10,in_ram - _start
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* As IVPR is going to point RAM address,
|
* As IVPR is going to point RAM address,
|
||||||
|
@ -1816,89 +1800,41 @@ clear_bss:
|
||||||
*/
|
*/
|
||||||
.globl trap_init
|
.globl trap_init
|
||||||
trap_init:
|
trap_init:
|
||||||
mflr r4 /* save link register */
|
/* Update IVORs as per relocation */
|
||||||
GET_GOT
|
mtspr IVPR,r3
|
||||||
lwz r7,GOT(_start_of_vectors)
|
|
||||||
lwz r8,GOT(_end_of_vectors)
|
|
||||||
|
|
||||||
li r9,0x100 /* reset vector always at 0x100 */
|
li r4,CriticalInput@l
|
||||||
|
mtspr IVOR0,r4 /* 0: Critical input */
|
||||||
cmplw 0,r7,r8
|
li r4,MachineCheck@l
|
||||||
bgelr /* return if r7>=r8 - just in case */
|
mtspr IVOR1,r4 /* 1: Machine check */
|
||||||
1:
|
li r4,DataStorage@l
|
||||||
lwz r0,0(r7)
|
mtspr IVOR2,r4 /* 2: Data storage */
|
||||||
stw r0,0(r9)
|
li r4,InstStorage@l
|
||||||
addi r7,r7,4
|
mtspr IVOR3,r4 /* 3: Instruction storage */
|
||||||
addi r9,r9,4
|
li r4,ExtInterrupt@l
|
||||||
cmplw 0,r7,r8
|
mtspr IVOR4,r4 /* 4: External interrupt */
|
||||||
bne 1b
|
li r4,Alignment@l
|
||||||
|
mtspr IVOR5,r4 /* 5: Alignment */
|
||||||
/*
|
li r4,ProgramCheck@l
|
||||||
* relocate `hdlr' and `int_return' entries
|
mtspr IVOR6,r4 /* 6: Program check */
|
||||||
*/
|
li r4,FPUnavailable@l
|
||||||
li r7,.L_CriticalInput - _start + _START_OFFSET
|
mtspr IVOR7,r4 /* 7: floating point unavailable */
|
||||||
bl trap_reloc
|
li r4,SystemCall@l
|
||||||
li r7,.L_MachineCheck - _start + _START_OFFSET
|
mtspr IVOR8,r4 /* 8: System call */
|
||||||
bl trap_reloc
|
|
||||||
li r7,.L_DataStorage - _start + _START_OFFSET
|
|
||||||
bl trap_reloc
|
|
||||||
li r7,.L_InstStorage - _start + _START_OFFSET
|
|
||||||
bl trap_reloc
|
|
||||||
li r7,.L_ExtInterrupt - _start + _START_OFFSET
|
|
||||||
bl trap_reloc
|
|
||||||
li r7,.L_Alignment - _start + _START_OFFSET
|
|
||||||
bl trap_reloc
|
|
||||||
li r7,.L_ProgramCheck - _start + _START_OFFSET
|
|
||||||
bl trap_reloc
|
|
||||||
li r7,.L_FPUnavailable - _start + _START_OFFSET
|
|
||||||
bl trap_reloc
|
|
||||||
li r7,.L_Decrementer - _start + _START_OFFSET
|
|
||||||
bl trap_reloc
|
|
||||||
li r7,.L_IntervalTimer - _start + _START_OFFSET
|
|
||||||
li r8,_end_of_vectors - _start + _START_OFFSET
|
|
||||||
2:
|
|
||||||
bl trap_reloc
|
|
||||||
addi r7,r7,0x100 /* next exception vector */
|
|
||||||
cmplw 0,r7,r8
|
|
||||||
blt 2b
|
|
||||||
|
|
||||||
/* Update IVORs as per relocated vector table address */
|
|
||||||
li r7,0x0100
|
|
||||||
mtspr IVOR0,r7 /* 0: Critical input */
|
|
||||||
li r7,0x0200
|
|
||||||
mtspr IVOR1,r7 /* 1: Machine check */
|
|
||||||
li r7,0x0300
|
|
||||||
mtspr IVOR2,r7 /* 2: Data storage */
|
|
||||||
li r7,0x0400
|
|
||||||
mtspr IVOR3,r7 /* 3: Instruction storage */
|
|
||||||
li r7,0x0500
|
|
||||||
mtspr IVOR4,r7 /* 4: External interrupt */
|
|
||||||
li r7,0x0600
|
|
||||||
mtspr IVOR5,r7 /* 5: Alignment */
|
|
||||||
li r7,0x0700
|
|
||||||
mtspr IVOR6,r7 /* 6: Program check */
|
|
||||||
li r7,0x0800
|
|
||||||
mtspr IVOR7,r7 /* 7: floating point unavailable */
|
|
||||||
li r7,0x0900
|
|
||||||
mtspr IVOR8,r7 /* 8: System call */
|
|
||||||
/* 9: Auxiliary processor unavailable(unsupported) */
|
/* 9: Auxiliary processor unavailable(unsupported) */
|
||||||
li r7,0x0a00
|
li r4,Decrementer@l
|
||||||
mtspr IVOR10,r7 /* 10: Decrementer */
|
mtspr IVOR10,r4 /* 10: Decrementer */
|
||||||
li r7,0x0b00
|
li r4,IntervalTimer@l
|
||||||
mtspr IVOR11,r7 /* 11: Interval timer */
|
mtspr IVOR11,r4 /* 11: Interval timer */
|
||||||
li r7,0x0c00
|
li r4,WatchdogTimer@l
|
||||||
mtspr IVOR12,r7 /* 12: Watchdog timer */
|
mtspr IVOR12,r4 /* 12: Watchdog timer */
|
||||||
li r7,0x0d00
|
li r4,DataTLBError@l
|
||||||
mtspr IVOR13,r7 /* 13: Data TLB error */
|
mtspr IVOR13,r4 /* 13: Data TLB error */
|
||||||
li r7,0x0e00
|
li r4,InstructionTLBError@l
|
||||||
mtspr IVOR14,r7 /* 14: Instruction TLB error */
|
mtspr IVOR14,r4 /* 14: Instruction TLB error */
|
||||||
li r7,0x0f00
|
li r4,DebugBreakpoint@l
|
||||||
mtspr IVOR15,r7 /* 15: Debug */
|
mtspr IVOR15,r4 /* 15: Debug */
|
||||||
|
|
||||||
lis r7,0x0
|
|
||||||
mtspr IVPR,r7
|
|
||||||
|
|
||||||
mtlr r4 /* restore link register */
|
|
||||||
blr
|
blr
|
||||||
|
|
||||||
.globl unlock_ram_in_cache
|
.globl unlock_ram_in_cache
|
||||||
|
|
|
@ -6,10 +6,6 @@
|
||||||
#ifndef __MPC85xx_H__
|
#ifndef __MPC85xx_H__
|
||||||
#define __MPC85xx_H__
|
#define __MPC85xx_H__
|
||||||
|
|
||||||
/* define for common ppc_asm.tmpl */
|
|
||||||
#define EXC_OFF_SYS_RESET 0x100 /* System reset */
|
|
||||||
#define _START_OFFSET 0
|
|
||||||
|
|
||||||
#if defined(CONFIG_E500)
|
#if defined(CONFIG_E500)
|
||||||
#include <e500.h>
|
#include <e500.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
#ifndef __PPC_ASM_TMPL__
|
#ifndef __PPC_ASM_TMPL__
|
||||||
#define __PPC_ASM_TMPL__
|
#define __PPC_ASM_TMPL__
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
*
|
*
|
||||||
* These definitions simplify the ugly declarations necessary for GOT
|
* These definitions simplify the ugly declarations necessary for GOT
|
||||||
|
@ -243,6 +245,45 @@
|
||||||
*/
|
*/
|
||||||
#define COPY_EE(d, s) rlwimi d,s,0,16,16
|
#define COPY_EE(d, s) rlwimi d,s,0,16,16
|
||||||
#define NOCOPY(d, s)
|
#define NOCOPY(d, s)
|
||||||
|
|
||||||
|
#ifdef CONFIG_E500
|
||||||
|
#define EXC_XFER_TEMPLATE(n, label, hdlr, msr, copyee) \
|
||||||
|
stw r22,_NIP(r21); \
|
||||||
|
stw r23,_MSR(r21); \
|
||||||
|
li r23,n; \
|
||||||
|
stw r23,TRAP(r21); \
|
||||||
|
li r20,msr; \
|
||||||
|
copyee(r20,r23); \
|
||||||
|
rlwimi r20,r23,0,25,25; \
|
||||||
|
mtmsr r20; \
|
||||||
|
bl 1f; \
|
||||||
|
1: mflr r23; \
|
||||||
|
addis r23,r23,(hdlr - 1b)@ha; \
|
||||||
|
addi r23,r23,(hdlr - 1b)@l; \
|
||||||
|
b transfer_to_handler
|
||||||
|
|
||||||
|
#define STD_EXCEPTION(n, label, hdlr) \
|
||||||
|
label: \
|
||||||
|
EXCEPTION_PROLOG(SRR0, SRR1); \
|
||||||
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||||
|
EXC_XFER_TEMPLATE(n, label, hdlr, MSR_KERNEL, NOCOPY) \
|
||||||
|
|
||||||
|
#define CRIT_EXCEPTION(n, label, hdlr) \
|
||||||
|
label: \
|
||||||
|
EXCEPTION_PROLOG(CSRR0, CSRR1); \
|
||||||
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||||
|
EXC_XFER_TEMPLATE(n, label, hdlr, \
|
||||||
|
MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY) \
|
||||||
|
|
||||||
|
#define MCK_EXCEPTION(n, label, hdlr) \
|
||||||
|
label: \
|
||||||
|
EXCEPTION_PROLOG(MCSRR0, MCSRR1); \
|
||||||
|
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||||
|
EXC_XFER_TEMPLATE(n, label, hdlr, \
|
||||||
|
MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY) \
|
||||||
|
|
||||||
|
#else /* !E500 */
|
||||||
|
|
||||||
#define EXC_XFER_TEMPLATE(label, hdlr, msr, copyee) \
|
#define EXC_XFER_TEMPLATE(label, hdlr, msr, copyee) \
|
||||||
bl 1f; \
|
bl 1f; \
|
||||||
1: mflr r20; \
|
1: mflr r20; \
|
||||||
|
@ -280,4 +321,5 @@ label: \
|
||||||
EXC_XFER_TEMPLATE(label, hdlr, \
|
EXC_XFER_TEMPLATE(label, hdlr, \
|
||||||
MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY) \
|
MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY) \
|
||||||
|
|
||||||
|
#endif /* !E500 */
|
||||||
#endif /* __PPC_ASM_TMPL__ */
|
#endif /* __PPC_ASM_TMPL__ */
|
||||||
|
|
Loading…
Reference in a new issue