So they can be shared with ARM64 (but not yet, so they are only built on x86).
No functional change. We also need to tweak the MAINTAINERS and .gitignore file Signed-off-by: Konrad Rzeszutek Wilk <konrad.w...@oracle.com> --- Cc: Stefano Stabellini <sstabell...@kernel.org> Cc: Julien Grall <julien.gr...@arm.com> Cc: Jan Beulich <jbeul...@suse.com> Cc: Andrew Cooper <andrew.coop...@citrix.com> v1: First submission --- .gitignore | 8 +-- MAINTAINERS | 1 + xen/Makefile | 2 +- xen/arch/arm/Makefile | 3 -- xen/arch/x86/Makefile | 4 -- xen/arch/x86/test/Makefile | 85 ------------------------------ xen/arch/x86/test/xen_bye_world.c | 34 ------------ xen/arch/x86/test/xen_bye_world_func.c | 22 -------- xen/arch/x86/test/xen_hello_world.c | 68 ------------------------ xen/arch/x86/test/xen_hello_world_func.c | 39 -------------- xen/arch/x86/test/xen_replace_world.c | 33 ------------ xen/arch/x86/test/xen_replace_world_func.c | 22 -------- xen/common/Makefile | 6 +++ xen/common/test/Makefile | 85 ++++++++++++++++++++++++++++++ xen/common/test/xen_bye_world.c | 34 ++++++++++++ xen/common/test/xen_bye_world_func.c | 22 ++++++++ xen/common/test/xen_hello_world.c | 68 ++++++++++++++++++++++++ xen/common/test/xen_hello_world_func.c | 39 ++++++++++++++ xen/common/test/xen_replace_world.c | 33 ++++++++++++ xen/common/test/xen_replace_world_func.c | 22 ++++++++ 20 files changed, 315 insertions(+), 315 deletions(-) delete mode 100644 xen/arch/x86/test/Makefile delete mode 100644 xen/arch/x86/test/xen_bye_world.c delete mode 100644 xen/arch/x86/test/xen_bye_world_func.c delete mode 100644 xen/arch/x86/test/xen_hello_world.c delete mode 100644 xen/arch/x86/test/xen_hello_world_func.c delete mode 100644 xen/arch/x86/test/xen_replace_world.c delete mode 100644 xen/arch/x86/test/xen_replace_world_func.c create mode 100644 xen/common/test/Makefile create mode 100644 xen/common/test/xen_bye_world.c create mode 100644 xen/common/test/xen_bye_world_func.c create mode 100644 xen/common/test/xen_hello_world.c create mode 100644 xen/common/test/xen_hello_world_func.c create mode 100644 xen/common/test/xen_replace_world.c create mode 100644 xen/common/test/xen_replace_world_func.c diff --git a/.gitignore b/.gitignore index 44cc7bf..bef1dee 100644 --- a/.gitignore +++ b/.gitignore @@ -255,14 +255,14 @@ xen/arch/x86/efi.lds xen/arch/x86/efi/check.efi xen/arch/x86/efi/disabled xen/arch/x86/efi/mkreloc -xen/arch/x86/test/config.h -xen/arch/x86/test/xen_hello_world.livepatch -xen/arch/x86/test/xen_bye_world.livepatch -xen/arch/x86/test/xen_replace_world.livepatch xen/arch/*/efi/boot.c xen/arch/*/efi/compat.c xen/arch/*/efi/efi.h xen/arch/*/efi/runtime.c +xen/common/test/config.h +xen/common/test/xen_bye_world.livepatch +xen/common/test/xen_hello_world.livepatch +xen/common/test/xen_replace_world.livepatch xen/include/headers.chk xen/include/headers++.chk xen/include/asm diff --git a/MAINTAINERS b/MAINTAINERS index ae0b6bc..e5763f6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -271,6 +271,7 @@ F: tools/misc/xen-livepatch.c F: xen/arch/*/livepatch* F: xen/arch/*/*/livepatch* F: xen/common/livepatch* +F: xen/common/test/* F: xen/include/xen/livepatch* MACHINE CHECK (MCA) & RAS diff --git a/xen/Makefile b/xen/Makefile index a4c72be..dc8980e 100644 --- a/xen/Makefile +++ b/xen/Makefile @@ -79,7 +79,7 @@ _install: $(TARGET)$(CONFIG_XEN_INSTALL_SUFFIX) .PHONY: _tests _tests: - $(MAKE) -f $(BASEDIR)/Rules.mk -C arch/$(TARGET_ARCH) tests + $(MAKE) -f $(BASEDIR)/Rules.mk -C common tests .PHONY: _uninstall _uninstall: D=$(DESTDIR) diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile index 9f75c5c..9dc0797 100644 --- a/xen/arch/arm/Makefile +++ b/xen/arch/arm/Makefile @@ -73,9 +73,6 @@ ifeq ($(CONFIG_ARM_64),y) ln -sf $(notdir $@) ../../$(notdir $@).efi endif -.PHONY: tests -tests: - $(TARGET).axf: $(TARGET)-syms # XXX: VE model loads by VMA so instead of # making a proper ELF we link with LMA == VMA and adjust crudely diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index d87ecd8..6f74346 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -92,10 +92,6 @@ $(TARGET): $(TARGET)-syms $(efi-y) boot/mkelf32 ./boot/mkelf32 $(notes_phdrs) $(TARGET)-syms $(TARGET) 0x100000 \ `$(NM) -nr $(TARGET)-syms | head -n 1 | sed -e 's/^\([^ ]*\).*/0x\1/'` -.PHONY: tests -tests: - $(MAKE) -f $(BASEDIR)/Rules.mk -C test livepatch - ALL_OBJS := $(BASEDIR)/arch/x86/boot/built_in.o $(BASEDIR)/arch/x86/efi/built_in.o $(ALL_OBJS) ifeq ($(lto),y) diff --git a/xen/arch/x86/test/Makefile b/xen/arch/x86/test/Makefile deleted file mode 100644 index 23dff1d..0000000 --- a/xen/arch/x86/test/Makefile +++ /dev/null @@ -1,85 +0,0 @@ -include $(XEN_ROOT)/Config.mk - -CODE_ADDR=$(shell nm --defined $(1) | grep $(2) | awk '{print "0x"$$1}') -CODE_SZ=$(shell nm --defined -S $(1) | grep $(2) | awk '{ print "0x"$$2}') - -.PHONY: default - -LIVEPATCH := xen_hello_world.livepatch -LIVEPATCH_BYE := xen_bye_world.livepatch -LIVEPATCH_REPLACE := xen_replace_world.livepatch - -default: livepatch - -install: livepatch - $(INSTALL_DATA) $(LIVEPATCH) $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH) - $(INSTALL_DATA) $(LIVEPATCH_BYE) $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH_BYE) - $(INSTALL_DATA) $(LIVEPATCH_REPLACE) $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH_REPLACE) -uninstall: - rm -f $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH) - rm -f $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH_BYE) - rm -f $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH_REPLACE) - -.PHONY: clean -clean:: - rm -f *.o .*.o.d *.livepatch config.h - -# -# To compute these values we need the binary files: xen-syms -# and xen_hello_world_func.o to be already compiled. -# -.PHONY: config.h -config.h: OLD_CODE_SZ=$(call CODE_SZ,$(BASEDIR)/xen-syms,xen_extra_version) -config.h: NEW_CODE_SZ=$(call CODE_SZ,$<,xen_hello_world) -config.h: xen_hello_world_func.o - (set -e; \ - echo "#define NEW_CODE_SZ $(NEW_CODE_SZ)"; \ - echo "#define OLD_CODE_SZ $(OLD_CODE_SZ)") > $@ - -xen_hello_world.o: config.h - -.PHONY: $(LIVEPATCH) -$(LIVEPATCH): xen_hello_world_func.o xen_hello_world.o note.o - $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(LIVEPATCH) $^ - -# -# This target is only accessible if CONFIG_LIVEPATCH is defined, which -# depends on $(build_id_linker) being available. Hence we do not -# need any checks. -# -# N.B. The reason we don't use arch/x86/note.o is that it may -# not be built (it is for EFI builds), and that we do not have -# the note.o.bin to muck with (as it gets deleted) -# -.PHONY: note.o -note.o: - $(OBJCOPY) -O binary --only-section=.note.gnu.build-id $(BASEDIR)/xen-syms $@.bin - $(OBJCOPY) -I binary -O elf64-x86-64 -B i386:x86-64 \ - --rename-section=.data=.livepatch.depends -S $@.bin $@ - rm -f $@.bin - -# -# Extract the build-id of the xen_hello_world.livepatch -# (which xen_bye_world will depend on). -# -.PHONY: hello_world_note.o -hello_world_note.o: $(LIVEPATCH) - $(OBJCOPY) -O binary --only-section=.note.gnu.build-id $(LIVEPATCH) $@.bin - $(OBJCOPY) -I binary -O elf64-x86-64 -B i386:x86-64 \ - --rename-section=.data=.livepatch.depends -S $@.bin $@ - rm -f $@.bin - -xen_bye_world.o: config.h - -.PHONY: $(LIVEPATCH_BYE) -$(LIVEPATCH_BYE): xen_bye_world_func.o xen_bye_world.o hello_world_note.o - $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(LIVEPATCH_BYE) $^ - -xen_replace_world.o: config.h - -.PHONY: $(LIVEPATCH_REPLACE) -$(LIVEPATCH_REPLACE): xen_replace_world_func.o xen_replace_world.o note.o - $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(LIVEPATCH_REPLACE) $^ - -.PHONY: livepatch -livepatch: $(LIVEPATCH) $(LIVEPATCH_BYE) $(LIVEPATCH_REPLACE) diff --git a/xen/arch/x86/test/xen_bye_world.c b/xen/arch/x86/test/xen_bye_world.c deleted file mode 100644 index b75e0b1..0000000 --- a/xen/arch/x86/test/xen_bye_world.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. - * - */ - -#include "config.h" -#include <xen/lib.h> -#include <xen/types.h> -#include <xen/version.h> -#include <xen/livepatch.h> - -#include <public/sysctl.h> - -static char bye_world_patch_this_fnc[] = "xen_extra_version"; -extern const char *xen_bye_world(void); - -struct livepatch_func __section(".livepatch.funcs") livepatch_xen_bye_world = { - .version = LIVEPATCH_PAYLOAD_VERSION, - .name = bye_world_patch_this_fnc, - .new_addr = xen_bye_world, - .old_addr = 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_bye_world_func.c b/xen/arch/x86/test/xen_bye_world_func.c deleted file mode 100644 index 32ef341..0000000 --- a/xen/arch/x86/test/xen_bye_world_func.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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_bye_world(void) -{ - return "Bye World!"; -} - -/* - * 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_hello_world.c b/xen/arch/x86/test/xen_hello_world.c deleted file mode 100644 index 66c5b8e..0000000 --- a/xen/arch/x86/test/xen_hello_world.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. - * - */ - -#include "config.h" -#include <xen/lib.h> -#include <xen/types.h> -#include <xen/version.h> -#include <xen/livepatch.h> -#include <xen/livepatch_payload.h> - -#include <public/sysctl.h> - -static char hello_world_patch_this_fnc[] = "xen_extra_version"; -extern const char *xen_hello_world(void); -static unsigned int cnt; - -static void apply_hook(void) -{ - printk(KERN_DEBUG "Hook executing.\n"); -} - -static void revert_hook(void) -{ - printk(KERN_DEBUG "Hook unloaded.\n"); -} - -static void hi_func(void) -{ - printk(KERN_DEBUG "%s: Hi! (called %u times)\n", __func__, ++cnt); -}; - -/* If we are sorted we _MUST_ be the last .livepatch.hook section. */ -static void z_check_fnc(void) -{ - printk(KERN_DEBUG "%s: Hi func called %u times\n", __func__, cnt); - BUG_ON(cnt == 0 || cnt > 2); -} - -LIVEPATCH_LOAD_HOOK(apply_hook); -LIVEPATCH_UNLOAD_HOOK(revert_hook); - -/* Imbalance here. Two load and three unload. */ - -LIVEPATCH_LOAD_HOOK(hi_func); -LIVEPATCH_UNLOAD_HOOK(hi_func); - -LIVEPATCH_UNLOAD_HOOK(z_check_fnc); - -struct livepatch_func __section(".livepatch.funcs") livepatch_xen_hello_world = { - .version = LIVEPATCH_PAYLOAD_VERSION, - .name = hello_world_patch_this_fnc, - .new_addr = xen_hello_world, - .old_addr = 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_hello_world_func.c b/xen/arch/x86/test/xen_hello_world_func.c deleted file mode 100644 index 03d6b84..0000000 --- a/xen/arch/x86/test/xen_hello_world_func.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. - * - */ - -#include <xen/types.h> - -#include <asm/alternative.h> -#include <asm/nops.h> -#include <asm/uaccess.h> - -static unsigned long *non_canonical_addr = (unsigned long *)0xdead000000000000ULL; - -/* Our replacement function for xen_extra_version. */ -const char *xen_hello_world(void) -{ - unsigned long tmp; - int rc; - - alternative(ASM_NOP8, ASM_NOP1, X86_FEATURE_LM); - /* - * Any BUG, or WARN_ON will contain symbol and payload name. Furthermore - * exceptions will be caught and processed properly. - */ - rc = __get_user(tmp, non_canonical_addr); - BUG_ON(rc != -EFAULT); - - return "Hello World"; -} - -/* - * 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.c b/xen/arch/x86/test/xen_replace_world.c deleted file mode 100644 index a2a221a..0000000 --- a/xen/arch/x86/test/xen_replace_world.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. - * - */ - -#include "config.h" -#include <xen/lib.h> -#include <xen/types.h> -#include <xen/livepatch.h> - -#include <public/sysctl.h> - -static char xen_replace_world_name[] = "xen_extra_version"; -extern const char *xen_replace_world(void); - -struct livepatch_func __section(".livepatch.funcs") livepatch_xen_replace_world = { - .version = LIVEPATCH_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: - */ diff --git a/xen/arch/x86/test/xen_replace_world_func.c b/xen/arch/x86/test/xen_replace_world_func.c deleted file mode 100644 index afb5cda..0000000 --- a/xen/arch/x86/test/xen_replace_world_func.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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: - */ diff --git a/xen/common/Makefile b/xen/common/Makefile index c2e6846..22806b6 100644 --- a/xen/common/Makefile +++ b/xen/common/Makefile @@ -79,3 +79,9 @@ subdir-$(coverage) += gcov subdir-y += libelf subdir-$(CONFIG_HAS_DEVICE_TREE) += libfdt + +.PHONY: tests +tests: +ifeq ($(XEN_TARGET_ARCH),x86_64) + $(MAKE) -f $(BASEDIR)/Rules.mk -C test livepatch +endif diff --git a/xen/common/test/Makefile b/xen/common/test/Makefile new file mode 100644 index 0000000..23dff1d --- /dev/null +++ b/xen/common/test/Makefile @@ -0,0 +1,85 @@ +include $(XEN_ROOT)/Config.mk + +CODE_ADDR=$(shell nm --defined $(1) | grep $(2) | awk '{print "0x"$$1}') +CODE_SZ=$(shell nm --defined -S $(1) | grep $(2) | awk '{ print "0x"$$2}') + +.PHONY: default + +LIVEPATCH := xen_hello_world.livepatch +LIVEPATCH_BYE := xen_bye_world.livepatch +LIVEPATCH_REPLACE := xen_replace_world.livepatch + +default: livepatch + +install: livepatch + $(INSTALL_DATA) $(LIVEPATCH) $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH) + $(INSTALL_DATA) $(LIVEPATCH_BYE) $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH_BYE) + $(INSTALL_DATA) $(LIVEPATCH_REPLACE) $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH_REPLACE) +uninstall: + rm -f $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH) + rm -f $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH_BYE) + rm -f $(DESTDIR)$(DEBUG_DIR)/$(LIVEPATCH_REPLACE) + +.PHONY: clean +clean:: + rm -f *.o .*.o.d *.livepatch config.h + +# +# To compute these values we need the binary files: xen-syms +# and xen_hello_world_func.o to be already compiled. +# +.PHONY: config.h +config.h: OLD_CODE_SZ=$(call CODE_SZ,$(BASEDIR)/xen-syms,xen_extra_version) +config.h: NEW_CODE_SZ=$(call CODE_SZ,$<,xen_hello_world) +config.h: xen_hello_world_func.o + (set -e; \ + echo "#define NEW_CODE_SZ $(NEW_CODE_SZ)"; \ + echo "#define OLD_CODE_SZ $(OLD_CODE_SZ)") > $@ + +xen_hello_world.o: config.h + +.PHONY: $(LIVEPATCH) +$(LIVEPATCH): xen_hello_world_func.o xen_hello_world.o note.o + $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(LIVEPATCH) $^ + +# +# This target is only accessible if CONFIG_LIVEPATCH is defined, which +# depends on $(build_id_linker) being available. Hence we do not +# need any checks. +# +# N.B. The reason we don't use arch/x86/note.o is that it may +# not be built (it is for EFI builds), and that we do not have +# the note.o.bin to muck with (as it gets deleted) +# +.PHONY: note.o +note.o: + $(OBJCOPY) -O binary --only-section=.note.gnu.build-id $(BASEDIR)/xen-syms $@.bin + $(OBJCOPY) -I binary -O elf64-x86-64 -B i386:x86-64 \ + --rename-section=.data=.livepatch.depends -S $@.bin $@ + rm -f $@.bin + +# +# Extract the build-id of the xen_hello_world.livepatch +# (which xen_bye_world will depend on). +# +.PHONY: hello_world_note.o +hello_world_note.o: $(LIVEPATCH) + $(OBJCOPY) -O binary --only-section=.note.gnu.build-id $(LIVEPATCH) $@.bin + $(OBJCOPY) -I binary -O elf64-x86-64 -B i386:x86-64 \ + --rename-section=.data=.livepatch.depends -S $@.bin $@ + rm -f $@.bin + +xen_bye_world.o: config.h + +.PHONY: $(LIVEPATCH_BYE) +$(LIVEPATCH_BYE): xen_bye_world_func.o xen_bye_world.o hello_world_note.o + $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(LIVEPATCH_BYE) $^ + +xen_replace_world.o: config.h + +.PHONY: $(LIVEPATCH_REPLACE) +$(LIVEPATCH_REPLACE): xen_replace_world_func.o xen_replace_world.o note.o + $(LD) $(LDFLAGS) $(build_id_linker) -r -o $(LIVEPATCH_REPLACE) $^ + +.PHONY: livepatch +livepatch: $(LIVEPATCH) $(LIVEPATCH_BYE) $(LIVEPATCH_REPLACE) diff --git a/xen/common/test/xen_bye_world.c b/xen/common/test/xen_bye_world.c new file mode 100644 index 0000000..b75e0b1 --- /dev/null +++ b/xen/common/test/xen_bye_world.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +#include "config.h" +#include <xen/lib.h> +#include <xen/types.h> +#include <xen/version.h> +#include <xen/livepatch.h> + +#include <public/sysctl.h> + +static char bye_world_patch_this_fnc[] = "xen_extra_version"; +extern const char *xen_bye_world(void); + +struct livepatch_func __section(".livepatch.funcs") livepatch_xen_bye_world = { + .version = LIVEPATCH_PAYLOAD_VERSION, + .name = bye_world_patch_this_fnc, + .new_addr = xen_bye_world, + .old_addr = 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/common/test/xen_bye_world_func.c b/xen/common/test/xen_bye_world_func.c new file mode 100644 index 0000000..32ef341 --- /dev/null +++ b/xen/common/test/xen_bye_world_func.c @@ -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_bye_world(void) +{ + return "Bye World!"; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/common/test/xen_hello_world.c b/xen/common/test/xen_hello_world.c new file mode 100644 index 0000000..66c5b8e --- /dev/null +++ b/xen/common/test/xen_hello_world.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +#include "config.h" +#include <xen/lib.h> +#include <xen/types.h> +#include <xen/version.h> +#include <xen/livepatch.h> +#include <xen/livepatch_payload.h> + +#include <public/sysctl.h> + +static char hello_world_patch_this_fnc[] = "xen_extra_version"; +extern const char *xen_hello_world(void); +static unsigned int cnt; + +static void apply_hook(void) +{ + printk(KERN_DEBUG "Hook executing.\n"); +} + +static void revert_hook(void) +{ + printk(KERN_DEBUG "Hook unloaded.\n"); +} + +static void hi_func(void) +{ + printk(KERN_DEBUG "%s: Hi! (called %u times)\n", __func__, ++cnt); +}; + +/* If we are sorted we _MUST_ be the last .livepatch.hook section. */ +static void z_check_fnc(void) +{ + printk(KERN_DEBUG "%s: Hi func called %u times\n", __func__, cnt); + BUG_ON(cnt == 0 || cnt > 2); +} + +LIVEPATCH_LOAD_HOOK(apply_hook); +LIVEPATCH_UNLOAD_HOOK(revert_hook); + +/* Imbalance here. Two load and three unload. */ + +LIVEPATCH_LOAD_HOOK(hi_func); +LIVEPATCH_UNLOAD_HOOK(hi_func); + +LIVEPATCH_UNLOAD_HOOK(z_check_fnc); + +struct livepatch_func __section(".livepatch.funcs") livepatch_xen_hello_world = { + .version = LIVEPATCH_PAYLOAD_VERSION, + .name = hello_world_patch_this_fnc, + .new_addr = xen_hello_world, + .old_addr = 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/common/test/xen_hello_world_func.c b/xen/common/test/xen_hello_world_func.c new file mode 100644 index 0000000..03d6b84 --- /dev/null +++ b/xen/common/test/xen_hello_world_func.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + * + */ + +#include <xen/types.h> + +#include <asm/alternative.h> +#include <asm/nops.h> +#include <asm/uaccess.h> + +static unsigned long *non_canonical_addr = (unsigned long *)0xdead000000000000ULL; + +/* Our replacement function for xen_extra_version. */ +const char *xen_hello_world(void) +{ + unsigned long tmp; + int rc; + + alternative(ASM_NOP8, ASM_NOP1, X86_FEATURE_LM); + /* + * Any BUG, or WARN_ON will contain symbol and payload name. Furthermore + * exceptions will be caught and processed properly. + */ + rc = __get_user(tmp, non_canonical_addr); + BUG_ON(rc != -EFAULT); + + return "Hello World"; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/common/test/xen_replace_world.c b/xen/common/test/xen_replace_world.c new file mode 100644 index 0000000..a2a221a --- /dev/null +++ b/xen/common/test/xen_replace_world.c @@ -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/livepatch.h> + +#include <public/sysctl.h> + +static char xen_replace_world_name[] = "xen_extra_version"; +extern const char *xen_replace_world(void); + +struct livepatch_func __section(".livepatch.funcs") livepatch_xen_replace_world = { + .version = LIVEPATCH_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: + */ diff --git a/xen/common/test/xen_replace_world_func.c b/xen/common/test/xen_replace_world_func.c new file mode 100644 index 0000000..afb5cda --- /dev/null +++ b/xen/common/test/xen_replace_world_func.c @@ -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: + */ -- 2.4.11 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel