Files
linux-kernel-module-cheat/run
Ciro Santilli 7b08433840 9p mount the output directory.
This is in preparation for moving parsec to 9p once we get it working on gem5.

We'll document it then when everything is working.
2018-03-11 22:00:55 +00:00

200 lines
5.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
# CLI handling.
arch=x86_64
cpus=1
debug_vm=''
kgdb=false
kvm=false
nographic=false
# norandmaps: Don't use address space randomization. Equivalent to echo 0 > /proc/sys/kernel/randomize_va_space.
# printk.time=y: log in format: "[time ] msg" for all printk messages.
# nokaslr: https://unix.stackexchange.com/questions/397939/turning-off-kaslr-to-debug-linux-kernel-using-qemu-and-gdb
# Turned on by default since v4.12
extra_append='nokaslr norandmaps printk.devkmsg=on printk.time=y'
extra_flags=''
extra_flags_qemu=''
gem5=false
gem5opts=''
initrd=false
root=''
while getopts a:c:Dde:G:giKknt:x OPT; do
case "$OPT" in
a)
arch="$OPTARG"
;;
c)
cpus="$OPTARG"
;;
d)
extra_flags_qemu="$extra_flags -S -s"
;;
D)
debug_vm='gdb -q -ex start --args'
;;
e)
extra_append="$extra_append $OPTARG"
;;
K)
kvm=true
;;
k)
extra_append="$extra_append kgdbwait"
# For those who want to try KDB.
#extra_append="$extra_append kgdbwait kgdboc=kbd"
extra_flags_qemu="$extra_flags -serial tcp::1234,server,nowait"
kgdb=true
;;
g)
gem5=true
;;
G)
gem5opts="$OPTARG"
;;
i)
initrd=true
;;
n)
extra_append="$extra_append console=ttyS0"
extra_flags_qemu="$extra_flags -nographic"
nographic=true
;;
esac
done
shift "$(($OPTIND - 1))"
extra_flags="$extra_flags $@"
arch_dir="$arch"
if "$gem5"; then
arch_dir="${arch}-gem5"
fi
root_dir="$(pwd)"
buildroot_dir="${root_dir}/buildroot"
out_dir="${root_dir}/buildroot/output.${arch_dir}~"
if "$gem5"; then
gem5_dir="${root_dir}/gem5/gem5"
if [ "$arch" = x86_64 ]; then
if "$kvm"; then
extra_flags="$extra_flags --cpu-type=X86KvmCPU"
fi
cmd="\
M5_PATH='${root_dir}/gem5/gem5-system' \
'${gem5_dir}/build/X86/gem5.opt' \
${gem5opts} \
'${gem5_dir}/configs/example/fs.py' \
--command-line='earlyprintk=ttyS0 console=ttyS0 lpj=7999923 root=/dev/hda $extra_append' \
--disk-image='${out_dir}/images/rootfs.ext2' \
--kernel='${out_dir}/build/linux-custom/vmlinux' \
--num-cpus=${cpus} \
$extra_flags \
"
elif [ "$arch" = arm ] || [ "$arch" = aarch64 ]; then
cmd="\
M5_PATH='${root_dir}/gem5/gem5-system' \
$debug_vm \
'${gem5_dir}/build/ARM/gem5.opt' \
${gem5opts} \
'${gem5_dir}/configs/example/fs.py' \
--command-line='earlyprintk=pl011,0x1c090000 console=ttyAMA0 lpj=19988480 rw loglevel=8 mem=512MB root=/dev/sda $extra_append' \
--disk-image='${out_dir}/images/rootfs.ext2' \
--dtb-file='${gem5_dir}/system/arm/dt/$([ "$arch" = arm ] && echo "armv7_gem5_v1_${cpus}cpu" || echo "armv8_gem5_v1_${cpus}cpu").dtb' \
--kernel='${out_dir}/build/linux-custom/vmlinux' \
--machine-type=VExpress_GEM5_V1 \
--num-cpus=${cpus} \
$extra_flags \
"
fi
else
if "$kvm"; then
extra_flags="${extra_flags} -enable-kvm"
fi
extra_flags="${extra_flags_qemu} ${extra_flags}"
images_dir="${out_dir}/images"
qemu_common="\
${debug_vm} \
${out_dir}/host/usr/bin/qemu-system-${arch} \
-m 128M \
-monitor telnet::45454,server,nowait \
-netdev user,hostfwd=tcp::45455-:45455,id=net0 \
-smp $cpus \
-virtfs local,path=9p,mount_tag=host_scratch,security_model=mapped,id=host_scratch \
-virtfs local,path=${out_dir}/build,mount_tag=host_out,security_model=mapped,id=host_out \
"
if "$initrd"; then
extra_flags="${extra_flags} -initrd '${images_dir}/rootfs.cpio'"
fi
# The base QEMU commands are found under board/qemu/*/readme.tx
case "$arch" in
x86_64)
if "$kgdb"; then
extra_append="$extra_append kgdboc=ttyS0,115200"
fi
if ! "$initrd"; then
root='root=/dev/vda'
extra_flags="$extra_flags -drive file='${images_dir}/rootfs.ext2.qcow2,if=virtio,format=qcow2'"
fi
cmd="$qemu_common \
-M pc \
-append '$root nopat $extra_append' \
-device edu \
-device lkmc_pci_min \
-device virtio-net-pci,netdev=net0 \
-kernel ${images_dir}/bzImage \
${extra_flags} \
"
;;
arm)
if "$kgdb"; then
extra_append="$extra_append kgdboc=ttyAMA0,115200"
fi
if ! "$initrd"; then
root='root=/dev/sda'
extra_flags="$extra_flags -drive file='${images_dir}/rootfs.ext2.qcow2,if=scsi,format=qcow2'"
fi
cmd="$qemu_common \
-M versatilepb \
-append '$root $extra_append' \
-device rtl8139,netdev=net0 \
-dtb ${images_dir}/versatile-pb.dtb \
-kernel ${images_dir}/zImage \
-serial stdio \
$extra_flags \
"
;;
aarch64)
if "$kgdb"; then
extra_append="${extra_append} kgdboc=ttyAMA0,115200"
fi
cmd="${qemu_common} \
-M virt \
-append 'root=/dev/sda ${extra_append}' \
-cpu cortex-a57 \
-device virtio-net-device,netdev=net0 \
-kernel ${images_dir}/Image \
-nographic \
-serial stdio \
${extra_flags} \
"
;;
mips64)
if ! "$initrd"; then
root='root=/dev/hda'
extra_flags="${extra_flags} -drive file='${images_dir}/rootfs.ext2.qcow2,format=qcow2'"
fi
cmd="$qemu_common \
-M malta \
-append 'root=/dev/hda ${extra_append}' \
-cpu I6400 \
-device pcnet \
-kernel ${images_dir}/vmlinux \
-nographic \
${extra_flags} \
"
;;
esac
fi
echo "$cmd" | tee run.log
eval "$cmd"