]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
vmspawn: Attach a USB keyboard in GUI mode
authorDaan De Meyer <daan@amutable.com>
Mon, 11 May 2026 13:00:19 +0000 (15:00 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Mon, 11 May 2026 15:16:14 +0000 (16:16 +0100)
EDK2's UsbKbDxe is the only driver that registers a default HII
keyboard layout via the HII database protocol; the PS/2 driver does
not. Adding a USB xHCI controller and usb-kbd in CONSOLE_GUI mode
gives us a layout to query, which systemd-boot exports through the
LoaderKeyboardLayout EFI variable — useful for exercising that
codepath end-to-end.

src/vmspawn/vmspawn.c

index 57b7697079ee4d8ce1e39ab46c464ff2fd6b9d23..f49b36af1e866ee4bbea812c600bae889659389c 100644 (file)
@@ -2978,6 +2978,23 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
                 if (r < 0)
                         return r;
 
+                /* Attach a USB xHCI controller and a USB keyboard. We prefer USB over the implicit PS/2
+                 * keyboard so that EDK2's UsbKbDxe driver runs, which registers the default HII keyboard
+                 * layout package — the PS/2 driver does not. That makes
+                 * EFI_HII_DATABASE_PROTOCOL.GetKeyboardLayout() return a usable layout, which systemd-boot
+                 * then exports via the LoaderKeyboardLayout EFI variable, which is useful for testing that
+                 * codepath actually works. */
+                r = qemu_config_section(config_file, "device", "xhci0",
+                                        "driver", "qemu-xhci");
+                if (r < 0)
+                        return r;
+
+                r = qemu_config_section(config_file, "device", "usb-kbd0",
+                                        "driver", "usb-kbd",
+                                        "bus", "xhci0.0");
+                if (r < 0)
+                        return r;
+
                 break;
 
         case CONSOLE_HEADLESS: