Re: [PATCHv2] x86info: dump kvm cpuid's
On Wed, Sep 05, 2012 at 08:33:35PM +0300, Michael S. Tsirkin wrote: On Mon, Apr 30, 2012 at 05:38:35PM +0300, Michael S. Tsirkin wrote: The following makes 'x86info -r' dump hypervisor leaf cpu ids (for kvm this is signature+features) when running in a vm. On the guest we see the signature and the features: eax in: 0x4000, eax = ebx = 4b4d564b ecx = 564b4d56 edx = 004d eax in: 0x4001, eax = 017b ebx = ecx = edx = Hypervisor flag is checked to avoid output changes when not running on a VM. Signed-off-by: Michael S. Tsirkin m...@redhat.com Changes from v1: Make work on non KVM hypervisors (only KVM was tested). Avi Kivity said kvm will in the future report max HV leaf in eax. For now it reports eax = 0 so add a work around for that. Ping. Davej, any comments? Would be nice to have this in. Is this the right address? Davej do you maintain x86info? Thanks, MST --- diff --git a/identify.c b/identify.c index 33f35de..a4a3763 100644 --- a/identify.c +++ b/identify.c @@ -9,8 +9,8 @@ void get_cpu_info_basics(struct cpudata *cpu) { - unsigned int maxi, maxei, vendor, address_bits; - unsigned int eax; + unsigned int maxi, maxei, maxhv, vendor, address_bits; + unsigned int eax, ebx, ecx; cpuid(cpu-number, 0, maxi, vendor, NULL, NULL); maxi = 0x; /* The high-order word is non-zero on some Cyrix CPUs */ @@ -19,7 +19,7 @@ void get_cpu_info_basics(struct cpudata *cpu) return; /* Everything that supports cpuid supports these. */ - cpuid(cpu-number, 1, eax, NULL, NULL, NULL); + cpuid(cpu-number, 1, eax, ebx, ecx, NULL); cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* +* KVM up to linux 3.4 reports 0 as the max hypervisor leaf, +* where it really means 0x4001. +* Most (all?) hypervisors have at least one CPUID besides +* the vendor ID so assume that. +*/ + cpu-maxhv = maxhv ? maxhv : 0x4001; + } else { + /* Suppress hypervisor cpuid unless running on a hypervisor */ + cpu-maxhv = 0; + } cpuid(cpu-number, 0x8008,address_bits, NULL, NULL, NULL); cpu-phyaddr_bits = address_bits 0xFF; diff --git a/x86info.c b/x86info.c index 22c4734..80cae36 100644 --- a/x86info.c +++ b/x86info.c @@ -44,6 +44,10 @@ static void display_detailed_info(struct cpudata *cpu) if (cpu-maxei2 =0xC000) dump_raw_cpuid(cpu-number, 0xC000, cpu-maxei2); + + if (cpu-maxhv = 0x4000) + dump_raw_cpuid(cpu-number, 0x4000, cpu-maxhv); + } if (show_cacheinfo) { diff --git a/x86info.h b/x86info.h index 7d2a455..c4f5d81 100644 --- a/x86info.h +++ b/x86info.h @@ -84,7 +84,7 @@ struct cpudata { unsigned int cachesize_trace; unsigned int phyaddr_bits; unsigned int viraddr_bits; - unsigned int cpuid_level, maxei, maxei2; + unsigned int cpuid_level, maxei, maxei2, maxhv; char name[CPU_NAME_LEN]; enum connector connector; unsigned int flags_ecx; -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2] x86info: dump kvm cpuid's
On Thu, Dec 06, 2012 at 01:41:12PM +0200, Michael S. Tsirkin wrote: On Wed, Sep 05, 2012 at 08:33:35PM +0300, Michael S. Tsirkin wrote: On Mon, Apr 30, 2012 at 05:38:35PM +0300, Michael S. Tsirkin wrote: The following makes 'x86info -r' dump hypervisor leaf cpu ids (for kvm this is signature+features) when running in a vm. On the guest we see the signature and the features: eax in: 0x4000, eax = ebx = 4b4d564b ecx = 564b4d56 edx = 004d eax in: 0x4001, eax = 017b ebx = ecx = edx = Hypervisor flag is checked to avoid output changes when not running on a VM. Signed-off-by: Michael S. Tsirkin m...@redhat.com Changes from v1: Make work on non KVM hypervisors (only KVM was tested). Avi Kivity said kvm will in the future report max HV leaf in eax. For now it reports eax = 0 so add a work around for that. Ping. Davej, any comments? Would be nice to have this in. Is this the right address? Davej do you maintain x86info? Thanks, MST It's effectively abandonware at this point, largely due to my own lack of time. hwloc and similar tools seem to have taken it's place. If anyone is interested in taking over x86info, I'm happy to hand over the reins to someone capable. Dave -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2] x86info: dump kvm cpuid's
On Mon, Apr 30, 2012 at 05:38:35PM +0300, Michael S. Tsirkin wrote: The following makes 'x86info -r' dump hypervisor leaf cpu ids (for kvm this is signature+features) when running in a vm. On the guest we see the signature and the features: eax in: 0x4000, eax = ebx = 4b4d564b ecx = 564b4d56 edx = 004d eax in: 0x4001, eax = 017b ebx = ecx = edx = Hypervisor flag is checked to avoid output changes when not running on a VM. Signed-off-by: Michael S. Tsirkin m...@redhat.com Changes from v1: Make work on non KVM hypervisors (only KVM was tested). Avi Kivity said kvm will in the future report max HV leaf in eax. For now it reports eax = 0 so add a work around for that. Ping. Davej, any comments? Would be nice to have this in. --- diff --git a/identify.c b/identify.c index 33f35de..a4a3763 100644 --- a/identify.c +++ b/identify.c @@ -9,8 +9,8 @@ void get_cpu_info_basics(struct cpudata *cpu) { - unsigned int maxi, maxei, vendor, address_bits; - unsigned int eax; + unsigned int maxi, maxei, maxhv, vendor, address_bits; + unsigned int eax, ebx, ecx; cpuid(cpu-number, 0, maxi, vendor, NULL, NULL); maxi = 0x; /* The high-order word is non-zero on some Cyrix CPUs */ @@ -19,7 +19,7 @@ void get_cpu_info_basics(struct cpudata *cpu) return; /* Everything that supports cpuid supports these. */ - cpuid(cpu-number, 1, eax, NULL, NULL, NULL); + cpuid(cpu-number, 1, eax, ebx, ecx, NULL); cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* + * KVM up to linux 3.4 reports 0 as the max hypervisor leaf, + * where it really means 0x4001. + * Most (all?) hypervisors have at least one CPUID besides + * the vendor ID so assume that. + */ + cpu-maxhv = maxhv ? maxhv : 0x4001; + } else { + /* Suppress hypervisor cpuid unless running on a hypervisor */ + cpu-maxhv = 0; + } cpuid(cpu-number, 0x8008,address_bits, NULL, NULL, NULL); cpu-phyaddr_bits = address_bits 0xFF; diff --git a/x86info.c b/x86info.c index 22c4734..80cae36 100644 --- a/x86info.c +++ b/x86info.c @@ -44,6 +44,10 @@ static void display_detailed_info(struct cpudata *cpu) if (cpu-maxei2 =0xC000) dump_raw_cpuid(cpu-number, 0xC000, cpu-maxei2); + + if (cpu-maxhv = 0x4000) + dump_raw_cpuid(cpu-number, 0x4000, cpu-maxhv); + } if (show_cacheinfo) { diff --git a/x86info.h b/x86info.h index 7d2a455..c4f5d81 100644 --- a/x86info.h +++ b/x86info.h @@ -84,7 +84,7 @@ struct cpudata { unsigned int cachesize_trace; unsigned int phyaddr_bits; unsigned int viraddr_bits; - unsigned int cpuid_level, maxei, maxei2; + unsigned int cpuid_level, maxei, maxei2, maxhv; char name[CPU_NAME_LEN]; enum connector connector; unsigned int flags_ecx; -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2] x86info: dump kvm cpuid's
On Tue, 2012-05-01 at 16:04 +0300, Gleb Natapov wrote: BTW, according to arch/x86/include/asm/kvm_para.h unsurprisingly KVM has a signature too 'KVMKVMKVM'. cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* + * KVM up to linux 3.4 reports 0 as the max hypervisor leaf, + * where it really means 0x4001. This is something where I definitely think you want to check the signature first. In theory yes, but in practice what will this break? I've got no idea -- but what's the harm in checking? Ian. -- Ian Campbell Current Noise: Hypocrisy - Roswell 47 Angels we have heard on High Tell us to go out and Buy. -- Tom Lehrer -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2] x86info: dump kvm cpuid's
On Wed, May 02, 2012 at 10:45:27AM +0100, Ian Campbell wrote: On Tue, 2012-05-01 at 16:04 +0300, Gleb Natapov wrote: BTW, according to arch/x86/include/asm/kvm_para.h unsurprisingly KVM has a signature too 'KVMKVMKVM'. cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* +* KVM up to linux 3.4 reports 0 as the max hypervisor leaf, +* where it really means 0x4001. This is something where I definitely think you want to check the signature first. In theory yes, but in practice what will this break? I've got no idea -- but what's the harm in checking? Ian. Users can set kvm signature to anything, if they do debugging will be a bit harder for them. -- Ian Campbell Current Noise: Hypocrisy - Roswell 47 Angels we have heard on High Tell us to go out and Buy. -- Tom Lehrer -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [Xen-devel] [PATCHv2] x86info: dump kvm cpuid's
On Wed, 2012-05-02 at 10:50 +0100, Michael S. Tsirkin wrote: On Wed, May 02, 2012 at 10:45:27AM +0100, Ian Campbell wrote: On Tue, 2012-05-01 at 16:04 +0300, Gleb Natapov wrote: BTW, according to arch/x86/include/asm/kvm_para.h unsurprisingly KVM has a signature too 'KVMKVMKVM'. cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* + * KVM up to linux 3.4 reports 0 as the max hypervisor leaf, + * where it really means 0x4001. This is something where I definitely think you want to check the signature first. In theory yes, but in practice what will this break? I've got no idea -- but what's the harm in checking? Ian. Users can set kvm signature to anything, if they do debugging will be a bit harder for them. Ah, right, someone already mentioned that and I forgot, sorry. And, just to complete my train of thought, cpuid just returns reserved values for requests for non-existent leaves (rather than #GP for example) so it's safe enough even if you do end up trying to read an eax=0x4001 when it doesn't exist. Seems fine to me then. Ian. -- Ian Campbell Current Noise: Hypocrisy - Buried He's like a function -- he returns a value, in the form of his opinion. It's up to you to cast it into a void or not. -- Phil Lapsley -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2] x86info: dump kvm cpuid's
On Tue, May 01, 2012 at 01:27:05PM +0100, Ian Campbell wrote: On Mon, 2012-04-30 at 17:38 +0300, Michael S. Tsirkin wrote: The following makes 'x86info -r' dump hypervisor leaf cpu ids (for kvm this is signature+features) when running in a vm. On the guest we see the signature and the features: eax in: 0x4000, eax = ebx = 4b4d564b ecx = 564b4d56 edx = 004d eax in: 0x4001, eax = 017b ebx = ecx = edx = Hypervisor flag is checked to avoid output changes when not running on a VM. Signed-off-by: Michael S. Tsirkin m...@redhat.com Changes from v1: Make work on non KVM hypervisors (only KVM was tested). Avi Kivity said kvm will in the future report max HV leaf in eax. For now it reports eax = 0 so add a work around for that. --- diff --git a/identify.c b/identify.c index 33f35de..a4a3763 100644 --- a/identify.c +++ b/identify.c @@ -9,8 +9,8 @@ void get_cpu_info_basics(struct cpudata *cpu) { - unsigned int maxi, maxei, vendor, address_bits; - unsigned int eax; + unsigned int maxi, maxei, maxhv, vendor, address_bits; + unsigned int eax, ebx, ecx; cpuid(cpu-number, 0, maxi, vendor, NULL, NULL); maxi = 0x; /* The high-order word is non-zero on some Cyrix CPUs */ @@ -19,7 +19,7 @@ void get_cpu_info_basics(struct cpudata *cpu) return; /* Everything that supports cpuid supports these. */ - cpuid(cpu-number, 1, eax, NULL, NULL, NULL); + cpuid(cpu-number, 1, eax, ebx, ecx, NULL); You probably want to check ebx, ecx, edx for the signatures of the hypervisor's you are willing to support and which you know do something sane with eax? Everyone puts the max leaf in eax - this is what hardware CPUs do. So I think we can just interpret eax as such. If someone wants to put broken info in cpuid, send a patch to blacklist it. Also it would be something worth reporting in its own right? BTW, according to arch/x86/include/asm/kvm_para.h unsurprisingly KVM has a signature too 'KVMKVMKVM'. cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* +* KVM up to linux 3.4 reports 0 as the max hypervisor leaf, +* where it really means 0x4001. This is something where I definitely think you want to check the signature first. Ian. kvm lets users change the signature. But worst case we print one useless line. Better than not printing something potentially useful. -- MST -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2] x86info: dump kvm cpuid's
On Mon, 2012-04-30 at 17:38 +0300, Michael S. Tsirkin wrote: The following makes 'x86info -r' dump hypervisor leaf cpu ids (for kvm this is signature+features) when running in a vm. On the guest we see the signature and the features: eax in: 0x4000, eax = ebx = 4b4d564b ecx = 564b4d56 edx = 004d eax in: 0x4001, eax = 017b ebx = ecx = edx = Hypervisor flag is checked to avoid output changes when not running on a VM. Signed-off-by: Michael S. Tsirkin m...@redhat.com Changes from v1: Make work on non KVM hypervisors (only KVM was tested). Avi Kivity said kvm will in the future report max HV leaf in eax. For now it reports eax = 0 so add a work around for that. --- diff --git a/identify.c b/identify.c index 33f35de..a4a3763 100644 --- a/identify.c +++ b/identify.c @@ -9,8 +9,8 @@ void get_cpu_info_basics(struct cpudata *cpu) { - unsigned int maxi, maxei, vendor, address_bits; - unsigned int eax; + unsigned int maxi, maxei, maxhv, vendor, address_bits; + unsigned int eax, ebx, ecx; cpuid(cpu-number, 0, maxi, vendor, NULL, NULL); maxi = 0x; /* The high-order word is non-zero on some Cyrix CPUs */ @@ -19,7 +19,7 @@ void get_cpu_info_basics(struct cpudata *cpu) return; /* Everything that supports cpuid supports these. */ - cpuid(cpu-number, 1, eax, NULL, NULL, NULL); + cpuid(cpu-number, 1, eax, ebx, ecx, NULL); You probably want to check ebx, ecx, edx for the signatures of the hypervisor's you are willing to support and which you know do something sane with eax? Also it would be something worth reporting in its own right? BTW, according to arch/x86/include/asm/kvm_para.h unsurprisingly KVM has a signature too 'KVMKVMKVM'. cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* + * KVM up to linux 3.4 reports 0 as the max hypervisor leaf, + * where it really means 0x4001. This is something where I definitely think you want to check the signature first. Ian. + * Most (all?) hypervisors have at least one CPUID besides + * the vendor ID so assume that. + */ + cpu-maxhv = maxhv ? maxhv : 0x4001; + } else { + /* Suppress hypervisor cpuid unless running on a hypervisor */ + cpu-maxhv = 0; + } cpuid(cpu-number, 0x8008,address_bits, NULL, NULL, NULL); cpu-phyaddr_bits = address_bits 0xFF; diff --git a/x86info.c b/x86info.c index 22c4734..80cae36 100644 --- a/x86info.c +++ b/x86info.c @@ -44,6 +44,10 @@ static void display_detailed_info(struct cpudata *cpu) if (cpu-maxei2 =0xC000) dump_raw_cpuid(cpu-number, 0xC000, cpu-maxei2); + + if (cpu-maxhv = 0x4000) + dump_raw_cpuid(cpu-number, 0x4000, cpu-maxhv); + } if (show_cacheinfo) { diff --git a/x86info.h b/x86info.h index 7d2a455..c4f5d81 100644 --- a/x86info.h +++ b/x86info.h @@ -84,7 +84,7 @@ struct cpudata { unsigned int cachesize_trace; unsigned int phyaddr_bits; unsigned int viraddr_bits; - unsigned int cpuid_level, maxei, maxei2; + unsigned int cpuid_level, maxei, maxei2, maxhv; char name[CPU_NAME_LEN]; enum connector connector; unsigned int flags_ecx; ___ Virtualization mailing list virtualizat...@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization -- Ian Campbell Your own qualities will help prevent your advancement in the world. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2] x86info: dump kvm cpuid's
On Tue, May 01, 2012 at 01:27:05PM +0100, Ian Campbell wrote: On Mon, 2012-04-30 at 17:38 +0300, Michael S. Tsirkin wrote: The following makes 'x86info -r' dump hypervisor leaf cpu ids (for kvm this is signature+features) when running in a vm. On the guest we see the signature and the features: eax in: 0x4000, eax = ebx = 4b4d564b ecx = 564b4d56 edx = 004d eax in: 0x4001, eax = 017b ebx = ecx = edx = Hypervisor flag is checked to avoid output changes when not running on a VM. Signed-off-by: Michael S. Tsirkin m...@redhat.com Changes from v1: Make work on non KVM hypervisors (only KVM was tested). Avi Kivity said kvm will in the future report max HV leaf in eax. For now it reports eax = 0 so add a work around for that. --- diff --git a/identify.c b/identify.c index 33f35de..a4a3763 100644 --- a/identify.c +++ b/identify.c @@ -9,8 +9,8 @@ void get_cpu_info_basics(struct cpudata *cpu) { - unsigned int maxi, maxei, vendor, address_bits; - unsigned int eax; + unsigned int maxi, maxei, maxhv, vendor, address_bits; + unsigned int eax, ebx, ecx; cpuid(cpu-number, 0, maxi, vendor, NULL, NULL); maxi = 0x; /* The high-order word is non-zero on some Cyrix CPUs */ @@ -19,7 +19,7 @@ void get_cpu_info_basics(struct cpudata *cpu) return; /* Everything that supports cpuid supports these. */ - cpuid(cpu-number, 1, eax, NULL, NULL, NULL); + cpuid(cpu-number, 1, eax, ebx, ecx, NULL); You probably want to check ebx, ecx, edx for the signatures of the hypervisor's you are willing to support and which you know do something sane with eax? Also it would be something worth reporting in its own right? Yes, but this is for -r option which only dumps raw cpuid info. Decoding hypervisor specific info is useful thing, but should not be pre-request for that patch. BTW, according to arch/x86/include/asm/kvm_para.h unsurprisingly KVM has a signature too 'KVMKVMKVM'. cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* +* KVM up to linux 3.4 reports 0 as the max hypervisor leaf, +* where it really means 0x4001. This is something where I definitely think you want to check the signature first. In theory yes, but in practice what will this break? Ian. +* Most (all?) hypervisors have at least one CPUID besides +* the vendor ID so assume that. +*/ + cpu-maxhv = maxhv ? maxhv : 0x4001; + } else { + /* Suppress hypervisor cpuid unless running on a hypervisor */ + cpu-maxhv = 0; + } cpuid(cpu-number, 0x8008,address_bits, NULL, NULL, NULL); cpu-phyaddr_bits = address_bits 0xFF; diff --git a/x86info.c b/x86info.c index 22c4734..80cae36 100644 --- a/x86info.c +++ b/x86info.c @@ -44,6 +44,10 @@ static void display_detailed_info(struct cpudata *cpu) if (cpu-maxei2 =0xC000) dump_raw_cpuid(cpu-number, 0xC000, cpu-maxei2); + + if (cpu-maxhv = 0x4000) + dump_raw_cpuid(cpu-number, 0x4000, cpu-maxhv); + } if (show_cacheinfo) { diff --git a/x86info.h b/x86info.h index 7d2a455..c4f5d81 100644 --- a/x86info.h +++ b/x86info.h @@ -84,7 +84,7 @@ struct cpudata { unsigned int cachesize_trace; unsigned int phyaddr_bits; unsigned int viraddr_bits; - unsigned int cpuid_level, maxei, maxei2; + unsigned int cpuid_level, maxei, maxei2, maxhv; char name[CPU_NAME_LEN]; enum connector connector; unsigned int flags_ecx; ___ Virtualization mailing list virtualizat...@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization -- Ian Campbell Your own qualities will help prevent your advancement in the world. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html -- Gleb. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2] x86info: dump kvm cpuid's
On Mon, Apr 30, 2012 at 05:38:35PM +0300, Michael S. Tsirkin wrote: The following makes 'x86info -r' dump hypervisor leaf cpu ids (for kvm this is signature+features) when running in a vm. On the guest we see the signature and the features: eax in: 0x4000, eax = ebx = 4b4d564b ecx = 564b4d56 edx = 004d eax in: 0x4001, eax = 017b ebx = ecx = edx = Hypervisor flag is checked to avoid output changes when not running on a VM. Signed-off-by: Michael S. Tsirkin m...@redhat.com Looks good to me. Changes from v1: Make work on non KVM hypervisors (only KVM was tested). Avi Kivity said kvm will in the future report max HV leaf in eax. For now it reports eax = 0 so add a work around for that. --- diff --git a/identify.c b/identify.c index 33f35de..a4a3763 100644 --- a/identify.c +++ b/identify.c @@ -9,8 +9,8 @@ void get_cpu_info_basics(struct cpudata *cpu) { - unsigned int maxi, maxei, vendor, address_bits; - unsigned int eax; + unsigned int maxi, maxei, maxhv, vendor, address_bits; + unsigned int eax, ebx, ecx; cpuid(cpu-number, 0, maxi, vendor, NULL, NULL); maxi = 0x; /* The high-order word is non-zero on some Cyrix CPUs */ @@ -19,7 +19,7 @@ void get_cpu_info_basics(struct cpudata *cpu) return; /* Everything that supports cpuid supports these. */ - cpuid(cpu-number, 1, eax, NULL, NULL, NULL); + cpuid(cpu-number, 1, eax, ebx, ecx, NULL); cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* + * KVM up to linux 3.4 reports 0 as the max hypervisor leaf, + * where it really means 0x4001. + * Most (all?) hypervisors have at least one CPUID besides + * the vendor ID so assume that. + */ + cpu-maxhv = maxhv ? maxhv : 0x4001; + } else { + /* Suppress hypervisor cpuid unless running on a hypervisor */ + cpu-maxhv = 0; + } cpuid(cpu-number, 0x8008,address_bits, NULL, NULL, NULL); cpu-phyaddr_bits = address_bits 0xFF; diff --git a/x86info.c b/x86info.c index 22c4734..80cae36 100644 --- a/x86info.c +++ b/x86info.c @@ -44,6 +44,10 @@ static void display_detailed_info(struct cpudata *cpu) if (cpu-maxei2 =0xC000) dump_raw_cpuid(cpu-number, 0xC000, cpu-maxei2); + + if (cpu-maxhv = 0x4000) + dump_raw_cpuid(cpu-number, 0x4000, cpu-maxhv); + } if (show_cacheinfo) { diff --git a/x86info.h b/x86info.h index 7d2a455..c4f5d81 100644 --- a/x86info.h +++ b/x86info.h @@ -84,7 +84,7 @@ struct cpudata { unsigned int cachesize_trace; unsigned int phyaddr_bits; unsigned int viraddr_bits; - unsigned int cpuid_level, maxei, maxei2; + unsigned int cpuid_level, maxei, maxei2, maxhv; char name[CPU_NAME_LEN]; enum connector connector; unsigned int flags_ecx; -- Gleb. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCHv2] x86info: dump kvm cpuid's
The following makes 'x86info -r' dump hypervisor leaf cpu ids (for kvm this is signature+features) when running in a vm. On the guest we see the signature and the features: eax in: 0x4000, eax = ebx = 4b4d564b ecx = 564b4d56 edx = 004d eax in: 0x4001, eax = 017b ebx = ecx = edx = Hypervisor flag is checked to avoid output changes when not running on a VM. Signed-off-by: Michael S. Tsirkin m...@redhat.com Changes from v1: Make work on non KVM hypervisors (only KVM was tested). Avi Kivity said kvm will in the future report max HV leaf in eax. For now it reports eax = 0 so add a work around for that. --- diff --git a/identify.c b/identify.c index 33f35de..a4a3763 100644 --- a/identify.c +++ b/identify.c @@ -9,8 +9,8 @@ void get_cpu_info_basics(struct cpudata *cpu) { - unsigned int maxi, maxei, vendor, address_bits; - unsigned int eax; + unsigned int maxi, maxei, maxhv, vendor, address_bits; + unsigned int eax, ebx, ecx; cpuid(cpu-number, 0, maxi, vendor, NULL, NULL); maxi = 0x; /* The high-order word is non-zero on some Cyrix CPUs */ @@ -19,7 +19,7 @@ void get_cpu_info_basics(struct cpudata *cpu) return; /* Everything that supports cpuid supports these. */ - cpuid(cpu-number, 1, eax, NULL, NULL, NULL); + cpuid(cpu-number, 1, eax, ebx, ecx, NULL); cpu-stepping = eax 0xf; cpu-model = (eax 4) 0xf; cpu-family = (eax 8) 0xf; @@ -29,6 +29,19 @@ void get_cpu_info_basics(struct cpudata *cpu) cpuid(cpu-number, 0xC000, maxei, NULL, NULL, NULL); cpu-maxei2 = maxei; + if (ecx 0x8000) { + cpuid(cpu-number, 0x4000, maxhv, NULL, NULL, NULL); + /* +* KVM up to linux 3.4 reports 0 as the max hypervisor leaf, +* where it really means 0x4001. +* Most (all?) hypervisors have at least one CPUID besides +* the vendor ID so assume that. +*/ + cpu-maxhv = maxhv ? maxhv : 0x4001; + } else { + /* Suppress hypervisor cpuid unless running on a hypervisor */ + cpu-maxhv = 0; + } cpuid(cpu-number, 0x8008,address_bits, NULL, NULL, NULL); cpu-phyaddr_bits = address_bits 0xFF; diff --git a/x86info.c b/x86info.c index 22c4734..80cae36 100644 --- a/x86info.c +++ b/x86info.c @@ -44,6 +44,10 @@ static void display_detailed_info(struct cpudata *cpu) if (cpu-maxei2 =0xC000) dump_raw_cpuid(cpu-number, 0xC000, cpu-maxei2); + + if (cpu-maxhv = 0x4000) + dump_raw_cpuid(cpu-number, 0x4000, cpu-maxhv); + } if (show_cacheinfo) { diff --git a/x86info.h b/x86info.h index 7d2a455..c4f5d81 100644 --- a/x86info.h +++ b/x86info.h @@ -84,7 +84,7 @@ struct cpudata { unsigned int cachesize_trace; unsigned int phyaddr_bits; unsigned int viraddr_bits; - unsigned int cpuid_level, maxei, maxei2; + unsigned int cpuid_level, maxei, maxei2, maxhv; char name[CPU_NAME_LEN]; enum connector connector; unsigned int flags_ecx; -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html