[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |