]> Chaos Git - corbenik/corbenik.git/commitdiff
Partial (broken) FIRM support
authorJon Feldman <chaos.kagami@gmail.com>
Sat, 20 May 2017 06:06:59 +0000 (02:06 -0400)
committerJon Feldman <chaos.kagami@gmail.com>
Sat, 20 May 2017 06:11:04 +0000 (02:11 -0400)
It's not quite working yet. For some reason, screeninit causes a complete lockup.

That said, it does boot if:
 * No background images are present
 * Autoboot is on
 * Silent mode is on

I'm aware this is currently broken. REPEAT. I am aware.

.gitignore
Makefile.am
boot/Makefile.am
boot/arm11.c
boot/corbenik.c
boot/start.s

index e14dd67ed86f7a5c5ec5793f607507a26840e0c1..46be2a45a8529dfde738755698508521d2d82dd2 100644 (file)
@@ -33,6 +33,7 @@ depcomp
 /external/Makefile
 /include/Makefile
 /boot/corbenik
+/boot/corbenik.firm
 /bootstub/bootstub
 /m4
 /include/config.h
index aac6f20fe3ddd4e899892f1a75b34731ab62ed49..ca7ae8ec24b10bf69d5dd29773b7a8ea28131b6c 100644 (file)
@@ -28,6 +28,7 @@ all-local: external loader boot bits patch
        mkdir -p out@sysconfdir@
        mkdir -p out@localstatedir@
        cp boot/corbenik.bin out/arm9loaderhax.bin
+       cp boot/corbenik.firm out/boot.firm
        cp boot/corbenik.bin out@libexecdir@/
        cp boot/corbenik out/corbenik.elf
        cp loader/loader.cxi out@libdir@/module/native/loader.cxi
index 9e1f60defcbb19cad39e4bb89302f69bb12861c7..0dd7337fb64471c7da99f3c69798e466e7842374 100644 (file)
@@ -15,8 +15,9 @@ clean-local:
 corbenik.bin: corbenik
        $(OBJCOPY) $(OCFLAGS) -O binary $< $@
 
+# XXX - Firmtool seems to incorrectly copy the elf's sections to the output, so we have to do this for now
 corbenik.firm: corbenik.bin
-       firmtool build $@ -n 0x23F00000 -e 0 -D $^ -A 0x23F00000 -C NDMA
+       firmtool build $@ -i -n 0x23F00000 -e 0 -D $^ -A 0x23F00000 -C NDMA
 
 corbenikdir = $(top_srcdir)/source
 
index 431085b067da30d725c6c03b16c7ae2f965ddc54..4e0e89ee70f8d9d895ca659b2dad3caffa72d25d 100644 (file)
 
 struct framebuffers *framebuffers;
 
-volatile uint32_t *arm11Entry = (volatile uint32_t *)0x1FFFFFF8;
+volatile uint32_t *arm11Entry = (volatile uint32_t *)0x1FFFFFFC;
 static const uint32_t brightness[4] = {0x26, 0x39, 0x4C, 0x5F};
 
-void  __attribute__((naked)) arm11Stub(void)
-{
-    //Disable interrupts
-    __asm(".word 0xF10C01C0");
-
-    //Wait for the entry to be set
-    while(*arm11Entry == ARM11_STUB_ADDRESS);
-
-    //Jump to it
-    ((void (*)())*arm11Entry)();
-}
-
-void installArm11Stub(void) {
-    static int hasCopiedStub = false;
-    if(!hasCopiedStub)
-    {
-        memcpy((void *)ARM11_STUB_ADDRESS, arm11Stub, 0x30);
-        ctr_cache_clean_and_flush_all();
-        hasCopiedStub = true;
-    }
-
-    if (is_firmlaunch())
-        arm11Entry = (volatile uint32_t*)0x1FFFFFFC;
-}
-
 void invokeArm11Function(void (*func)())
 {
     installArm11Stub();
index f3e82914f8e9b7c321fdc68a317b6acbec842472..5cd597d88aac69420cb687a9a28798f8b64b28bb 100644 (file)
@@ -63,8 +63,6 @@ main(int argc, char** argv)
 
     install_interrupts(); // Get some free debug info.
 
-    installArm11Stub();
-
     if (is_firmlaunch()) {
         shut_up();
 
@@ -110,6 +108,7 @@ main(int argc, char** argv)
                 clear_disp(TOP_SCREEN);
                 clear_disp(BOTTOM_SCREEN);
             }
+
             menu_handler();
         }
 
index 09398efbc141b2d84ee2cb4ac61057adcc9905b7..ea2997c05b6804d3fa7f18dc041f0d5288d57170 100644 (file)
@@ -10,17 +10,18 @@ argc: .int 0
 argv: .int 0
 
 init:
+    // Disable IRQ
+    mrs r2, cpsr
+    orr r2, r2, #0x1C0
+    msr cpsr_c, r2
+
+    // Save argc, argv
     ldr r2, =argc
     str r0, [r2]
 
     ldr r2, =argv
     str r1, [r2]
 
-    // Disable IRQ
-    mrs r0, cpsr
-    orr r0, r0, #0x80
-    msr cpsr_c, r0
-
     // Flush caches, make sure to sync memory with what's on the cache before
     // turning off the MPU
     adr r0, flush_all_caches_offset
@@ -215,6 +216,7 @@ enable_mpu_and_caching:
     // Enable caches, MPU, and itcm
     mrc p15, 0, r0, c1, c0, 0  // read control register
     orr r0, r0, #(1<<18)       // - itcm enable
+    orr r0, r0, #(1<<13)       // - alt exception vector enable
     orr r0, r0, #(1<<12)       // - instruction cache enable
     orr r0, r0, #(1<<2)        // - data cache enable
     orr r0, r0, #(1<<0)        // - mpu enable