[PATCH] hw: q35: fix VGA text console with SMM disabled

Mohamed Mediouni posted 1 patch 2 weeks, 2 days ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260413170407.57574-1-mohamed@unpredictable.fr
Maintainers: "Michael S. Tsirkin" <mst@redhat.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
hw/pci-host/q35.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
[PATCH] hw: q35: fix VGA text console with SMM disabled
Posted by Mohamed Mediouni 2 weeks, 2 days ago
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)
Re: [PATCH] hw: q35: fix VGA text console with SMM disabled
Posted by Michael Tokarev 2 weeks, 1 day ago
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);
Re: [PATCH-for-11.0] hw: q35: fix VGA text console with SMM disabled
Posted by Philippe Mathieu-Daudé 2 weeks, 1 day ago
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);
> 
>