mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-23 02:05:57 +01:00
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.
175 lines
4.4 KiB
Bash
Executable File
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"
|