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
1 1 #
2 2 # This file and its contents are supplied under the terms of the
3 3 # Common Development and Distribution License ("CDDL"), version 1.0.
↓ 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
24 25 clean := TARGET= clean
25 26 clobber := TARGET= clobber
26 27 lint := TARGET= lint
27 28 lintlib := TARGET= lintlib
28 29 modlintlib := TARGET= modlintlib
29 30 modlist := TARGET= modlist
↓ 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