forked from Mirror/GodMode9
- rewrote the entrypoint detection code for clarity and size
- fixed a dumb bug during mpu setup
This commit is contained in:
parent
f179caaef3
commit
648275c097
@ -16,7 +16,7 @@ _start:
|
|||||||
mov r8, r0
|
mov r8, r0
|
||||||
mov r9, r1
|
mov r9, r1
|
||||||
mov r10, r2
|
mov r10, r2
|
||||||
mov r11, r3
|
@mov r11, r3 @ unnecessary for now
|
||||||
|
|
||||||
@ Clear bss
|
@ Clear bss
|
||||||
ldr r0, =__bss_start
|
ldr r0, =__bss_start
|
||||||
@ -92,10 +92,9 @@ _start:
|
|||||||
blo .LXRQ_Install
|
blo .LXRQ_Install
|
||||||
|
|
||||||
@ Enable caches / TCMs / select high exception vectors
|
@ Enable caches / TCMs / select high exception vectors
|
||||||
ldr r2, =(CR_MPU | CR_CACHES | CR_ITCM | CR_DTCM | CR_ALT_VECTORS)
|
ldr r1, =(CR_MPU | CR_CACHES | CR_ITCM | CR_DTCM | CR_ALT_VECTORS)
|
||||||
mrc p15, 0, r0, c1, c0, 0
|
mrc p15, 0, r0, c1, c0, 0
|
||||||
bic r0, r1
|
orr r0, r1
|
||||||
orr r0, r2
|
|
||||||
mcr p15, 0, r0, c1, c0, 0
|
mcr p15, 0, r0, c1, c0, 0
|
||||||
|
|
||||||
@ Switch to system mode, disable interrupts, setup application stack
|
@ Switch to system mode, disable interrupts, setup application stack
|
||||||
@ -103,63 +102,59 @@ _start:
|
|||||||
ldr sp, =__STACK_TOP
|
ldr sp, =__STACK_TOP
|
||||||
|
|
||||||
@ Check entrypoints
|
@ Check entrypoints
|
||||||
|
@ assume by default that the entrypoint
|
||||||
|
@ cant be detected and fix up if necessary
|
||||||
|
mov r0, #0
|
||||||
|
mov r1, #0
|
||||||
|
ldr r2, =ENTRY_UNKNOWN
|
||||||
|
|
||||||
@ b9s
|
@ returning from main will trigger a prefetch abort
|
||||||
|
mov lr, #0
|
||||||
|
|
||||||
|
@ B9S
|
||||||
|
@ if (R2 & 0xFFFF) == 0xBEEF
|
||||||
ldr r3, =0xBEEF
|
ldr r3, =0xBEEF
|
||||||
lsl r2, r10, #16
|
lsl r2, r10, #16
|
||||||
lsr r2, r2, #16
|
cmp r3, r2, lsr #16
|
||||||
cmp r2, r3
|
|
||||||
|
|
||||||
moveq r0, r8
|
moveq r0, r8
|
||||||
moveq r1, r9
|
moveq r1, r9
|
||||||
moveq r2, #(ENTRY_B9S)
|
ldreq r2, =ENTRY_B9S
|
||||||
beq .Lboot_main
|
ldreq pc, =main
|
||||||
|
|
||||||
@ ntrboot
|
@ ntrboot
|
||||||
ldr r4, =0x1FFFE00C
|
@ if ([0x1FFFE010] | [0x1FFFE014]) == 0
|
||||||
ldr r5, =0x1FFFE010
|
@ && ([0x1FFFE00C] & 0xFF00FF00) == 0x02000000
|
||||||
|
ldr r3, =0x1FFFE010
|
||||||
|
|
||||||
ldrd r6, r7, [r5]
|
ldrd r4, r5, [r3]
|
||||||
orr r6, r6, r7
|
orrs r4, r4, r5
|
||||||
cmp r6, #0
|
ldreq r4, [r3, #-4]
|
||||||
ldreqb r6, [r4, #1]
|
ldreq r5, =0xFF00FF00
|
||||||
ldreqb r7, [r4, #3]
|
andeq r4, r4, r5
|
||||||
cmpeq r6, #0
|
cmpeq r4, #0x02000000
|
||||||
cmpeq r7, #2
|
ldreq r2, =ENTRY_NTRBOOT
|
||||||
|
ldreq pc, =main
|
||||||
moveq r0, #0
|
|
||||||
moveq r1, #0
|
|
||||||
moveq r2, #(ENTRY_NTRBOOT)
|
|
||||||
beq .Lboot_main
|
|
||||||
|
|
||||||
@ nandboot
|
@ nandboot
|
||||||
ldrd r6, r7, [r5]
|
@ if ([0x1FFFE010] | [0x1FFFE014]) == 0
|
||||||
orr r6, r6, r7
|
@ && ([0x1FFFE00C] & 0xFF) == 0
|
||||||
cmp r6, #0
|
ldrd r4, r5, [r3]
|
||||||
beq .Lentrycheck_firmboot_end
|
orrs r4, r4, r5
|
||||||
ldrb r6, [r4, #0]
|
ldreqb r4, [r3, #-4]
|
||||||
cmp r6, #0
|
cmpeq r4, #0
|
||||||
moveq r0, #0
|
ldreq r2, =ENTRY_NANDBOOT
|
||||||
moveq r1, #0
|
|
||||||
moveq r2, #(ENTRY_NANDBOOT)
|
|
||||||
beq .Lboot_main
|
|
||||||
.Lentrycheck_firmboot_end:
|
|
||||||
|
|
||||||
@ Unknown
|
@ unconditionally branch into the main C function
|
||||||
mov r0, #0
|
@ if no entrypoint was detected
|
||||||
mov r1, #0
|
@ R2 will be ENTRY_UNKNOWN
|
||||||
mov r2, #(ENTRY_UNKNOWN)
|
|
||||||
|
|
||||||
|
|
||||||
.Lboot_main:
|
|
||||||
mov lr, #0
|
|
||||||
ldr pc, =main
|
ldr pc, =main
|
||||||
|
|
||||||
|
|
||||||
__mpu_regions:
|
__mpu_regions:
|
||||||
.word 0xFFFF001F @ FFFF0000 64k | bootrom (unprotected / protected)
|
.word 0xFFFF001F @ FFFF0000 64k | bootrom (unprotected / protected)
|
||||||
.word 0x3000801B @ 30008000 16k | dtcm
|
.word 0x3000801B @ 30008000 16k | dtcm
|
||||||
.word 0x01FF8035 @ 01FF8000 32k | itcm (+ mirrors)
|
.word 0x01FF801D @ 01FF8000 32k | itcm (+ mirrors)
|
||||||
.word 0x08000029 @ 08000000 2M | arm9 mem (O3DS / N3DS)
|
.word 0x08000029 @ 08000000 2M | arm9 mem (O3DS / N3DS)
|
||||||
.word 0x10000029 @ 10000000 2M | io mem (ARM9 / first 2MB)
|
.word 0x10000029 @ 10000000 2M | io mem (ARM9 / first 2MB)
|
||||||
.word 0x20000037 @ 20000000 256M | fcram (O3DS / N3DS)
|
.word 0x20000037 @ 20000000 256M | fcram (O3DS / N3DS)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user