[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4] x86: relocate pvh_info
On 22/01/18 16:13, Wei Liu wrote: > 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> > Cc: Doug Goldstein <cardoe@xxxxxxxxxx> > > v4: inlcude autoconf.h directly. The code itself is unchanged. > --- > xen/arch/x86/boot/Makefile | 4 +++ > xen/arch/x86/boot/defs.h | 3 +++ > xen/arch/x86/boot/head.S | 25 ++++++++++-------- > xen/arch/x86/boot/reloc.c | 64 > +++++++++++++++++++++++++++++++++++++++++----- > 4 files changed, 78 insertions(+), 18 deletions(-) > > diff --git a/xen/arch/x86/boot/Makefile b/xen/arch/x86/boot/Makefile > index c6246c85d2..1b3f121a2f 100644 > --- a/xen/arch/x86/boot/Makefile > +++ b/xen/arch/x86/boot/Makefile > @@ -7,6 +7,10 @@ CMDLINE_DEPS = $(DEFS_H_DEPS) video.h > RELOC_DEPS = $(DEFS_H_DEPS) $(BASEDIR)/include/xen/multiboot.h \ > $(BASEDIR)/include/xen/multiboot2.h + autoconf.h However, it would much better to take xen/kconfig.h ... > > +ifeq ($(CONFIG_PVH_GUEST),y) > +RELOC_DEPS += $(BASEDIR)/include/public/arch-x86/hvm/start_info.h > +endif and this unconditionally, and ... > + > head.o: cmdline.S reloc.S > > cmdline.S: cmdline.c $(CMDLINE_DEPS) > 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: For new code, please have spaces after commas for readibility. > > /* > * 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..1fe19294ad 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 ( > @@ -29,6 +29,8 @@ asm ( > #include "../../../include/xen/multiboot.h" > #include "../../../include/xen/multiboot2.h" > > +#include "../../../include/generated/autoconf.h" > + > #define get_mb2_data(tag, type, member) (((multiboot2_tag_##type##_t > *)(tag))->member) > #define get_mb2_string(tag, type, member) ((u32)get_mb2_data(tag, type, > member)) > > @@ -71,6 +73,41 @@ static u32 copy_string(u32 src) > return copy_mem(src, p - src + 1); > } > > +#ifdef CONFIG_PVH_GUEST ... drop this ifdef and ... > + > +#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 +263,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 Rearrange this as: case XEN_HVM_START_MAGIC_VALUE: if ( IS_ENABLED(CONFIG_PVH_GUEST) ) return pvh_info_reloc(in); /* Fallthrough */ Which drops all of the ifdefary. ~Andrew > + > + default: > + /* Nothing we can do */ > + return NULL; > + } > } > > /* _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |