aboutsummaryrefslogtreecommitdiff
path: root/Makefile
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