Switch to SYS mode on arm FS#12322 by me

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30741 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Marcin Bukat 2011-10-11 16:06:03 +00:00
parent 9055915645
commit bf056d5372
16 changed files with 298 additions and 233 deletions

View file

@ -33,6 +33,8 @@
#define ARM_MODE_FIQ 0x11 #define ARM_MODE_FIQ 0x11
#define ARM_MODE_IRQ 0x12 #define ARM_MODE_IRQ 0x12
#define ARM_MODE_SVC 0x13 #define ARM_MODE_SVC 0x13
#define ARM_MODE_UND 0x1b
#define ARM_MODE_SYS 0x1f
#define I_BIT 0x80 #define I_BIT 0x80
#define F_BIT 0x40 #define F_BIT 0x40
@ -163,6 +165,15 @@ _stack_init:
* r2 = IRQ_STACK_SIZE * r2 = IRQ_STACK_SIZE
*/ */
/*- Set up Interrupt Mode and set IRQ Mode Stack */
msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT /* Enter in Mode Interrupt
* and disable IRQ (Interrupt) and FIQ (Fast Interrupt)
*/
mov sp, r0 /* sp (Interrupt Mode Stack Pointer) =
* TOP_OF_MEMORY (end of IRAM 1)
*/
/*- Set up Abort Mode and set ABT Mode Stack */ /*- Set up Abort Mode and set ABT Mode Stack */
msr CPSR_c, #ARM_MODE_ABT | I_BIT | F_BIT /* Enter in Mode Abort msr CPSR_c, #ARM_MODE_ABT | I_BIT | F_BIT /* Enter in Mode Abort
* and disable IRQ (Interrupt) and FIQ (Fast Interrupt) * and disable IRQ (Interrupt) and FIQ (Fast Interrupt)
@ -172,26 +183,27 @@ _stack_init:
* (end of IRAM 1) * (end of IRAM 1)
*/ */
/* put r0 with value of the new address for next Stack */ /*- Set up Abort Mode and set ABT Mode Stack */
sub r0, r0, r1 /* r0 = r0 - r1 --> r0 = (end of IRAM 1) - msr CPSR_c, #ARM_MODE_UND | I_BIT | F_BIT /* Enter in Mode Undefined
* (ABT_STACK_SIZE)
*/
/*- Set up Interrupt Mode and set IRQ Mode Stack */
msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT /* Enter in Mode Interrupt
* and disable IRQ (Interrupt) and FIQ (Fast Interrupt) * and disable IRQ (Interrupt) and FIQ (Fast Interrupt)
*/ */
mov sp, r0 /* sp (Interrupt Mode Stack Pointer) = mov sp, r0 /* sp (ABT Mode Stack Pointer) = TOP_OF_MEMORY
* TOP_OF_MEMORY (end of IRAM 1) - (ABT_STACK_SIZE) * (end of IRAM 1)
*/ */
/*- Set up Supervisor Mode and set Supervisor Mode Stack */
msr CPSR_c, #ARM_MODE_SVC | I_BIT | F_BIT
mov sp, r0
sub r0, r0, r2 /* Put on r0 the new address for next sub r0, r0, r2 /* Put on r0 the new address for next
* Stack (Supervisor Mode) * Stack (Sys Mode)
*/ */
/*- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack */ /*- Set up Sys Mode and set Sys Mode Stack */
msr CPSR_c, #ARM_MODE_SVC | F_BIT msr CPSR_c, #ARM_MODE_SYS | F_BIT /* Enter in Sys Mode
* and enable IRQ (Interrupt) and disable FIQ (Fast Interrupt)
*/
mov sp, r0 mov sp, r0
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------

View file

@ -61,7 +61,7 @@ start:
.equ CACHE_ENAB, 0x1 .equ CACHE_ENAB, 0x1
#endif #endif
msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ */ msr cpsr_c, #0xdf /* enter sys mode, disable IRQ */
#ifndef E200R_INSTALLER #ifndef E200R_INSTALLER
/* 1 - Copy the bootloader to IRAM */ /* 1 - Copy the bootloader to IRAM */
/* get the high part of our execute address */ /* get the high part of our execute address */

View file

@ -262,17 +262,6 @@ cpu_init:
strhi r4, [r2], #4 strhi r4, [r2], #4
bhi 1b bhi 1b
/* Load stack munge value */
ldr r4, =0xdeadbeef
/* Set up some stack and munge it with 0xdeadbeef */
ldr r2, =stackbegin
ldr sp, =stackend
1:
cmp sp, r2
strhi r4, [r2], #4
bhi 1b
#if NUM_CORES > 1 #if NUM_CORES > 1
/* Set up idle stack and munge it with 0xdeadbeef */ /* Set up idle stack and munge it with 0xdeadbeef */
ldr r2, =cpu_idlestackbegin ldr r2, =cpu_idlestackbegin
@ -289,14 +278,28 @@ cpu_init:
/* Set up stack for FIQ mode */ /* Set up stack for FIQ mode */
msr cpsr_c, #0xd1 /* IRQ/FIQ disabled */ msr cpsr_c, #0xd1 /* IRQ/FIQ disabled */
ldr sp, =fiq_stack ldr sp, =fiq_stack
/* Let abort and undefined modes use IRQ stack */
/* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3 /* IRQ/FIQ disabled */
ldr sp, =irq_stack
msr cpsr_c, #0xd7 /* IRQ/FIQ disabled */ msr cpsr_c, #0xd7 /* IRQ/FIQ disabled */
ldr sp, =irq_stack ldr sp, =irq_stack
msr cpsr_c, #0xdb /* IRQ/FIQ disabled */ msr cpsr_c, #0xdb /* IRQ/FIQ disabled */
ldr sp, =irq_stack ldr sp, =irq_stack
/* Switch back to supervisor mode */ /* Switch to sys mode */
msr cpsr_c, #0xd3 msr cpsr_c, #0xdf
/* Load stack munge value */
ldr r4, =0xdeadbeef
/* Set up some stack and munge it with 0xdeadbeef */
ldr r2, =stackbegin
ldr sp, =stackend
1:
cmp sp, r2
strhi r4, [r2], #4
bhi 1b
/* Delay waking the COP until thread initialization is complete unless dual-core /* Delay waking the COP until thread initialization is complete unless dual-core
support is not enabled in which case the cop_main function does not perform support is not enabled in which case the cop_main function does not perform
@ -320,6 +323,24 @@ cop_init:
beq 1b beq 1b
#endif #endif
/* Set up stack for IRQ mode */
msr cpsr_c, #0x92 /* IRQ disabled, FIQ enabled */
ldr sp, =cop_irq_stack
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1 /* IRQ/FIQ disabled */
ldr sp, =cop_fiq_stack
/* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3 /* IRQ/FIQ disabled */
ldr sp, =cop_irq_stack
msr cpsr_c, #0xd7 /* IRQ/FIQ disabled */
ldr sp, =cop_irq_stack
msr cpsr_c, #0xdb /* IRQ/FIQ disabled */
ldr sp, =cop_irq_stack
/* Switch to sys mode */
msr cpsr_c, #0xdf
/* Set up idle stack for COP and munge it with 0xdeadbeef */ /* Set up idle stack for COP and munge it with 0xdeadbeef */
ldr sp, =cop_idlestackend ldr sp, =cop_idlestackend
ldr r2, =cop_idlestackbegin ldr r2, =cop_idlestackbegin
@ -329,22 +350,6 @@ cop_init:
strhi r4, [r2], #4 strhi r4, [r2], #4
bhi 2b bhi 2b
/* Set up stack for IRQ mode */
msr cpsr_c, #0x92 /* IRQ disabled, FIQ enabled */
ldr sp, =cop_irq_stack
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1 /* IRQ/FIQ disabled */
ldr sp, =cop_fiq_stack
/* Let abort and undefined modes use IRQ stack */
msr cpsr_c, #0xd7 /* IRQ/FIQ disabled */
ldr sp, =cop_irq_stack
msr cpsr_c, #0xdb /* IRQ/FIQ disabled */
ldr sp, =cop_irq_stack
/* Switch back to supervisor mode */
msr cpsr_c, #0xd3
/* Run cop_main() in apps/main.c */ /* Run cop_main() in apps/main.c */
ldr pc, =cop_main ldr pc, =cop_main
@ -383,12 +388,15 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
exception being thrown. Perhaps make it illegal and call UIE? exception being thrown. Make it illegal and call UIE.
*/ */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4
mov r1, #1 mov r1, #1

View file

@ -239,6 +239,20 @@ start_stub_end:
strhi r0, [r1], #4 strhi r0, [r1], #4
bhi 1b bhi 1b
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2 /* IRQ/FIQ disabled */
ldr sp, =irq_stack
/* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3
ldr sp, =irq_stack
msr cpsr_c, #0xd7 /* IRQ/FIQ disabled */
ldr sp, =irq_stack
msr cpsr_c, #0xdb /* IRQ/FIQ disabled */
ldr sp, =irq_stack
/* Switch back to sys mode */
msr cpsr_c, #0xdf
/* Set up some stack and munge it with 0xdeadbeef */ /* Set up some stack and munge it with 0xdeadbeef */
ldr r0, =0xdeadbeef ldr r0, =0xdeadbeef
ldr r1, =stackbegin ldr r1, =stackbegin
@ -248,18 +262,6 @@ start_stub_end:
strhi r0, [r1], #4 strhi r0, [r1], #4
bhi 1b bhi 1b
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2 /* IRQ/FIQ disabled */
ldr sp, =irq_stack
/* Let abort and undefined modes use IRQ stack */
msr cpsr_c, #0xd7 /* IRQ/FIQ disabled */
ldr sp, =irq_stack
msr cpsr_c, #0xdb /* IRQ/FIQ disabled */
ldr sp, =irq_stack
/* Switch back to supervisor mode */
msr cpsr_c, #0xd3
/* execute the loader - this will load an image to 0x10000000 */ /* execute the loader - this will load an image to 0x10000000 */
ldr r0, =main ldr r0, =main
mov lr, pc mov lr, pc
@ -335,12 +337,15 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
exception being thrown. Perhaps make it illegal and call UIE? exception being thrown. Make it illegal and call UIE.
*/ */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4
mov r1, #1 mov r1, #1

View file

@ -100,6 +100,25 @@ newstart:
strhi r4, [r2], #4 strhi r4, [r2], #4
bhi 1b bhi 1b
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2
ldr sp, =irq_stack
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1
ldr sp, =fiq_stack
/* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3
ldr sp, =irq_stack
msr cpsr_c, #0xd7
ldr sp, =irq_stack
msr cpsr_c, #0xdb
ldr sp, =irq_stack
/* Switch to sys mode */
msr cpsr_c, #0xdf
/* Set up some stack and munge it with 0xdeadbeef */ /* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend ldr sp, =stackend
ldr r2, =stackbegin ldr r2, =stackbegin
@ -109,22 +128,6 @@ newstart:
strhi r3, [r2], #4 strhi r3, [r2], #4
bhi 1b bhi 1b
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2
ldr sp, =irq_stack
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1
ldr sp, =fiq_stack
/* Let abort and undefined modes use IRQ stack */
msr cpsr_c, #0xd7
ldr sp, =irq_stack
msr cpsr_c, #0xdb
ldr sp, =irq_stack
/* Switch back to supervisor mode */
msr cpsr_c, #0xd3
ldr ip, =main @ make sure we are using the virtual address ldr ip, =main @ make sure we are using the virtual address
bx ip bx ip
@ -142,11 +145,13 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
* exception being thrown. Perhaps make it illegal and call UIE? */ * exception being thrown. Make it illegal and call UIE. */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4
@ -165,5 +170,4 @@ irq_stack:
/* 256 words of FIQ stack */ /* 256 words of FIQ stack */
.space 256*4 .space 256*4
fiq_stack: fiq_stack:
end: end:

View file

@ -126,15 +126,6 @@ remap:
strhi r4, [r2], #4 strhi r4, [r2], #4
bhi 1b bhi 1b
/* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend
ldr r2, =stackbegin
ldr r3, =0xdeadbeef
1:
cmp sp, r2
strhi r3, [r2], #4
bhi 1b
/* Set up stack for IRQ mode */ /* Set up stack for IRQ mode */
msr cpsr_c, #0xd2 msr cpsr_c, #0xd2
ldr sp, =irq_stack ldr sp, =irq_stack
@ -143,14 +134,25 @@ remap:
msr cpsr_c, #0xd1 msr cpsr_c, #0xd1
ldr sp, =fiq_stack ldr sp, =fiq_stack
/* Let abort and undefined modes use IRQ stack */ /* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3
ldr sp, =irq_stack
msr cpsr_c, #0xd7 msr cpsr_c, #0xd7
ldr sp, =irq_stack ldr sp, =irq_stack
msr cpsr_c, #0xdb msr cpsr_c, #0xdb
ldr sp, =irq_stack ldr sp, =irq_stack
/* Switch back to supervisor mode */ /* Switch to sys mode */
msr cpsr_c, #0xd3 msr cpsr_c, #0xdf
/* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend
ldr r2, =stackbegin
ldr r3, =0xdeadbeef
1:
cmp sp, r2
strhi r3, [r2], #4
bhi 1b
/* Jump to main */ /* Jump to main */
mov r0, r6 mov r0, r6
@ -173,11 +175,13 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
* exception being thrown. Perhaps make it illegal and call UIE? */ * exception being thrown. Make it illegal and call UIE. */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4
@ -196,5 +200,4 @@ irq_stack:
/* 256 words of FIQ stack */ /* 256 words of FIQ stack */
.space 256*4 .space 256*4
fiq_stack: fiq_stack:
end: end:

View file

@ -253,15 +253,6 @@ remap_end:
strhi r4, [r2], #4 strhi r4, [r2], #4
bhi 1b bhi 1b
/* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend
ldr r2, =stackbegin
ldr r3, =0xdeadbeef
1:
cmp sp, r2
strhi r3, [r2], #4
bhi 1b
/* Set up stack for IRQ mode */ /* Set up stack for IRQ mode */
msr cpsr_c, #0xd2 msr cpsr_c, #0xd2
ldr sp, =irq_stack ldr sp, =irq_stack
@ -270,14 +261,25 @@ remap_end:
msr cpsr_c, #0xd1 msr cpsr_c, #0xd1
ldr sp, =fiq_stack ldr sp, =fiq_stack
/* Let abort and undefined modes use IRQ stack */ /* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3
ldr sp, =irq_stack
msr cpsr_c, #0xd7 msr cpsr_c, #0xd7
ldr sp, =irq_stack ldr sp, =irq_stack
msr cpsr_c, #0xdb msr cpsr_c, #0xdb
ldr sp, =irq_stack ldr sp, =irq_stack
/* Switch back to supervisor mode */ /* Switch to sys mode */
msr cpsr_c, #0xd3 msr cpsr_c, #0xdf
/* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend
ldr r2, =stackbegin
ldr r3, =0xdeadbeef
1:
cmp sp, r2
strhi r3, [r2], #4
bhi 1b
#ifndef BOOTLOADER #ifndef BOOTLOADER
/* Enable access to VFP */ /* Enable access to VFP */
@ -334,11 +336,13 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
* exception being thrown. Perhaps make it illegal and call UIE? */ * exception being thrown. Make it illegal and call UIE. */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4

View file

@ -115,6 +115,24 @@ start:
strhi r4, [r2], #4 strhi r4, [r2], #4
bhi 1b bhi 1b
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2
ldr sp, =irq_stack
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1
ldr sp, =fiq_stack
/* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3
ldr sp =irq_stack
msr cpsr_c, #0xd7
ldr sp, =irq_stack
msr cpsr_c, #0xdb
ldr sp, =irq_stack
/* Switch to sys mode */
msr cpsr_c, #0xdf
/* Set up some stack and munge it with 0xdeadbeef */ /* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend ldr sp, =stackend
mov r3, sp mov r3, sp
@ -125,21 +143,6 @@ start:
strhi r4, [r2], #4 strhi r4, [r2], #4
bhi 1b bhi 1b
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2
ldr sp, =irq_stack
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1
ldr sp, =fiq_stack
/* Let abort and undefined modes use IRQ stack */
msr cpsr_c, #0xd7
ldr sp, =irq_stack
msr cpsr_c, #0xdb
ldr sp, =irq_stack
/* Switch to supervisor mode */
msr cpsr_c, #0xd3
ldr sp, =stackend
bl main bl main
/* main() should never return */ /* main() should never return */
@ -178,12 +181,14 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
exception being thrown. Perhaps make it illegal and call UIE? exception being thrown. Make it illegal and call UIE.
*/ */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4

View file

@ -156,6 +156,25 @@ newstart2:
bhi 1b bhi 1b
#endif #endif
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2
ldr sp, =_irqstackend
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1
ldr sp, =_fiqstackend
/* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3
ldr sp, =_irqstackend
msr cpsr_c, #0xd7
ldr sp, =_irqstackend
msr cpsr_c, #0xdb
ldr sp, =_irqstackend
/* Switch to sys mode */
msr cpsr_c, #0xdf
/* Set up some stack and munge it with 0xdeadbeef */ /* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend ldr sp, =stackend
ldr r2, =stackbegin ldr r2, =stackbegin
@ -165,22 +184,6 @@ newstart2:
strhi r3, [r2], #4 strhi r3, [r2], #4
bhi 1b bhi 1b
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2
ldr sp, =_irqstackend
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1
ldr sp, =_fiqstackend
/* Let abort and undefined modes use IRQ stack */
msr cpsr_c, #0xd7
ldr sp, =_irqstackend
msr cpsr_c, #0xdb
ldr sp, =_irqstackend
/* Switch back to supervisor mode */
msr cpsr_c, #0xd3
bl main bl main
@ -196,12 +199,6 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software
* exception being thrown. Perhaps make it illegal and call UIE? */
software_int_handler:
reserved_handler:
movs pc, lr
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4
mov r1, #1 mov r1, #1
@ -211,3 +208,11 @@ data_abort_handler:
sub r0, lr, #8 sub r0, lr, #8
mov r1, #2 mov r1, #2
b UIE b UIE
/* We run sys mode most of the time, and should never see a software
* exception being thrown. Make it illegal and call UIE */
software_int_handler:
reserved_handler:
sub r0, lr, #4
mov r1, #5
b UIE

View file

@ -528,6 +528,24 @@ bsszero:
strhi r4, [r2], #4 strhi r4, [r2], #4
bhi bsszero bhi bsszero
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2
ldr sp, =irq_stack
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1
ldr sp, =fiq_stack
/* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3
ldr sp, =irq_stack
msr cpsr_c, #0xd7
ldr sp, =irq_stack
msr cpsr_c, #0xdb
ldr sp, =irq_stack
/* Switch to sys mode */
msr cpsr_c, #0xdf
/* Set up some stack and munge it with 0xdeadbeef */ /* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend ldr sp, =stackend
mov r3, sp mov r3, sp
@ -538,22 +556,6 @@ stackmunge:
strhi r4, [r2], #4 strhi r4, [r2], #4
bhi stackmunge bhi stackmunge
/* Set up stack for IRQ mode */
msr cpsr_c, #0xd2
ldr sp, =irq_stack
/* Set up stack for FIQ mode */
msr cpsr_c, #0xd1
ldr sp, =fiq_stack
/* Let abort and undefined modes use IRQ stack */
msr cpsr_c, #0xd7
ldr sp, =irq_stack
msr cpsr_c, #0xdb
ldr sp, =irq_stack
/* Switch to supervisor mode */
msr cpsr_c, #0xd3
ldr sp, =stackend
/* Start the main function */ /* Start the main function */
ldr lr, =vectors ldr lr, =vectors
ldr pc, =main ldr pc, =main
@ -573,12 +575,14 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
exception being thrown. Perhaps make it illegal and call UIE? exception being thrown. Make it illegal and call UIE.
*/ */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4
@ -749,4 +753,3 @@ irq_stack:
/* 256 words of FIQ stack */ /* 256 words of FIQ stack */
.space 256*4 .space 256*4
fiq_stack: fiq_stack:

View file

@ -465,15 +465,6 @@ start_loc:
bhi 1b bhi 1b
#endif #endif
/* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend
ldr r2, =stackbegin
ldr r3, =0xdeadbeef
1:
cmp sp, r2
strhi r3, [r2], #4
bhi 1b
/* Set up stack for IRQ mode */ /* Set up stack for IRQ mode */
msr cpsr_c, #0xd2 msr cpsr_c, #0xd2
ldr sp, =_irqstackend ldr sp, =_irqstackend
@ -482,14 +473,25 @@ start_loc:
msr cpsr_c, #0xd1 msr cpsr_c, #0xd1
ldr sp, =_fiqstackend ldr sp, =_fiqstackend
/* Let abort and undefined modes use IRQ stack */ /* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3
ldr sp, =_irqstackend
msr cpsr_c, #0xd7 msr cpsr_c, #0xd7
ldr sp, =_irqstackend ldr sp, =_irqstackend
msr cpsr_c, #0xdb msr cpsr_c, #0xdb
ldr sp, =_irqstackend ldr sp, =_irqstackend
/* Switch back to supervisor mode */ /* Switch to sys mode */
msr cpsr_c, #0xd3 msr cpsr_c, #0xdf
/* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend
ldr r2, =stackbegin
ldr r3, =0xdeadbeef
1:
cmp sp, r2
strhi r3, [r2], #4
bhi 1b
// if we did not switch remap on, device // if we did not switch remap on, device
// would crash when MENU is pressed, // would crash when MENU is pressed,
@ -518,11 +520,13 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
* exception being thrown. Perhaps make it illegal and call UIE? */ * exception being thrown. Make it illegal and call UIE. */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4

View file

@ -150,15 +150,6 @@ start_loc:
bhi 1b bhi 1b
#endif #endif
/* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend
ldr r2, =stackbegin
ldr r3, =0xdeadbeef
1:
cmp sp, r2
strhi r3, [r2], #4
bhi 1b
/* Set up stack for IRQ mode */ /* Set up stack for IRQ mode */
msr cpsr_c, #0xd2 msr cpsr_c, #0xd2
ldr sp, =_irqstackend ldr sp, =_irqstackend
@ -167,14 +158,25 @@ start_loc:
msr cpsr_c, #0xd1 msr cpsr_c, #0xd1
ldr sp, =_fiqstackend ldr sp, =_fiqstackend
/* Let abort and undefined modes use IRQ stack */ /* Let svc, abort and undefined modes use irq stack */
msr cpsr_c, #0xd3
ldr sp, =_irqstackend
msr cpsr_c, #0xd7 msr cpsr_c, #0xd7
ldr sp, =_irqstackend ldr sp, =_irqstackend
msr cpsr_c, #0xdb msr cpsr_c, #0xdb
ldr sp, =_irqstackend ldr sp, =_irqstackend
/* Switch back to supervisor mode */ /* Switch to sys mode */
msr cpsr_c, #0xd3 msr cpsr_c, #0xdf
/* Set up some stack and munge it with 0xdeadbeef */
ldr sp, =stackend
ldr r2, =stackbegin
ldr r3, =0xdeadbeef
1:
cmp sp, r2
strhi r3, [r2], #4
bhi 1b
bl main bl main
@ -190,11 +192,13 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
* exception being thrown. Perhaps make it illegal and call UIE? */ * exception being thrown. Make it illegal and call UIE. */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4

View file

@ -29,7 +29,8 @@ static const char* const uiename[] = {
"Undefined instruction", "Undefined instruction",
"Prefetch abort", "Prefetch abort",
"Data abort", "Data abort",
"Divide by zero" "Divide by zero",
"SWI"
}; };
/* Unexpected Interrupt or Exception handler. Currently only deals with /* Unexpected Interrupt or Exception handler. Currently only deals with

View file

@ -141,16 +141,16 @@ copied_start:
ldr r11, =dma_play_data ldr r11, =dma_play_data
#endif #endif
/* Let abort and undefined modes use IRQ stack */ /* Let svc, abort and undefined modes use irq stack */
mov r0,#0xd7 msr cpsr, #0xd3
msr cpsr, r0
ldr sp, =irq_stack ldr sp, =irq_stack
mov r0,#0xdb msr cpsr, #0xd7
msr cpsr, r0 ldr sp, =irq_stack
msr cpsr, #0xdb
ldr sp, =irq_stack ldr sp, =irq_stack
/* Switch to supervisor mode */ /* Switch to sys mode */
mov r0,#0xd3 mov r0,#0xdf
msr cpsr, r0 msr cpsr, r0
ldr sp, =stackend ldr sp, =stackend
@ -222,12 +222,14 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
exception being thrown. Perhaps make it illegal and call UIE? exception being thrown. Make it illegal and call UIE.
*/ */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4
@ -255,4 +257,3 @@ irq_stack:
/* 256 words of FIQ stack */ /* 256 words of FIQ stack */
.space 256*4 .space 256*4
fiq_stack: fiq_stack:

View file

@ -120,17 +120,16 @@ copied_start:
ldr r11, =dma_play_data ldr r11, =dma_play_data
#endif #endif
/* Let abort and undefined modes use IRQ stack */ /* Let svc, abort and undefined modes use irq stack */
mov r0,#0xd7 msr cpsr, #0xd3
msr cpsr, r0
ldr sp, =irq_stack ldr sp, =irq_stack
mov r0,#0xdb msr cpsr, #0xd7
msr cpsr, r0 ldr sp, =irq_stack
msr cpsr, #0xdb
ldr sp, =irq_stack ldr sp, =irq_stack
/* Switch to supervisor mode */ /* Switch to sys mode */
mov r0,#0xd3 msr cpsr, #0xdf
msr cpsr, r0
ldr sp, =stackend ldr sp, =stackend
/* Enable MMU & caches. At present this is just doing what the OF does. /* Enable MMU & caches. At present this is just doing what the OF does.
@ -293,12 +292,14 @@ undef_instr_handler:
mov r1, #0 mov r1, #0
b UIE b UIE
/* We run supervisor mode most of the time, and should never see a software /* We run sys mode most of the time, and should never see a software
exception being thrown. Perhaps make it illegal and call UIE? exception being thrown. Make it illegal and call UIE.
*/ */
software_int_handler: software_int_handler:
reserved_handler: reserved_handler:
movs pc, lr sub r0, lr, #4
mov r1, #4
b UIE
prefetch_abort_handler: prefetch_abort_handler:
sub r0, lr, #4 sub r0, lr, #4

View file

@ -169,23 +169,25 @@ _start:
msr cpsr_c, #0xd2 /* Go into irq state */ msr cpsr_c, #0xd2 /* Go into irq state */
ldr sp, =_irq_stack_start /* set the irq stack pointer */ ldr sp, =_irq_stack_start /* set the irq stack pointer */
/* This should not be needed, but set the stack location for abort and /* SVC, ABT, UNDEF share irq stack */
* undefined to at least a known stack location (IRQ) msr cpsr_c, #0xd3 /* Go into svc state */
*/ ldr sp, =_irq_stack_start /* set svc stack pointer */
msr cpsr_c, #0xd7 /* Go into abort state */
msr cpsr_c, #0xd7 /* Go into abort state */
ldr sp, =_irq_stack_start /* set the stack pointer */ ldr sp, =_irq_stack_start /* set the stack pointer */
msr cpsr_c, #0xdb /* Go into undefined state */ msr cpsr_c, #0xdb /* Go into undefined state */
ldr sp, =_irq_stack_start /* set the stack pointer */ ldr sp, =_irq_stack_start /* set the stack pointer */
/* Initialize program stack */ /* Initialize program stack */
msr cpsr_c, #0xd3 /* Go into supervisor state */ msr cpsr_c, #0xdf /* Go into sys state */
ldr r0, =0xDEADBEEF /* Can be taken out; left for clarity */ ldr r0, =0xDEADBEEF /* Can be taken out; left for clarity */
ldr r1, =_pro_stack_end /* Stack counts backwards, so end is first*/ ldr r1, =_pro_stack_end /* Stack counts backwards, so end is first*/
ldr r2, =_pro_stack_start ldr r2, =_pro_stack_start
bl _init_section bl _init_section
ldr sp, =_pro_stack_start /* set the supervisor stack pointer */ ldr sp, =_pro_stack_start /* set the sys stack pointer */
/* MMU initialization */ /* MMU initialization */
bl ttb_init bl ttb_init
@ -298,6 +300,8 @@ _delay_cycles:
* 0: Undefined Instruction * * 0: Undefined Instruction *
* 1: Prefetch Abort * * 1: Prefetch Abort *
* 2: Data Abort * * 2: Data Abort *
* 3: DIV0 *
* 4: SWI *
* The exceptions return operations are documented in section A2.6 of the * * The exceptions return operations are documented in section A2.6 of the *
* ARM Architecture Reference Manual. * * ARM Architecture Reference Manual. *
******************************************************************************/ ******************************************************************************/
@ -309,11 +313,12 @@ _undefined_instruction:
bl UIE bl UIE
/* A2.6.4: Software Interrupt exception - These should not happen in Rockbox, /* A2.6.4: Software Interrupt exception - These should not happen in Rockbox,
* but for now leave this as a placeholder and continue with the program. * make it illegal
* LR=PC of next instruction.
*/ */
_software_interrupt: _software_interrupt:
mov pc, lr sub r0, lr, #4
mov r1, #4
bl UIE
/* A2.6.5 Prefetch Abort - This is also the BKPT instruction since this is a /* A2.6.5 Prefetch Abort - This is also the BKPT instruction since this is a
* v5 target. Pass it on to UIE since it is not currently used. * v5 target. Pass it on to UIE since it is not currently used.