1
1
arch ?= x86_64
2
2
target ?= $(arch ) -sos-kernel-gnu
3
3
4
+ boot_target := x86_32-sos-bootstrap-gnu
5
+ boot_outdir := boot/target/$(boot_target )
6
+
4
7
iso := target/$(target ) /debug/sos-$(arch ) .iso
5
8
kernel := target/$(target ) /debug/sos_kernel
9
+ isofiles := target/$(target ) /debug/isofiles
10
+ boot := $(boot_outdir ) /debug/libboot.a
11
+
6
12
7
13
release_iso := target/$(target ) /release/sos-$(arch ) .iso
8
14
release_kernel := target/$(target ) /release/sos_kernel
15
+ release_isofiles := target/$(target ) /release/isofiles
16
+ release_boot := $(boot_outdir ) /release/libboot.a
9
17
10
18
grub_cfg := src/arch/$(arch ) /grub.cfg
11
19
@@ -39,6 +47,9 @@ HELP_FUN = \
39
47
40
48
.PHONY : all clean kernel run iso cargo help gdb test doc release-iso release-run release-kernel
41
49
50
+ exception : $(iso ) # #@build Run the kernel, dumping the state from QEMU if an exception occurs
51
+ @qemu-system-x86_64 -s -hda $(iso ) -d int -no-reboot
52
+
42
53
doc : # #@utilities Make RustDoc documentation
43
54
@xargo doc
44
55
@@ -52,7 +63,7 @@ env: ##@utilities Install dev environment dependencies
52
63
53
64
clean : # #@utilities Delete all build artefacts.
54
65
@xargo clean
55
-
66
+ @cd boot && xargo clean
56
67
57
68
kernel : $(kernel ) .bin # #@build Compile the debug kernel binary
58
69
@@ -67,7 +78,7 @@ release-iso: $(release_iso) ##@release Compile the release kernel binary and mak
67
78
release-run : run-release # #@release Make the release kernel ISO image and boot QEMU from it.
68
79
69
80
debug : $(iso ) # #@build Run the kernel, redirecting serial output to a logfile.
70
- @qemu-system-x86_64 -s -hda $(iso ) -serial file:$(CURDIR ) /target/$(target ) /serial-$(TIMESTAMP ) .log
81
+ @qemu-system-x86_64 -s -S - hda $(iso ) -serial file:$(CURDIR ) /target/$(target ) /serial-$(TIMESTAMP ) .log
71
82
72
83
test : # #@build Test crate dependencies
73
84
@cargo test -p sos_intrusive
@@ -86,13 +97,37 @@ $(wild_iso): $(wild_kernel).bin $(wild_isofiles) $(grub_cfg)
86
97
$(wild_isofiles ) :
87
98
@mkdir -p $@ /boot/grub
88
99
89
- $(release_kernel ) :
100
+ $(boot ) :
101
+ @cd boot && xargo rustc --target $(boot_target ) -- \
102
+ --emit=obj=target/$(boot_target ) /debug/boot32.o
103
+ # # Place 32-bit bootstrap code into a 64-bit ELF
104
+ @x86_64-elf-objcopy -O elf64-x86-64 $(boot_outdir ) /debug/boot32.o \
105
+ $(boot_outdir ) /debug/boot.o
106
+ # @x86_64-elf-objcopy --strip-debug -G _start boot/target/boot.o
107
+ @cd $(boot_outdir ) /debug && ar -crus libboot.a boot.o
108
+
109
+ $(release_boot ) :
110
+ @cd boot && xargo rustc --target $(boot_target ) -- --release \
111
+ --emit=obj=target/$(boot_target ) release/boot32.o
112
+ # # Place 32-bit bootstrap code into a 64-bit ELF
113
+ @x86_64-elf-objcopy -O elf64-x86-64 $(boot_outdir ) /release/boot32.o $(boot_outdir ) /release/boot.o
114
+ @x86_64-elf-objcopy --strip-debug -G _start $(boot_outdir ) /release/boot.o
115
+ @cd $(boot_outdir ) /release && ar -crus libboot.a boot.o
116
+
117
+ $(release_kernel ) : $(release_boot )
90
118
@xargo build --target $(target ) --release
91
119
92
120
$(release_kernel ) .bin : $(release_kernel )
93
121
@cp $(release_kernel ) $(release_kernel ) .bin
94
122
95
- $(kernel ) :
123
+ $(release_iso ) : $(release_kernel ) .bin $(grub_cfg )
124
+ @mkdir -p $(release_isofiles ) /boot/grub
125
+ @cp $(release_kernel ) .bin $(release_isofiles ) /boot/
126
+ @cp $(grub_cfg ) $(release_isofiles ) /boot/grub
127
+ @grub-mkrescue -o $(release_iso ) $(release_isofiles ) /
128
+ @rm -r $(release_isofiles )
129
+
130
+ $(kernel ) : $(boot )
96
131
@xargo build --target $(target )
97
132
98
133
$(kernel ) .debug : $(kernel )
@@ -103,4 +138,4 @@ $(kernel).bin: $(kernel) $(kernel).debug
103
138
@x86_64-elf-objcopy --add-gnu-debuglink=$(kernel ) .debug $(kernel )
104
139
105
140
gdb : $(kernel ) .bin $(kernel ) .debug # #@utilities Connect to a running QEMU instance with gdb.
106
- @rust-gdb -ex " target remote tcp:127.0.0.1:1234" $(kernel )
141
+ @rust-os- gdb -ex " target remote tcp:127.0.0.1:1234" $(kernel )
0 commit comments