|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 3/3] tools/xen-ucode: print information about currently loaded ucode
Add an option to xen-ucode tool to print the currently loaded ucode
version and also print it during usage info. Print CPU signature and
processor flags as well. The raw data comes from XENPF_get_cpu_version
and XENPF_get_ucode_version platform ops.
Example output:
Intel:
Current CPU signature is: 06-55-04 (raw 0x50654)
Current CPU microcode revision is: 0x2006e05
Current CPU processor flags are: 0x1
AMD:
Current CPU signature is: fam19h (raw 0xa00f11)
Current CPU microcode revision is: 0xa0011a8
Signed-off-by: Sergey Dyasli <sergey.dyasli@xxxxxxxxxx>
---
tools/misc/xen-ucode.c | 66 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/tools/misc/xen-ucode.c b/tools/misc/xen-ucode.c
index ad32face2b..b9037ce6a1 100644
--- a/tools/misc/xen-ucode.c
+++ b/tools/misc/xen-ucode.c
@@ -12,6 +12,65 @@
#include <fcntl.h>
#include <xenctrl.h>
+static const char intel_id[] = "GenuineIntel";
+static const char amd_id[] = "AuthenticAMD";
+
+static void show_curr_cpu(FILE *f)
+{
+ int ret;
+ xc_interface *xch;
+ struct xenpf_pcpu_version cpu_ver = { .xen_cpuid = 0 };
+ struct xenpf_ucode_version ucode_ver = { .xen_cpuid = 0 };
+ bool intel = false, amd = false;
+
+ xch = xc_interface_open(0, 0, 0);
+ if ( xch == NULL )
+ return;
+
+ ret = xc_get_cpu_version(xch, &cpu_ver);
+ if ( ret )
+ return;
+
+ ret = xc_get_ucode_version(xch, &ucode_ver);
+ if ( ret )
+ return;
+
+ if ( memcmp(cpu_ver.vendor_id, intel_id,
+ sizeof(cpu_ver.vendor_id)) == 0 )
+ intel = true;
+ else if ( memcmp(cpu_ver.vendor_id, amd_id,
+ sizeof(cpu_ver.vendor_id)) == 0 )
+ amd = true;
+
+ /*
+ * Print signature in a form that allows to quickly identify which ucode
+ * blob to load, e.g.:
+ *
+ * Intel: /lib/firmware/intel-ucode/06-55-04
+ * AMD: /lib/firmware/amd-ucode/microcode_amd_fam19h.bin
+ */
+ if ( intel )
+ {
+ fprintf(f, "Current CPU signature is: %02x-%02x-%02x (raw %#x)\n",
+ cpu_ver.family, cpu_ver.model, cpu_ver.stepping,
+ ucode_ver.cpu_signature);
+ }
+ else if ( amd )
+ {
+ fprintf(f, "Current CPU signature is: fam%xh (raw %#x)\n",
+ cpu_ver.family, ucode_ver.cpu_signature);
+ }
+
+ if ( intel || amd )
+ fprintf(f, "Current CPU microcode revision is: %#x\n",
+ ucode_ver.ucode_revision);
+
+ if ( intel )
+ fprintf(f, "Current CPU processor flags are: %#x\n", ucode_ver.pf);
+
+ xc_interface_close(xch);
+}
+
int main(int argc, char *argv[])
{
int fd, ret;
@@ -25,9 +84,16 @@ int main(int argc, char *argv[])
fprintf(stderr,
"xen-ucode: Xen microcode updating tool\n"
"Usage: %s <microcode blob>\n", argv[0]);
+ show_curr_cpu(stderr);
exit(2);
}
+ if ( !strcmp(argv[1], "show-cpu-info") )
+ {
+ show_curr_cpu(stdout);
+ return 0;
+ }
+
filename = argv[1];
fd = open(filename, O_RDONLY);
if ( fd < 0 )
--
2.17.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |