Print this page
loader: pass args along to unix in C
There's no reason why we can't pass the args gotten from the bootloader to
unix in C.
Note: loader's _start sets the ATAG pointer to 0x100.  This change simply
propagates it to unix.
bcm2835: we need a loader on this platform as well
As stated before, the Raspberry Pi loader is terrible.  It claims to
supporte ELF file loading, but what it does is crazy.  It loads the ELF file
into memory, gets the start address from the header, converts it into file
offset, adds it to the address where the file was loaded and jumps there.
This is very wrong.  So, instead of booting the loader as an ELF file, we
objcopy it into a plain ol' binary image.  This should be safe because (1)
the loader has no relocations left, (2) whatever benefit we lose from not
having the whole ELF file in memory is only temporary until the loader hands
off control to unix.
Finally, we force the entry point to appear at the beginning of the binary
file by moving _start into its own section (.text.init) and using the
mapfile to put that section before everything else.
   1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2013 (c) Joyent, Inc. All rights reserved.

  14  */
  15 
  16 /*
  17  * Every story needs a beginning, this is the loader's.
  18  */
  19 
  20 #include <sys/asm_linkage.h>
  21 
  22         ENTRY(_start)








  23         mov     sp, #0x8000
  24         /*
  25          * XXX manually fix up the tag start
  26          */
  27         mov     r2, #0x100
  28         bl      fakeload_init
  29         SET_SIZE(_start)
  30 
  31 #if defined(__lint)
  32 
  33 /* ARGSUSED */
  34 void
  35 fakeload_unaligned_enable(void)
  36 {}
  37 
  38 #else   /* __lint */
  39 
  40         /*
  41          * Fix up alignment by turning off A and by turning on U.
  42          */


  85 
  86 #else   /* __lint */
  87 
  88         /*
  89          * We first make sure that the ARMv6 pages are enabled (bit 23) and then
  90          * enable the MMU (bit 0).
  91          */
  92         ENTRY(fakeload_mmu_enable)
  93         mrc     p15, 0, r0, c1, c0, 0
  94         orr     r0, #0x800000
  95         mcr     p15, 0, r0, c1, c0, 0
  96         mrc     p15, 0, r0, c1, c0, 0
  97         orr     r0, #0x1
  98         mcr     p15, 0, r0, c1, c0, 0
  99         bx      lr
 100         SET_SIZE(fakeload_mmu_enable)
 101 #endif  /* __lint */
 102 
 103 
 104         ENTRY(fakeload_exec)
 105         mov     r4, r0
 106         mov     r2, #0x100
 107         blx     r4
 108         /* We should never execute this. If we do we'll go back to a panic */
 109         bx      lr
 110         SET_SIZE(fakeload_exec)
   1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2013 (c) Joyent, Inc. All rights reserved.
  14  * Copyright 2015 (c) Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
  15  */
  16 
  17 /*
  18  * Every story needs a beginning, this is the loader's.
  19  */
  20 
  21 #include <sys/asm_linkage.h>
  22 
  23 /*
  24  * We put _start into the .text.init section so we can more easily shove it
  25  * at the front of the .text.
  26  */
  27         .section .text.init
  28         .align  4
  29         .globl  _start
  30         .type   _start, %function
  31 _start:
  32         mov     sp, #0x8000
  33         /*
  34          * XXX manually fix up the tag start
  35          */
  36         mov     r2, #0x100
  37         bl      fakeload_init
  38         SET_SIZE(_start)
  39 
  40 #if defined(__lint)
  41 
  42 /* ARGSUSED */
  43 void
  44 fakeload_unaligned_enable(void)
  45 {}
  46 
  47 #else   /* __lint */
  48 
  49         /*
  50          * Fix up alignment by turning off A and by turning on U.
  51          */


  94 
  95 #else   /* __lint */
  96 
  97         /*
  98          * We first make sure that the ARMv6 pages are enabled (bit 23) and then
  99          * enable the MMU (bit 0).
 100          */
 101         ENTRY(fakeload_mmu_enable)
 102         mrc     p15, 0, r0, c1, c0, 0
 103         orr     r0, #0x800000
 104         mcr     p15, 0, r0, c1, c0, 0
 105         mrc     p15, 0, r0, c1, c0, 0
 106         orr     r0, #0x1
 107         mcr     p15, 0, r0, c1, c0, 0
 108         bx      lr
 109         SET_SIZE(fakeload_mmu_enable)
 110 #endif  /* __lint */
 111 
 112 
 113         ENTRY(fakeload_exec)
 114         blx     r3


 115         /* We should never execute this. If we do we'll go back to a panic */
 116         bx      lr
 117         SET_SIZE(fakeload_exec)