Print this page
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.

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/armv6/bcm2835/Makefile
          +++ new/usr/src/uts/armv6/bcm2835/Makefile
↓ open down ↓ 3 lines elided ↑ open up ↑
   4    4  # You may only use this file in accordance with the terms of version
   5    5  # 1.0 of the CDDL.
   6    6  #
   7    7  # A full copy of the text of the CDDL should have accompanied this
   8    8  # source.  A copy of the CDDL is also available via the Internet at
   9    9  # http://www.illumos.org/license/CDDL.
  10   10  #
  11   11  
  12   12  #
  13   13  # Copyright (c) 2013, Joyent, Inc.  All rights reserved.
       14 +# Copyright (c) 2015, Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
  14   15  #
  15   16  
  16   17  UTSBASE = ../..
  17   18  
  18   19  include $(UTSBASE)/armv6/bcm2835/Makefile.bcm2835
  19   20  
  20   21  def             :=      TARGET= def
  21   22  all             :=      TARGET= all
  22   23  install         :=      TARGET= install
  23   24  install_h       :=      TARGET= install_h
↓ open down ↓ 6 lines elided ↑ open up ↑
  30   31  modlist         :=      NO_STATE= -K $$MODSTATE$$$$
  31   32  clean.lint      :=      TARGET= clean.lint
  32   33  check           :=      TARGET= check
  33   34  
  34   35  
  35   36  #
  36   37  #       Default build targets.
  37   38  #
  38   39  .KEEP_STATE:
  39   40  
  40      -def all clean clobber clean.lint: unix .WAIT \
       41 +def all clean clobber clean.lint: unix loader .WAIT \
  41   42                  $(BCM2835_CPU_KMODS) $(BCM2835_KMODS)
  42   43  
  43   44  modlist:        unix \
       45 +                loader \
  44   46                  $(BCM2835_CPU_KMODS) $(BCM2835_KMODS)
  45   47  
  46   48  IMPLEMENTED_PLATFORM = Raspberry,Pi
  47   49  
  48   50  install: $(ROOT_BCM2835_DIR) $(USR_BCM2835_DIR) \
  49   51          $(USR_BCM2835_INC_DIR) \
  50   52          $(USR_BCM2835_SBIN_DIR) \
  51   53          $(USR_BCM2835_LIB_DIR) \
  52   54          $(BCM2835_CRYPTO_LINKS) \
  53   55          unix .WAIT $(BCM2835_CPU_KMODS) \
  54      -        $(BCM2835_KMODS)
       56 +        $(BCM2835_KMODS) loader
  55   57  
  56      -unix $(BCM2835_KMODS) $(BCM2835_CPU_KMODS): FRC
       58 +unix loader $(BCM2835_KMODS) $(BCM2835_CPU_KMODS): FRC
  57   59          @cd $@; pwd; $(MAKE) $(NO_STATE) $(TARGET)
  58   60  
  59   61  install_h check:        FRC
  60   62  
  61   63  #
  62   64  #       Include common targets.
  63   65  #
  64   66  include $(UTSBASE)/armv6/bcm2835/Makefile.targ
  65   67  
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX