Set kernel arguments from host in qemu #2

Open
dbautist wants to merge 1 commits from dbautist/nixos-riscv:pl-enhancement into master
5 changed files with 99 additions and 38 deletions
Showing only changes of commit 492c540bf5 - Show all commits

9
.gitea/workflows/ci.yaml Normal file
View File

@ -0,0 +1,9 @@
name: CI
on: push
jobs:
build:qemu-lagarto-ox:
runs-on: native
steps:
- uses: https://gitea.com/ScMi1/checkout@v1.4
- run: nix develop -L .#qemu-lagarto-ox --command ./boot.sh bench2

View File

@ -58,6 +58,17 @@ Then, simply run boot.sh to start the QEMU system.
```
$ ./boot.sh
```
To execute the RISC-V benchmark suite on boot stage 2, run boot.sh with the bench2 option.
```
$ ./boot.sh bench2
```
To open a debug shell on boot stage 2, run boot.sh with the debug2 option.
```
$ ./boot.sh debug2
```
## Lagarto Hun

42
boot.sh
View File

@ -2,6 +2,8 @@
set -ex
dbautist marked this conversation as resolved Outdated

Let's leave -x for now, so we see what is happening.

Let's leave -x for now, so we see what is happening.

The -x option is set on line 37 to avoid showing the trace of the option parsing commands. Do you want these commands to be also traced?

The -x option is set on line 37 to avoid showing the trace of the option parsing commands. Do you want these commands to be also traced?

For now yes

For now yes
QEMU_KERNEL_PARAMS="$@"
#export PATH=/nix/store/c5xwy0rllg4lcw61mh20glairjz7ibv4-qemu-8.0.4/bin/:$PATH
CDIR=$(readlink -f "$PWD")
@ -22,8 +24,6 @@ if [ -z "$TMPDIR" ] || [ -z "$USE_TMPDIR" ]; then
TMPDIR=$(mktemp -d nix-vm.XXXXXXXXXX --tmpdir)
fi
# Create a directory for exchanging data with the VM.
mkdir -p "$TMPDIR/xchg"
@ -32,16 +32,15 @@ echo "Booting $system"
cd "$TMPDIR"
#QEMU_KERNEL_PARAMS="boot.debug1devices"
dbautist marked this conversation as resolved Outdated

Use just QEMU_KERNEL_PARAMS="$@", there is no need to add all this complexity.

Use just `QEMU_KERNEL_PARAMS="$@"`, there is no need to add all this complexity.

The reason why I did it this way is to enable the possibility of adding new options to boot.sh in the future. Furthermore, the option of passing additional arguments to the qemu command is not erased.

If you still want it the simple way, I'll change it :-)

The reason why I did it this way is to enable the possibility of adding new options to boot.sh in the future. Furthermore, the option of passing additional arguments to the qemu command is not erased. If you still want it the simple way, I'll change it :-)

Let's keep it simple until we need more complexity.

Let's keep it simple until we need more complexity.
#QEMU_KERNEL_PARAMS="boot.trace boot.debug1"
QEMU_KERNEL_PARAMS=bench2
#QEMU_KERNEL_PARAMS=bench2
#QEMU_KERNEL_PARAMS=debug2
# Trap the CPU on compressed instructions?
#TRAP_COMPRESSED="-cpu rv64,c=false"
CUSTOM_BIOS="-bios $OPENSBI/share/opensbi/lp64/generic/firmware/fw_payload.bin"
#CUSTOM_BIOS="-bios $OPENSBI/share/opensbi/lp64/generic/firmware/fw_payload.bin"
#CUSTOM_BIOS="-bios $OPENSBI/share/opensbi/lp64/generic/firmware/fw_jump.elf"
#CUSTOM_BIOS="-bios $CDIR/bios-nc.bin"
#CUSTOM_BIOS="-bios $CDIR/bios.bin"
@ -50,8 +49,9 @@ CUSTOM_BIOS="-bios $OPENSBI/share/opensbi/lp64/generic/firmware/fw_payload.bin"
#DEBUG_CPU="-d cpu_reset"
#DEBUG_CPU="-d in_asm,cpu,cpu_reset"
run_qemu () {
exec qemu-system-riscv64 \
CMD='qemu-system-riscv64 \
$DEBUG_GDB \
$DEBUG_CPU \
-name nixos-riscv \
@ -70,30 +70,42 @@ exec qemu-system-riscv64 \
-device virtio-blk-device,drive=hd0 \
-kernel $system/kernel \
-initrd $system/initrd \
-append "$(cat $system/kernel-params) init=$system/init console=ttyS0,115200n8 loglevel=7 $QEMU_KERNEL_PARAMS" \
$QEMU_OPTS \
"$@"
-device vhost-vsock-pci,id=vhost-vsock-pci0,guest-cid=123 \
-serial mon:stdio \
-append "$(cat $system/kernel-params) init=$system/init console=ttyS0 loglevel=7 $QEMU_KERNEL_PARAMS" \
$QEMU_OPTS'
if [[ "$QEMU_KERNEL_PARAMS" =~ bench2 ]]; then
eval "$CMD &"
echo "$!" > qemu.pid
else
eval "$CMD"
fi
}
if [[ "$QEMU_KERNEL_PARAMS" =~ bench2 ]]; then
run_qemu | awk -f $CDIR/verify-bench2.awk
else
run_qemu
fi
# QEMU OPTIONS GRAVEYARD
# -kernel $system/kernel \
# -initrd $system/initrd \
# -append "$(cat $system/kernel-params) init=$system/init regInfo=/nix/store/x3zpwfbk2wkiisxhgi7zwsfwbdfxk0w1-closure-info-riscv64-unknown-linux-gnu/registration console=ttyS0,115200n8 loglevel=7 $QEMU_KERNEL_PARAMS"
# -kernel ${NIXPKGS_QEMU_KERNEL_visionfive_nix:-/nix/store/8n5fakqq44nsmbcn0vdm3mzsvcq9ihbi-nixos-system-visionfive-nix-24.05.20240115.c3e128f/kernel} \
# -initrd /nix/store/96058frp51dn0xxfci4kyvzz0rvd5ngy-initrd-linux-riscv64-unknown-linux-gnu-6.1.72/initrd \
# -append "$(cat /nix/store/8n5fakqq44nsmbcn0vdm3mzsvcq9ihbi-nixos-system-visionfive-nix-24.05.20240115.c3e128f/kernel-params) init=/nix/store/8n5fakqq44nsmbcn0vdm3mzsvcq9ihbi-nixos-system-visionfive-nix-24.05.20240115.c3e128f/init regInfo=/nix/store/bgqa92gznhcr9aryx6ac4ycx4s2385cr-closure-info-riscv64-unknown-linux-gnu/registration console=ttyS0,115200n8 console=tty0 $QEMU_KERNEL_PARAMS" \
# -drive "file=$NIX_DISK_IMAGE,if=virtio,id=hd0" \
# -hda "$NIX_DISK_IMAGE" \
#-net nic,model=virtio,macaddr=16:da:11:b4:44:c9 -net user \
# -net nic,netdev=user.0,model=virtio -netdev user,id=user.0,"$QEMU_NET_OPTS" \
#console=tty0
#console=ttyS0,115200n8
#
# -fsdev local,id=fsdev1,path=/nix/store,security_model=none \
dbautist marked this conversation as resolved Outdated

Why do we need to send stderr to the awk output?, this will hide errors.

Why do we need to send stderr to the awk output?, this will hide errors.

Sorry that was an experiment I performed, there's no reason for that to be there... erasing it.

Sorry that was an experiment I performed, there's no reason for that to be there... erasing it.
# -device virtio-9p-pci,fsdev=fsdev1,mount_tag=store,bus=pcie.1 \
#
# -drive cache=writeback,file="$NIX_DISK_IMAGE",id=drive1,if=none,index=1,werror=report -device virtio-blk-pci,drive=drive1 \
dbautist marked this conversation as resolved Outdated

Use a regex match and quote $QEMU_KERNEL_PARAMS :

if [[ "$QEMU_KERNEL_PARAMS" =~ bench2 ]]; then

Use a regex match and quote `$QEMU_KERNEL_PARAMS` : `if [[ "$QEMU_KERNEL_PARAMS" =~ bench2 ]]; then`

View File

@ -407,6 +407,16 @@
};
bench2 = final.writeShellScript "bench2" ''
#Tests if a benchmark exection was successful
function bench_test {
$@
local status=$?
if (( status != 0)); then
echo "BENCHMARK-ERROR-STATE"
fi
return $status
}
echo --------BENCHMARKING PHASE---------
# Performs minimal FS setup and runs the SPEC benchmark
mkdir /tmp /bin /root
@ -420,42 +430,41 @@
#cat /tmp/spec/time.csv
# hpc_benchmarks
set -x
axpy-autovect 800 1000
axpy-cblas 800 1000
axpy-omp-simd 800 1000
axpy-scalar 800 1000
bench_test "axpy-autovect 800 1000"
bench_test "axpy-cblas 800 1000"
bench_test "axpy-omp-simd 800 1000"
bench_test "axpy-scalar 800 1000"
gemm-autovect 256
gemm-omp-simd 256
gemm-scalar 256
bench_test "gemm-autovect 256"
bench_test "gemm-omp-simd 256"
bench_test "gemm-scalar 256"
somier-autovect 4 32
somier-omp-simd 4 32
somier-scalar 4 32
bench_test "somier-autovect 4 32"
bench_test "somier-omp-simd 4 32"
bench_test "somier-scalar 4 32"
lulesh2.0 -s 4
bench_test "lulesh2.0 -s 4"
jacobi2d_scalar_vanilla 16 2
bench_test "jacobi2d_scalar_vanilla 16 2"
hacckernels-autovectorisation 10
hacckernels-scalar 10
bench_test "hacckernels-scalar 10"
# desktop_benchmarks
blackscholes_scalar 1 ${final.blackscholesInput} /dev/null
bench_test "blackscholes_scalar 1 ${final.blackscholesInput} /dev/null"
bench_test "streamcluster_scalar 3 10 16 16 16 10 none output.txt 1"
streamcluster_scalar 3 10 16 16 16 10 none output.txt 1
canneal_scalar 1 100 300
canneal_vectorial_intrinsics
bench_test "pathfinder_serial.exe 64 64 output_64_64.txt"
bench_test "pathfinder_vector.exe 64 64 output_64_64.txt"
pathfinder_serial.exe 64 64 output_64_64.txt
pathfinder_vector.exe 64 64 output_64_64.txt
swaptions_scalar -ns 2 -sm 1024 -nt 1
bench_test "swaptions_scalar -ns 2 -sm 1024 -nt 1"
# micro_benchmarks (NO WORKING BENCHMARKS FOR NOW...)
echo "BENCHMARK-SUCESS-STATE"
# Give me a shell at the end
bash -l
'';

20
verify-bench2.awk Normal file
View File

@ -0,0 +1,20 @@
BEGIN {
bench_success_flag = 0
}
function terminate_qemu() {
system("kill $(cat qemu.pid)");
if (bench_success_flag) {
print "Benchmark execution has finished successfully. \n"
exit 0;
} else {
print "Benchmark execution has been interrupted by an error. \n"
exit 1;
}
}
/^BENCHMARK-SUCESS-STATE/ { bench_success_flag = 1; terminate_qemu()}
/^BENCHMARK-ERROR-STATE/ { bench_success_flag = 0; terminate_qemu()}
{print $0}