|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-xen-4.5 v3 06/16] x86: Introduce boot_info structure
On 08/10/14 18:52, Daniel Kiper wrote:
> This patch introduces boot_info structure. Subsequent patches will move
> step by step all boot related data to above mentioned struct. At the end
> of this process multiboot (v1) protocol dependency will be broken. It means
> that most of Xen code (excluding preloader) could be bootloader agnostic
> and does not need almost any knowledge about boot protocol. Additionally,
> it will be possible to pass all boot data to __start_xen() in one bucket
> without any side channels. I do not mention that we are also able to easily
> identify boot data in Xen code.
>
> Here is boot data flow for legacy BIOS platform:
>
> BIOS -> GRUB -> multiboot[12]* -> __reloc() -> MBD ->-\
> /
> ------<------<------<------<------<------<-----
> \
> \
> ---> __init_boot_info() -> boot_info_mb -> __start_xen() ->
> boot_info
> /
> BIOS ->-/
>
> * multiboot2 is not implemented yet. Look for it in later patches.
>
> Here is boot data flow for EFI platform:
>
> EFI -> efi_start() -> boot_info_efi -> __start_xen() -> boot_info
>
> WARNING: ARM build has not been tested yet.
>
> Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
> ---
> v3 - suggestions/fixes:
> - further patch split rearrangement
> (suggested by Andrew Cooper).
>
> v2 - suggestions/fixes:
> - rename XBI to boot_info
> (suggested by Andrew Cooper),
> - use more meaningful types in boot_info structure
> (suggested by Andrew Cooper, Jan Beulich and Stefano Stabellini),
> - improve boot_info structure comment
> (suggested by Andrew Cooper and Jan Beulich),
> - do data shuffling after exception support initialization
> (suggested by Andrew Cooper),
> - patch split rearrangement
> (suggested by Andrew Cooper and Jan Beulich).
> ---
> xen/arch/x86/boot/x86_64.S | 10 +++++++--
> xen/arch/x86/boot_info.c | 11 ++++++++++
> xen/arch/x86/efi/efi-boot.h | 3 ++-
> xen/arch/x86/setup.c | 13 ++++++++++-
> xen/common/efi/efi.h | 7 ++++++
> xen/common/efi/runtime.c | 10 +++++++++
> xen/include/asm-x86/boot_info.h | 46
> +++++++++++++++++++++++++++++++++++++++
> 7 files changed, 96 insertions(+), 4 deletions(-)
> create mode 100644 xen/include/asm-x86/boot_info.h
>
> diff --git a/xen/arch/x86/boot/x86_64.S b/xen/arch/x86/boot/x86_64.S
> index ef8c735..647c33b 100644
> --- a/xen/arch/x86/boot/x86_64.S
> +++ b/xen/arch/x86/boot/x86_64.S
> @@ -32,9 +32,15 @@
> /* Init mbi. */
> mov mbd_pa(%rip),%edi
> call __init_mbi
> + pushq %rax
> +
> + /* Init boot_info. */
> + mov mbd_pa(%rip),%edi
> + call __init_boot_info
>
> - /* Pass off the mbi to C land. */
> - movq %rax,%rdi
> + /* Pass off the mbi and boot_info to C land. */
> + popq %rdi
> + movq %rax,%rsi
> call __start_xen
> ud2 /* Force a panic (invalid opcode). */
>
> diff --git a/xen/arch/x86/boot_info.c b/xen/arch/x86/boot_info.c
> index a2799aa..83bd255 100644
> --- a/xen/arch/x86/boot_info.c
> +++ b/xen/arch/x86/boot_info.c
> @@ -20,11 +20,17 @@
> #include <xen/init.h>
> #include <xen/multiboot.h>
>
> +#include <asm/boot_info.h>
> #include <asm/mbd.h>
> #include <asm/page.h>
>
> static multiboot_info_t __read_mostly mbi;
>
> +static boot_info_t __read_mostly boot_info_mb = {
> + .warn_msg = NULL,
> + .err_msg = NULL
> +};
You don't need to explicitly 0 things like this with structure
initialisation.
> +
> extern void enable_exception_support(void);
>
> unsigned long __init __init_mbi(u32 mbd_pa)
> @@ -57,3 +63,8 @@ unsigned long __init __init_mbi(u32 mbd_pa)
>
> return __pa(&mbi);
> }
> +
> +paddr_t __init __init_boot_info(u32 mbd_pa)
> +{
> + return __pa(&boot_info_mb);
> +}
> diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h
> index 71030b0..6d7c222 100644
> --- a/xen/arch/x86/efi/efi-boot.h
> +++ b/xen/arch/x86/efi/efi-boot.h
> @@ -254,7 +254,8 @@ static void __init noreturn efi_arch_post_exit_boot(void)
> [cs] "ir" (__HYPERVISOR_CS),
> [ds] "r" (__HYPERVISOR_DS),
> [stkoff] "i" (STACK_SIZE - sizeof(struct cpu_info)),
> - "D" (&mbi)
> + "D" (&mbi),
> + "S" (&boot_info_efi)
> : "memory" );
> for( ; ; ); /* not reached */
> }
> diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
> index 24e1be3..d2a1450 100644
> --- a/xen/arch/x86/setup.c
> +++ b/xen/arch/x86/setup.c
> @@ -49,6 +49,7 @@
> #include <xen/cpu.h>
> #include <asm/nmi.h>
> #include <asm/alternative.h>
> +#include <asm/boot_info.h>
>
> /* opt_nosmp: If true, secondary processors are ignored. */
> static bool_t __initdata opt_nosmp;
> @@ -92,6 +93,8 @@ unsigned long __initdata highmem_start;
> size_param("highmem-start", highmem_start);
> #endif
>
> +boot_info_t *boot_info;
> +
> cpumask_t __read_mostly cpu_present_map;
>
> unsigned long __read_mostly xen_phys_start;
> @@ -548,7 +551,7 @@ void __init enable_exception_support(void)
> /* Full exception support from here on in. */
> }
>
> -void __init noreturn __start_xen(unsigned long mbi_p)
> +void __init noreturn __start_xen(unsigned long mbi_p, paddr_t boot_info_pa)
> {
> char *memmap_type = NULL;
> char *cmdline, *kextra, *loader;
> @@ -565,6 +568,8 @@ void __init noreturn __start_xen(unsigned long mbi_p)
> .stop_bits = 1
> };
>
> + boot_info = __va(boot_info_pa);
> +
> if ( efi_enabled ) {
> enable_exception_support();
> }
> @@ -613,6 +618,12 @@ void __init noreturn __start_xen(unsigned long mbi_p)
> ehci_dbgp_init();
> console_init_preirq();
>
> + if ( boot_info->err_msg )
> + panic(boot_info->err_msg);
> +
> + if ( boot_info->warn_msg )
> + printk(boot_info->warn_msg);
> +
> printk("Bootloader: %s\n", loader);
>
> printk("Command line: %s\n", cmdline);
> diff --git a/xen/common/efi/efi.h b/xen/common/efi/efi.h
> index bee3b77..526f57c 100644
> --- a/xen/common/efi/efi.h
> +++ b/xen/common/efi/efi.h
> @@ -8,6 +8,9 @@
> #include <xen/efi.h>
> #include <xen/spinlock.h>
> #include <asm/page.h>
> +#ifndef CONFIG_ARM /* TODO - disabled until implemented on ARM */
> +#include <asm/boot_info.h>
> +#endif
>
> struct efi_pci_rom {
> const struct efi_pci_rom *next;
> @@ -25,6 +28,10 @@ extern const CHAR16 *efi_fw_vendor;
>
> extern EFI_RUNTIME_SERVICES *efi_rs;
>
> +#ifndef CONFIG_ARM /* TODO - boot_info is not implemented on ARM yet */
> +extern boot_info_t boot_info_efi;
> +#endif
> +
> extern UINTN efi_memmap_size, efi_mdesc_size;
> extern void *efi_memmap;
>
> diff --git a/xen/common/efi/runtime.c b/xen/common/efi/runtime.c
> index 1c43d10..eb0acae 100644
> --- a/xen/common/efi/runtime.c
> +++ b/xen/common/efi/runtime.c
> @@ -5,6 +5,9 @@
> #include <xen/guest_access.h>
> #include <xen/irq.h>
> #include <xen/time.h>
> +#ifndef CONFIG_ARM /* TODO - disabled until implemented on ARM */
> +#include <asm/boot_info.h>
> +#endif
>
> DEFINE_XEN_GUEST_HANDLE(CHAR16);
>
> @@ -50,6 +53,13 @@ struct efi __read_mostly efi = {
> const struct efi_pci_rom *__read_mostly efi_pci_roms;
>
> #ifndef CONFIG_ARM /* TODO - disabled until implemented on ARM */
> +boot_info_t __read_mostly boot_info_efi = {
> + .warn_msg = NULL,
> + .err_msg = NULL
> +};
> +#endif
> +
> +#ifndef CONFIG_ARM /* TODO - disabled until implemented on ARM */
> unsigned long efi_rs_enter(void)
> {
> static const u16 fcw = FCW_DEFAULT;
> diff --git a/xen/include/asm-x86/boot_info.h b/xen/include/asm-x86/boot_info.h
> new file mode 100644
> index 0000000..9ff3c0f
> --- /dev/null
> +++ b/xen/include/asm-x86/boot_info.h
> @@ -0,0 +1,46 @@
> +/*
> + * Copyright (c) 2013, 2014 Oracle Co., Daniel Kiper
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef __BOOT_INFO_H__
> +#define __BOOT_INFO_H__
> +
> +/*
> + * Define boot_info type. It will be used to define variable which in turn
> + * will store data collected by bootloader and preloader. This way it will
> + * be possible to make most of Xen code bootloader agnostic.
> + *
> + * Some members should have relevant EFI/ACPI types. However, due to type
> + * conflicts among ACPI and EFI headers it is not possible to use required
> + * EFI/ACPI types here. Instead of them there are simple types in use which
> + * are compatible as much as possible with relevant EFI/ACPI types.
> + */
> +typedef struct {
> + /*
> + * Info about warning occurred during boot_info initialization.
> + * NULL if everything went OK.
> + */
> + char *warn_msg;
const char *
~Andrew
> +
> + /*
> + * Info about error occurred during boot_info initialization. NULL if
> everything
> + * went OK. Otherwise boot_info is not fully/properly initialized.
> + */
> + char *err_msg;
> +} boot_info_t;
> +
> +extern boot_info_t *boot_info;
> +#endif /* __BOOT_INFO_H__ */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |