mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 21:22:39 -05:00
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:
parent
9055915645
commit
bf056d5372
16 changed files with 298 additions and 233 deletions
|
|
@ -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
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
/*-----------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue