[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 09/23] efi: create efi_enabled()



On Mon, Jul 20, 2015 at 04:29:04PM +0200, Daniel Kiper wrote:
> We need more fine grained knowledge about EFI environment and check
> for EFI platform and EFI loader separately to properly support
> multiboot2 protocol. In general Xen loaded by this protocol uses
> memory mappings and loaded modules in similar way to Xen loaded
> by multiboot (v1) protocol. Hence, create efi_enabled() which
> checks available features in efi.flags. This patch only defines
> EFI_PLATFORM feature which is equal to old efi_enabled == 1.
> Following patch will define EFI_LOADER feature accordingly.
> 
> Suggested-by: Jan Beulich <jbeulich@xxxxxxxx>
> Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>

Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> ---
>  xen/arch/x86/dmi_scan.c    |    4 ++--
>  xen/arch/x86/domain_page.c |    2 +-
>  xen/arch/x86/efi/stub.c    |   11 ++++++++---
>  xen/arch/x86/mpparse.c     |    4 ++--
>  xen/arch/x86/setup.c       |   10 +++++-----
>  xen/arch/x86/shutdown.c    |    2 +-
>  xen/arch/x86/time.c        |    2 +-
>  xen/arch/x86/xen.lds.S     |    2 --
>  xen/common/efi/boot.c      |    4 ++++
>  xen/common/efi/runtime.c   |   17 +++++++----------
>  xen/drivers/acpi/osl.c     |    2 +-
>  xen/include/xen/efi.h      |   16 ++++++++++++++--
>  12 files changed, 46 insertions(+), 30 deletions(-)
> 
> diff --git a/xen/arch/x86/dmi_scan.c b/xen/arch/x86/dmi_scan.c
> index 269168c..95c5a77 100644
> --- a/xen/arch/x86/dmi_scan.c
> +++ b/xen/arch/x86/dmi_scan.c
> @@ -229,7 +229,7 @@ const char *__init dmi_get_table(paddr_t *base, u32 *len)
>  {
>       static unsigned int __initdata instance;
>  
> -     if (efi_enabled) {
> +     if (efi_enabled(EFI_PLATFORM)) {
>               if (efi_smbios3_size && !(instance & 1)) {
>                       *base = efi_smbios3_address;
>                       *len = efi_smbios3_size;
> @@ -693,7 +693,7 @@ static void __init dmi_decode(struct dmi_header *dm)
>  
>  void __init dmi_scan_machine(void)
>  {
> -     if ((!efi_enabled ? dmi_iterate(dmi_decode) :
> +     if ((!efi_enabled(EFI_PLATFORM) ? dmi_iterate(dmi_decode) :
>                           dmi_efi_iterate(dmi_decode)) == 0)
>               dmi_check_system(dmi_blacklist);
>       else
> diff --git a/xen/arch/x86/domain_page.c b/xen/arch/x86/domain_page.c
> index d86f8fe..fdf0d8a 100644
> --- a/xen/arch/x86/domain_page.c
> +++ b/xen/arch/x86/domain_page.c
> @@ -36,7 +36,7 @@ static inline struct vcpu *mapcache_current_vcpu(void)
>       * domain's page tables but current may point at another domain's VCPU.
>       * Return NULL as though current is not properly set up yet.
>       */
> -    if ( efi_enabled && efi_rs_using_pgtables() )
> +    if ( efi_enabled(EFI_PLATFORM) && efi_rs_using_pgtables() )
>          return NULL;
>  
>      /*
> diff --git a/xen/arch/x86/efi/stub.c b/xen/arch/x86/efi/stub.c
> index 07c2bd0..c5ae369 100644
> --- a/xen/arch/x86/efi/stub.c
> +++ b/xen/arch/x86/efi/stub.c
> @@ -4,9 +4,14 @@
>  #include <xen/lib.h>
>  #include <asm/page.h>
>  
> -#ifndef efi_enabled
> -const bool_t efi_enabled = 0;
> -#endif
> +struct efi __read_mostly efi = {
> +     .flags   = 0, /* Initialized later. */
> +     .acpi    = EFI_INVALID_TABLE_ADDR,
> +     .acpi20  = EFI_INVALID_TABLE_ADDR,
> +     .mps     = EFI_INVALID_TABLE_ADDR,
> +     .smbios  = EFI_INVALID_TABLE_ADDR,
> +     .smbios3 = EFI_INVALID_TABLE_ADDR
> +};
>  
>  void __init efi_init_memory(void) { }
>  
> diff --git a/xen/arch/x86/mpparse.c b/xen/arch/x86/mpparse.c
> index 8609f4a..5223579 100644
> --- a/xen/arch/x86/mpparse.c
> +++ b/xen/arch/x86/mpparse.c
> @@ -557,7 +557,7 @@ static inline void __init 
> construct_default_ISA_mptable(int mpc_default_type)
>  
>  static __init void efi_unmap_mpf(void)
>  {
> -     if (efi_enabled)
> +     if (efi_enabled(EFI_PLATFORM))
>               clear_fixmap(FIX_EFI_MPF);
>  }
>  
> @@ -715,7 +715,7 @@ void __init find_smp_config (void)
>  {
>       unsigned int address;
>  
> -     if (efi_enabled) {
> +     if (efi_enabled(EFI_PLATFORM)) {
>               efi_check_config();
>               return;
>       }
> diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
> index ff34670..bce708c 100644
> --- a/xen/arch/x86/setup.c
> +++ b/xen/arch/x86/setup.c
> @@ -444,8 +444,8 @@ static void __init parse_video_info(void)
>  {
>      struct boot_video_info *bvi = &bootsym(boot_vid_info);
>  
> -    /* The EFI loader fills vga_console_info directly. */
> -    if ( efi_enabled )
> +    /* vga_console_info is filled directly on EFI platform. */
> +    if ( efi_enabled(EFI_PLATFORM) )
>          return;
>  
>      if ( (bvi->orig_video_isVGA == 1) && (bvi->orig_video_mode == 3) )
> @@ -695,7 +695,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>      if ( !(mbi->flags & MBI_MODULES) || (mbi->mods_count == 0) )
>          panic("dom0 kernel not specified. Check bootloader configuration.");
>  
> -    if ( efi_enabled )
> +    if ( efi_enabled(EFI_PLATFORM) )
>      {
>          set_pdx_range(xen_phys_start >> PAGE_SHIFT,
>                        (xen_phys_start + BOOTSTRAP_MAP_BASE) >> PAGE_SHIFT);
> @@ -806,7 +806,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>       * we can relocate the dom0 kernel and other multiboot modules. Also, on
>       * x86/64, we relocate Xen to higher memory.
>       */
> -    for ( i = 0; !efi_enabled && i < mbi->mods_count; i++ )
> +    for ( i = 0; !efi_enabled(EFI_PLATFORM) && i < mbi->mods_count; i++ )
>      {
>          if ( mod[i].mod_start & (PAGE_SIZE - 1) )
>              panic("Bootloader didn't honor module alignment request.");
> @@ -994,7 +994,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
>  
>      if ( !xen_phys_start )
>          panic("Not enough memory to relocate Xen.");
> -    reserve_e820_ram(&boot_e820, efi_enabled ? mbi->mem_upper : 
> __pa(&_start),
> +    reserve_e820_ram(&boot_e820, efi_enabled(EFI_PLATFORM) ? mbi->mem_upper 
> : __pa(&_start),
>                       __pa(&_end));
>  
>      /* Late kexec reservation (dynamic start address). */
> diff --git a/xen/arch/x86/shutdown.c b/xen/arch/x86/shutdown.c
> index 0e1499d..79dcd16 100644
> --- a/xen/arch/x86/shutdown.c
> +++ b/xen/arch/x86/shutdown.c
> @@ -116,7 +116,7 @@ void machine_halt(void)
>  static void default_reboot_type(void)
>  {
>      if ( reboot_type == BOOT_INVALID )
> -        reboot_type = efi_enabled ? BOOT_EFI
> +        reboot_type = efi_enabled(EFI_PLATFORM) ? BOOT_EFI
>                                    : acpi_disabled ? BOOT_KBD
>                                                    : BOOT_ACPI;
>  }
> diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
> index bbb7e6c..11e7e11 100644
> --- a/xen/arch/x86/time.c
> +++ b/xen/arch/x86/time.c
> @@ -690,7 +690,7 @@ static unsigned long get_cmos_time(void)
>      static bool_t __read_mostly cmos_rtc_probe;
>      boolean_param("cmos-rtc-probe", cmos_rtc_probe);
>  
> -    if ( efi_enabled )
> +    if ( efi_enabled(EFI_PLATFORM) )
>      {
>          res = efi_get_time();
>          if ( res )
> diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S
> index 3e1f2af..87f3e83 100644
> --- a/xen/arch/x86/xen.lds.S
> +++ b/xen/arch/x86/xen.lds.S
> @@ -191,8 +191,6 @@ SECTIONS
>    .pad : {
>      . = ALIGN(MB(16));
>    } :text
> -#else
> -  efi = .;
>  #endif
>  
>    /* Sections to be discarded */
> diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
> index 75a939f..1f188fe 100644
> --- a/xen/common/efi/boot.c
> +++ b/xen/common/efi/boot.c
> @@ -717,6 +717,10 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE 
> *SystemTable)
>      char *option_str;
>      bool_t use_cfg_file;
>  
> +#ifndef CONFIG_ARM /* Disabled until runtime services implemented. */
> +    set_bit(EFI_PLATFORM, &efi.flags);
> +#endif
> +
>      efi_ih = ImageHandle;
>      efi_bs = SystemTable->BootServices;
>      efi_bs_revision = efi_bs->Hdr.Revision;
> diff --git a/xen/common/efi/runtime.c b/xen/common/efi/runtime.c
> index ae87557..aa064e7 100644
> --- a/xen/common/efi/runtime.c
> +++ b/xen/common/efi/runtime.c
> @@ -10,14 +10,10 @@ DEFINE_XEN_GUEST_HANDLE(CHAR16);
>  
>  #ifndef COMPAT
>  
> -#ifdef CONFIG_ARM  /* Disabled until runtime services implemented */
> -const bool_t efi_enabled = 0;
> -#else
> +#ifndef CONFIG_ARM
>  # include <asm/i387.h>
>  # include <asm/xstate.h>
>  # include <public/platform.h>
> -
> -const bool_t efi_enabled = 1;
>  #endif
>  
>  unsigned int __read_mostly efi_num_ct;
> @@ -42,11 +38,12 @@ UINT64 __read_mostly efi_boot_remain_var_store_size;
>  UINT64 __read_mostly efi_boot_max_var_size;
>  
>  struct efi __read_mostly efi = {
> -     .acpi   = EFI_INVALID_TABLE_ADDR,
> -     .acpi20 = EFI_INVALID_TABLE_ADDR,
> -     .mps    = EFI_INVALID_TABLE_ADDR,
> -     .smbios = EFI_INVALID_TABLE_ADDR,
> -     .smbios3 = EFI_INVALID_TABLE_ADDR,
> +     .flags   = 0, /* Initialized later. */
> +     .acpi    = EFI_INVALID_TABLE_ADDR,
> +     .acpi20  = EFI_INVALID_TABLE_ADDR,
> +     .mps     = EFI_INVALID_TABLE_ADDR,
> +     .smbios  = EFI_INVALID_TABLE_ADDR,
> +     .smbios3 = EFI_INVALID_TABLE_ADDR
>  };
>  
>  const struct efi_pci_rom *__read_mostly efi_pci_roms;
> diff --git a/xen/drivers/acpi/osl.c b/xen/drivers/acpi/osl.c
> index 4c09859..f4f6628 100644
> --- a/xen/drivers/acpi/osl.c
> +++ b/xen/drivers/acpi/osl.c
> @@ -66,7 +66,7 @@ void __init acpi_os_vprintf(const char *fmt, va_list args)
>  
>  acpi_physical_address __init acpi_os_get_root_pointer(void)
>  {
> -     if (efi_enabled) {
> +     if (efi_enabled(EFI_PLATFORM)) {
>               if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
>                       return efi.acpi20;
>               else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
> diff --git a/xen/include/xen/efi.h b/xen/include/xen/efi.h
> index e74dad1..318bbec 100644
> --- a/xen/include/xen/efi.h
> +++ b/xen/include/xen/efi.h
> @@ -2,15 +2,17 @@
>  #define __XEN_EFI_H__
>  
>  #ifndef __ASSEMBLY__
> +#include <xen/bitops.h>
>  #include <xen/types.h>
>  #endif
>  
> -extern const bool_t efi_enabled;
> -
>  #define EFI_INVALID_TABLE_ADDR (~0UL)
>  
> +#define EFI_PLATFORM 0
> +
>  /* Add fields here only if they need to be referenced from non-EFI code. */
>  struct efi {
> +    unsigned long flags;
>      unsigned long mps;          /* MPS table */
>      unsigned long acpi;         /* ACPI table (IA64 ext 0.71) */
>      unsigned long acpi20;       /* ACPI table (ACPI 2.0) */
> @@ -40,6 +42,16 @@ int efi_runtime_call(struct xenpf_efi_runtime_call *);
>  int efi_compat_get_info(uint32_t idx, union compat_pf_efi_info *);
>  int efi_compat_runtime_call(struct compat_pf_efi_runtime_call *);
>  
> +/*
> + * Test whether the above EFI_* bits are enabled.
> + *
> + * Stolen from Linux Kernel.
> + */
> +static inline bool_t efi_enabled(int feature)
> +{
> +    return test_bit(feature, &efi.flags) != 0;
> +}
> +
>  #endif /* !__ASSEMBLY__ */
>  
>  #endif /* __XEN_EFI_H__ */
> -- 
> 1.7.10.4
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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