mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
e2c40d1e69
commit
9db5e896ec
3 files changed
+23
-9
No files matched your search
@@ -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_cputopoinfo(xc_interface *xch, unsigned *max_cpus,
|
||||
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_ucode_revision(xc_interface *xch,
|
||||
struct xenpf_ucode_revision *ucode_rev);
|
||||
|
||||
@@ -203,11 +203,12 @@ int xc_physinfo(xc_interface *xch,
|
||||
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;
|
||||
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);
|
||||
if ( uc == NULL )
|
||||
@@ -215,9 +216,10 @@ int xc_microcode_update(xc_interface *xch, const void *buf, size_t len)
|
||||
|
||||
memcpy(uc, buf, len);
|
||||
|
||||
platform_op.cmd = XENPF_microcode_update;
|
||||
platform_op.u.microcode.length = len;
|
||||
set_xen_guest_handle(platform_op.u.microcode.data, uc);
|
||||
platform_op.cmd = XENPF_microcode_update2;
|
||||
platform_op.u.microcode2.length = len;
|
||||
platform_op.u.microcode2.flags = flags;
|
||||
set_xen_guest_handle(platform_op.u.microcode2.data, uc);
|
||||
|
||||
ret = do_platform_op(xch, &platform_op);
|
||||
|
||||
|
||||
+14
-3
@@ -13,6 +13,8 @@
|
||||
#include <xenctrl.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#include <xen/platform.h>
|
||||
|
||||
static xc_interface *xch;
|
||||
|
||||
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"
|
||||
"options:\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);
|
||||
show_curr_cpu(stream);
|
||||
}
|
||||
@@ -89,6 +94,7 @@ int main(int argc, char *argv[])
|
||||
static const struct option options[] = {
|
||||
{ "help", no_argument, NULL, 'h' },
|
||||
{ "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;
|
||||
struct stat st;
|
||||
int opt;
|
||||
uint32_t ucode_flags = 0;
|
||||
|
||||
xch = xc_interface_open(NULL, NULL, 0);
|
||||
if ( xch == NULL )
|
||||
@@ -106,7 +113,7 @@ int main(int argc, char *argv[])
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while ( (opt = getopt_long(argc, argv, "hs", options, NULL)) != -1 )
|
||||
while ( (opt = getopt_long(argc, argv, "hsf", options, NULL)) != -1 )
|
||||
{
|
||||
switch ( opt )
|
||||
{
|
||||
@@ -118,6 +125,10 @@ int main(int argc, char *argv[])
|
||||
show_curr_cpu(stdout);
|
||||
exit(EXIT_SUCCESS);
|
||||
|
||||
case 'f':
|
||||
ucode_flags |= XENPF_UCODE_FORCE;
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "%s: unknown option\n", argv[0]);
|
||||
goto ext_err;
|
||||
@@ -162,7 +173,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
ret = xc_microcode_update(xch, buf, len);
|
||||
ret = xc_microcode_update(xch, buf, len, ucode_flags);
|
||||
if ( ret == -1 && errno == EEXIST )
|
||||
printf("Microcode already up to date\n");
|
||||
else if ( ret )
|
||||
|
||||