I got sick of closing the debugcon window all the time when I only need it sometimes, so it's now gated behind the '-x' option to qemu.sh.
140 lines
3.5 KiB
Bash
Executable File
140 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
build="$(dirname $0)/build"
|
|
assets="$(dirname $0)/assets"
|
|
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 jsix.log"
|
|
shift
|
|
;;
|
|
-x | --debugcon)
|
|
debugcon_cmd="less --follow-name -R +F debugcon.log"
|
|
shift
|
|
;;
|
|
*)
|
|
if [ -d "$1" ]; then
|
|
build="$1"
|
|
shift
|
|
fi
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ ! -c /dev/kvm ]]; then
|
|
kvm=""
|
|
fi
|
|
|
|
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
|
|
|
|
qemu-system-x86_64 \
|
|
-drive "if=pflash,format=raw,readonly,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=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
|