[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 5/7] x86: relocate pvh_info
On Mon, Jan 22, 2018 at 03:31:22AM -0700, Jan Beulich wrote: > >>> On 19.01.18 at 17:39, <wei.liu2@xxxxxxxxxx> wrote: > > On Fri, Jan 19, 2018 at 04:29:31PM +0000, Roger Pau Monné wrote: > >> On Fri, Jan 19, 2018 at 03:34:56PM +0000, Wei Liu wrote: > >> > diff --git a/xen/arch/x86/boot/build32.mk b/xen/arch/x86/boot/build32.mk > >> > index 48c7407c00..028ac19b96 100644 > >> > --- a/xen/arch/x86/boot/build32.mk > >> > +++ b/xen/arch/x86/boot/build32.mk > >> > @@ -36,5 +36,8 @@ CFLAGS := $(filter-out -flto,$(CFLAGS)) > >> > cmdline.o: cmdline.c $(CMDLINE_DEPS) > >> > > >> > reloc.o: reloc.c $(RELOC_DEPS) > >> > +ifeq ($(CONFIG_PVH_GUEST),y) > >> > +reloc.o: CFLAGS += -DCONFIG_PVH_GUEST > >> > +endif > >> > >> I would maybe do this above, where the rest of the CFLAGS are set. > >> Certainly setting -DCONFIG_PVH_GUEST shouldn't cause issues elsewhere. > >> > >> CFLAGS-$(CONFIG_PVH_GUEST) += -DCONFIG_PVH_GUEST > >> CFLAGS += $(CFLAGS-y) > >> > >> > .PRECIOUS: %.bin %.lnk > >> > diff --git a/xen/arch/x86/boot/defs.h b/xen/arch/x86/boot/defs.h > >> > index 6abdc15446..05921a64a3 100644 > >> > --- a/xen/arch/x86/boot/defs.h > >> > +++ b/xen/arch/x86/boot/defs.h > >> > @@ -51,6 +51,9 @@ typedef unsigned short u16; > >> > typedef unsigned int u32; > >> > typedef unsigned long long u64; > >> > typedef unsigned int size_t; > >> > +typedef u8 uint8_t; > >> > +typedef u32 uint32_t; > >> > +typedef u64 uint64_t; > >> > >> This this seems to be always expanding, maybe better to simply replace > >> the stdbool.h include above with types.h? > >> > > > > I'm two minded here. My impression is that this wants to be minimal and > > standalone. The content in types.h is a lot more than we need here. > > Please keep it the (minimal) way you have it. > > >> > #define U16_MAX ((u16)(~0U)) > >> > #define UINT_MAX (~0U) > >> > diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S > >> > index 0f652cea11..614e53081e 100644 > >> > --- a/xen/arch/x86/boot/head.S > >> > +++ b/xen/arch/x86/boot/head.S > >> > @@ -414,6 +414,7 @@ __pvh_start: > >> > > >> > /* Set trampoline_phys to use mfn 1 to avoid having a mapping > >> > at VA 0 */ > >> > movw $0x1000, sym_esi(trampoline_phys) > >> > + movl $0x336ec578, %eax /* mov $XEN_HVM_START_MAGIC_VALUE, > >> > %eax */ > >> > >> Hm, if XEN_HVM_START_MAGIC_VALUE cannot be used I would rather prefer > >> to use (%ebx). > > > > The same reason I didn't include types.h + hvm_start_info.h here. > > > > We can include both to make $XEN_HVM_START_MAGIC_VALUE work. But I think > > using (%ebx) is better in here. > > I agree (%ebx) is preferable. > To avoid spamming the list with all the other acked patches, here is the updated patch. ---8<--- From 1ac0afbbc0ecd620c5fba3a03bb084bc4dafc78e Mon Sep 17 00:00:00 2001 From: Wei Liu <wei.liu2@xxxxxxxxxx> Date: Wed, 17 Jan 2018 18:38:02 +0000 Subject: [PATCH] x86: relocate pvh_info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modify early boot code to relocate pvh info as well, so that we can be sure __va in __start_xen works. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: Roger Pau Monné <roger.pau@xxxxxxxxxx> v2: use XEN_HVM_START_MAGIC_VALUE and switch statement in reloc. Move header inclusion. v3: Use (%ebx). Add blank lines. --- xen/arch/x86/boot/Makefile | 7 ++++- xen/arch/x86/boot/build32.mk | 3 +++ xen/arch/x86/boot/defs.h | 3 +++ xen/arch/x86/boot/head.S | 25 ++++++++++-------- xen/arch/x86/boot/reloc.c | 62 +++++++++++++++++++++++++++++++++++++++----- 5 files changed, 81 insertions(+), 19 deletions(-) diff --git a/xen/arch/x86/boot/Makefile b/xen/arch/x86/boot/Makefile index c6246c85d2..9fe5b309c5 100644 --- a/xen/arch/x86/boot/Makefile +++ b/xen/arch/x86/boot/Makefile @@ -7,10 +7,15 @@ CMDLINE_DEPS = $(DEFS_H_DEPS) video.h RELOC_DEPS = $(DEFS_H_DEPS) $(BASEDIR)/include/xen/multiboot.h \ $(BASEDIR)/include/xen/multiboot2.h +ifeq ($(CONFIG_PVH_GUEST),y) +RELOC_DEPS += $(BASEDIR)/include/public/arch-x86/hvm/start_info.h +RELOC_EXTRA = CONFIG_PVH_GUEST=y +endif + head.o: cmdline.S reloc.S cmdline.S: cmdline.c $(CMDLINE_DEPS) $(MAKE) -f build32.mk $@ CMDLINE_DEPS="$(CMDLINE_DEPS)" reloc.S: reloc.c $(RELOC_DEPS) - $(MAKE) -f build32.mk $@ RELOC_DEPS="$(RELOC_DEPS)" + $(MAKE) -f build32.mk $@ RELOC_DEPS="$(RELOC_DEPS)" $(RELOC_EXTRA) diff --git a/xen/arch/x86/boot/build32.mk b/xen/arch/x86/boot/build32.mk index 48c7407c00..028ac19b96 100644 --- a/xen/arch/x86/boot/build32.mk +++ b/xen/arch/x86/boot/build32.mk @@ -36,5 +36,8 @@ CFLAGS := $(filter-out -flto,$(CFLAGS)) cmdline.o: cmdline.c $(CMDLINE_DEPS) reloc.o: reloc.c $(RELOC_DEPS) +ifeq ($(CONFIG_PVH_GUEST),y) +reloc.o: CFLAGS += -DCONFIG_PVH_GUEST +endif .PRECIOUS: %.bin %.lnk diff --git a/xen/arch/x86/boot/defs.h b/xen/arch/x86/boot/defs.h index 6abdc15446..05921a64a3 100644 --- a/xen/arch/x86/boot/defs.h +++ b/xen/arch/x86/boot/defs.h @@ -51,6 +51,9 @@ typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; typedef unsigned int size_t; +typedef u8 uint8_t; +typedef u32 uint32_t; +typedef u64 uint64_t; #define U16_MAX ((u16)(~0U)) #define UINT_MAX (~0U) diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S index 0f652cea11..aa2e2a93c8 100644 --- a/xen/arch/x86/boot/head.S +++ b/xen/arch/x86/boot/head.S @@ -414,6 +414,7 @@ __pvh_start: /* Set trampoline_phys to use mfn 1 to avoid having a mapping at VA 0 */ movw $0x1000, sym_esi(trampoline_phys) + movl (%ebx), %eax /* mov $XEN_HVM_START_MAGIC_VALUE, %eax */ jmp trampoline_setup #endif /* CONFIG_PVH_GUEST */ @@ -578,18 +579,20 @@ trampoline_setup: /* Get bottom-most low-memory stack address. */ add $TRAMPOLINE_SPACE,%ecx -#ifdef CONFIG_PVH_GUEST - cmpb $0, sym_fs(pvh_boot) - jne 1f -#endif - - /* Save the Multiboot info struct (after relocation) for later use. */ + /* Save Multiboot / PVH info struct (after relocation) for later use. */ push %ecx /* Bottom-most low-memory stack address. */ - push %ebx /* Multiboot information address. */ - push %eax /* Multiboot magic. */ + push %ebx /* Multiboot / PVH information address. */ + push %eax /* Magic number. */ call reloc - mov %eax,sym_fs(multiboot_ptr) +#ifdef CONFIG_PVH_GUEST + cmp $0,sym_fs(pvh_boot) + je 1f + mov %eax,sym_fs(pvh_start_info_pa) + jmp 2f +#endif 1: + mov %eax,sym_fs(multiboot_ptr) +2: /* * Now trampoline_phys points to the following structure (lowest address @@ -598,12 +601,12 @@ trampoline_setup: * +------------------------+ * | TRAMPOLINE_STACK_SPACE | * +------------------------+ - * | mbi data | + * | Data (MBI / PVH) | * +- - - - - - - - - - - - + * | TRAMPOLINE_SPACE | * +------------------------+ * - * mbi data grows downwards from the highest address of TRAMPOLINE_SPACE + * Data grows downwards from the highest address of TRAMPOLINE_SPACE * region to the end of the trampoline. The rest of TRAMPOLINE_SPACE is * reserved for trampoline code and data. */ diff --git a/xen/arch/x86/boot/reloc.c b/xen/arch/x86/boot/reloc.c index b992678b5e..216edb83a6 100644 --- a/xen/arch/x86/boot/reloc.c +++ b/xen/arch/x86/boot/reloc.c @@ -14,8 +14,8 @@ /* * This entry point is entered from xen/arch/x86/boot/head.S with: - * - 0x4(%esp) = MULTIBOOT_MAGIC, - * - 0x8(%esp) = MULTIBOOT_INFORMATION_ADDRESS, + * - 0x4(%esp) = MAGIC, + * - 0x8(%esp) = INFORMATION_ADDRESS, * - 0xc(%esp) = TOPMOST_LOW_MEMORY_STACK_ADDRESS. */ asm ( @@ -71,6 +71,41 @@ static u32 copy_string(u32 src) return copy_mem(src, p - src + 1); } +#ifdef CONFIG_PVH_GUEST + +#include <public/arch-x86/hvm/start_info.h> + +static struct hvm_start_info *pvh_info_reloc(u32 in) +{ + struct hvm_start_info *out; + + out = _p(copy_mem(in, sizeof(*out))); + + if ( out->cmdline_paddr ) + out->cmdline_paddr = copy_string(out->cmdline_paddr); + + if ( out->nr_modules ) + { + unsigned int i; + struct hvm_modlist_entry *mods; + + out->modlist_paddr = + copy_mem(out->modlist_paddr, + out->nr_modules * sizeof(struct hvm_modlist_entry)); + + mods = _p(out->modlist_paddr); + + for ( i = 0; i < out->nr_modules; i++ ) + { + if ( mods[i].cmdline_paddr ) + mods[i].cmdline_paddr = copy_string(mods[i].cmdline_paddr); + } + } + + return out; +} +#endif + static multiboot_info_t *mbi_reloc(u32 mbi_in) { int i; @@ -226,14 +261,27 @@ static multiboot_info_t *mbi2_reloc(u32 mbi_in) return mbi_out; } -multiboot_info_t __stdcall *reloc(u32 mb_magic, u32 mbi_in, u32 trampoline) +void __stdcall *reloc(u32 magic, u32 in, u32 trampoline) { alloc = trampoline; - if ( mb_magic == MULTIBOOT2_BOOTLOADER_MAGIC ) - return mbi2_reloc(mbi_in); - else - return mbi_reloc(mbi_in); + switch ( magic ) + { + case MULTIBOOT_BOOTLOADER_MAGIC: + return mbi_reloc(in); + + case MULTIBOOT2_BOOTLOADER_MAGIC: + return mbi2_reloc(in); + +#ifdef CONFIG_PVH_GUEST + case XEN_HVM_START_MAGIC_VALUE: + return pvh_info_reloc(in); +#endif + + default: + /* Nothing we can do */ + return NULL; + } } /* -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |