On Fri, Aug 14, 2026 at 12:03 AM George Guo <[email protected]> wrote:
>
> Hi Huacai,
>
> On Sun, 9 Aug 2026 at 12:16, Huacai Chen <[email protected]> wrote:
> > 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.
>
> I owe you an apology: I did not actually understand your question. I
> thought the commit message had already explained the reason (the
> i8042_flush() panic), so I treated it as answered and never addressed
> what you were really asking. Let me answer it directly now.
>
> You are right that this is not just a selftest detail. i8042 is built on
> every LoongArch kernel: arch/loongarch/Kconfig selects
> ARCH_MIGHT_HAVE_PC_SERIO, and KEYBOARD_ATKBD and MOUSE_PS2 (both default
> y) select SERIO_I8042 under it. So your "single kernel for host and
> guest" point is correct -- a normal defconfig kernel has i8042 built in.
>
> On the QEMU virtual machine there is no i8042, so PNP finds nothing and
> i8042_pnp_init() falls back to probing the i8042 status and data
> registers (I8042_STATUS_REG, I8042_DATA_REG) directly. On LoongArch those
> registers are memory-mapped, and on the virtual machine they are not backed
> by any device, so i8042_flush() takes a page fault and the kernel panics
> before userspace. A normal LoongArch defconfig kernel booted as a QEMU
> guest hits the same panic -- the "# CONFIG_SERIO_I8042 is not set" in
> loongarch.conf is only a workaround to let the KHO selftest boot, not a
> fix.
>
> The real fix is separate from the KHO series: make i8042 bail out on
> LoongArch when ACPI/PNP does not describe a controller, so the direct-port
> fallback never runs. I have prepared that as a standalone patch -- the
> relevant hunk is below -- and will send the full patch separately. The
> selftest workaround can be dropped once it lands.
You nearly answered nothing.
Does your employer use different kernels for host and guest in KylinOS?
Huacai
>
> diff --git a/drivers/input/serio/i8042-acpipnpio.h
> b/drivers/input/serio/i8042-acpipnpio.h
> --- a/drivers/input/serio/i8042-acpipnpio.h
> +++ b/drivers/input/serio/i8042-acpipnpio.h
> @@ -1633,8 +1633,14 @@ static int __init i8042_pnp_init(void)
> #else
> pr_info("PNP: No PS/2 controller found.\n");
> #if defined(__loongarch__)
> - if (acpi_disabled == 0)
> - return -ENODEV;
> + /*
> + * LoongArch legacy I/O ports are memory-mapped and are not
> + * safely probeable when no controller is present: a direct
> + * probe faults on the QEMU virtual machine and on any
> FDT-based
> + * boot. Do not fall back to probing them directly; if
> ACPI/PNP
> + * did not describe a controller, assume there is none.
> + */
> + return -ENODEV;
> #else
> if (x86_platform.legacy.i8042 !=
> X86_LEGACY_I8042_EXPECTED_PRESENT)
>
> Thanks,
> George