mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xsplice/xen_replace_world: Test-case for XSPLICE_ACTION_REPLACE
With this third payload one can do: -bash-4.1# xen-xsplice load xen_hello_world.xsplice Uploading xen_hello_world.xsplice (10148 bytes) Performing check: completed Performing apply:. completed [xen_hello_world depends on hypervisor build-id] -bash-4.1# xen-xsplice load xen_bye_world.xsplice Uploading xen_bye_world.xsplice (7076 bytes) Performing check: completed Performing apply:. completed [xen_bye_world depends on xen_hello_world build-id] -bash-4.1# xen-xsplice upload xen_replace_world xen_replace_world.xsplice Uploading xen_replace_world.xsplice (7148 bytes) -bash-4.1# xen-xsplice list ID | status ----------------------------------------+------------ xen_hello_world | APPLIED xen_bye_world | APPLIED xen_replace_world | CHECKED -bash-4.1# xen-xsplice replace xen_replace_world Performing replace:. completed -bash-4.1# xl info | grep extra xen_extra : Hello Again World! -bash-4.1# xen-xsplice list ID | status ----------------------------------------+------------ xen_hello_world | CHECKED xen_bye_world | CHECKED xen_replace_world | APPLIED and revert both of the previous payloads and apply the xen_replace_world. All the magic of this is in the Makefile - we extract the build-id from the hypervisor (xen-syms) and jam it in the xen_replace_world as .xsplice.depends. We also make .old_addr be zero, forcing the hypervisor to lookup the xen_extra_version. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Acked-by: Jan Beulich <jbeulich@suse.com> Release-acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
895111a94f
commit
48a312d1ad
4 files changed
+66
-1
No files matched your search
@@ -249,6 +249,7 @@ xen/arch/x86/efi/mkreloc
|
||||
xen/arch/x86/test/config.h
|
||||
xen/arch/x86/test/xen_hello_world.xsplice
|
||||
xen/arch/x86/test/xen_bye_world.xsplice
|
||||
xen/arch/x86/test/xen_replace_world.xsplice
|
||||
xen/arch/*/efi/boot.c
|
||||
xen/arch/*/efi/compat.c
|
||||
xen/arch/*/efi/efi.h
|
||||
|
||||
@@ -7,15 +7,18 @@ CODE_SZ=$(shell nm --defined -S $(1) | grep $(2) | awk '{ print "0x"$$2}')
|
||||
|
||||
XSPLICE := xen_hello_world.xsplice
|
||||
XSPLICE_BYE := xen_bye_world.xsplice
|
||||
XSPLICE_REPLACE := xen_replace_world.xsplice
|
||||
|
||||
default: xsplice
|
||||
|
||||
install: xsplice
|
||||
$(INSTALL_DATA) $(XSPLICE) $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE)
|
||||
$(INSTALL_DATA) $(XSPLICE_BYE) $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE_BYE)
|
||||
$(INSTALL_DATA) $(XSPLICE_REPLACE) $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE_REPLACE)
|
||||
uninstall:
|
||||
rm -f $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE)
|
||||
rm -f $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE_BYE)
|
||||
rm -f $(DESTDIR)$(DEBUG_DIR)/$(XSPLICE_REPLACE)
|
||||
|
||||
.PHONY: clean
|
||||
clean::
|
||||
@@ -72,5 +75,11 @@ xen_bye_world.o: config.h
|
||||
$(XSPLICE_BYE): xen_bye_world_func.o xen_bye_world.o hello_world_note.o
|
||||
$(LD) $(LDFLAGS) $(build_id_linker) -r -o $(XSPLICE_BYE) $^
|
||||
|
||||
xen_replace_world.o: config.h
|
||||
|
||||
.PHONY: $(XSPLICE_REPLACE)
|
||||
$(XSPLICE_REPLACE): xen_replace_world_func.o xen_replace_world.o note.o
|
||||
$(LD) $(LDFLAGS) $(build_id_linker) -r -o $(XSPLICE_REPLACE) $^
|
||||
|
||||
.PHONY: xsplice
|
||||
xsplice: $(XSPLICE) $(XSPLICE_BYE)
|
||||
xsplice: $(XSPLICE) $(XSPLICE_BYE) $(XSPLICE_REPLACE)
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <xen/lib.h>
|
||||
#include <xen/types.h>
|
||||
#include <xen/xsplice.h>
|
||||
|
||||
#include <public/sysctl.h>
|
||||
|
||||
static char xen_replace_world_name[] = "xen_extra_version";
|
||||
extern const char *xen_replace_world(void);
|
||||
|
||||
struct xsplice_patch_func __section(".xsplice.funcs") xsplice_xen_replace_world = {
|
||||
.version = XSPLICE_PAYLOAD_VERSION,
|
||||
.name = xen_replace_world_name,
|
||||
.old_addr = 0, /* Forces the hypervisor to lookup .name */
|
||||
.new_addr = xen_replace_world,
|
||||
.new_size = NEW_CODE_SZ,
|
||||
.old_size = OLD_CODE_SZ,
|
||||
};
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-file-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <xen/types.h>
|
||||
|
||||
/* Our replacement function for xen_hello_world. */
|
||||
const char *xen_replace_world(void)
|
||||
{
|
||||
return "Hello Again World!";
|
||||
}
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-file-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||