NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/59721: qemu VM's blackscreen over VNC wth -machine q35



The attached patch to qemu makes q35 with smm=off -- or with nvmm --
work to display a VGA console again on my machine.

As workarounds pending an upstream fix or pkgsrc patch, you can:

1. use serial console instead of graphical console,

2. use OVMF for UEFI boot rather than SeaBIOS for BIOS boot, by adding
   `-bios $LOCALBASE/share/ovmf/OVMFX64.fd' to qemu arguments
$NetBSD$

Work around black screen in VGA mode with SMM disabled, as required by,
e.g., NVMM:

https://gnats.NetBSD.org/59721
https://gitlab.com/qemu-project/qemu/-/issues/2608

--- hw/pci-host/q35.c.orig	2025-10-08 20:50:34.000000000 +0000
+++ hw/pci-host/q35.c
@@ -373,6 +373,10 @@ static void mch_update_smram(MCHPCIState
         memory_region_set_enabled(&mch->high_smram, false);
     }
 
+    if (!mch->has_smm_ranges) {
+        goto out;
+    }
+
     if ((pd->config[MCH_HOST_BRIDGE_ESMRAMC] & MCH_HOST_BRIDGE_ESMRAMC_T_EN) &&
         (pd->config[MCH_HOST_BRIDGE_SMRAM] & SMRAM_G_SMRAME)) {
         switch (pd->config[MCH_HOST_BRIDGE_ESMRAMC] &
@@ -406,7 +410,7 @@ static void mch_update_smram(MCHPCIState
                               mch->below_4g_mem_size - tseg_size);
     memory_region_set_alias_offset(&mch->tseg_window,
                                    mch->below_4g_mem_size - tseg_size);
-
+out:
     memory_region_transaction_commit();
 }
 
@@ -478,15 +482,15 @@ static void mch_write_config(PCIDevice *
         mch_update_pciexbar(mch);
     }
 
-    if (!mch->has_smm_ranges) {
-        return;
-    }
-
     if (ranges_overlap(address, len, MCH_HOST_BRIDGE_SMRAM,
                        MCH_HOST_BRIDGE_SMRAM_SIZE)) {
         mch_update_smram(mch);
     }
 
+    if (!mch->has_smm_ranges) {
+        return;
+    }
+
     if (ranges_overlap(address, len, MCH_HOST_BRIDGE_EXT_TSEG_MBYTES,
                        MCH_HOST_BRIDGE_EXT_TSEG_MBYTES_SIZE)) {
         mch_update_ext_tseg_mbytes(mch);
@@ -589,10 +593,6 @@ static void mch_realize(PCIDevice *d, Er
                  PAM_EXPAN_BASE + i * PAM_EXPAN_SIZE, PAM_EXPAN_SIZE);
     }
 
-    if (!mch->has_smm_ranges) {
-        return;
-    }
-
     /* if *disabled* show SMRAM to all CPUs */
     memory_region_init_alias(&mch->smram_region, OBJECT(mch), "smram-region",
                              mch->pci_address_space, MCH_HOST_BRIDGE_SMRAM_C_BASE,
@@ -608,6 +608,10 @@ static void mch_realize(PCIDevice *d, Er
                                         &mch->open_high_smram, 1);
     memory_region_set_enabled(&mch->open_high_smram, false);
 
+    if (!mch->has_smm_ranges) {
+        return;
+    }
+
     /* smram, as seen by SMM CPUs */
     memory_region_init(&mch->smram, OBJECT(mch), "smram", 4 * GiB);
     memory_region_set_enabled(&mch->smram, true);


Home | Main Index | Thread Index | Old Index