#!/bin/sh
set -e
PATH_TO_ELF="$1"
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
BIN="$SCRIPT_DIR/bin"
DISK_IMG="$BIN/disk.img"
MNT1="$SCRIPT_DIR/mnt1"
MNT2="$SCRIPT_DIR/mnt2"
ROOTFS_IMG="$BIN/DISK0"
SIZE_MB=2048
GDB_PORT=${GDB_PORT:-3333}
RUN_NET=${RUN_NET:-0}
mkdir -p "$BIN" "$MNT1" "$MNT2"
dd if=/dev/zero of="$DISK_IMG" bs=1M count=2048
# - p1: start 1MiB、total 512MiB、FAT32(LBA), bootable
# - p2: Linux(0x83)
sudo sfdisk "$DISK_IMG" <<'EOF'
label: dos
unit: sectors
sector-size: 512
start=2048, size=1048576, type=c, bootable
start=, type=83
EOF
LOOP=$(sudo losetup --find --show --partscan "$DISK_IMG")
echo "loop = $LOOP"
sudo mkfs.vfat -F 32 "${LOOP}p1"
sudo mount "${LOOP}p1" "$MNT1"
sudo cp "$PATH_TO_ELF" "$MNT1/elf-hypervisor.elf"
sudo cp "$BIN/boot.scr" "$MNT1/boot.scr" || true
sudo cp "$BIN/u-boot.bin" "$MNT1/u-boot.bin" || true
sudo cp "$BIN/Image" "$MNT1/image"
sync
sudo dd if="$ROOTFS_IMG" of="${LOOP}p2" bs=4M conv=fsync
sudo umount "$MNT1"
sudo losetup -d "$LOOP"
if [ "$RUN_NET" = "1" ]; then
qemu-system-aarch64 \
-M virt,gic-version=2,secure=off,virtualization=on \
-global virtio-mmio.force-legacy=off \
-bios "$BIN/u-boot.bin" -cpu max -m 4G \
-nographic \
-serial mon:stdio \
-netdev user,id=net0,hostfwd=udp::40000-:10000,hostfwd=udp::40010-:10001 \
-device virtio-net-device,netdev=net0 \
-device virtio-blk-device,drive=disk \
-drive file="$DISK_IMG",format=raw,if=none,media=disk,id=disk \
-gdb tcp::1234 #-S
else
qemu-system-aarch64 \
-M virt,gic-version=2,secure=off,virtualization=on \
-global virtio-mmio.force-legacy=off \
-bios "$BIN/u-boot.bin" -cpu max -m 4G \
-nographic \
-serial mon:stdio \
-chardev socket,id=gdbserial,port=${GDB_PORT},host=127.0.0.1,server=on,wait=off \
-serial chardev:gdbserial \
-device virtio-blk-device,drive=disk \
-drive file="$DISK_IMG",format=raw,if=none,media=disk,id=disk \
-gdb tcp::1234 #-S
fi