kexec: implement STATUS hypercall to check if image is loaded
PATCH v4 1/1 kexec: implement STATUS hypercall to check if image is loaded
The tools that use kexec are asynchronous in nature and do not keep state changes. As such provide an hypercall to find out whether an image has been loaded for either type.
Note: No need to modify XSM as it has one size fits all check and does not check for subcommands.
Note: No need to check KEXEC_FLAG_IN_PROGRESS (and error out of kexec_status()) as this flag is set only once by the first/only cpu on the crash path.
Note: In kexec_status(), the use of test_bit() can also return EPERM, so the return value from test_bit() must be checked to ensure that kexec_status() always returns 0, 1 or -1, per the public header description.
Note: This is just the Xen side of the hypercall, kexec-tools patch to come separately.
---
CC: Andrew Cooper <[email protected]>
CC: Elena Ufimtseva <[email protected]>
CC: Daniel Kiper <[email protected]>
v0: Internal version.
v1: Dropped Reviewed-by, posting on xen-devel.
v2: Incorporated xen-devel feedback, re-posted on xen-devel.
v3: Incorporated xen-devel feedback, re-posted on xen-devel.
v4: Incorporated xen-devel feedback
--- tools/libxc/include/xenctrl.h | 10 ++++++++++ tools/libxc/xc_kexec.c | 24 ++++++++++++++++++++++++ xen/common/kexec.c | 19 +++++++++++++++++++ xen/include/public/kexec.h | 14 ++++++++++++++ 4 files changed, 67 insertions(+)
tools/libxc/include/xenctrl.h +10 -0
@@ -2574,6 +2574,16 @@ int xc_kexec_load(xc_interface *xch, uint8_t type, uint16_t arch,*/ int xc_kexec_unload (xc_interface *xch,int type); +/* +* Find out whether the image has been succesfully loaded. +* +* The type can be either KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH. +* If zero is returned, that means no image is loaded for the type. +* If one is returned, that means an image is loaded for the type. +* Otherwise, negative return value indicates error. +*/ +int xc_kexec_status (xc_interface *xch,int type); +typedef xenpf_resource_entry_t xc_resource_entry_t ;/*
tools/libxc/xc_kexec.c +24 -0
@@ -126,3 +126,27 @@ out:return ret; } + +int xc_kexec_status (xc_interface *xch,int type) +{ +DECLARE_HYPERCALL_BUFFER (xen_kexec_status_t, status); +int ret =-1 ; + + status =xc_hypercall_buffer_alloc (xch, status,sizeof (*status)); +if ( status ==NULL ) + { +PERROR ("Could not alloc buffer for kexec status hypercall" ); + goto out; + } + + status->type = type; + + ret =xencall2 (xch->xcall, __HYPERVISOR_kexec_op, + KEXEC_CMD_kexec_status, +HYPERCALL_BUFFER_AS_ARG (status)); + +out: +xc_hypercall_buffer_free (xch, status); + +return ret; +}
xen/common/kexec.c +19 -0
@@ -1169,6 +1169,22 @@ static int kexec_unload(XEN_GUEST_HANDLE_PARAM(void) uarg)return kexec_do_unload (&unload); } +static int kexec_status (XEN_GUEST_HANDLE_PARAM (void ) uarg) +{ +xen_kexec_status_t status; +int base, bit; + +if (unlikely (copy_from_guest (&status, uarg,1 )) ) +return -EFAULT ; + +/* No need to check KEXEC_FLAG_IN_PROGRESS. */ + +if (kexec_load_get_bits (status.type, &base, &bit) ) +return -EINVAL ; + +return (test_bit (bit, &kexec_flags) ==1 ); +} +static int do_kexec_op_internal (unsigned long op,XEN_GUEST_HANDLE_PARAM (void ) uarg,bool_t compat)
@@ -1208,6 +1224,9 @@ static int do_kexec_op_internal(unsigned long op,case KEXEC_CMD_kexec_unload: ret =kexec_unload (uarg);break ; +case KEXEC_CMD_kexec_status: + ret =kexec_status (uarg); +break ; }return ret;
xen/include/public/kexec.h +14 -0
@@ -227,6 +227,20 @@ typedef struct xen_kexec_unload { } xen_kexec_unload_t;DEFINE_XEN_GUEST_HANDLE (xen_kexec_unload_t); +/* +* Figure out whether we have an image loaded. A return value of +* zero indicates no image loaded. A return value of one +* indicates an image is loaded. A negative return value +* indicates an error. +* +* Type must be one of KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH. +*/ +#define KEXEC_CMD_kexec_status 6 +typedef struct xen_kexec_status { +uint8_t type; +}xen_kexec_status_t ; +DEFINE_XEN_GUEST_HANDLE (xen_kexec_status_t); +#else /* __XEN_INTERFACE_VERSION__ < 0x00040400 */ #define KEXEC_CMD_kexec_load KEXEC_CMD_kexec_load_v1
Signature · 7 lines
2.7.4 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xen.org/xen-devel
Quoted 16 lines · Eric DeVolder
The tools that use kexec are asynchronous in nature and do not keep state changes. As such provide an hypercall to find out whether an image has been loaded for either type.
Note: No need to modify XSM as it has one size fits all check and does not check for subcommands.
Note: No need to check
KEXEC_FLAG_IN_PROGRESS(and error out ofkexec_status()) as this flag is set only once by the first/only cpu on the crash path.Note: In
kexec_status(), the use oftest_bit()can also return EPERM, so the return value fromtest_bit()must be checked to ensure thatkexec_status()always returns 0, 1 or -1, per the public header description.
Quoted 5 lines
Note: This is just the Xen side of the hypercall, kexec-tools patch to come separately.
Signed-off-by Konrad Rzeszutek Wilk <[email protected]>Signed-off-by Eric DeVolder <[email protected]>
Your v3 is already applied to staging.
Please submit a patch on top of staging branch.
Wei.
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel
Quoted 20 lines · Wei Liu
Quoted 19 lines · Eric DeVolder
The tools that use kexec are asynchronous in nature and do not keep state changes. As such provide an hypercall to find out whether an image has been loaded for either type.
Note: No need to modify XSM as it has one size fits all check and does not check for subcommands.
Note: No need to check
KEXEC_FLAG_IN_PROGRESS(and error out ofkexec_status()) as this flag is set only once by the first/only cpu on the crash path.Note: In
kexec_status(), the use oftest_bit()can also return EPERM, so the return value fromtest_bit()must be checked to ensure thatkexec_status()always returns 0, 1 or -1, per the public header description.Note: This is just the Xen side of the hypercall, kexec-tools patch to come separately.
Quoted 9 lines
Quoted 2 lines
Signed-off-by Konrad Rzeszutek Wilk <[email protected]>Signed-off-by Eric DeVolder <[email protected]>Your v3 is already applied to staging.
Please submit a patch on top of staging branch.
Wei.
Wei,
I just sent those, subject line 'Followup corrections to kexec STATUS' eric
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xen.org/xen-devel