12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- arch := x86_64
- target := x86_64-unknown-none
- mode := release
- kernel := target/$(target)/$(mode)/$(arch)
- img := target/$(target)/$(mode)/img
- accel ?= on
- tcp ?= on
- sysroot := $(shell rustc --print sysroot)
- objdump := $(shell find $(sysroot) -name llvm-objdump) --arch-name=$(arch)
- objcopy := $(shell find $(sysroot) -name llvm-objcopy)
- BUILD_ARGS += --target $(target)
- ifeq ($(mode), release)
- BUILD_ARGS += --release
- endif
- ifeq ($(tcp), on)
- BUILD_ARGS += --features tcp
- else
- BUILD_ARGS += --no-default-features
- endif
- QEMU_ARGS += \
- -machine q35 \
- -serial mon:stdio \
- -kernel $(kernel) \
- -device virtio-gpu-pci -vga none \
- -device virtio-blk-pci,drive=x0 -drive file=$(img),if=none,format=raw,id=x0 \
- -device virtio-net-pci,netdev=net0 -netdev user,id=net0,hostfwd=tcp::5555-:5555
- ifeq ($(accel), on)
- QEMU_ARGS += -cpu host -accel kvm
- endif
- .PHONY: kernel clean qemu run env
- kernel:
- cargo build $(BUILD_ARGS) --config 'build.rustflags="--cfg platform=\"qemu\" -Clink-args=-Tlinker.ld -Clink-args=-no-pie"'
- env:
- rustup component add llvm-tools-preview rustfmt
- rustup target add $(target)
- asm: kernel
- $(objdump) -d $(kernel) | less
- sym: kernel
- $(objdump) -t $(kernel) | less
- header: kernel
- $(objdump) -x $(kernel) | less
- clean:
- cargo clean
- qemu: kernel $(img)
- # Wait a few seconds, then try to open a connection to the VM so it can test its networking.
- ( sleep 4 && echo "hello" | nc localhost 5555 -N -v) &
- qemu-system-$(arch) $(QEMU_ARGS)
- $(img):
- dd if=/dev/zero of=$@ bs=512 count=32
- run: qemu
|