[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 30/34] 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. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- Cc: Keir Fraser <keir@xxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> v1: Make the objcopy use -S to strip the name. --- --- xen/arch/x86/test/Makefile | 10 +++++++-- xen/arch/x86/test/xen_replace_world.c | 35 ++++++++++++++++++++++++++++++ xen/arch/x86/test/xen_replace_world_func.c | 25 +++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 xen/arch/x86/test/xen_replace_world.c create mode 100644 xen/arch/x86/test/xen_replace_world_func.c diff --git a/xen/arch/x86/test/Makefile b/xen/arch/x86/test/Makefile index a84c609..c9bcb1c 100644 --- a/xen/arch/x86/test/Makefile +++ b/xen/arch/x86/test/Makefile @@ -8,15 +8,18 @@ ifdef CONFIG_XSPLICE 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) else default: install: @@ -54,7 +57,6 @@ build_id.o: --rename-section=.data=.xsplice.depends -S $@.bin $@ rm -f $@.bin - # # Extract the build-id of the xen_hello_world.xsplice # (which xen_bye_world will depend on). @@ -78,4 +80,8 @@ xsplice: config.h build_id.o $(MAKE) -f $(BASEDIR)/Rules.mk hello_world_build_id.o $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(XSPLICE_BYE) \ xen_bye_world_func.o xen_bye_world.o hello_world_build_id.o - + $(MAKE) -f $(BASEDIR)/Rules.mk xen_replace_world_func.o + $(MAKE) -f $(BASEDIR)/Rules.mk xen_replace_world.o + $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(XSPLICE_REPLACE) \ + xen_replace_world_func.o \ + xen_replace_world.o build_id.o diff --git a/xen/arch/x86/test/xen_replace_world.c b/xen/arch/x86/test/xen_replace_world.c new file mode 100644 index 0000000..72871f7 --- /dev/null +++ b/xen/arch/x86/test/xen_replace_world.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +#include <xen/config.h> +#include <xen/types.h> +#include <xen/xsplice_patch.h> +#include <xen/xsplice.h> +#include "config.h" +#include <xen/lib.h> + +static char xen_replace_world_name[] = "xen_replace_world"; +extern const char *xen_replace_world(void); + +/* External symbol. */ +extern const char *xen_extra_version(void); + +struct xsplice_patch_func __section(".xsplice.funcs") xsplice_xen_replace_world = { + .name = xen_replace_world_name, + .new_addr = (unsigned long)(xen_replace_world), + .old_addr = (unsigned long)(xen_extra_version), + .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: + */ diff --git a/xen/arch/x86/test/xen_replace_world_func.c b/xen/arch/x86/test/xen_replace_world_func.c new file mode 100644 index 0000000..75ee3b5 --- /dev/null +++ b/xen/arch/x86/test/xen_replace_world_func.c @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +#include <xen/config.h> +#include <xen/types.h> +#include <asm/nops.h> +#include <asm/alternative.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: + */ -- 2.5.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |