summaryrefslogtreecommitdiff
path: root/xen
diff options
context:
space:
mode:
authorSergey Dyasli <sergey.dyasli@citrix.com>2023-04-17 14:53:34 +0100
committerAndrew Cooper <andrew.cooper3@citrix.com>2023-05-03 18:36:46 +0100
commit161c37d020a7a958a10bc784dd7914308a5cc367 (patch)
treea6133bed6b442ed385b70737ec36a0d6c5af1cad /xen
parentf1e574fa6dea74517cb700fb072b52f9b49d984e (diff)
downloadxen-161c37d020a7a958a10bc784dd7914308a5cc367.tar.gz
x86/platform: introduce XENPF_get_ucode_revision
Currently it's hard to get CPU's microcode revision from Xen after late loading without looking into Xen logs, which is not always convenient. Add a new platform op in order to get the required data from Xen and provide a wrapper for libxenctrl. Signed-off-by: Sergey Dyasli <sergey.dyasli@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Diffstat (limited to 'xen')
-rw-r--r--xen/arch/x86/platform_hypercall.c29
-rw-r--r--xen/arch/x86/x86_64/platform_hypercall.c4
-rw-r--r--xen/include/public/platform.h11
-rw-r--r--xen/include/xlat.lst1
4 files changed, 45 insertions, 0 deletions
diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c
index a2d9526355..9ff2da8fc3 100644
--- a/xen/arch/x86/platform_hypercall.c
+++ b/xen/arch/x86/platform_hypercall.c
@@ -640,6 +640,35 @@ ret_t do_platform_op(
}
break;
+ case XENPF_get_ucode_revision:
+ {
+ struct xenpf_ucode_revision *rev = &op->u.ucode_revision;
+
+ if ( !get_cpu_maps() )
+ {
+ ret = -EBUSY;
+ break;
+ }
+
+ /* TODO: make it possible to know ucode revisions for parked CPUs */
+ if ( (rev->cpu >= nr_cpu_ids) || !cpu_online(rev->cpu) )
+ ret = -ENOENT;
+ else
+ {
+ const struct cpu_signature *sig = &per_cpu(cpu_sig, rev->cpu);
+
+ rev->signature = sig->sig;
+ rev->pf = sig->pf;
+ rev->revision = sig->rev;
+ }
+
+ put_cpu_maps();
+
+ if ( __copy_field_to_guest(u_xenpf_op, op, u.ucode_revision) )
+ ret = -EFAULT;
+ }
+ break;
+
case XENPF_cpu_online:
{
int cpu = op->u.cpu_ol.cpuid;
diff --git a/xen/arch/x86/x86_64/platform_hypercall.c b/xen/arch/x86/x86_64/platform_hypercall.c
index 5bf6b958d2..99440f4076 100644
--- a/xen/arch/x86/x86_64/platform_hypercall.c
+++ b/xen/arch/x86/x86_64/platform_hypercall.c
@@ -28,6 +28,10 @@ CHECK_pf_pcpuinfo;
CHECK_pf_pcpu_version;
#undef xen_pf_pcpu_version
+#define xen_pf_ucode_revision xenpf_ucode_revision
+CHECK_pf_ucode_revision;
+#undef xen_pf_pucode_revision
+
#define xen_pf_enter_acpi_sleep xenpf_enter_acpi_sleep
CHECK_pf_enter_acpi_sleep;
#undef xen_pf_enter_acpi_sleep
diff --git a/xen/include/public/platform.h b/xen/include/public/platform.h
index 60caa5ce7e..15777b5416 100644
--- a/xen/include/public/platform.h
+++ b/xen/include/public/platform.h
@@ -614,6 +614,16 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_symdata_t);
typedef struct dom0_vga_console_info xenpf_dom0_console_t;
DEFINE_XEN_GUEST_HANDLE(xenpf_dom0_console_t);
+#define XENPF_get_ucode_revision 65
+struct xenpf_ucode_revision {
+ uint32_t cpu; /* IN: CPU number to get the revision from. */
+ uint32_t signature; /* OUT: CPU signature (CPUID.1.EAX). */
+ uint32_t pf; /* OUT: Platform Flags (Intel only) */
+ uint32_t revision; /* OUT: Microcode Revision. */
+};
+typedef struct xenpf_ucode_revision xenpf_ucode_revision_t;
+DEFINE_XEN_GUEST_HANDLE(xenpf_ucode_revision_t);
+
/*
* ` enum neg_errnoval
* ` HYPERVISOR_platform_op(const struct xen_platform_op*);
@@ -645,6 +655,7 @@ struct xen_platform_op {
xenpf_resource_op_t resource_op;
xenpf_symdata_t symdata;
xenpf_dom0_console_t dom0_console;
+ xenpf_ucode_revision_t ucode_revision;
uint8_t pad[128];
} u;
};
diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
index d601a8a984..9c41948514 100644
--- a/xen/include/xlat.lst
+++ b/xen/include/xlat.lst
@@ -157,6 +157,7 @@
? xenpf_pcpuinfo platform.h
? xenpf_pcpu_version platform.h
? xenpf_resource_entry platform.h
+? xenpf_ucode_revision platform.h
? pmu_data pmu.h
? pmu_params pmu.h
! sched_poll sched.h