hw/pci-host/q35.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
Work around black screen in VGA mode with SMM disabled.
Required by NVMM, HVF and WHPX backends.
https://gnats.NetBSD.org/59721
https://gitlab.com/qemu-project/qemu/-/issues/2608
https://gitlab.com/qemu-project/qemu/-/work_items/3085
Patch written by Taylor R Campbell <riastradh@NetBSD.org>
Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
---
hw/pci-host/q35.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index e85e4227b3..05ef5222f7 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -372,6 +372,10 @@ static void mch_update_smram(MCHPCIState *mch)
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] &
@@ -405,7 +409,7 @@ static void mch_update_smram(MCHPCIState *mch)
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();
}
@@ -474,15 +478,15 @@ static void mch_write_config(PCIDevice *d,
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);
@@ -585,10 +589,6 @@ static void mch_realize(PCIDevice *d, Error **errp)
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,
@@ -604,6 +604,10 @@ static void mch_realize(PCIDevice *d, Error **errp)
&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);
--
2.50.1 (Apple Git-155)
On 13.04.2026 20:04, Mohamed Mediouni wrote:
> Work around black screen in VGA mode with SMM disabled.
>
> Required by NVMM, HVF and WHPX backends.
>
> https://gnats.NetBSD.org/59721
> https://gitlab.com/qemu-project/qemu/-/issues/2608
> https://gitlab.com/qemu-project/qemu/-/work_items/3085
>
> Patch written by Taylor R Campbell <riastradh@NetBSD.org>
>
> Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
Since this is effectively a reworked-for-later-qemu my patch from
https://lore.kernel.org/qemu-devel/3458e5b7-b53e-4057-baea-03a729452255@tls.msk.ru/,
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Cc: qemu-stable@nongnu.org
Thanks,
/mjt
> ---
> hw/pci-host/q35.c | 22 +++++++++++++---------
> 1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
> index e85e4227b3..05ef5222f7 100644
> --- a/hw/pci-host/q35.c
> +++ b/hw/pci-host/q35.c
> @@ -372,6 +372,10 @@ static void mch_update_smram(MCHPCIState *mch)
> 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] &
> @@ -405,7 +409,7 @@ static void mch_update_smram(MCHPCIState *mch)
> 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();
> }
>
> @@ -474,15 +478,15 @@ static void mch_write_config(PCIDevice *d,
> 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);
> @@ -585,10 +589,6 @@ static void mch_realize(PCIDevice *d, Error **errp)
> 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,
> @@ -604,6 +604,10 @@ static void mch_realize(PCIDevice *d, Error **errp)
> &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);
On 14/4/26 09:31, Michael Tokarev wrote:
> On 13.04.2026 20:04, Mohamed Mediouni wrote:
>> Work around black screen in VGA mode with SMM disabled.
>>
>> Required by NVMM, HVF and WHPX backends.
>>
>> https://gnats.NetBSD.org/59721
>> https://gitlab.com/qemu-project/qemu/-/issues/2608
>> https://gitlab.com/qemu-project/qemu/-/work_items/3085
>>
>> Patch written by Taylor R Campbell <riastradh@NetBSD.org>
>>
>> Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
>
> Since this is effectively a reworked-for-later-qemu my patch from
> https://lore.kernel.org/qemu-devel/3458e5b7-b53e-4057-
> baea-03a729452255@tls.msk.ru/,
>
> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
> Cc: qemu-stable@nongnu.org
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>
> Thanks,
>
> /mjt
>
>> ---
>> hw/pci-host/q35.c | 22 +++++++++++++---------
>> 1 file changed, 13 insertions(+), 9 deletions(-)
>>
>> diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
>> index e85e4227b3..05ef5222f7 100644
>> --- a/hw/pci-host/q35.c
>> +++ b/hw/pci-host/q35.c
>> @@ -372,6 +372,10 @@ static void mch_update_smram(MCHPCIState *mch)
>> 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] &
>> @@ -405,7 +409,7 @@ static void mch_update_smram(MCHPCIState *mch)
>> 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();
>> }
>> @@ -474,15 +478,15 @@ static void mch_write_config(PCIDevice *d,
>> 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);
>> @@ -585,10 +589,6 @@ static void mch_realize(PCIDevice *d, Error **errp)
>> 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,
>> @@ -604,6 +604,10 @@ static void mch_realize(PCIDevice *d, Error **errp)
>> &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);
>
>
© 2016 - 2026 Red Hat, Inc.