Re: [PATCH v4 4/4] selftests/kho: add LoongArch vmtest support

From: Huacai Chen

Date: Sun Aug 09 2026 - 00:16:44 EST


Hi, George,

On Fri, Aug 7, 2026 at 6:39 PM George Guo <dongtai.guo@xxxxxxxxx> wrote:
>
> From: George Guo <guodongtai@xxxxxxxxxx>
>
> Add loongarch.conf to configure QEMU's LoongArch virtual machine (VM)
> with a la464 CPU, enable the 8250 serial console, and set the kernel
> image to vmlinux.efi. Extend vmtest.sh to recognise loongarch64 as a
> supported target and map it to the 'loongarch' kernel arch name.
>
> QEMU's LoongArch VM provides no ACPI tables and relies on FDT to
> describe hardware. Without 'earlycon' on the kernel command line, the
> FDT is not scanned for a console UART, no output reaches the console,
> and vmtest.sh's console log stays empty causing the test to always
> fail. Add 'earlycon' to KERNEL_CMDLINE in loongarch.conf.
>
> QEMU's LoongArch VM has no i8042 PS/2 controller. When PNP detection
> finds nothing, i8042_init() falls back to probing the ports directly.
> On LoongArch the I/O ports are memory-mapped, and the i8042 port
> addresses are not backed by any device on the VM, so i8042_flush() takes
> a page fault and the kernel panics:
>
> i8042: PNP: No PS/2 controller found.
> i8042: Probing ports directly.
> CPU 0 Unable to handle kernel paging request at virtual address ffff800000008064
> ERA: i8042_flush+0x50/0x198
> RA: i8042_init+0x2a8/0x35c
> Kernel panic - not syncing: Attempted to kill init!
You never answer me why in your test you should disable i8042 from V1
until V4. In normal use we use a single kernel for both host and
guest.

Huacai

>
> Disable SERIO_I8042 and its dependents (KEYBOARD_ATKBD, MOUSE_PS2) in
> the QEMU_KCONFIG fragment to prevent the driver from being built.
> All three options are scoped to loongarch.conf; no other architecture
> is affected.
>
> Wrap the QEMU invocation in run_qemu() with timeout(1) using a local
> time limit so the test always terminates, even when QEMU does not exit
> on its own. This is useful for every architecture; on LoongArch, for
> example, QEMU provides no EFI runtime services and machine_restart()
> falls through to an idle loop after kexec, so QEMU would never exit
> otherwise.
>
> Co-developed-by: Kexin Liu <liukexin@xxxxxxxxxx>
> Signed-off-by: Kexin Liu <liukexin@xxxxxxxxxx>
> Signed-off-by: George Guo <guodongtai@xxxxxxxxxx>
> ---
> tools/testing/selftests/kho/loongarch.conf | 11 +++++++++++
> tools/testing/selftests/kho/vmtest.sh | 22 +++++++++++++++-------
> 2 files changed, 26 insertions(+), 7 deletions(-)
> create mode 100644 tools/testing/selftests/kho/loongarch.conf
>
> diff --git a/tools/testing/selftests/kho/loongarch.conf b/tools/testing/selftests/kho/loongarch.conf
> new file mode 100644
> index 000000000000..e45fe1014cf3
> --- /dev/null
> +++ b/tools/testing/selftests/kho/loongarch.conf
> @@ -0,0 +1,11 @@
> +QEMU_CMD="qemu-system-loongarch64 -M virt -cpu la464"
> +QEMU_KCONFIG="
> +CONFIG_SERIAL_8250=y
> +CONFIG_SERIAL_8250_CONSOLE=y
> +CONFIG_SPARSEMEM_MANUAL=y
> +# CONFIG_KEYBOARD_ATKBD is not set
> +# CONFIG_MOUSE_PS2 is not set
> +# CONFIG_SERIO_I8042 is not set
> +"
> +KERNEL_IMAGE="vmlinux.efi"
> +KERNEL_CMDLINE="console=ttyS0 earlycon kho_scratch=16M,16M,16M"
> diff --git a/tools/testing/selftests/kho/vmtest.sh b/tools/testing/selftests/kho/vmtest.sh
> index 0014bd76e88d..de6aa59cf5a0 100755
> --- a/tools/testing/selftests/kho/vmtest.sh
> +++ b/tools/testing/selftests/kho/vmtest.sh
> @@ -21,7 +21,7 @@ Options:
> -d) path to the kernel build directory
> -j) number of jobs for compilation, similar to -j in make
> -t) run test for target_arch, requires CROSS_COMPILE set
> - supported targets: aarch64, x86_64
> + supported targets: aarch64, x86_64, loongarch64
> -h) display this help
> EOF
> }
> @@ -111,12 +111,19 @@ function run_qemu() {
>
> cmdline="$cmdline kho=on panic=-1"
>
> - $qemu_cmd -m 1G -smp 2 -no-reboot -nographic -nodefaults \
> - -accel kvm -accel hvf -accel tcg \
> - -serial file:"$serial" \
> - -append "$cmdline" \
> - -kernel "$kernel" \
> - -initrd "$initrd"
> + local qemu_args=(
> + -m 1G -smp 2 -no-reboot -nographic -nodefaults
> + -accel kvm -accel hvf -accel tcg
> + -serial file:"$serial"
> + -append "$cmdline"
> + -kernel "$kernel"
> + -initrd "$initrd"
> + )
> +
> + # Bound the QEMU run so the test always terminates, even when QEMU
> + # does not exit on its own (e.g. no EFI runtime services after kexec).
> + local qemu_timeout=60
> + timeout "$qemu_timeout" $qemu_cmd "${qemu_args[@]}" || true
>
> grep "KHO restore succeeded" "$serial" &> /dev/null || fail "KHO failed"
> }
> @@ -127,6 +134,7 @@ function target_to_arch() {
> case $target in
> aarch64) echo "arm64" ;;
> x86_64) echo "x86" ;;
> + loongarch64) echo "loongarch" ;;
> *) skip "architecture $target is not supported"
> esac
> }
> --
> 2.53.0
>