blob: d3706666706832abef769b3f6b8790f0b486cef7 (
plain)
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
|
export
ARCH ?= x86_64
DEBUG ?= 1
RUST_LIB_PATH=debug
CARGO_FLAGS =
#QEMU_DEBUG=-d int -no-reboot -no-shutdown
TARGET=kernel.iso
ifeq ($(DEBUG), 0)
RUST_LIB_PATH=release
CARGO_FLAGS=--release
endif
ifeq ($(ARCH), x86)
QEMU = qemu-system-i386
QEMU_OPTS = -serial file:serial.log
MACHINE = -machine q35
BOOT = -cdrom kernel.iso
ARCH_PREFIX = i386-elf-
target = "./arch/x86.json"
RUST_OBJS = ../target/x86/$(RUST_LIB_PATH)/libmyrustkernel.a
ASM_PATHS = ./arch/x86/boot
ASM_PATHS += ./arch/x86/common/boot
CARGO_B = --target "./arch/x86.json"
LD_SCRIPT=../arch/x86.ld
endif
ifeq ($(ARCH), x86_64)
QEMU = qemu-system-x86_64
QEMU_OPTS = -serial file:serial.log
MACHINE = -machine q35
BOOT = -cdrom kernel.iso
ARCH_PREFIX = x86_64-elf-
target = "./arch/x86_64.json"
RUST_OBJS = ../target/x86_64/$(RUST_LIB_PATH)/libmyrustkernel.a
ASM_PATHS = ./arch/x86_64/boot
ASM_PATHS += ./arch/x86/common/boot
CARGO_B = --target "./arch/x86_64.json"
LD_SCRIPT=../arch/x86_64.ld
endif
ifeq ($(ARCH), riscv64)
QEMU = qemu-system-riscv64
QEMU_OPTS = -nographic -serial mon:stdio
MACHINE = -machine virt -bios none
BOOT = -kernel ./src/kernel.bin
ARCH_PREFIX = riscv64-elf-
target = "./arch/riscv64.json"
RUST_OBJS = ../target/riscv64/$(RUST_LIB_PATH)/libmyrustkernel.a
ASM_PATHS = ./arch/riscv64/boot
CARGO_B = --target "./arch/riscv64.json"
LD_SCRIPT=../arch/riscv64.ld
TARGET=src/kernel.bin
endif
ifndef ARCH_PREFIX
$(error ARCH available: "x86_64", "x86", "riscv64")
endif
CC = $(ARCH_PREFIX)gcc
AS = $(ARCH_PREFIX)as
LD = $(ARCH_PREFIX)ld
OBJDUMP = $(ARCH_PREFIX)objcopy
OBJCOPY = $(ARCH_PREFIX)objdump
W := -Wall -Werror -Wextra -Wshadow -Wcast-align
# W:= -Wpointer-arith -pedantic -Wmissing-prototypes -Wmissing-declarations
W += -Wwrite-strings -Wredundant-decls -Wnested-externs -Winline -Wno-long-long
W += -Wconversion -Wstrict-prototypes
WNO := -Wno-error=unused-parameter -Wno-error=unused-variable
WNO += -Wno-error=unused-but-set-variable -Wno-error=unused-but-set-parameter
WNO += -Wno-error=infinite-recursion
CFLAGS = $(W) $(WNO) -fno-omit-frame-pointer
CFLAGS += -MD -O3 -ffreestanding -nostdlib -std=gnu89
CFLAGS += -fno-common -fno-stack-protector
CFLAGS += -fno-pie -no-pie -fno-pic
CFLAGS += -g -fsanitize=undefined
#CFLAGS += -fstack-protector-all
LDFLAGS = -z max-page-size=4096
ifeq ($(ARCH), x86)
CFLAGS += -mgeneral-regs-only
endif
ifeq ($(ARCH), x86_64)
CFLAGS += -mcmodel=large
CFLAGS += -mgeneral-regs-only
endif
ifeq ($(ARCH), riscv64)
CFLAGS += -mcmodel=medany
endif
MAKE:=$(MAKE) -s
all: $(TARGET)
FORCE:
src/kernel.bin: FORCE
cargo b $(CARGO_B) $(CARGO_FLAGS)
@rm -f src/kernel.bin
@$(MAKE) -C $(@D)
isodir:
$(info [all] $@)
@mkdir -p isodir/boot/grub
@cp src/grub.cfg isodir/boot/grub/grub.cfg
@mkdir -p isodir/modules
@dd if=/dev/zero of=isodir/modules/ext2.img bs=4M count=2 > /dev/null 2>&1
@mkfs.ext2 isodir/modules/ext2.img > /dev/null 2>&1
kernel.iso: src/kernel.bin src/grub.cfg Makefile isodir FORCE
$(info [all] $@)
@cp src/kernel.bin isodir/boot/kernel.bin
@sudo cp src/kernel.bin /srv/tftp/boot/kernel.bin
@grub-mkrescue -o kernel.iso isodir > /dev/null 2>&1
.PHONY: all build qemu bochs mount umount clean
BOCHS = bochs -q
qemu: kernel.iso
$(QEMU) $(MACHINE) $(BOOT) $(QEMU_OPTS) $(QEMU_DEBUG)
@cat serial.log
bochs: kernel.iso
@$(BOCHS) -qf .bochsrc
@cat serial.log
mount: isodir
ifeq ("$(wildcard /mnt/ext2/lost+found/)","")
$(info [all] $@)
@doas mount isodir/modules/ext2.img /mnt/ext2 -o loop
@doas chown -R aleksa:aleksa /mnt/ext2
endif
umount:
ifneq ("$(wildcard /mnt/ext2/lost+found/)","")
$(info [all] $@)
@doas umount /mnt/ext2
endif
clean:
@find ./src/ -name "*.o" -exec rm {} \;
@find ./src/ -name "*.d" -exec rm {} \;
@rm -f kernel.iso src/kernel.bin xbochs.log bx_enh_dbg.ini log serial.log
@rm -rf isodir
@cargo clean
@$(MAKE) umount
|