Mailing List Archive

[PATCH v3 2/4] livepatch: introduce --force option
Introduce a xen-livepatch tool --force option, that's propagated into the
hyerpvisor for livepatch operations. The intention is for the option to be
used to bypass some checks that would otherwise prevent the patch from being
loaded.

Re purpose the pad field in xen_sysctl_livepatch_op to be a flags field that
applies to all livepatch operations. The flag is currently only set by the
hypercall wrappers for the XEN_SYSCTL_LIVEPATCH_UPLOAD operation, as that's so
far the only one where it will be used initially. Other uses can be added as
required.

Note that helpers would set the .pad field to 0, that's been removed since the
structure is already zero initialized at definition.

No functional usages of the new flag introduced in this patch.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
---
Changes since v2:
- New in this version.
---
tools/include/xenctrl.h | 3 ++-
tools/libs/ctrl/xc_misc.c | 7 +++----
tools/misc/xen-livepatch.c | 21 +++++++++++++++++++--
xen/common/livepatch.c | 3 ++-
xen/include/public/sysctl.h | 4 +++-
5 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h
index 2ef8b4e05422..499685594427 100644
--- a/tools/include/xenctrl.h
+++ b/tools/include/xenctrl.h
@@ -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,
diff --git a/tools/libs/ctrl/xc_misc.c b/tools/libs/ctrl/xc_misc.c
index 5ecdfa2c7934..50282fd60dcc 100644
--- a/tools/libs/ctrl/xc_misc.c
+++ b/tools/libs/ctrl/xc_misc.c
@@ -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;
diff --git a/tools/misc/xen-livepatch.c b/tools/misc/xen-livepatch.c
index a246e5dfd38e..cf2e5fada12d 100644
--- a/tools/misc/xen-livepatch.c
+++ b/tools/misc/xen-livepatch.c
@@ -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 ( !strncmp("--force", argv[1], strlen("--force")) )
+ {
+ if ( argc <= 2 )
+ {
+ show_help();
+ return EXIT_FAILURE;
+ }
+ force = true;
+ argv++;
+ argc--;
+ }
+
for ( i = 0; i < ARRAY_SIZE(main_options); i++ )
if (!strncmp(main_options[i].name, argv[1],
strlen(main_options[i].name)))
diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c
index 351a3e0b9a60..1503a84457e4 100644
--- a/xen/common/livepatch.c
+++ b/xen/common/livepatch.c
@@ -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 )
diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h
index 9b19679caeb1..febaa4b16ab7 100644
--- a/xen/include/public/sysctl.h
+++ b/xen/include/public/sysctl.h
@@ -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;
--
2.44.0
Re: [PATCH v3 2/4] livepatch: introduce --force option [ In reply to ]
On 23.04.2024 15:12, Roger Pau Monne wrote:
> --- a/xen/common/livepatch.c
> +++ b/xen/common/livepatch.c
> @@ -2125,7 +2125,8 @@ int livepatch_op(struct xen_sysctl_livepatch_op *livepatch)
> {
> int rc;
>
> - if ( livepatch->pad )
> + if ( livepatch->flags & ~LIVEPATCH_FLAGS_MASK &&

With parentheses added here (which presumably could be done while
committing)
Acked-by: Jan Beulich <jbeulich@suse.com>

Jan
Re: [PATCH v3 2/4] livepatch: introduce --force option [ In reply to ]
On Tue, Apr 23, 2024 at 03:12:47PM +0200, Roger Pau Monne wrote:
> Introduce a xen-livepatch tool --force option, that's propagated into the
> hyerpvisor for livepatch operations. The intention is for the option to be
> used to bypass some checks that would otherwise prevent the patch from being
> loaded.
>
> Re purpose the pad field in xen_sysctl_livepatch_op to be a flags field that
> applies to all livepatch operations. The flag is currently only set by the
> hypercall wrappers for the XEN_SYSCTL_LIVEPATCH_UPLOAD operation, as that's so
> far the only one where it will be used initially. Other uses can be added as
> required.
>
> Note that helpers would set the .pad field to 0, that's been removed since the
> structure is already zero initialized at definition.
>
> No functional usages of the new flag introduced in this patch.
>
> Signed-off-by: Roger Pau Monn? <roger.pau@citrix.com>

For the tools:
Acked-by: Anthony PERARD <anthony.perard@citrix.com>

Thanks,

--
Anthony PERARD