summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVarad Gautam <vrd@amazon.de>2020-04-01 18:57:17 +0200
committerSimon Horman <horms@verge.net.au>2020-04-07 13:53:41 +0200
commit65441fbf8766046a0499edff8a893dc8143f6abd (patch)
tree6e71150c53e822d227d52ae72623b10a9cecbd4b
parentb13984c6f9ec7fdd322e8d981defc2b846717bbc (diff)
downloadkexec-tools-65441fbf8766046a0499edff8a893dc8143f6abd.tar.gz
kexec-xen: Introduce --exec-live-update to trigger a live update
This signals xen to do a KEXEC_TYPE_LIVE_UPDATE kexec operation. Signed-off-by: Varad Gautam <vrd@amazon.de> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--kexec/kexec-xen.c12
-rw-r--r--kexec/kexec.c11
-rw-r--r--kexec/kexec.h6
3 files changed, 22 insertions, 7 deletions
diff --git a/kexec/kexec-xen.c b/kexec/kexec-xen.c
index 83629baf..da514d05 100644
--- a/kexec/kexec-xen.c
+++ b/kexec/kexec-xen.c
@@ -242,15 +242,19 @@ int xen_kexec_status(uint64_t kexec_flags)
return ret;
}
-void xen_kexec_exec(void)
+void xen_kexec_exec(uint64_t kexec_flags)
{
xc_interface *xch;
-
+ uint8_t type = KEXEC_TYPE_DEFAULT;
+
xch = xc_interface_open(NULL, NULL, 0);
if (!xch)
return;
- xc_kexec_exec(xch, KEXEC_TYPE_DEFAULT);
+ if (kexec_flags & KEXEC_LIVE_UPDATE)
+ type = KEXEC_TYPE_LIVE_UPDATE;
+
+ xc_kexec_exec(xch, type);
xc_interface_close(xch);
}
@@ -277,7 +281,7 @@ int xen_kexec_status(uint64_t kexec_flags)
return -1;
}
-void xen_kexec_exec(void)
+void xen_kexec_exec(uint64_t kexec_flags)
{
}
diff --git a/kexec/kexec.c b/kexec/kexec.c
index da61d6dd..7ef3d2ab 100644
--- a/kexec/kexec.c
+++ b/kexec/kexec.c
@@ -906,7 +906,7 @@ static int my_shutdown(void)
static int my_exec(void)
{
if (xen_present())
- xen_kexec_exec();
+ xen_kexec_exec(kexec_flags);
else
reboot(LINUX_REBOOT_CMD_KEXEC);
/* I have failed if I make it here */
@@ -1012,6 +1012,8 @@ void usage(void)
" If capture kernel is being unloaded\n"
" specify -p with -u.\n"
" -e, --exec Execute a currently loaded kernel.\n"
+ " --exec-live-update Execute a currently loaded xen image after\n"
+ "storing the state required to live update.\n"
" -t, --type=TYPE Specify the new kernel is of this type.\n"
" --mem-min=<addr> Specify the lowest memory address to\n"
" load code into.\n"
@@ -1397,6 +1399,13 @@ int main(int argc, char *argv[])
do_unload = 1;
kexec_file_flags |= KEXEC_FILE_UNLOAD;
break;
+ case OPT_EXEC_LIVE_UPDATE:
+ if ( !xen_present() ) {
+ fprintf(stderr, "--exec-live-update only works under xen.\n");
+ return 1;
+ }
+ kexec_flags |= KEXEC_LIVE_UPDATE;
+ /* fallthrough */
case OPT_EXEC:
do_load = 0;
do_shutdown = 0;
diff --git a/kexec/kexec.h b/kexec/kexec.h
index 8021f39d..f0f347d5 100644
--- a/kexec/kexec.h
+++ b/kexec/kexec.h
@@ -234,7 +234,8 @@ extern int file_types;
#define OPT_ENTRY 261
#define OPT_PRINT_CKR_SIZE 262
#define OPT_LOAD_LIVE_UPDATE 263
-#define OPT_MAX 264
+#define OPT_EXEC_LIVE_UPDATE 264
+#define OPT_MAX 265
#define KEXEC_OPTIONS \
{ "help", 0, 0, OPT_HELP }, \
{ "version", 0, 0, OPT_VERSION }, \
@@ -245,6 +246,7 @@ extern int file_types;
{ "load", 0, 0, OPT_LOAD }, \
{ "unload", 0, 0, OPT_UNLOAD }, \
{ "exec", 0, 0, OPT_EXEC }, \
+ { "exec-live-update", 0, 0, OPT_EXEC_LIVE_UPDATE}, \
{ "load-preserve-context", 0, 0, OPT_LOAD_PRESERVE_CONTEXT}, \
{ "load-jump-back-helper", 0, 0, OPT_LOAD_JUMP_BACK_HELPER }, \
{ "load-live-update", 0, 0, OPT_LOAD_LIVE_UPDATE }, \
@@ -326,7 +328,7 @@ void cmdline_add_liveupdate(char **base);
int xen_present(void);
int xen_kexec_load(struct kexec_info *info);
int xen_kexec_unload(uint64_t kexec_flags);
-void xen_kexec_exec(void);
+void xen_kexec_exec(uint64_t kexec_flags);
int xen_kexec_status(uint64_t kexec_flags);
extern unsigned long long get_kernel_sym(const char *text);