Integrate linux chainloader into master
authorAlyssa Rosenzweig <alyssa@backtick.town>
Tue, 6 Sep 2016 22:36:29 +0000 (15:36 -0700)
committerAlyssa Rosenzweig <alyssa@backtick.town>
Tue, 6 Sep 2016 22:36:29 +0000 (15:36 -0700)
arm_chainloader/boot.s [new file with mode: 0644]
arm_chainloader/loader.cc

diff --git a/arm_chainloader/boot.s b/arm_chainloader/boot.s
new file mode 100644 (file)
index 0000000..ac6a6ab
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+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 bootLinux
+bootLinux:
+    //cli /* TODO: figure out how to disable interrupts correctly */
+
+    /* jump to kernel */
+    mov pc, r3
index 762af88..4c8d36e 100644 (file)
-/*=============================================================================\r
-Copyright (C) 2016 Kristina Brooks\r
-All rights reserved.\r
-\r
-This program is free software; you can redistribute it and/or\r
-modify it under the terms of the GNU General Public License\r
-as published by the Free Software Foundation; either version 2\r
-of the License, or (at your option) any later version.\r
-\r
-This program is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-GNU General Public License for more details.\r
-\r
-FILE DESCRIPTION\r
-Second stage bootloader.\r
-\r
-=============================================================================*/\r
-\r
-#include <drivers/fatfs/ff.h>\r
-#include <chainloader.h>\r
-#include <drivers/mailbox.hpp>\r
-\r
-#define logf(fmt, ...) printf("[LDR:%s]: " fmt, __FUNCTION__, ##__VA_ARGS__);\r
-\r
-FATFS g_BootVolumeFs;\r
-\r
-#define ROOT_VOLUME_PREFIX "0:"\r
-\r
-static const char* g_BootFiles32[] = {\r
-       "zImage",\r
-       "kernel.img",\r
-};\r
-\r
-struct LoaderImpl {\r
-       inline bool file_exists(const char* path) {\r
-               return f_stat(path, NULL) == FR_OK;\r
-       }\r
-\r
-       bool read_file(const char* path, uintptr_t dest) {\r
-\r
-       }\r
-\r
-       LoaderImpl() {\r
-               logf("Mounting boot partitiion ...\n");\r
-               FRESULT r = f_mount(&g_BootVolumeFs, ROOT_VOLUME_PREFIX, 1);\r
-               if (r != FR_OK) {\r
-                       panic("failed to mount boot partition, error: %d", (int)r);\r
-               }\r
-               logf("Boot partition mounted!\n");\r
-\r
-               g_Mailbox.write_word(0x1111);\r
-       }\r
-};\r
-\r
-static LoaderImpl STATIC_APP g_Loader {};\r
+/*=============================================================================
+Copyright (C) 2016 Kristina Brooks
+All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+FILE DESCRIPTION
+Second stage bootloader.
+
+=============================================================================*/
+
+#include <drivers/fatfs/ff.h>
+#include <chainloader.h>
+#include <drivers/mailbox.hpp>
+
+#define logf(fmt, ...) printf("[LDR:%s]: " fmt, __FUNCTION__, ##__VA_ARGS__);
+
+FATFS g_BootVolumeFs;
+
+#define ROOT_VOLUME_PREFIX "0:"
+
+extern "C" {
+    void bootLinux(int zero, int machineID, void* dtb, void* kernel);
+}
+
+static const char* g_BootFiles32[] = {
+       "zImage",
+       "kernel.img",
+};
+
+struct LoaderImpl {
+       inline bool file_exists(const char* path) {
+               return f_stat(path, NULL) == FR_OK;
+       }
+
+       bool read_file(const char* path, uint8_t* dest) {
+            /* ensure file exists first */
+            if(!file_exists(path)) return false;
+
+            /* read entire file into buffer */
+            FIL* fp;
+            f_open(fp, path, FA_READ);
+
+            unsigned int len = f_size(fp);
+            dest = (uint8_t*) malloc(len);
+
+            f_read(fp, dest, len, &len);
+
+            f_close(fp);
+
+            return true;
+       }
+
+       LoaderImpl() {
+               logf("Mounting boot partitiion ...\n");
+               FRESULT r = f_mount(&g_BootVolumeFs, ROOT_VOLUME_PREFIX, 1);
+               if (r != FR_OK) {
+                       panic("failed to mount boot partition, error: %d", (int)r);
+               }
+               logf("Boot partition mounted!\n");
+
+                /* dump cmdline.txt for test */
+                uint8_t* arguments;
+
+                if(!read_file("cmdline.txt", arguments)) {
+                    panic("Error reading cmdline arguments");
+                }
+
+                printf("\n%s\n", arguments);
+
+                free(arguments);
+
+                /* read device tree blob */
+                uint8_t* dtb;
+
+                if(!read_file("rpi.dtb", dtb)) {
+                    panic("Error reading device tree blob");
+                }
+
+                printf("DTB loaded at %X\n", dtb);
+
+                /* read the kernel */
+                uint8_t* bzImage;
+
+                if(!read_file("bzImage", bzImage)) {
+                    panic("Error reading bzImage");
+                }
+
+                printf("bzImage loaded at %X\n", bzImage);
+
+                printf("Jumping to the Linux kernel...\n");
+                
+                /* this should never return */
+                bootLinux(0, 3139, dtb, bzImage);
+       }
+};
+
+static LoaderImpl STATIC_APP g_Loader {};
This page took 0.029753 seconds and 4 git commands to generate.