* [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
* 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 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 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-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
* [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 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 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
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).