Message ID | 0ee4b0a8293188a53970a2b0e4f4ef713425055e.1714757834.git.babu.moger@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3] target/i386: Fix CPUID encoding of Fn8000001E_ECX | expand |
Queued, thanks. Paolo
03.05.2024 20:46, Babu Moger wrote: > Observed the following failure while booting the SEV-SNP guest and the > guest fails to boot with the smp parameters: > "-smp 192,sockets=1,dies=12,cores=8,threads=2". > > qemu-system-x86_64: sev_snp_launch_update: SNP_LAUNCH_UPDATE ret=-5 fw_error=22 'Invalid parameter' > qemu-system-x86_64: SEV-SNP: CPUID validation failed for function 0x8000001e, index: 0x0. > provided: eax:0x00000000, ebx: 0x00000100, ecx: 0x00000b00, edx: 0x00000000 > expected: eax:0x00000000, ebx: 0x00000100, ecx: 0x00000300, edx: 0x00000000 > qemu-system-x86_64: SEV-SNP: failed update CPUID page ... > Cc: qemu-stable@nongnu.org > Fixes: 31ada106d891 ("Simplify CPUID_8000_001E for AMD") > Link: https://bugzilla.kernel.org/show_bug.cgi?id=206537 > Reviewed-by: Zhao Liu <zhao1.liu@intel.com> > Signed-off-by: Babu Moger <babu.moger@amd.com> > --- > v3: > Rebased to the latest tree. > Updated the pc_compat_9_0 for the new flag. > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > index 08c7de416f..46235466d7 100644 > --- a/hw/i386/pc.c > +++ b/hw/i386/pc.c > @@ -81,6 +81,7 @@ > GlobalProperty pc_compat_9_0[] = { > { TYPE_X86_CPU, "guest-phys-bits", "0" }, > { "sev-guest", "legacy-vm-type", "true" }, > + { TYPE_X86_CPU, "legacy-multi-node", "on" }, > }; Should this legacy-multi-node property be added to previous machine types when applying to stable? How about stable-8.2 and stable-7.2? Thanks, /mjt
On Thu, May 09, 2024 at 04:54:16PM +0300, Michael Tokarev wrote: > 03.05.2024 20:46, Babu Moger wrote: > > Observed the following failure while booting the SEV-SNP guest and the > > guest fails to boot with the smp parameters: > > "-smp 192,sockets=1,dies=12,cores=8,threads=2". > > > > qemu-system-x86_64: sev_snp_launch_update: SNP_LAUNCH_UPDATE ret=-5 fw_error=22 'Invalid parameter' > > qemu-system-x86_64: SEV-SNP: CPUID validation failed for function 0x8000001e, index: 0x0. > > provided: eax:0x00000000, ebx: 0x00000100, ecx: 0x00000b00, edx: 0x00000000 > > expected: eax:0x00000000, ebx: 0x00000100, ecx: 0x00000300, edx: 0x00000000 > > qemu-system-x86_64: SEV-SNP: failed update CPUID page > ... > > Cc: qemu-stable@nongnu.org > > Fixes: 31ada106d891 ("Simplify CPUID_8000_001E for AMD") > > Link: https://bugzilla.kernel.org/show_bug.cgi?id=206537 > > Reviewed-by: Zhao Liu <zhao1.liu@intel.com> > > Signed-off-by: Babu Moger <babu.moger@amd.com> > > --- > > v3: > > Rebased to the latest tree. > > Updated the pc_compat_9_0 for the new flag. > > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > > index 08c7de416f..46235466d7 100644 > > --- a/hw/i386/pc.c > > +++ b/hw/i386/pc.c > > @@ -81,6 +81,7 @@ > > GlobalProperty pc_compat_9_0[] = { > > { TYPE_X86_CPU, "guest-phys-bits", "0" }, > > { "sev-guest", "legacy-vm-type", "true" }, > > + { TYPE_X86_CPU, "legacy-multi-node", "on" }, > > }; > > Should this legacy-multi-node property be added to previous > machine types when applying to stable? How about stable-8.2 > and stable-7.2? machine types are considered to express a fixed guest ABI once part of a QEMU release. Given that we should not be changing existing machine types in stable branches. In theory we could create new "bug fix" machine types in stable branches. To support live migration, we would then need to also add those same stable branch "bug fix" machine type versions in all future QEMU versions. This is generally not worth the hassle of exploding the number of machine types. If you backport the patch, minus the machine type, then users can still get the fix but they'll need to manually set the property to enable it. With regards, Daniel
09.05.2024 17:11, Daniel P. Berrangé wrote: > On Thu, May 09, 2024 at 04:54:16PM +0300, Michael Tokarev wrote: >> 03.05.2024 20:46, Babu Moger wrote: >>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c >>> index 08c7de416f..46235466d7 100644 >>> --- a/hw/i386/pc.c >>> +++ b/hw/i386/pc.c >>> @@ -81,6 +81,7 @@ >>> GlobalProperty pc_compat_9_0[] = { >>> { TYPE_X86_CPU, "guest-phys-bits", "0" }, >>> { "sev-guest", "legacy-vm-type", "true" }, >>> + { TYPE_X86_CPU, "legacy-multi-node", "on" }, >>> }; >> >> Should this legacy-multi-node property be added to previous >> machine types when applying to stable? How about stable-8.2 >> and stable-7.2? > > machine types are considered to express a fixed guest ABI > once part of a QEMU release. Given that we should not be > changing existing machine types in stable branches. Yes, I understand this, and this is exactly why I asked. The change in question has been Cc'ed to stable. And I'm trying to understand what should I do with it :) > In theory we could create new "bug fix" machine types in stable > branches. To support live migration, we would then need to also > add those same stable branch "bug fix" machine type versions in > all future QEMU versions. This is generally not worth the hassle > of exploding the number of machine types. > > If you backport the patch, minus the machine type, then users > can still get the fix but they'll need to manually set the > property to enable it. I don't think this makes big sense. But maybe for someone who actually hits this issue such backport will let to fix it. Hence, again, I'm asking if it really a good idea to pick this up for stable (any version of, - currently there are 2 active series, 7.2, 8.2 and 9.0). Also, the parameter has to be compatible with 9.1+ (maybe having different default). Thanks, /mjt
On Fri, May 10, 2024 at 11:05:44AM +0300, Michael Tokarev wrote: > 09.05.2024 17:11, Daniel P. Berrangé wrote: > > On Thu, May 09, 2024 at 04:54:16PM +0300, Michael Tokarev wrote: > > > 03.05.2024 20:46, Babu Moger wrote: > > > > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > > > > index 08c7de416f..46235466d7 100644 > > > > --- a/hw/i386/pc.c > > > > +++ b/hw/i386/pc.c > > > > @@ -81,6 +81,7 @@ > > > > GlobalProperty pc_compat_9_0[] = { > > > > { TYPE_X86_CPU, "guest-phys-bits", "0" }, > > > > { "sev-guest", "legacy-vm-type", "true" }, > > > > + { TYPE_X86_CPU, "legacy-multi-node", "on" }, > > > > }; > > > > > > Should this legacy-multi-node property be added to previous > > > machine types when applying to stable? How about stable-8.2 > > > and stable-7.2? > > > > machine types are considered to express a fixed guest ABI > > once part of a QEMU release. Given that we should not be > > changing existing machine types in stable branches. > > Yes, I understand this, and this is exactly why I asked. > The change in question has been Cc'ed to stable. And I'm > trying to understand what should I do with it :) > > > In theory we could create new "bug fix" machine types in stable > > branches. To support live migration, we would then need to also > > add those same stable branch "bug fix" machine type versions in > > all future QEMU versions. This is generally not worth the hassle > > of exploding the number of machine types. > > > > If you backport the patch, minus the machine type, then users > > can still get the fix but they'll need to manually set the > > property to enable it. > > I don't think this makes big sense. But maybe for someone who > actually hits this issue such backport will let to fix it. > Hence, again, I'm asking if it really a good idea to pick this > up for stable (any version of, - currently there are 2 active > series, 7.2, 8.2 and 9.0). Hmm, the description says "Observed the following failure while booting the SEV-SNP guest" and yet the patches for SEV-SNP are *not* merged in QEMU yet. So this does not look relevant for stable unless I'm missing something. With regards, Daniel
Hi Daniel, On 5/10/2024 3:10 AM, Daniel P. Berrangé wrote: > On Fri, May 10, 2024 at 11:05:44AM +0300, Michael Tokarev wrote: >> 09.05.2024 17:11, Daniel P. Berrangé wrote: >>> On Thu, May 09, 2024 at 04:54:16PM +0300, Michael Tokarev wrote: >>>> 03.05.2024 20:46, Babu Moger wrote: >> >>>>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c >>>>> index 08c7de416f..46235466d7 100644 >>>>> --- a/hw/i386/pc.c >>>>> +++ b/hw/i386/pc.c >>>>> @@ -81,6 +81,7 @@ >>>>> GlobalProperty pc_compat_9_0[] = { >>>>> { TYPE_X86_CPU, "guest-phys-bits", "0" }, >>>>> { "sev-guest", "legacy-vm-type", "true" }, >>>>> + { TYPE_X86_CPU, "legacy-multi-node", "on" }, >>>>> }; >>>> >>>> Should this legacy-multi-node property be added to previous >>>> machine types when applying to stable? How about stable-8.2 >>>> and stable-7.2? >>> >>> machine types are considered to express a fixed guest ABI >>> once part of a QEMU release. Given that we should not be >>> changing existing machine types in stable branches. >> >> Yes, I understand this, and this is exactly why I asked. >> The change in question has been Cc'ed to stable. And I'm >> trying to understand what should I do with it :) >> >>> In theory we could create new "bug fix" machine types in stable >>> branches. To support live migration, we would then need to also >>> add those same stable branch "bug fix" machine type versions in >>> all future QEMU versions. This is generally not worth the hassle >>> of exploding the number of machine types. >>> >>> If you backport the patch, minus the machine type, then users >>> can still get the fix but they'll need to manually set the >>> property to enable it. >> >> I don't think this makes big sense. But maybe for someone who >> actually hits this issue such backport will let to fix it. >> Hence, again, I'm asking if it really a good idea to pick this >> up for stable (any version of, - currently there are 2 active >> series, 7.2, 8.2 and 9.0). > > Hmm, the description says > > "Observed the following failure while booting the SEV-SNP guest" > > and yet the patches for SEV-SNP are *not* merged in QEMU yet. So this > does not look relevant for stable unless I'm missing something. I have not thought thru about stable tag. This is not critical for stable release. If required I will send a separate patch for stable later. It is not required right now. Sorry about the noise.
diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 08c7de416f..46235466d7 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -81,6 +81,7 @@ GlobalProperty pc_compat_9_0[] = { { TYPE_X86_CPU, "guest-phys-bits", "0" }, { "sev-guest", "legacy-vm-type", "true" }, + { TYPE_X86_CPU, "legacy-multi-node", "on" }, }; const size_t pc_compat_9_0_len = G_N_ELEMENTS(pc_compat_9_0); diff --git a/target/i386/cpu.c b/target/i386/cpu.c index aa3b2d8391..ceb068027d 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -398,12 +398,9 @@ static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info, * 31:11 Reserved. * 10:8 NodesPerProcessor: Node per processor. Read-only. Reset: XXXb. * ValidValues: - * Value Description - * 000b 1 node per processor. - * 001b 2 nodes per processor. - * 010b Reserved. - * 011b 4 nodes per processor. - * 111b-100b Reserved. + * Value Description + * 0h 1 node per processor. + * 7h-1h Reserved. * 7:0 NodeId: Node ID. Read-only. Reset: XXh. * * NOTE: Hardware reserves 3 bits for number of nodes per processor. @@ -412,8 +409,12 @@ static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info, * NodeId is combination of node and socket_id which is already decoded * in apic_id. Just use it by shifting. */ - *ecx = ((topo_info->dies_per_pkg - 1) << 8) | - ((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF); + if (cpu->legacy_multi_node) { + *ecx = ((topo_info->dies_per_pkg - 1) << 8) | + ((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF); + } else { + *ecx = (cpu->apic_id >> apicid_pkg_offset(topo_info)) & 0xFF; + } *edx = 0; } @@ -8073,6 +8074,7 @@ static Property x86_cpu_properties[] = { * own cache information (see x86_cpu_load_def()). */ DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true), + DEFINE_PROP_BOOL("legacy-multi-node", X86CPU, legacy_multi_node, false), DEFINE_PROP_BOOL("xen-vapic", X86CPU, xen_vapic, false), /* diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 565c7a98c3..1e0d2c915f 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1994,6 +1994,12 @@ struct ArchCPU { */ bool legacy_cache; + /* Compatibility bits for old machine types. + * If true decode the CPUID Function 0x8000001E_ECX to support multiple + * nodes per processor + */ + bool legacy_multi_node; + /* Compatibility bits for old machine types: */ bool enable_cpuid_0xb;