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_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);
|
||||||
|
|||||||
@@ -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
@@ -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 )
|
||||||
|
|||||||