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