tools/xen-ucode: Introduce a --force option to xen-ucode

Introduce a --force option to xen-ucode, in order to bypass certain checks
when applying microcode.

Update libxc's xc_microcode_update() to take an extra parameter, and to use
the new XENPF_microcode_update2 hypercall instead.

Signed-off-by: Fouad Hilly <fouad.hilly@cloud.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Fouad Hilly authored and Andrew Cooper committed 2024-08-23 18:50:00 +01:00
1 parent e2c40d1e69
commit 9db5e896ec
3 files changed
+23 -9

No files matched your search

+2 -1
View File
@@ -1171,7 +1171,8 @@ typedef uint32_t xc_node_to_node_dist_t;
int xc_physinfo(xc_interface *xch, xc_physinfo_t *info); int xc_physinfo(xc_interface *xch, xc_physinfo_t *info);
int xc_cputopoinfo(xc_interface *xch, unsigned *max_cpus, int xc_cputopoinfo(xc_interface *xch, unsigned *max_cpus,
xc_cputopo_t *cputopo); xc_cputopo_t *cputopo);
int xc_microcode_update(xc_interface *xch, const void *buf, size_t len); int xc_microcode_update(xc_interface *xch, const void *buf,
size_t len, unsigned int flags);
int xc_get_cpu_version(xc_interface *xch, struct xenpf_pcpu_version *cpu_ver); int xc_get_cpu_version(xc_interface *xch, struct xenpf_pcpu_version *cpu_ver);
int xc_get_ucode_revision(xc_interface *xch, int xc_get_ucode_revision(xc_interface *xch,
struct xenpf_ucode_revision *ucode_rev); struct xenpf_ucode_revision *ucode_rev);
+7 -5
View File
@@ -203,11 +203,12 @@ int xc_physinfo(xc_interface *xch,
return 0; return 0;
} }
int xc_microcode_update(xc_interface *xch, const void *buf, size_t len) int xc_microcode_update(xc_interface *xch, const void *buf,
size_t len, unsigned int flags)
{ {
int ret; int ret;
struct xen_platform_op platform_op = {}; struct xen_platform_op platform_op = {};
DECLARE_HYPERCALL_BUFFER(struct xenpf_microcode_update, uc); DECLARE_HYPERCALL_BUFFER(struct xenpf_microcode_update2, uc);
uc = xc_hypercall_buffer_alloc(xch, uc, len); uc = xc_hypercall_buffer_alloc(xch, uc, len);
if ( uc == NULL ) if ( uc == NULL )
@@ -215,9 +216,10 @@ int xc_microcode_update(xc_interface *xch, const void *buf, size_t len)
memcpy(uc, buf, len); memcpy(uc, buf, len);
platform_op.cmd = XENPF_microcode_update; platform_op.cmd = XENPF_microcode_update2;
platform_op.u.microcode.length = len; platform_op.u.microcode2.length = len;
set_xen_guest_handle(platform_op.u.microcode.data, uc); platform_op.u.microcode2.flags = flags;
set_xen_guest_handle(platform_op.u.microcode2.data, uc);
ret = do_platform_op(xch, &platform_op); ret = do_platform_op(xch, &platform_op);
+14 -3
View File
@@ -13,6 +13,8 @@
#include <xenctrl.h> #include <xenctrl.h>
#include <getopt.h> #include <getopt.h>
#include <xen/platform.h>
static xc_interface *xch; static xc_interface *xch;
static const char intel_id[] = "GenuineIntel"; static const char intel_id[] = "GenuineIntel";
@@ -79,7 +81,10 @@ static void usage(FILE *stream, const char *name)
"Usage: %s [options] [<microcode file> | show-cpu-info]\n" "Usage: %s [options] [<microcode file> | show-cpu-info]\n"
"options:\n" "options:\n"
" -h, --help display this help\n" " -h, --help display this help\n"
" -s, --show-cpu-info show CPU information\n", " -s, --show-cpu-info show CPU information\n"
" -f, --force skip certain checks when applying\n"
" microcode; do not use unless you know\n"
" exactly what you are doing\n",
name, name); name, name);
show_curr_cpu(stream); show_curr_cpu(stream);
} }
@@ -89,6 +94,7 @@ int main(int argc, char *argv[])
static const struct option options[] = { static const struct option options[] = {
{ "help", no_argument, NULL, 'h' }, { "help", no_argument, NULL, 'h' },
{ "show-cpu-info", no_argument, NULL, 's' }, { "show-cpu-info", no_argument, NULL, 's' },
{ "force", no_argument, NULL, 'f' },
{} {}
}; };
@@ -97,6 +103,7 @@ int main(int argc, char *argv[])
size_t len; size_t len;
struct stat st; struct stat st;
int opt; int opt;
uint32_t ucode_flags = 0;
xch = xc_interface_open(NULL, NULL, 0); xch = xc_interface_open(NULL, NULL, 0);
if ( xch == NULL ) if ( xch == NULL )
@@ -106,7 +113,7 @@ int main(int argc, char *argv[])
exit(1); exit(1);
} }
while ( (opt = getopt_long(argc, argv, "hs", options, NULL)) != -1 ) while ( (opt = getopt_long(argc, argv, "hsf", options, NULL)) != -1 )
{ {
switch ( opt ) switch ( opt )
{ {
@@ -118,6 +125,10 @@ int main(int argc, char *argv[])
show_curr_cpu(stdout); show_curr_cpu(stdout);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
case 'f':
ucode_flags |= XENPF_UCODE_FORCE;
break;
default: default:
fprintf(stderr, "%s: unknown option\n", argv[0]); fprintf(stderr, "%s: unknown option\n", argv[0]);
goto ext_err; goto ext_err;
@@ -162,7 +173,7 @@ int main(int argc, char *argv[])
} }
errno = 0; errno = 0;
ret = xc_microcode_update(xch, buf, len); ret = xc_microcode_update(xch, buf, len, ucode_flags);
if ( ret == -1 && errno == EEXIST ) if ( ret == -1 && errno == EEXIST )
printf("Microcode already up to date\n"); printf("Microcode already up to date\n");
else if ( ret ) else if ( ret )
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.