Files
linux-kernel-module-cheat/run
Ciro Santilli 2eff007f7c GEM5 checkpoint switch to HPI for benchmarking.
Don't pass -e on checkpoint restore.

Add benchmarks to how much GEM5 is slower than QEMU.

Rename Kernel boot command line arguments to match kernel docs name.

Document how to pass extra options to GEM5.

Start listing interesting benchmarks to run on GEM5.

Add an openmp hello world.
2018-02-25 10:59:28 +00:00

175 lines
4.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
# CLI handling.
arch=x86_64
debug_vm=''
kgdb=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=''
gem5=false
gem5opts=''
initrd=false
root=''
while getopts a:Dde:G:giknt:x OPT; do
case "$OPT" in
a)
arch="$OPTARG"
;;
d)
extra_flags="$extra_flags -S -s"
;;
D)
debug_vm='gdb -q -ex start --args'
;;
e)
extra_append="$extra_append $OPTARG"
;;
k)
extra_append="$extra_append kgdbwait"
# For those who want to try KDB.
#extra_append="$extra_append kgdbwait kgdboc=kbd"
extra_flags="$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="$extra_flags -nographic"
nographic=true
;;
esac
done
shift "$(($OPTIND - 1))"
extra_flags="$extra_flags $@"
if $gem5; then
outdir="$(pwd)/buildroot/output.${arch}-gem5~"
gem5_dir="$(pwd)/gem5/gem5"
if [ "$arch" = x86_64 ]; then
cmd="\
M5_PATH='$(pwd)/gem5/gem5-system' \
'${gem5_dir}/build/X86/gem5.opt' \
${gem5opts} \
'${gem5_dir}/configs/example/fs.py' \
--disk-image='${outdir}/images/rootfs.ext2' \
--kernel='${outdir}/build/linux-custom/vmlinux' \
--root-device=/dev/sda \
$extra_flags \
"
elif [ "$arch" = arm ] || [ "$arch" = aarch64 ]; then
cmd="\
M5_PATH='$(pwd)/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='${outdir}/images/rootfs.ext2' \
--dtb-file='${gem5_dir}/system/arm/dt/$([ "$arch" = arm ] && echo armv7_gem5_v1_1cpu || echo armv8_gem5_v1_1cpu).dtb' \
--kernel='${outdir}/build/linux-custom/vmlinux' \
--machine-type=VExpress_GEM5_V1 \
$extra_flags \
"
fi
else
buildroot_out_dir="./buildroot/output.${arch}~"
images_dir="$buildroot_out_dir/images"
qemu_common="\
$debug_vm \
$buildroot_out_dir/host/usr/bin/qemu-system-${arch} \
-m 128M \
-monitor telnet::45454,server,nowait \
-netdev user,hostfwd=tcp::45455-:45455,id=net0 \
-smp 1 \
"
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"