@@ -2555,7 +2555,8 @@ int xc_psr_get_hw_info(xc_interface *xch, uint32_t socket,
#endif
int xc_livepatch_upload(xc_interface *xch,
- char *name, unsigned char *payload, uint32_t size);
+ char *name, unsigned char *payload, uint32_t size,
+ bool force);
int xc_livepatch_get(xc_interface *xch,
char *name,
@@ -576,7 +576,8 @@ int xc_getcpuinfo(xc_interface *xch, int max_cpus,
int xc_livepatch_upload(xc_interface *xch,
char *name,
unsigned char *payload,
- uint32_t size)
+ uint32_t size,
+ bool force)
{
int rc;
struct xen_sysctl sysctl = {};
@@ -612,7 +613,7 @@ int xc_livepatch_upload(xc_interface *xch,
sysctl.cmd = XEN_SYSCTL_livepatch_op;
sysctl.u.livepatch.cmd = XEN_SYSCTL_LIVEPATCH_UPLOAD;
- sysctl.u.livepatch.pad = 0;
+ sysctl.u.livepatch.flags = force ? LIVEPATCH_FLAG_FORCE : 0;
sysctl.u.livepatch.u.upload.size = size;
set_xen_guest_handle(sysctl.u.livepatch.u.upload.payload, local);
@@ -656,7 +657,6 @@ int xc_livepatch_get(xc_interface *xch,
sysctl.cmd = XEN_SYSCTL_livepatch_op;
sysctl.u.livepatch.cmd = XEN_SYSCTL_LIVEPATCH_GET;
- sysctl.u.livepatch.pad = 0;
sysctl.u.livepatch.u.get.status.state = 0;
sysctl.u.livepatch.u.get.status.rc = 0;
@@ -985,7 +985,6 @@ static int _xc_livepatch_action(xc_interface *xch,
sysctl.cmd = XEN_SYSCTL_livepatch_op;
sysctl.u.livepatch.cmd = XEN_SYSCTL_LIVEPATCH_ACTION;
- sysctl.u.livepatch.pad = 0;
sysctl.u.livepatch.u.action.cmd = action;
sysctl.u.livepatch.u.action.timeout = timeout;
sysctl.u.livepatch.u.action.flags = flags;
@@ -19,11 +19,15 @@
static xc_interface *xch;
+/* Global option to disable checks. */
+static bool force;
+
void show_help(void)
{
fprintf(stderr,
"xen-livepatch: live patching tool\n"
- "Usage: xen-livepatch <command> [args] [command-flags]\n"
+ "Usage: xen-livepatch [--force] <command> [args] [command-flags]\n"
+ " Use --force option to bypass some checks.\n"
" <name> An unique name of payload. Up to %d characters.\n"
"Commands:\n"
" help display this help\n"
@@ -240,7 +244,7 @@ static int upload_func(int argc, char *argv[])
return saved_errno;
}
printf("Uploading %s... ", filename);
- rc = xc_livepatch_upload(xch, name, fbuf, len);
+ rc = xc_livepatch_upload(xch, name, fbuf, len, force);
if ( rc )
{
rc = errno;
@@ -571,6 +575,19 @@ int main(int argc, char *argv[])
show_help();
return 0;
}
+
+ if ( strcmp("--force", argv[1]) )
+ {
+ if ( argc <= 2 )
+ {
+ show_help();
+ return EXIT_FAILURE;
+ }
+ force = true;
+ argv++;
+ argc--;
+ }
+
for ( i = 0; i < ARRAY_SIZE(main_options); i++ )
if (!strcmp(main_options[i].name, argv[1]))
break;
@@ -2125,7 +2125,8 @@ int livepatch_op(struct xen_sysctl_livepatch_op *livepatch)
{
int rc;
- if ( livepatch->pad )
+ if ( (livepatch->flags & ~LIVEPATCH_FLAGS_MASK) &&
+ !(livepatch->flags & LIVEPATCH_FLAG_FORCE) )
return -EINVAL;
switch ( livepatch->cmd )
@@ -1139,7 +1139,9 @@ struct xen_sysctl_livepatch_action {
struct xen_sysctl_livepatch_op {
uint32_t cmd; /* IN: XEN_SYSCTL_LIVEPATCH_*. */
- uint32_t pad; /* IN: Always zero. */
+ uint32_t flags; /* IN, flags. */
+#define LIVEPATCH_FLAG_FORCE (1u << 0) /* Skip some checks. */
+#define LIVEPATCH_FLAGS_MASK LIVEPATCH_FLAG_FORCE
union {
struct xen_sysctl_livepatch_upload upload;
struct xen_sysctl_livepatch_list list;