[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.