Makefile.src 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. HOST ?= $(shell uname -s | tr '[:upper:]' '[:lower:]')
  2. ARCH ?= ##DEFAULT_ARCH##
  3. MODE ?= debug
  4. SMP ?= 4
  5. QEMU ?= ##QEMU##
  6. GDB ?= ##GDB##
  7. FDISK ?= ##FDISK##
  8. COMMA := ,
  9. ifeq ($(MODE),debug)
  10. MODE := dev
  11. endif
  12. QEMU_ARGS ?= -no-reboot -no-shutdown
  13. CARGO_FLAGS := --profile $(MODE) --features $(FEATURES)$(if $(SMP),$(COMMA)smp,)
  14. ifeq ($(HOST),darwin)
  15. QEMU_ACCEL ?= -accel tcg
  16. else ifeq ($(HOST),linux)
  17. QEMU_ACCEL ?= -accel kvm
  18. endif
  19. QEMU_ARGS += $(QEMU_ACCEL)
  20. ifneq ($(DEBUG_TRAPS),)
  21. QEMU_ARGS += -d cpu_reset,int,guest_errors -D build/qemu.log
  22. endif
  23. ifneq ($(SMP),)
  24. QEMU_ARGS += -smp $(SMP)
  25. endif
  26. ifeq ($(ARCH),riscv64)
  27. QEMU_ARGS += \
  28. -machine virt -kernel build/riscv64gc-unknown-none-elf/debug/eonix_kernel \
  29. -device virtio-blk-device,drive=disk0,bus=virtio-mmio-bus.0 \
  30. -device virtio-blk-device,drive=disk1,bus=virtio-mmio-bus.1 \
  31. -device virtio-net-device,netdev=mynet0 \
  32. -drive id=disk0,file=build/boot.img,format=raw,if=none \
  33. -drive id=disk1,file=build/fs.img,format=raw,if=none \
  34. -netdev user,id=mynet0 \
  35. -rtc base=utc
  36. CARGO_FLAGS += --target riscv64gc-unknown-none-elf
  37. .PHONY: run
  38. run: kernel build/kernel.sym build/boot.img
  39. $(QEMU) $(QEMU_ARGS) -display none -serial mon:stdio
  40. .PHONY: srun
  41. srun: kernel build/kernel.sym build/boot.img
  42. $(QEMU) $(QEMU_ARGS) -display none -S -s -serial mon:stdio
  43. else ifeq ($(ARCH),x86_64)
  44. QEMU_ARGS += \
  45. -machine q35 \
  46. -device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0 \
  47. -device e1000e,netdev=mynet0 \
  48. -drive id=disk,file=build/boot.img,format=raw,if=none \
  49. -netdev user,id=mynet0
  50. CARGO_FLAGS += --target x86_64-unknown-none.json
  51. .PHONY: run
  52. run: build
  53. $(QEMU) $(QEMU_ARGS) -display none -serial mon:stdio
  54. .PHONY: srun
  55. srun: build
  56. $(QEMU) $(QEMU_ARGS) -display none -S -s -serial mon:stdio
  57. endif
  58. .PHONY: clean
  59. clean:
  60. -rm -rf build
  61. -mkdir build
  62. .PHONY: clean-all
  63. clean-all: clean
  64. -rm Makefile
  65. .PHONY: debug
  66. debug:
  67. -RUST_GDB=$(GDB) rust-gdb --symbols=build/kernel.sym \
  68. -iex 'source pretty-print.py' \
  69. -iex 'set pagination off' \
  70. -iex 'set output-radix 16' \
  71. -iex 'set print asm-demangle on' \
  72. -iex 'set print pretty on' \
  73. -iex 'target remote:1234'
  74. -killall $(QEMU)
  75. .PHONY: tmux-debug
  76. tmux-debug:
  77. tmux new-session -s gbos-debug -d
  78. -tmux split-window -t gbos-debug -hf
  79. -tmux send-keys -t gbos-debug:1.1 'make srun' C-m
  80. -tmux send-keys -t gbos-debug:1.2 'make debug' C-m C-m
  81. -tmux attach -t gbos-debug
  82. tmux kill-session -t gbos-debug
  83. .PHONY: kernel
  84. kernel:
  85. cargo build $(CARGO_FLAGS)
  86. build/kernel.sym: kernel
  87. cargo objcopy $(CARGO_FLAGS) -- --only-keep-debug build/kernel.sym
  88. build/mbr.bin: kernel
  89. cargo objcopy $(CARGO_FLAGS) -- -O binary -j .mbr build/mbr.bin
  90. build/stage1.bin: kernel
  91. cargo objcopy $(CARGO_FLAGS) -- -O binary -j .stage1 build/stage1.bin
  92. build/kernel.bin: kernel
  93. cargo objcopy $(CARGO_FLAGS) -- -O binary --strip-debug \
  94. -R .mbr -R .stage1 build/kernel.bin
  95. build/fs.img: init_script.sh script/build-img.sh
  96. sh script/build-img.sh
  97. build/boot.img: build/mbr.bin build/stage1.bin build/kernel.bin build/fs.img
  98. dd if=build/mbr.bin of=build/boot.img bs=512 count=1 conv=notrunc 2> /dev/null
  99. dd if=build/stage1.bin of=build/boot.img bs=512 seek=1 conv=notrunc 2> /dev/null
  100. dd if=build/kernel.bin of=build/boot.img bs=4096 seek=1 conv=notrunc 2> /dev/null
  101. dd if=build/fs.img of=build/boot.img bs=$(shell expr 4 \* 1024 \* 1024) \
  102. seek=1 conv=notrunc 2> /dev/null
  103. sh -c 'echo n; echo; echo; echo 8192; echo; echo a; echo w' \
  104. | $(FDISK) build/boot.img 2> /dev/null > /dev/null
  105. .PHONY: build
  106. build: build/boot.img build/kernel.sym