mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 08:24:32 -08:00
Add an option to tell qemu.sh not to build before running. Also update paths to be more explicit about where log files go.
152 lines
3.7 KiB
Bash
Executable File
152 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
root=$(dirname $0)
|
|
build="${root}/build"
|
|
assets="${root}/assets"
|
|
|
|
no_build=""
|
|
debug=""
|
|
isaexit='-device isa-debug-exit,iobase=0xf4,iosize=0x04'
|
|
debugtarget="${build}/jsix.elf"
|
|
gfx="-nographic"
|
|
vga="-vga none"
|
|
log=""
|
|
kvm=""
|
|
debugcon_cmd=""
|
|
cpu_features=",+pdpe1gb,+invtsc,+hypervisor,+x2apic,+xsavec,+xsaves,+xsaveopt"
|
|
cpu="Broadwell"
|
|
smp=4
|
|
|
|
while true; do
|
|
case "$1" in
|
|
-b | --debugboot)
|
|
debug="-s -S"
|
|
debugtarget="${build}/boot/boot.efi"
|
|
shift
|
|
;;
|
|
-d | --debug)
|
|
debug="-s -S"
|
|
isaexit=""
|
|
shift
|
|
;;
|
|
-g | --gfx)
|
|
gfx=""
|
|
vga=""
|
|
shift
|
|
;;
|
|
-v | --vga)
|
|
vga=""
|
|
shift
|
|
;;
|
|
-r | --remote)
|
|
shift
|
|
vnchost="${1:-${VNCHOST:-"localhost:5500"}}"
|
|
gfx="-vnc ${vnchost},reverse"
|
|
vga=""
|
|
shift
|
|
;;
|
|
-k | --kvm)
|
|
kvm="-enable-kvm"
|
|
cpu="max"
|
|
shift
|
|
;;
|
|
-c | --cpus)
|
|
smp=$2
|
|
shift 2
|
|
;;
|
|
-l | --log)
|
|
log="-d mmu,int,guest_errors -D ${root}/jsix.log"
|
|
shift
|
|
;;
|
|
-x | --debugcon)
|
|
debugcon_cmd="less --follow-name -R +F debugcon.log"
|
|
shift
|
|
;;
|
|
--no-build)
|
|
no_build="yes"
|
|
shift
|
|
;;
|
|
*)
|
|
if [ -d "$1" ]; then
|
|
build="$1"
|
|
shift
|
|
fi
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ ! -c /dev/kvm ]]; then
|
|
kvm=""
|
|
fi
|
|
|
|
[[ -z "${no_build}" ]] && if ! ninja -C "${build}"; then
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -n $TMUX ]]; then
|
|
cols=$(tput cols)
|
|
log_width=100
|
|
|
|
if [[ -n $debug ]]; then
|
|
log_cols=1
|
|
if [[ $debugcon_cmd ]]; then
|
|
log_cols=2
|
|
fi
|
|
|
|
gdb_width=$(($cols - $log_cols * $log_width))
|
|
|
|
if (($gdb_width < 150)); then
|
|
stack=1
|
|
gdb_width=$(($cols - $log_width))
|
|
tmux split-window -h -l $gdb_width "gdb ${debugtarget}"
|
|
if [[ $debugcon_cmd ]]; then
|
|
tmux select-pane -t .left
|
|
tmux split-window -v "$debugcon_cmd"
|
|
fi
|
|
else
|
|
if [[ $debugcon_cmd ]]; then
|
|
tmux split-window -h -l $(($log_width + $gdb_width)) "$debugcon_cmd"
|
|
fi
|
|
tmux split-window -h -l $gdb_width "gdb ${debugtarget}"
|
|
tmux select-pane -t .left
|
|
tmux select-pane -t .right
|
|
fi
|
|
else
|
|
if [[ $debugcon_cmd ]]; then
|
|
tmux split-window -h -l $log_width "$debugcon_cmd"
|
|
tmux last-pane
|
|
fi
|
|
tmux split-window -l 10 "sleep 1; telnet localhost 45454"
|
|
fi
|
|
elif [[ $DESKTOP_SESSION = "i3" ]]; then
|
|
if [[ -n $debug ]]; then
|
|
i3-msg exec i3-sensible-terminal -- -e "gdb ${debugtarget}" &
|
|
else
|
|
i3-msg exec i3-sensible-terminal -- -e 'telnet localhost 45454' &
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "${debug}" ]]; then
|
|
(sleep 1; echo "Debugging ready.") &
|
|
fi
|
|
|
|
qemu-system-x86_64 \
|
|
-drive "if=pflash,format=raw,readonly=on,file=${assets}/ovmf/x64/ovmf_code.fd" \
|
|
-drive "if=pflash,format=raw,file=${build}/ovmf_vars.fd" \
|
|
-drive "format=raw,file=${build}/jsix.img" \
|
|
-chardev "file,path=${root}/debugcon.log,id=jsix_debug" \
|
|
-device "isa-debugcon,iobase=0x6600,chardev=jsix_debug" \
|
|
-monitor telnet:localhost:45454,server,nowait \
|
|
-serial stdio \
|
|
-smp "${smp}" \
|
|
-m 4096 \
|
|
-cpu "${cpu}${cpu_features}" \
|
|
-M q35 \
|
|
-no-reboot \
|
|
-name jsix \
|
|
$isaexit $log $gfx $vga $kvm $debug
|
|
|
|
((result = ($? >> 1) - 1))
|
|
exit $result
|