qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] i386/kvm: Enable SMM addrss space for i386 cpu
@ 2025-07-29  5:40 Xiaoyao Li
  2025-07-29  5:40 ` [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace Xiaoyao Li
  2025-07-29  5:40 ` [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address spaces Xiaoyao Li
  0 siblings, 2 replies; 14+ messages in thread
From: Xiaoyao Li @ 2025-07-29  5:40 UTC (permalink / raw)
  To: Paolo Bonzini, Philippe Mathieu-Daudé
  Cc: Kirill Martynov, Zhao Liu, Marcelo Tosatti, Richard Henderson,
	qemu-devel, Xiaoyao Li

Patch 1 enables the SMM address space i386 cpu under KVM.

Patch 2 gives name for each address space index.

Xiaoyao Li (2):
  i386/cpu: Enable SMM cpu addressspace
  target/i386: Define enum X86ASIdx for x86's address spaces

 accel/kvm/kvm-all.c              |  2 +-
 system/physmem.c                 |  5 -----
 target/i386/cpu.h                |  5 +++++
 target/i386/kvm/kvm-cpu.c        | 10 ++++++++++
 target/i386/kvm/kvm.c            |  7 ++++++-
 target/i386/tcg/system/tcg-cpu.c |  4 ++--
 6 files changed, 24 insertions(+), 9 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
  2025-07-29  5:40 [PATCH 0/2] i386/kvm: Enable SMM addrss space for i386 cpu Xiaoyao Li
@ 2025-07-29  5:40 ` Xiaoyao Li
  2025-07-29  7:08   ` Philippe Mathieu-Daudé
  2025-07-30  8:11   ` Zhao Liu
  2025-07-29  5:40 ` [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address spaces Xiaoyao Li
  1 sibling, 2 replies; 14+ messages in thread
From: Xiaoyao Li @ 2025-07-29  5:40 UTC (permalink / raw)
  To: Paolo Bonzini, Philippe Mathieu-Daudé
  Cc: Kirill Martynov, Zhao Liu, Marcelo Tosatti, Richard Henderson,
	qemu-devel, Xiaoyao Li

Kirill Martynov reported assertation in cpu_asidx_from_attrs() being hit
when x86_cpu_dump_state() is called to dump the CPU state[*]. It happens
when the CPU is in SMM and KVM emulation failure due to misbehaving
guest.

The root cause is that QEMU i386 never enables the SMM addressspace for cpu
since kvm SMM support has been added.

Enable the SMM cpu address space under KVM when the SMM is enabled for
the x86machine.

[*] https://lore.kernel.org/qemu-devel/20250523154431.506993-1-stdcalllevi@yandex-team.ru/

Reported-by: Kirill Martynov <stdcalllevi@yandex-team.ru>
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
---
 system/physmem.c          |  5 -----
 target/i386/kvm/kvm-cpu.c | 10 ++++++++++
 target/i386/kvm/kvm.c     |  5 +++++
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/system/physmem.c b/system/physmem.c
index 130c148ffb5c..76e1c33aab5c 100644
--- a/system/physmem.c
+++ b/system/physmem.c
@@ -795,9 +795,6 @@ void cpu_address_space_init(CPUState *cpu, int asidx,
         cpu->as = as;
     }
 
-    /* KVM cannot currently support multiple address spaces. */
-    assert(asidx == 0 || !kvm_enabled());
-
     if (!cpu->cpu_ases) {
         cpu->cpu_ases = g_new0(CPUAddressSpace, cpu->num_ases);
         cpu->cpu_ases_count = cpu->num_ases;
@@ -820,8 +817,6 @@ void cpu_address_space_destroy(CPUState *cpu, int asidx)
 
     assert(cpu->cpu_ases);
     assert(asidx >= 0 && asidx < cpu->num_ases);
-    /* KVM cannot currently support multiple address spaces. */
-    assert(asidx == 0 || !kvm_enabled());
 
     cpuas = &cpu->cpu_ases[asidx];
     if (tcg_enabled()) {
diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
index 89a795365945..aa657c2a4627 100644
--- a/target/i386/kvm/kvm-cpu.c
+++ b/target/i386/kvm/kvm-cpu.c
@@ -13,6 +13,7 @@
 #include "qapi/error.h"
 #include "system/system.h"
 #include "hw/boards.h"
+#include "hw/i386/x86.h"
 
 #include "kvm_i386.h"
 #include "accel/accel-cpu-target.h"
@@ -91,6 +92,15 @@ static bool kvm_cpu_realizefn(CPUState *cs, Error **errp)
         kvm_set_guest_phys_bits(cs);
     }
 
+    /*
+     * When SMM is enabled, there is 2 address spaces. Otherwise only 1.
+     *
+     * Only init address space 0 here, the second one for SMM is initialized at
+     * register_smram_listener() after machine init done.
+     */
+    cs->num_ases = x86_machine_is_smm_enabled(X86_MACHINE(current_machine)) ? 2 : 1;
+    cpu_address_space_init(cs, 0, "cpu-mmeory", cs->memory);
+
     return true;
 }
 
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 369626f8c8d7..47fb5c673c8e 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -2704,6 +2704,7 @@ static MemoryRegion smram_as_mem;
 
 static void register_smram_listener(Notifier *n, void *unused)
 {
+    CPUState *cpu;
     MemoryRegion *smram =
         (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
 
@@ -2728,6 +2729,10 @@ static void register_smram_listener(Notifier *n, void *unused)
     address_space_init(&smram_address_space, &smram_as_root, "KVM-SMRAM");
     kvm_memory_listener_register(kvm_state, &smram_listener,
                                  &smram_address_space, 1, "kvm-smram");
+
+    CPU_FOREACH(cpu) {
+        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);
+    }
 }
 
 static void *kvm_msr_energy_thread(void *data)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address spaces
  2025-07-29  5:40 [PATCH 0/2] i386/kvm: Enable SMM addrss space for i386 cpu Xiaoyao Li
  2025-07-29  5:40 ` [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace Xiaoyao Li
@ 2025-07-29  5:40 ` Xiaoyao Li
  2025-07-29  7:11   ` Philippe Mathieu-Daudé
  2025-07-30  8:23   ` Zhao Liu
  1 sibling, 2 replies; 14+ messages in thread
From: Xiaoyao Li @ 2025-07-29  5:40 UTC (permalink / raw)
  To: Paolo Bonzini, Philippe Mathieu-Daudé
  Cc: Kirill Martynov, Zhao Liu, Marcelo Tosatti, Richard Henderson,
	qemu-devel, Xiaoyao Li

Like ARM defines ARMASIdx, do the same to define X86ASIdx as enum. So
that it's more clear what index 0 is for memory and index 1 is for SMM.

Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
---
 accel/kvm/kvm-all.c              | 2 +-
 target/i386/cpu.h                | 5 +++++
 target/i386/kvm/kvm-cpu.c        | 2 +-
 target/i386/kvm/kvm.c            | 4 ++--
 target/i386/tcg/system/tcg-cpu.c | 4 ++--
 5 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index 890d5ea9f865..e56c217a5a0d 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -2797,7 +2797,7 @@ static int kvm_init(AccelState *as, MachineState *ms)
     s->memory_listener.listener.coalesced_io_del = kvm_uncoalesce_mmio_region;
 
     kvm_memory_listener_register(s, &s->memory_listener,
-                                 &address_space_memory, 0, "kvm-memory");
+                                 &address_space_memory, X86ASIdx_MEM, "kvm-memory");
     memory_listener_register(&kvm_io_listener,
                              &address_space_io);
 
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index f977fc49a774..e0be7a740685 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -2574,6 +2574,11 @@ static inline bool x86_has_cpuid_0x1f(X86CPU *cpu)
 void x86_cpu_set_a20(X86CPU *cpu, int a20_state);
 void cpu_sync_avx_hflag(CPUX86State *env);
 
+typedef enum X86ASIdx {
+    X86ASIdx_MEM = 0,
+    X86ASIdx_SMM = 1,
+} X86ASIdx;
+
 #ifndef CONFIG_USER_ONLY
 static inline int x86_asidx_from_attrs(CPUState *cs, MemTxAttrs attrs)
 {
diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
index aa657c2a4627..36f5892d330e 100644
--- a/target/i386/kvm/kvm-cpu.c
+++ b/target/i386/kvm/kvm-cpu.c
@@ -99,7 +99,7 @@ static bool kvm_cpu_realizefn(CPUState *cs, Error **errp)
      * register_smram_listener() after machine init done.
      */
     cs->num_ases = x86_machine_is_smm_enabled(X86_MACHINE(current_machine)) ? 2 : 1;
-    cpu_address_space_init(cs, 0, "cpu-mmeory", cs->memory);
+    cpu_address_space_init(cs, X86ASIdx_MEM, "cpu-mmeory", cs->memory);
 
     return true;
 }
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
index 47fb5c673c8e..5621200be0f0 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -2728,10 +2728,10 @@ static void register_smram_listener(Notifier *n, void *unused)
 
     address_space_init(&smram_address_space, &smram_as_root, "KVM-SMRAM");
     kvm_memory_listener_register(kvm_state, &smram_listener,
-                                 &smram_address_space, 1, "kvm-smram");
+                                 &smram_address_space, X86ASIdx_SMM, "kvm-smram");
 
     CPU_FOREACH(cpu) {
-        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);
+        cpu_address_space_init(cpu, X86ASIdx_SMM, "cpu-smm", &smram_as_root);
     }
 }
 
diff --git a/target/i386/tcg/system/tcg-cpu.c b/target/i386/tcg/system/tcg-cpu.c
index 0538a4fd51a3..7255862c2449 100644
--- a/target/i386/tcg/system/tcg-cpu.c
+++ b/target/i386/tcg/system/tcg-cpu.c
@@ -74,8 +74,8 @@ bool tcg_cpu_realizefn(CPUState *cs, Error **errp)
     memory_region_set_enabled(cpu->cpu_as_mem, true);
 
     cs->num_ases = 2;
-    cpu_address_space_init(cs, 0, "cpu-memory", cs->memory);
-    cpu_address_space_init(cs, 1, "cpu-smm", cpu->cpu_as_root);
+    cpu_address_space_init(cs, X86ASIdx_MEM, "cpu-memory", cs->memory);
+    cpu_address_space_init(cs, X86ASIdx_SMM, "cpu-smm", cpu->cpu_as_root);
 
     /* ... SMRAM with higher priority, linked from /machine/smram.  */
     cpu->machine_done.notify = tcg_cpu_machine_done;
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
  2025-07-29  5:40 ` [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace Xiaoyao Li
@ 2025-07-29  7:08   ` Philippe Mathieu-Daudé
  2025-07-30  8:11   ` Zhao Liu
  1 sibling, 0 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-07-29  7:08 UTC (permalink / raw)
  To: Xiaoyao Li, Paolo Bonzini
  Cc: Kirill Martynov, Zhao Liu, Marcelo Tosatti, Richard Henderson,
	qemu-devel

On 29/7/25 07:40, Xiaoyao Li wrote:
> Kirill Martynov reported assertation in cpu_asidx_from_attrs() being hit
> when x86_cpu_dump_state() is called to dump the CPU state[*]. It happens
> when the CPU is in SMM and KVM emulation failure due to misbehaving
> guest.
> 
> The root cause is that QEMU i386 never enables the SMM addressspace for cpu

"address space"

> since kvm SMM support has been added.
> 
> Enable the SMM cpu address space under KVM when the SMM is enabled for
> the x86machine.
> 
> [*] https://lore.kernel.org/qemu-devel/20250523154431.506993-1-stdcalllevi@yandex-team.ru/
> 
> Reported-by: Kirill Martynov <stdcalllevi@yandex-team.ru>
> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
> ---
>   system/physmem.c          |  5 -----
>   target/i386/kvm/kvm-cpu.c | 10 ++++++++++
>   target/i386/kvm/kvm.c     |  5 +++++
>   3 files changed, 15 insertions(+), 5 deletions(-)
> 
> diff --git a/system/physmem.c b/system/physmem.c
> index 130c148ffb5c..76e1c33aab5c 100644
> --- a/system/physmem.c
> +++ b/system/physmem.c
> @@ -795,9 +795,6 @@ void cpu_address_space_init(CPUState *cpu, int asidx,
>           cpu->as = as;
>       }
>   
> -    /* KVM cannot currently support multiple address spaces. */
> -    assert(asidx == 0 || !kvm_enabled());
> -
>       if (!cpu->cpu_ases) {
>           cpu->cpu_ases = g_new0(CPUAddressSpace, cpu->num_ases);
>           cpu->cpu_ases_count = cpu->num_ases;
> @@ -820,8 +817,6 @@ void cpu_address_space_destroy(CPUState *cpu, int asidx)
>   
>       assert(cpu->cpu_ases);
>       assert(asidx >= 0 && asidx < cpu->num_ases);
> -    /* KVM cannot currently support multiple address spaces. */
> -    assert(asidx == 0 || !kvm_enabled());
>   
>       cpuas = &cpu->cpu_ases[asidx];
>       if (tcg_enabled()) {
> diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
> index 89a795365945..aa657c2a4627 100644
> --- a/target/i386/kvm/kvm-cpu.c
> +++ b/target/i386/kvm/kvm-cpu.c
> @@ -13,6 +13,7 @@
>   #include "qapi/error.h"
>   #include "system/system.h"
>   #include "hw/boards.h"
> +#include "hw/i386/x86.h"
>   
>   #include "kvm_i386.h"
>   #include "accel/accel-cpu-target.h"
> @@ -91,6 +92,15 @@ static bool kvm_cpu_realizefn(CPUState *cs, Error **errp)
>           kvm_set_guest_phys_bits(cs);
>       }
>   
> +    /*
> +     * When SMM is enabled, there is 2 address spaces. Otherwise only 1.
> +     *
> +     * Only init address space 0 here, the second one for SMM is initialized at
> +     * register_smram_listener() after machine init done.
> +     */
> +    cs->num_ases = x86_machine_is_smm_enabled(X86_MACHINE(current_machine)) ? 2 : 1;
> +    cpu_address_space_init(cs, 0, "cpu-mmeory", cs->memory);

Typo "memory".

> +
>       return true;
>   }
>   
> diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
> index 369626f8c8d7..47fb5c673c8e 100644
> --- a/target/i386/kvm/kvm.c
> +++ b/target/i386/kvm/kvm.c
> @@ -2704,6 +2704,7 @@ static MemoryRegion smram_as_mem;
>   
>   static void register_smram_listener(Notifier *n, void *unused)
>   {
> +    CPUState *cpu;
>       MemoryRegion *smram =
>           (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
>   
> @@ -2728,6 +2729,10 @@ static void register_smram_listener(Notifier *n, void *unused)
>       address_space_init(&smram_address_space, &smram_as_root, "KVM-SMRAM");
>       kvm_memory_listener_register(kvm_state, &smram_listener,
>                                    &smram_address_space, 1, "kvm-smram");
> +
> +    CPU_FOREACH(cpu) {
> +        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);
> +    }
>   }
>   
>   static void *kvm_msr_energy_thread(void *data)



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address spaces
  2025-07-29  5:40 ` [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address spaces Xiaoyao Li
@ 2025-07-29  7:11   ` Philippe Mathieu-Daudé
  2025-07-29 12:16     ` Kirill Martynov
  2025-07-30  8:23   ` Zhao Liu
  1 sibling, 1 reply; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-07-29  7:11 UTC (permalink / raw)
  To: Xiaoyao Li, Paolo Bonzini
  Cc: Kirill Martynov, Zhao Liu, Marcelo Tosatti, Richard Henderson,
	qemu-devel

On 29/7/25 07:40, Xiaoyao Li wrote:
> Like ARM defines ARMASIdx, do the same to define X86ASIdx as enum. So
> that it's more clear what index 0 is for memory and index 1 is for SMM.
> 
> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
> ---
>   accel/kvm/kvm-all.c              | 2 +-
>   target/i386/cpu.h                | 5 +++++
>   target/i386/kvm/kvm-cpu.c        | 2 +-
>   target/i386/kvm/kvm.c            | 4 ++--
>   target/i386/tcg/system/tcg-cpu.c | 4 ++--
>   5 files changed, 11 insertions(+), 6 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address spaces
  2025-07-29  7:11   ` Philippe Mathieu-Daudé
@ 2025-07-29 12:16     ` Kirill Martynov
  0 siblings, 0 replies; 14+ messages in thread
From: Kirill Martynov @ 2025-07-29 12:16 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Xiaoyao Li, Paolo Bonzini, Zhao Liu, Marcelo Tosatti,
	Richard Henderson, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 786 bytes --]

Tested-By: Kirill Martynov <stdcalllevi@yandex-team.ru <mailto:stdcalllevi@yandex-team.ru>>

> On 29 Jul 2025, at 10:11, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
> 
> On 29/7/25 07:40, Xiaoyao Li wrote:
>> Like ARM defines ARMASIdx, do the same to define X86ASIdx as enum. So
>> that it's more clear what index 0 is for memory and index 1 is for SMM.
>> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
>> ---
>>  accel/kvm/kvm-all.c              | 2 +-
>>  target/i386/cpu.h                | 5 +++++
>>  target/i386/kvm/kvm-cpu.c        | 2 +-
>>  target/i386/kvm/kvm.c            | 4 ++--
>>  target/i386/tcg/system/tcg-cpu.c | 4 ++--
>>  5 files changed, 11 insertions(+), 6 deletions(-)
> 
> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> 


[-- Attachment #2: Type: text/html, Size: 1465 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
  2025-07-30  8:11   ` Zhao Liu
@ 2025-07-30  7:55     ` Kirill Martynov
  2025-07-30 10:12     ` Xiaoyao Li
  1 sibling, 0 replies; 14+ messages in thread
From: Kirill Martynov @ 2025-07-30  7:55 UTC (permalink / raw)
  To: Zhao Liu
  Cc: Xiaoyao Li, Paolo Bonzini, Philippe Mathieu-Daudé,
	Marcelo Tosatti, Richard Henderson, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 2190 bytes --]



> On 30 Jul 2025, at 11:11, Zhao Liu <zhao1.liu@intel.com> wrote:
> 
>> @@ -91,6 +92,15 @@ static bool kvm_cpu_realizefn(CPUState *cs, Error **errp)
>>         kvm_set_guest_phys_bits(cs);
>>     }
>> 
>> +    /*
>> +     * When SMM is enabled, there is 2 address spaces. Otherwise only 1.
>> +     *
>> +     * Only init address space 0 here, the second one for SMM is initialized at
>               ^^^^
> 	       initialize
> 
>> +     * register_smram_listener() after machine init done.
>> +     */
>> +    cs->num_ases = x86_machine_is_smm_enabled(X86_MACHINE(current_machine)) ? 2 : 1;
>> +    cpu_address_space_init(cs, 0, "cpu-mmeory", cs->memory);
>> +
>>     return true;
>> }
>> 
>> diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
>> index 369626f8c8d7..47fb5c673c8e 100644
>> --- a/target/i386/kvm/kvm.c
>> +++ b/target/i386/kvm/kvm.c
>> @@ -2704,6 +2704,7 @@ static MemoryRegion smram_as_mem;
>> 
>> static void register_smram_listener(Notifier *n, void *unused)
>> {
>> +    CPUState *cpu;
>>     MemoryRegion *smram =
>>         (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
>> 
>> @@ -2728,6 +2729,10 @@ static void register_smram_listener(Notifier *n, void *unused)
>>     address_space_init(&smram_address_space, &smram_as_root, "KVM-SMRAM");
>>     kvm_memory_listener_register(kvm_state, &smram_listener,
>>                                  &smram_address_space, 1, "kvm-smram");
>> +
>> +    CPU_FOREACH(cpu) {
>> +        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);
> 
> It is worth mentioning in the commit message that directly sharing
> MemoryRegion in CPUAddressSpace is safe.
> 
>> +    }
> 
> I still think such CPU_FOREACH in machine_done callback is not the
> best approach - it's better to initialize all the address spaces in
> kvm_cpu_realizefn(), and not to go far away from cs->num_ases, as I
> said in the previous discussion.
> 
> But it's still good to fix this bug. So, with other comments
> addressed,
> 
> Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
> 

Tested-by: Kirill Martynov <stdcalllevi@yandex-team.ru <mailto:stdcalllevi@yandex-team.ru>>

[-- Attachment #2: Type: text/html, Size: 3430 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
  2025-07-29  5:40 ` [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace Xiaoyao Li
  2025-07-29  7:08   ` Philippe Mathieu-Daudé
@ 2025-07-30  8:11   ` Zhao Liu
  2025-07-30  7:55     ` Kirill Martynov
  2025-07-30 10:12     ` Xiaoyao Li
  1 sibling, 2 replies; 14+ messages in thread
From: Zhao Liu @ 2025-07-30  8:11 UTC (permalink / raw)
  To: Xiaoyao Li
  Cc: Paolo Bonzini, Philippe Mathieu-Daudé, Kirill Martynov,
	Marcelo Tosatti, Richard Henderson, qemu-devel

> @@ -91,6 +92,15 @@ static bool kvm_cpu_realizefn(CPUState *cs, Error **errp)
>          kvm_set_guest_phys_bits(cs);
>      }
>  
> +    /*
> +     * When SMM is enabled, there is 2 address spaces. Otherwise only 1.
> +     *
> +     * Only init address space 0 here, the second one for SMM is initialized at
               ^^^^
	       initialize

> +     * register_smram_listener() after machine init done.
> +     */
> +    cs->num_ases = x86_machine_is_smm_enabled(X86_MACHINE(current_machine)) ? 2 : 1;
> +    cpu_address_space_init(cs, 0, "cpu-mmeory", cs->memory);
> +
>      return true;
>  }
>  
> diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
> index 369626f8c8d7..47fb5c673c8e 100644
> --- a/target/i386/kvm/kvm.c
> +++ b/target/i386/kvm/kvm.c
> @@ -2704,6 +2704,7 @@ static MemoryRegion smram_as_mem;
>  
>  static void register_smram_listener(Notifier *n, void *unused)
>  {
> +    CPUState *cpu;
>      MemoryRegion *smram =
>          (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
>  
> @@ -2728,6 +2729,10 @@ static void register_smram_listener(Notifier *n, void *unused)
>      address_space_init(&smram_address_space, &smram_as_root, "KVM-SMRAM");
>      kvm_memory_listener_register(kvm_state, &smram_listener,
>                                   &smram_address_space, 1, "kvm-smram");
> +
> +    CPU_FOREACH(cpu) {
> +        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);

It is worth mentioning in the commit message that directly sharing
MemoryRegion in CPUAddressSpace is safe.

> +    }

I still think such CPU_FOREACH in machine_done callback is not the
best approach - it's better to initialize all the address spaces in
kvm_cpu_realizefn(), and not to go far away from cs->num_ases, as I
said in the previous discussion.

But it's still good to fix this bug. So, with other comments
addressed,

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address spaces
  2025-07-29  5:40 ` [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address spaces Xiaoyao Li
  2025-07-29  7:11   ` Philippe Mathieu-Daudé
@ 2025-07-30  8:23   ` Zhao Liu
  1 sibling, 0 replies; 14+ messages in thread
From: Zhao Liu @ 2025-07-30  8:23 UTC (permalink / raw)
  To: Xiaoyao Li
  Cc: Paolo Bonzini, Philippe Mathieu-Daudé, Kirill Martynov,
	Marcelo Tosatti, Richard Henderson, qemu-devel

On Tue, Jul 29, 2025 at 01:40:23PM +0800, Xiaoyao Li wrote:
> Date: Tue, 29 Jul 2025 13:40:23 +0800
> From: Xiaoyao Li <xiaoyao.li@intel.com>
> Subject: [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address
>  spaces
> X-Mailer: git-send-email 2.43.0
> 
> Like ARM defines ARMASIdx, do the same to define X86ASIdx as enum. So
> that it's more clear what index 0 is for memory and index 1 is for SMM.

Maybe:

Define X86ASIdx as the enum, like ARM's ARMASIdx, so that index 0 is
clearly for memory and index 1 for SMM.

> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
> ---
>  accel/kvm/kvm-all.c              | 2 +-
>  target/i386/cpu.h                | 5 +++++
>  target/i386/kvm/kvm-cpu.c        | 2 +-
>  target/i386/kvm/kvm.c            | 4 ++--
>  target/i386/tcg/system/tcg-cpu.c | 4 ++--
>  5 files changed, 11 insertions(+), 6 deletions(-)

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
  2025-07-30  8:11   ` Zhao Liu
  2025-07-30  7:55     ` Kirill Martynov
@ 2025-07-30 10:12     ` Xiaoyao Li
  2025-07-30 15:20       ` Zhao Liu
  1 sibling, 1 reply; 14+ messages in thread
From: Xiaoyao Li @ 2025-07-30 10:12 UTC (permalink / raw)
  To: Zhao Liu
  Cc: Paolo Bonzini, Philippe Mathieu-Daudé, Kirill Martynov,
	Marcelo Tosatti, Richard Henderson, qemu-devel

On 7/30/2025 4:11 PM, Zhao Liu wrote:
>> @@ -91,6 +92,15 @@ static bool kvm_cpu_realizefn(CPUState *cs, Error **errp)
>>           kvm_set_guest_phys_bits(cs);
>>       }
>>   
>> +    /*
>> +     * When SMM is enabled, there is 2 address spaces. Otherwise only 1.
>> +     *
>> +     * Only init address space 0 here, the second one for SMM is initialized at
>                 ^^^^
> 	       initialize
> 
>> +     * register_smram_listener() after machine init done.
>> +     */
>> +    cs->num_ases = x86_machine_is_smm_enabled(X86_MACHINE(current_machine)) ? 2 : 1;
>> +    cpu_address_space_init(cs, 0, "cpu-mmeory", cs->memory);
>> +
>>       return true;
>>   }
>>   
>> diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
>> index 369626f8c8d7..47fb5c673c8e 100644
>> --- a/target/i386/kvm/kvm.c
>> +++ b/target/i386/kvm/kvm.c
>> @@ -2704,6 +2704,7 @@ static MemoryRegion smram_as_mem;
>>   
>>   static void register_smram_listener(Notifier *n, void *unused)
>>   {
>> +    CPUState *cpu;
>>       MemoryRegion *smram =
>>           (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
>>   
>> @@ -2728,6 +2729,10 @@ static void register_smram_listener(Notifier *n, void *unused)
>>       address_space_init(&smram_address_space, &smram_as_root, "KVM-SMRAM");
>>       kvm_memory_listener_register(kvm_state, &smram_listener,
>>                                    &smram_address_space, 1, "kvm-smram");
>> +
>> +    CPU_FOREACH(cpu) {
>> +        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);
> 
> It is worth mentioning in the commit message that directly sharing
> MemoryRegion in CPUAddressSpace is safe.

It's unnecessary to me. It's common that different Address space share 
the same (root) memory region. e.g., for address space 0 for the cpu, 
though what passed in is cpu->memory, they all point to system_memory.

>> +    }
> 
> I still think such CPU_FOREACH in machine_done callback is not the
> best approach - it's better to initialize all the address spaces in
> kvm_cpu_realizefn(), and not to go far away from cs->num_ases, as I
> said in the previous discussion.
> 
> But it's still good to fix this bug. So, with other comments
> addressed,
> 
> Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
> 



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
  2025-07-30 10:12     ` Xiaoyao Li
@ 2025-07-30 15:20       ` Zhao Liu
  2025-07-30 16:11         ` Xiaoyao Li
  0 siblings, 1 reply; 14+ messages in thread
From: Zhao Liu @ 2025-07-30 15:20 UTC (permalink / raw)
  To: Xiaoyao Li
  Cc: Paolo Bonzini, Philippe Mathieu-Daudé, Kirill Martynov,
	Marcelo Tosatti, Richard Henderson, qemu-devel

> > > +        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);
> > 
> > It is worth mentioning in the commit message that directly sharing
> > MemoryRegion in CPUAddressSpace is safe.
> 
> It's unnecessary to me. It's common that different Address space share the
> same (root) memory region. e.g., for address space 0 for the cpu, though
> what passed in is cpu->memory, they all point to system_memory.

For cpu->memory, there's the "object_ref(OBJECT(cpu->memory))" in
cpu_exec_initfn().

But this case doesn't need to increase ref count like cpu->memory, since
memory_region_ref() provides protection and it's enough.

This is the difference.

So it sounds like now it's more necessary to clarify this, no?



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
  2025-07-30 15:20       ` Zhao Liu
@ 2025-07-30 16:11         ` Xiaoyao Li
  2025-07-31  3:53           ` Zhao Liu
  0 siblings, 1 reply; 14+ messages in thread
From: Xiaoyao Li @ 2025-07-30 16:11 UTC (permalink / raw)
  To: Zhao Liu
  Cc: Paolo Bonzini, Philippe Mathieu-Daudé, Kirill Martynov,
	Marcelo Tosatti, Richard Henderson, qemu-devel

On 7/30/2025 11:20 PM, Zhao Liu wrote:
>>>> +        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);
>>>
>>> It is worth mentioning in the commit message that directly sharing
>>> MemoryRegion in CPUAddressSpace is safe.
>>
>> It's unnecessary to me. It's common that different Address space share the
>> same (root) memory region. e.g., for address space 0 for the cpu, though
>> what passed in is cpu->memory, they all point to system_memory.
> 
> For cpu->memory, there's the "object_ref(OBJECT(cpu->memory))" in
> cpu_exec_initfn().
> 
> But this case doesn't need to increase ref count like cpu->memory, since
> memory_region_ref() provides protection and it's enough.
> 
> This is the difference.
> 
> So it sounds like now it's more necessary to clarify this, no?
> 

clarify why smram_as_root doesn't need to be object_ref()'ed explicitly 
like what cpu_exec_initfn() does for cpu->memory?

As you saide,

cpu_address_space_init()
   -> address_space_init()
      -> memory_region_ref()

it already ensures the ref count is increased.

Why cpu_exec_initfn() increases the refcount of cpu->memory, is totally 
unrelated to cpu_address_space_init().


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
  2025-07-30 16:11         ` Xiaoyao Li
@ 2025-07-31  3:53           ` Zhao Liu
  2025-08-18  9:37             ` Kirill Martynov
  0 siblings, 1 reply; 14+ messages in thread
From: Zhao Liu @ 2025-07-31  3:53 UTC (permalink / raw)
  To: Xiaoyao Li
  Cc: Paolo Bonzini, Philippe Mathieu-Daudé, Kirill Martynov,
	Marcelo Tosatti, Richard Henderson, qemu-devel

On Thu, Jul 31, 2025 at 12:11:41AM +0800, Xiaoyao Li wrote:
> Date: Thu, 31 Jul 2025 00:11:41 +0800
> From: Xiaoyao Li <xiaoyao.li@intel.com>
> Subject: Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
> 
> On 7/30/2025 11:20 PM, Zhao Liu wrote:
> > > > > +        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);
> > > > 
> > > > It is worth mentioning in the commit message that directly sharing
> > > > MemoryRegion in CPUAddressSpace is safe.
> > > 
> > > It's unnecessary to me. It's common that different Address space share the
> > > same (root) memory region. e.g., for address space 0 for the cpu, though
> > > what passed in is cpu->memory, they all point to system_memory.
> > 
> > For cpu->memory, there's the "object_ref(OBJECT(cpu->memory))" in
> > cpu_exec_initfn().
> > 
> > But this case doesn't need to increase ref count like cpu->memory, since
> > memory_region_ref() provides protection and it's enough.
> > 
> > This is the difference.
> > 
> > So it sounds like now it's more necessary to clarify this, no?
> > 
> 
> clarify why smram_as_root doesn't need to be object_ref()'ed explicitly like
> what cpu_exec_initfn() does for cpu->memory?

When you're referring cpu->memory, you should aware where's the
difference and why you don't need do the same thing.

This is necessary for a clear commit message, and it also allows more
eyes to check whether it is correct and whether there are any potential
problems. Providing details is always beneficial.

> As you saide,
> 
> cpu_address_space_init()
>   -> address_space_init()
>      -> memory_region_ref()
> 
> it already ensures the ref count is increased.

Yes, this is what I mean.

> Why cpu_exec_initfn() increases the refcount of cpu->memory, is
> totally unrelated to cpu_address_space_init().
  ^^^^^^^^^^^^^^^^^

The validity of cpu->memory must be guaranteed, as this is a prerequisite
for everything else. And isn't it mainly related with the CPU address
space??

It can be said that because the pointer to system_memory needs to be
cached in CPUState, such a ref is useful, thereby ensuring the safety
of the next address space stuff.




^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
  2025-07-31  3:53           ` Zhao Liu
@ 2025-08-18  9:37             ` Kirill Martynov
  0 siblings, 0 replies; 14+ messages in thread
From: Kirill Martynov @ 2025-08-18  9:37 UTC (permalink / raw)
  To: Zhao Liu
  Cc: Xiaoyao Li, Paolo Bonzini, Philippe Mathieu-Daudé,
	Marcelo Tosatti, Richard Henderson, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 2393 bytes --]

Hi Paolo,
Would you have time to share your thoughts about this set of patches?

> On 31 Jul 2025, at 06:53, Zhao Liu <zhao1.liu@intel.com> wrote:
> 
> On Thu, Jul 31, 2025 at 12:11:41AM +0800, Xiaoyao Li wrote:
>> Date: Thu, 31 Jul 2025 00:11:41 +0800
>> From: Xiaoyao Li <xiaoyao.li@intel.com>
>> Subject: Re: [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace
>> 
>> On 7/30/2025 11:20 PM, Zhao Liu wrote:
>>>>>> +        cpu_address_space_init(cpu, 1, "cpu-smm", &smram_as_root);
>>>>> 
>>>>> It is worth mentioning in the commit message that directly sharing
>>>>> MemoryRegion in CPUAddressSpace is safe.
>>>> 
>>>> It's unnecessary to me. It's common that different Address space share the
>>>> same (root) memory region. e.g., for address space 0 for the cpu, though
>>>> what passed in is cpu->memory, they all point to system_memory.
>>> 
>>> For cpu->memory, there's the "object_ref(OBJECT(cpu->memory))" in
>>> cpu_exec_initfn().
>>> 
>>> But this case doesn't need to increase ref count like cpu->memory, since
>>> memory_region_ref() provides protection and it's enough.
>>> 
>>> This is the difference.
>>> 
>>> So it sounds like now it's more necessary to clarify this, no?
>>> 
>> 
>> clarify why smram_as_root doesn't need to be object_ref()'ed explicitly like
>> what cpu_exec_initfn() does for cpu->memory?
> 
> When you're referring cpu->memory, you should aware where's the
> difference and why you don't need do the same thing.
> 
> This is necessary for a clear commit message, and it also allows more
> eyes to check whether it is correct and whether there are any potential
> problems. Providing details is always beneficial.
> 
>> As you saide,
>> 
>> cpu_address_space_init()
>>  -> address_space_init()
>>     -> memory_region_ref()
>> 
>> it already ensures the ref count is increased.
> 
> Yes, this is what I mean.
> 
>> Why cpu_exec_initfn() increases the refcount of cpu->memory, is
>> totally unrelated to cpu_address_space_init().
>  ^^^^^^^^^^^^^^^^^
> 
> The validity of cpu->memory must be guaranteed, as this is a prerequisite
> for everything else. And isn't it mainly related with the CPU address
> space??
> 
> It can be said that because the pointer to system_memory needs to be
> cached in CPUState, such a ref is useful, thereby ensuring the safety
> of the next address space stuff.


[-- Attachment #2: Type: text/html, Size: 15629 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2025-08-18  9:39 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-29  5:40 [PATCH 0/2] i386/kvm: Enable SMM addrss space for i386 cpu Xiaoyao Li
2025-07-29  5:40 ` [PATCH 1/2] i386/cpu: Enable SMM cpu addressspace Xiaoyao Li
2025-07-29  7:08   ` Philippe Mathieu-Daudé
2025-07-30  8:11   ` Zhao Liu
2025-07-30  7:55     ` Kirill Martynov
2025-07-30 10:12     ` Xiaoyao Li
2025-07-30 15:20       ` Zhao Liu
2025-07-30 16:11         ` Xiaoyao Li
2025-07-31  3:53           ` Zhao Liu
2025-08-18  9:37             ` Kirill Martynov
2025-07-29  5:40 ` [PATCH 2/2] target/i386: Define enum X86ASIdx for x86's address spaces Xiaoyao Li
2025-07-29  7:11   ` Philippe Mathieu-Daudé
2025-07-29 12:16     ` Kirill Martynov
2025-07-30  8:23   ` Zhao Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).