-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
199 lines (159 loc) · 5.71 KB
/
Copy pathMakefile
File metadata and controls
199 lines (159 loc) · 5.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
NASM = nasm
NFLAGS = -f bin -g
MINGW = x86_64-w64-mingw32-gcc
MFLAGS = -m64 -ffreestanding -Wall -Werror
LFLAGS = -Wall -Werror -m64 -nostdlib -shared -Wl,-dll -Wl,--subsystem,10 -e efi_main
GCC = x86_64-elf-gcc
GPP = x86_64-elf-g++
AR = x86_64-elf-ar
CCFLAGS = -c -m64 -g -ffreestanding -fno-exceptions -fno-rtti -nostdlib -I./src/kernel
LD = x86_64-elf-ld
LDFLAGS = -m elf_x86_64 -T src/kernel/linker.ld -nostdlib
# pmemsave XXXX - YYYY mem.dmp - dump of phys memory
# -d int,cpu_reset
QEMU_UEFI = qemu-system-x86_64 \
-monitor stdio \
-chardev file,id=uart0,path=uart.log \
-trace usb_xhci* -D xhci.log \
-m 128M \
-bios uefi64.bin \
-cpu qemu64 \
-device qemu-xhci \
-device usb-storage,drive=usbstick \
-device pci-serial,chardev=uart0 \
-no-reboot -no-shutdown
QEMU_BIOS = qemu-system-x86_64 -monitor stdio -serial file:uart.log -m 64M -cpu qemu64 # -no-reboot -no-shutdown
DISK_IMG = surfaceos.img
SOURCES = bin/kernel/kernel.o \
bin/kernel/cpu/gdt.o \
bin/kernel/cpu/gdt.asm.o \
bin/kernel/mm/memory.o \
bin/kernel/mm/heap.o \
bin/kernel/cpu/paging.o \
bin/kernel/cpu/ports.o \
bin/kernel/drivers/uart.o \
bin/kernel/drivers/screen.o \
bin/kernel/stdlib/stdio.o \
bin/kernel/stdlib/string.o \
bin/kernel/cpu/idt.o \
bin/kernel/cpu/irq.o \
bin/kernel/cpu/interrupts.asm.o \
bin/kernel/drivers/keyboard.o \
bin/kernel/drivers/console.o \
bin/kernel/cpu/cpuid.o \
bin/kernel/cpu/pci.o \
bin/kernel/drivers/usb/xhci.o \
bin/kernel/drivers/fs/fat32.o \
bin/kernel/drivers/commands.o \
bin/kernel/drivers/pit.o \
bin/kernel/drivers/rtc.o \
bin/kernel/cpu/syscall.o \
bin/kernel/cpu/program.o \
# SDK: entry.o is always linked first (contains _start, must be at PROGRAM_BASE)
# everything else goes into a static library so link order doesn't matter
SDK_FLAGS = -c -m64 -ffreestanding -fno-exceptions -fno-rtti -nostdlib -Isrc/sdk/include
SDK_SRC = $(wildcard src/sdk/libc/*.cpp)
SDK_ALL_OBJ = $(patsubst src/sdk/libc/%.cpp, bin/sdk/%.o, $(SDK_SRC))
SDK_ENTRY = bin/sdk/entry.o
SDK_LIB_OBJ = $(filter-out $(SDK_ENTRY), $(SDK_ALL_OBJ))
SDK_LIB = bin/sdk/libsfos.a
# Apps: every .cpp in src/apps/ becomes a .bin
APP_SRC = $(wildcard src/apps/*.cpp)
APP_BINS = $(patsubst src/apps/%.cpp, bin/apps/%.bin, $(APP_SRC))
.PHONY: run clean create_disk version
# Bootloader
bin/boot/bios/%.bin: src/boot/bios/%.asm
mkdir -p $(dir $@)
$(NASM) $(NFLAGS) -o $@ $<
bin/boot/efi/%.o: src/boot/efi/%.c
mkdir -p $(dir $@)
$(MINGW) $(MFLAGS) -c $< -o $@
bin/boot/efi/BOOTX64.EFI: bin/boot/efi/main_efi.o
$(MINGW) $^ $(LFLAGS) -o $@
# Data files
bin/kernel/data/stdfont.fnt: src/kernel/data/stdfont.asm
mkdir -p $(dir $@)
$(NASM) $(NFLAGS) -o $@ $<
# Kernel object files
bin/kernel/drivers/%.o: src/kernel/drivers/%.cpp
mkdir -p $(dir $@)
$(GPP) $(CCFLAGS) -o $@ $^
bin/kernel/drivers/usb/%.o: src/kernel/drivers/usb/%.cpp
mkdir -p $(dir $@)
$(GPP) $(CCFLAGS) -o $@ $^
bin/kernel/drivers/fs/%.o: src/kernel/drivers/fs/%.cpp
mkdir -p $(dir $@)
$(GPP) $(CCFLAGS) -o $@ $^
bin/kernel/stdlib/%.o: src/kernel/stdlib/%.cpp
mkdir -p $(dir $@)
$(GPP) $(CCFLAGS) -o $@ $^
bin/kernel/cpu/%.o: src/kernel/cpu/%.cpp
mkdir -p $(dir $@)
$(GPP) $(CCFLAGS) -o $@ $^
bin/kernel/mm/%.o: src/kernel/mm/%.cpp
mkdir -p $(dir $@)
$(GPP) $(CCFLAGS) -o $@ $^
bin/kernel/cpu/%.asm.o: src/kernel/cpu/%.asm
mkdir -p $(dir $@)
$(NASM) -f elf64 -o $@ $<
# SDK objects
bin/sdk/%.o: src/sdk/libc/%.cpp
mkdir -p $(dir $@)
$(GPP) $(SDK_FLAGS) -o $@ $<
# SDK static library (everything except entry.o)
$(SDK_LIB): $(SDK_LIB_OBJ)
$(AR) rcs $@ $^
# Apps: compile + link entry.o first, then app object, then pull the rest from libsfos.a
bin/apps/%.bin: src/apps/%.cpp $(SDK_ENTRY) $(SDK_LIB)
mkdir -p $(dir $@)
$(GPP) $(SDK_FLAGS) -c -o bin/apps/$*.o $<
$(LD) -m elf_x86_64 -T src/sdk/linker.ld -nostdlib -o $@ \
$(SDK_ENTRY) bin/apps/$*.o -Lbin/sdk -lsfos
# Generating version
version:
@bash ./version.sh
# Kernel
bin/kernel/kentry.o: src/kernel/kentry.asm
mkdir -p $(dir $@)
$(NASM) -f elf64 -o $@ $<
bin/kernel/kernel.o: src/kernel/kernel.cpp version
mkdir -p $(dir $@)
$(GPP) $(CCFLAGS) -o $@ $<
bin/kernel/kernel.bin: bin/kernel/kentry.o $(SOURCES)
mkdir -p $(dir $@)
$(LD) $(LDFLAGS) -o $@ $^
# Disk and test
$(DISK_IMG): create_disk bin/boot/efi/BOOTX64.EFI bin/boot/bios/stub.bin bin/kernel/kernel.bin bin/kernel/data/stdfont.fnt $(APP_BINS)
mkfs.fat -F32 $(DISK_IMG)
mkdir -p ./disk/EFI/Boot
cp bin/boot/efi/BOOTX64.EFI ./disk/EFI/Boot
dd if=bin/boot/bios/stub.bin of=$(DISK_IMG) conv=notrunc,fsync
dd if=bin/boot/bios/stub.bin of=$(DISK_IMG) conv=notrunc,fsync bs=512 seek=6 # copy of bootloader
# dd if=bin/boot/bios/stage2.bin of=$(DISK_IMG) conv=notrunc,fsync bs=512 seek=16 # if you want support BIOS
sudo mount $(DISK_IMG) ./tmp
sudo cp -R ./disk/EFI ./tmp
sudo cp ./bin/kernel/kernel.bin ./tmp/KERNEL.BIN
sudo cp ./bin/kernel/data/stdfont.fnt ./tmp/FONT.FNT
sudo sh -c 'echo "Hello from file!" > ./tmp/FILE.TXT'
sudo mkdir -p ./tmp/APPS
@for f in $(APP_BINS); do sudo cp $$f ./tmp/APPS/$$(basename $$f | tr 'a-z' 'A-Z'); done
sleep 0.6
sudo umount ./tmp
run: $(DISK_IMG)
# $(QEMU_UEFI) -hda $(DISK_IMG)
$(QEMU_UEFI) -drive id=usbstick,if=none,format=raw,file=$(DISK_IMG)
# $(QEMU_BIOS) -hda $(DISK_IMG)
create_disk:
@rm -rf $(DISK_IMG)
dd if=/dev/zero of=$(DISK_IMG) bs=1M count=8
clean:
@rm -rf bin/boot/bios/*.bin
@rm -rf bin/boot/efi/*.o
@rm -rf bin/boot/efi/*.EFI
@rm -rf disk/EFI/Boot/*.EFI
@rm -rf bin/kernel/*.o bin/kernel/*.bin
@rm -rf bin/kernel/data/*.fnt
@rm -rf bin/kernel/cpu/*.o bin/kernel/drivers/*.o bin/kernel/stdlib/*.o
@rm -rf bin/sdk/*.o bin/sdk/*.a
@rm -rf bin/apps/*
@rm -f src/kernel/version.h