- rewrote the entrypoint detection code for clarity and size

- fixed a dumb bug during mpu setup
This commit is contained in:
Wolfvak 2019-05-26 20:26:11 -03:00 committed by d0k3
parent f179caaef3
commit 648275c097

View File

@ -16,7 +16,7 @@ _start:
mov r8, r0
mov r9, r1
mov r10, r2
mov r11, r3
@mov r11, r3 @ unnecessary for now
@ Clear bss
ldr r0, =__bss_start
@ -92,10 +92,9 @@ _start:
blo .LXRQ_Install
@ 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
bic r0, r1
orr r0, r2
orr r0, r1
mcr p15, 0, r0, c1, c0, 0
@ Switch to system mode, disable interrupts, setup application stack
@ -103,63 +102,59 @@ _start:
ldr sp, =__STACK_TOP
@ 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
lsl r2, r10, #16
lsr r2, r2, #16
cmp r2, r3
cmp r3, r2, lsr #16
moveq r0, r8
moveq r1, r9
moveq r2, #(ENTRY_B9S)
beq .Lboot_main
ldreq r2, =ENTRY_B9S
ldreq pc, =main
@ ntrboot
ldr r4, =0x1FFFE00C
ldr r5, =0x1FFFE010
@ if ([0x1FFFE010] | [0x1FFFE014]) == 0
@ && ([0x1FFFE00C] & 0xFF00FF00) == 0x02000000
ldr r3, =0x1FFFE010
ldrd r6, r7, [r5]
orr r6, r6, r7
cmp r6, #0
ldreqb r6, [r4, #1]
ldreqb r7, [r4, #3]
cmpeq r6, #0
cmpeq r7, #2
moveq r0, #0
moveq r1, #0
moveq r2, #(ENTRY_NTRBOOT)
beq .Lboot_main
ldrd r4, r5, [r3]
orrs r4, r4, r5
ldreq r4, [r3, #-4]
ldreq r5, =0xFF00FF00
andeq r4, r4, r5
cmpeq r4, #0x02000000
ldreq r2, =ENTRY_NTRBOOT
ldreq pc, =main
@ nandboot
ldrd r6, r7, [r5]
orr r6, r6, r7
cmp r6, #0
beq .Lentrycheck_firmboot_end
ldrb r6, [r4, #0]
cmp r6, #0
moveq r0, #0
moveq r1, #0
moveq r2, #(ENTRY_NANDBOOT)
beq .Lboot_main
.Lentrycheck_firmboot_end:
@ if ([0x1FFFE010] | [0x1FFFE014]) == 0
@ && ([0x1FFFE00C] & 0xFF) == 0
ldrd r4, r5, [r3]
orrs r4, r4, r5
ldreqb r4, [r3, #-4]
cmpeq r4, #0
ldreq r2, =ENTRY_NANDBOOT
@ Unknown
mov r0, #0
mov r1, #0
mov r2, #(ENTRY_UNKNOWN)
.Lboot_main:
mov lr, #0
@ unconditionally branch into the main C function
@ if no entrypoint was detected
@ R2 will be ENTRY_UNKNOWN
ldr pc, =main
__mpu_regions:
.word 0xFFFF001F @ FFFF0000 64k | bootrom (unprotected / protected)
.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 0x10000029 @ 10000000 2M | io mem (ARM9 / first 2MB)
.word 0x20000037 @ 20000000 256M | fcram (O3DS / N3DS)