Remove boot.s
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Fri, 6 Jan 2017 07:24:11 +0000 (23:24 -0800)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Fri, 6 Jan 2017 07:24:11 +0000 (23:24 -0800)
boot.s was previously used as a stub to call the Linux kernel. However,
the kernel loading ABI aligns with the local calling convention,
allowing as a define a special kernel_t type (internally a function
pointer) and call Linux directly from C++.

arm_chainloader/Makefile
arm_chainloader/boot.s [deleted file]
arm_chainloader/loader.cc

index 89c1a74..937a3d1 100644 (file)
@@ -3,7 +3,6 @@ TARGET_ARM_CHAINLOADER = arm_chainloader.bin
 
 SRCS = \
        start.s \
-       boot.s \
        lib/arm_bcopy.s \
        lib/arm_bzero.s \
        lib/arm_locore.s \
diff --git a/arm_chainloader/boot.s b/arm_chainloader/boot.s
deleted file mode 100644 (file)
index ad96c39..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-At this point, the kernel is already ready in memory;
-all that is left is setting up some registers and jumping.
-However, it's kind of ugly to do it in inline asm.. so here
-*/
-
-  /*
-   r0: 0
-   r1: machine ID (3138/3189 for Pi 1/2)
-   r2: DTB address
-   r3: kernel address
-   */
-
-.globl boot_linux
-boot_linux:
-    /* jump to kernel */
-    // mov pc, r3
-    //bx r3
-    ldr r3, =0x2000000
-    push {lr}
-    blx r3
-    pop {lr}
-    
-    bx lr
index 6db27d1..8ccb4ae 100644 (file)
@@ -32,9 +32,7 @@ FATFS g_BootVolumeFs;
 #define DTB_LOAD_ADDRESS    0x20000000
 #define KERNEL_LOAD_ADDRESS 0x2000000
 
-extern "C" {
-       void boot_linux(int zero, int machineID, void* dtb, void* kernel);
-}
+typedef void (*linux_t)(uint32_t, uint32_t, void*);
 
 static_assert((MEM_USABLE_START+0x800000) < KERNEL_LOAD_ADDRESS,
        "memory layout would not allow for kernel to be loaded at KERNEL_LOAD_ADDRESS, please check memory_map.h");
@@ -170,6 +168,9 @@ struct LoaderImpl {
                        panic("error reading zImage");
                }
 
+               /* zImage is actually a function pointer; see the typedef */
+               linux_t kernel = reinterpret_cast<linux_t>(zImage);
+
                logf("zImage loaded at 0x%X\n", (unsigned int)zImage);
 
                logf("First few of zImage.. %X%X%X%X\n", zImage[0], zImage[1], zImage[2], zImage[3]);
@@ -188,7 +189,7 @@ struct LoaderImpl {
                /* this should never return */
                logf("FDT loaded at %x\n",  reinterpret_cast<uint32_t>(fdt));
                logf("First few of fdt... %X%X%X%X\n", fdt[0], fdt[1], fdt[2], fdt[3]);
-               boot_linux(0, ~0, fdt, zImage);
+               kernel(0, ~0, fdt);
        }
 };
 
This page took 0.027235 seconds and 4 git commands to generate.