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_IRQ 0x12
|
||||
#define ARM_MODE_SVC 0x13
|
||||
#define ARM_MODE_UND 0x1b
|
||||
#define ARM_MODE_SYS 0x1f
|
||||
|
||||
#define I_BIT 0x80
|
||||
#define F_BIT 0x40
|
||||
|
|
@ -163,6 +165,15 @@ _stack_init:
|
|||
* 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 */
|
||||
msr CPSR_c, #ARM_MODE_ABT | I_BIT | F_BIT /* Enter in Mode Abort
|
||||
* and disable IRQ (Interrupt) and FIQ (Fast Interrupt)
|
||||
|
|
@ -172,26 +183,27 @@ _stack_init:
|
|||
* (end of IRAM 1)
|
||||
*/
|
||||
|
||||
/* put r0 with value of the new address for next Stack */
|
||||
sub r0, r0, r1 /* r0 = r0 - r1 --> r0 = (end of IRAM 1) -
|
||||
* (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
|
||||
/*- Set up Abort Mode and set ABT Mode Stack */
|
||||
msr CPSR_c, #ARM_MODE_UND | I_BIT | F_BIT /* Enter in Mode Undefined
|
||||
* and disable IRQ (Interrupt) and FIQ (Fast Interrupt)
|
||||
*/
|
||||
|
||||
mov sp, r0 /* sp (Interrupt Mode Stack Pointer) =
|
||||
* TOP_OF_MEMORY (end of IRAM 1) - (ABT_STACK_SIZE)
|
||||
mov sp, r0 /* sp (ABT Mode Stack Pointer) = TOP_OF_MEMORY
|
||||
* (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
|
||||
* Stack (Supervisor Mode)
|
||||
* Stack (Sys Mode)
|
||||
*/
|
||||
|
||||
/*- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack */
|
||||
msr CPSR_c, #ARM_MODE_SVC | F_BIT
|
||||
/*- Set up Sys Mode and set Sys Mode Stack */
|
||||
msr CPSR_c, #ARM_MODE_SYS | F_BIT /* Enter in Sys Mode
|
||||
* and enable IRQ (Interrupt) and disable FIQ (Fast Interrupt)
|
||||
*/
|
||||
mov sp, r0
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ start:
|
|||
.equ CACHE_ENAB, 0x1
|
||||
#endif
|
||||
|
||||
msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ */
|
||||
msr cpsr_c, #0xdf /* enter sys mode, disable IRQ */
|
||||
#ifndef E200R_INSTALLER
|
||||
/* 1 - Copy the bootloader to IRAM */
|
||||
/* get the high part of our execute address */
|
||||
|
|
|
|||
|
|
@ -262,17 +262,6 @@ cpu_init:
|
|||
strhi r4, [r2], #4
|
||||
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
|
||||
/* Set up idle stack and munge it with 0xdeadbeef */
|
||||
ldr r2, =cpu_idlestackbegin
|
||||
|
|
@ -289,14 +278,28 @@ cpu_init:
|
|||
/* Set up stack for FIQ mode */
|
||||
msr cpsr_c, #0xd1 /* IRQ/FIQ disabled */
|
||||
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 */
|
||||
ldr sp, =irq_stack
|
||||
msr cpsr_c, #0xdb /* IRQ/FIQ disabled */
|
||||
ldr sp, =irq_stack
|
||||
|
||||
/* Switch back to supervisor mode */
|
||||
msr cpsr_c, #0xd3
|
||||
/* Switch to sys mode */
|
||||
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
|
||||
support is not enabled in which case the cop_main function does not perform
|
||||
|
|
@ -320,6 +323,24 @@ cop_init:
|
|||
beq 1b
|
||||
#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 */
|
||||
ldr sp, =cop_idlestackend
|
||||
ldr r2, =cop_idlestackbegin
|
||||
|
|
@ -328,23 +349,7 @@ cop_init:
|
|||
cmp sp, r2
|
||||
strhi r4, [r2], #4
|
||||
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 */
|
||||
ldr pc, =cop_main
|
||||
|
||||
|
|
@ -383,12 +388,15 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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?
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
mov r1, #1
|
||||
|
|
|
|||
|
|
@ -239,6 +239,20 @@ start_stub_end:
|
|||
strhi r0, [r1], #4
|
||||
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 */
|
||||
ldr r0, =0xdeadbeef
|
||||
ldr r1, =stackbegin
|
||||
|
|
@ -248,18 +262,6 @@ start_stub_end:
|
|||
strhi r0, [r1], #4
|
||||
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 */
|
||||
ldr r0, =main
|
||||
mov lr, pc
|
||||
|
|
@ -335,12 +337,15 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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?
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
mov r1, #1
|
||||
|
|
|
|||
|
|
@ -100,15 +100,6 @@ newstart:
|
|||
strhi r4, [r2], #4
|
||||
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 */
|
||||
msr cpsr_c, #0xd2
|
||||
ldr sp, =irq_stack
|
||||
|
|
@ -117,14 +108,26 @@ newstart:
|
|||
msr cpsr_c, #0xd1
|
||||
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
|
||||
ldr sp, =irq_stack
|
||||
msr cpsr_c, #0xdb
|
||||
ldr sp, =irq_stack
|
||||
|
||||
/* Switch back to supervisor mode */
|
||||
msr cpsr_c, #0xd3
|
||||
/* Switch to sys mode */
|
||||
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
|
||||
|
||||
ldr ip, =main @ make sure we are using the virtual address
|
||||
bx ip
|
||||
|
||||
|
|
@ -142,11 +145,13 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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? */
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
|
|
@ -165,5 +170,4 @@ irq_stack:
|
|||
/* 256 words of FIQ stack */
|
||||
.space 256*4
|
||||
fiq_stack:
|
||||
|
||||
end:
|
||||
|
|
|
|||
|
|
@ -126,15 +126,6 @@ remap:
|
|||
strhi r4, [r2], #4
|
||||
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 */
|
||||
msr cpsr_c, #0xd2
|
||||
ldr sp, =irq_stack
|
||||
|
|
@ -143,14 +134,25 @@ remap:
|
|||
msr cpsr_c, #0xd1
|
||||
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
|
||||
ldr sp, =irq_stack
|
||||
msr cpsr_c, #0xdb
|
||||
ldr sp, =irq_stack
|
||||
|
||||
/* Switch back to supervisor mode */
|
||||
msr cpsr_c, #0xd3
|
||||
/* Switch to sys mode */
|
||||
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 */
|
||||
mov r0, r6
|
||||
|
|
@ -173,11 +175,13 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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? */
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
|
|
@ -196,5 +200,4 @@ irq_stack:
|
|||
/* 256 words of FIQ stack */
|
||||
.space 256*4
|
||||
fiq_stack:
|
||||
|
||||
end:
|
||||
|
|
|
|||
|
|
@ -253,15 +253,6 @@ remap_end:
|
|||
strhi r4, [r2], #4
|
||||
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 */
|
||||
msr cpsr_c, #0xd2
|
||||
ldr sp, =irq_stack
|
||||
|
|
@ -270,14 +261,25 @@ remap_end:
|
|||
msr cpsr_c, #0xd1
|
||||
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
|
||||
ldr sp, =irq_stack
|
||||
msr cpsr_c, #0xdb
|
||||
ldr sp, =irq_stack
|
||||
|
||||
/* Switch back to supervisor mode */
|
||||
msr cpsr_c, #0xd3
|
||||
/* Switch to sys mode */
|
||||
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
|
||||
/* Enable access to VFP */
|
||||
|
|
@ -334,11 +336,13 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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? */
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
|
|
|
|||
|
|
@ -115,6 +115,24 @@ start:
|
|||
strhi r4, [r2], #4
|
||||
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 */
|
||||
ldr sp, =stackend
|
||||
mov r3, sp
|
||||
|
|
@ -125,21 +143,6 @@ start:
|
|||
strhi r4, [r2], #4
|
||||
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
|
||||
/* main() should never return */
|
||||
|
||||
|
|
@ -178,12 +181,14 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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?
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
|
|
|
|||
|
|
@ -156,6 +156,25 @@ newstart2:
|
|||
bhi 1b
|
||||
#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 */
|
||||
ldr sp, =stackend
|
||||
ldr r2, =stackbegin
|
||||
|
|
@ -165,22 +184,6 @@ newstart2:
|
|||
strhi r3, [r2], #4
|
||||
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
|
||||
|
||||
|
|
@ -196,12 +199,6 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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:
|
||||
sub r0, lr, #4
|
||||
mov r1, #1
|
||||
|
|
@ -211,3 +208,11 @@ data_abort_handler:
|
|||
sub r0, lr, #8
|
||||
mov r1, #2
|
||||
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
|
||||
|
|
|
|||
|
|
@ -527,7 +527,25 @@ bsszero:
|
|||
cmp r3, r2
|
||||
strhi r4, [r2], #4
|
||||
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 */
|
||||
ldr sp, =stackend
|
||||
mov r3, sp
|
||||
|
|
@ -538,22 +556,6 @@ stackmunge:
|
|||
strhi r4, [r2], #4
|
||||
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 */
|
||||
ldr lr, =vectors
|
||||
ldr pc, =main
|
||||
|
|
@ -573,12 +575,14 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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?
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
|
|
@ -749,4 +753,3 @@ irq_stack:
|
|||
/* 256 words of FIQ stack */
|
||||
.space 256*4
|
||||
fiq_stack:
|
||||
|
||||
|
|
|
|||
|
|
@ -465,15 +465,6 @@ start_loc:
|
|||
bhi 1b
|
||||
#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 */
|
||||
msr cpsr_c, #0xd2
|
||||
ldr sp, =_irqstackend
|
||||
|
|
@ -482,14 +473,25 @@ start_loc:
|
|||
msr cpsr_c, #0xd1
|
||||
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
|
||||
ldr sp, =_irqstackend
|
||||
msr cpsr_c, #0xdb
|
||||
ldr sp, =_irqstackend
|
||||
|
||||
/* Switch back to supervisor mode */
|
||||
msr cpsr_c, #0xd3
|
||||
/* Switch to sys mode */
|
||||
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
|
||||
// would crash when MENU is pressed,
|
||||
|
|
@ -518,11 +520,13 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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? */
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
|
|
|
|||
|
|
@ -150,15 +150,6 @@ start_loc:
|
|||
bhi 1b
|
||||
#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 */
|
||||
msr cpsr_c, #0xd2
|
||||
ldr sp, =_irqstackend
|
||||
|
|
@ -167,14 +158,25 @@ start_loc:
|
|||
msr cpsr_c, #0xd1
|
||||
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
|
||||
ldr sp, =_irqstackend
|
||||
msr cpsr_c, #0xdb
|
||||
ldr sp, =_irqstackend
|
||||
|
||||
/* Switch back to supervisor mode */
|
||||
msr cpsr_c, #0xd3
|
||||
/* Switch to sys mode */
|
||||
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
|
||||
|
||||
|
|
@ -190,11 +192,13 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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? */
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
|
|
|
|||
|
|
@ -29,7 +29,8 @@ static const char* const uiename[] = {
|
|||
"Undefined instruction",
|
||||
"Prefetch abort",
|
||||
"Data abort",
|
||||
"Divide by zero"
|
||||
"Divide by zero",
|
||||
"SWI"
|
||||
};
|
||||
|
||||
/* Unexpected Interrupt or Exception handler. Currently only deals with
|
||||
|
|
|
|||
|
|
@ -141,16 +141,16 @@ copied_start:
|
|||
ldr r11, =dma_play_data
|
||||
#endif
|
||||
|
||||
/* Let abort and undefined modes use IRQ stack */
|
||||
mov r0,#0xd7
|
||||
msr cpsr, r0
|
||||
/* Let svc, abort and undefined modes use irq stack */
|
||||
msr cpsr, #0xd3
|
||||
ldr sp, =irq_stack
|
||||
mov r0,#0xdb
|
||||
msr cpsr, r0
|
||||
msr cpsr, #0xd7
|
||||
ldr sp, =irq_stack
|
||||
msr cpsr, #0xdb
|
||||
ldr sp, =irq_stack
|
||||
|
||||
/* Switch to supervisor mode */
|
||||
mov r0,#0xd3
|
||||
/* Switch to sys mode */
|
||||
mov r0,#0xdf
|
||||
msr cpsr, r0
|
||||
ldr sp, =stackend
|
||||
|
||||
|
|
@ -222,12 +222,14 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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?
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
|
|
@ -255,4 +257,3 @@ irq_stack:
|
|||
/* 256 words of FIQ stack */
|
||||
.space 256*4
|
||||
fiq_stack:
|
||||
|
||||
|
|
|
|||
|
|
@ -120,17 +120,16 @@ copied_start:
|
|||
ldr r11, =dma_play_data
|
||||
#endif
|
||||
|
||||
/* Let abort and undefined modes use IRQ stack */
|
||||
mov r0,#0xd7
|
||||
msr cpsr, r0
|
||||
/* Let svc, abort and undefined modes use irq stack */
|
||||
msr cpsr, #0xd3
|
||||
ldr sp, =irq_stack
|
||||
mov r0,#0xdb
|
||||
msr cpsr, r0
|
||||
msr cpsr, #0xd7
|
||||
ldr sp, =irq_stack
|
||||
msr cpsr, #0xdb
|
||||
ldr sp, =irq_stack
|
||||
|
||||
/* Switch to supervisor mode */
|
||||
mov r0,#0xd3
|
||||
msr cpsr, r0
|
||||
/* Switch to sys mode */
|
||||
msr cpsr, #0xdf
|
||||
ldr sp, =stackend
|
||||
|
||||
/* Enable MMU & caches. At present this is just doing what the OF does.
|
||||
|
|
@ -293,12 +292,14 @@ undef_instr_handler:
|
|||
mov r1, #0
|
||||
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?
|
||||
/* 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:
|
||||
movs pc, lr
|
||||
sub r0, lr, #4
|
||||
mov r1, #4
|
||||
b UIE
|
||||
|
||||
prefetch_abort_handler:
|
||||
sub r0, lr, #4
|
||||
|
|
|
|||
|
|
@ -169,23 +169,25 @@ _start:
|
|||
msr cpsr_c, #0xd2 /* Go into irq state */
|
||||
ldr sp, =_irq_stack_start /* set the irq stack pointer */
|
||||
|
||||
/* This should not be needed, but set the stack location for abort and
|
||||
* undefined to at least a known stack location (IRQ)
|
||||
*/
|
||||
msr cpsr_c, #0xd7 /* Go into abort state */
|
||||
/* SVC, ABT, UNDEF share irq stack */
|
||||
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 */
|
||||
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 */
|
||||
|
||||
/* 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 r1, =_pro_stack_end /* Stack counts backwards, so end is first*/
|
||||
ldr r2, =_pro_stack_start
|
||||
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 */
|
||||
bl ttb_init
|
||||
|
|
@ -298,6 +300,8 @@ _delay_cycles:
|
|||
* 0: Undefined Instruction *
|
||||
* 1: Prefetch Abort *
|
||||
* 2: Data Abort *
|
||||
* 3: DIV0 *
|
||||
* 4: SWI *
|
||||
* The exceptions return operations are documented in section A2.6 of the *
|
||||
* ARM Architecture Reference Manual. *
|
||||
******************************************************************************/
|
||||
|
|
@ -309,11 +313,12 @@ _undefined_instruction:
|
|||
bl UIE
|
||||
|
||||
/* 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.
|
||||
* LR=PC of next instruction.
|
||||
* make it illegal
|
||||
*/
|
||||
_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
|
||||
* v5 target. Pass it on to UIE since it is not currently used.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue