curiOS/kernel/run.sh
2026-07-26 04:32:21 +02:00

87 lines
1.7 KiB
Bash
Executable file

#!/usr/bin/env bash
set -e
bin="$1"
canonicalised="$(realpath -- "$bin")"
parent="$(dirname -- "$canonicalised")"
bin_name="$(basename -- "$canonicalised")"
parent_base="$(basename -- "$parent")"
case "$parent_base" in
rustdoctest*)
is_doctest=1
;;
*)
is_doctest=0
;;
esac
case "$parent" in
*/deps|*/deps/)
is_test=1
;;
*)
is_test=$is_doctest
;;
esac
echo "Running $bin_name (is_test=$is_test, is_doctest=$is_doctest)"
if [[ $is_test -eq 1 ]]; then
QEMU_TEST_ARGS=("-display" "none" "-device" "isa-debug-exit,iobase=0xf4,iosize=0x04")
else
QEMU_TEST_ARGS=()
fi
image="$parent/$bin_name.img"
if [[ "$canonicalised" -nt "$image" ]]; then
echo "Creating image $image"
cat > /tmp/limine.conf <<EOF
timeout: 0
/Kernel
protocol: limine
path: boot():/boot/kernel.elf
EOF
limine_datadir="$(limine --print-datadir)"
limine_uefi_path="$limine_datadir/BOOTX64.EFI"
dd if=/dev/zero of="$image" bs=1M count=64
mformat -i "$image" -F ::
mmd -i "$image" ::/boot
mmd -i "$image" ::/EFI
mmd -i "$image" ::/EFI/BOOT
mcopy -i "$image" /tmp/limine.conf ::/boot/limine.conf
mcopy -i "$image" "$canonicalised" ::/boot/kernel.elf
mcopy -i "$image" "$limine_uefi_path" ::/EFI/BOOT/BOOTX64.EFI
fi
# cp -n "$OVMF_PATH/FV/OVMF_VARS.fd" "$parent/$bin_name.OVMF_VARS.fd"
set +e
qemu-system-x86_64 \
-drive file="$image",format=raw \
-machine q35,accel=kvm -enable-kvm \
-m 2G \
-drive if=pflash,format=raw,readonly=on,file="$OVMF_PATH/FV/OVMF_CODE.fd" \
-chardev stdio,id=serial0,logfile=qemu.log,signal=on \
-serial chardev:serial0 \
-vga std \
${QEMU_TEST_ARGS[@]}
qemu_ret=$?
if [[ $is_test -eq 1 ]]; then
exit $([ $qemu_ret -eq 33 ])
fi