efi: create efi_enabled()

First of all we need to differentiate between legacy BIOS
and EFI platforms during runtime, not during build, because
one image will have legacy and EFI code and can be executed
on both platforms. Additionally, 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 defines
EFI_BOOT, EFI_LOADER and EFI_RS features. EFI_BOOT is equal
to old efi_enabled == 1. EFI_RS ease control on runtime
services usage. EFI_LOADER tells that Xen was loaded
directly from EFI as PE executable.

Suggested-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Daniel Kiper authored and Jan Beulich committed 2016-12-07 14:36:11 +01:00
1 parent f343852c5e
commit 146786b922
12 files changed
+49 -30

No files matched your search

+2 -2
View File
@@ -238,7 +238,7 @@ const char *__init dmi_get_table(paddr_t *base, u32 *len)
{
static unsigned int __initdata instance;
if (efi_enabled) {
if (efi_enabled(EFI_BOOT)) {
if (efi_smbios3_size && !(instance & 1)) {
*base = efi_smbios3_address;
*len = efi_smbios3_size;
@@ -696,7 +696,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_BOOT) ? dmi_iterate(dmi_decode) :
dmi_efi_iterate(dmi_decode)) == 0)
dmi_check_system(dmi_blacklist);
else
+1 -1
View File
@@ -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_rs_using_pgtables() )
return NULL;
/*
+4 -4
View File
@@ -4,9 +4,10 @@
#include <xen/lib.h>
#include <asm/page.h>
#ifndef efi_enabled
const bool_t efi_enabled = 0;
#endif
bool efi_enabled(unsigned int feature)
{
return false;
}
void __init efi_init_memory(void) { }
@@ -14,7 +15,6 @@ void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t l4e) { }
bool_t efi_rs_using_pgtables(void)
{
BUG();
return 0;
}
+2 -2
View File
@@ -564,7 +564,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_BOOT))
clear_fixmap(FIX_EFI_MPF);
}
@@ -722,7 +722,7 @@ void __init find_smp_config (void)
{
unsigned int address;
if (efi_enabled) {
if (efi_enabled(EFI_BOOT)) {
efi_check_config();
return;
}
+7 -5
View File
@@ -483,8 +483,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_BOOT) )
return;
if ( (bvi->orig_video_isVGA == 1) && (bvi->orig_video_mode == 3) )
@@ -770,7 +770,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_LOADER) )
{
set_pdx_range(xen_phys_start >> PAGE_SHIFT,
(xen_phys_start + BOOTSTRAP_MAP_BASE) >> PAGE_SHIFT);
@@ -785,6 +785,8 @@ void __init noreturn __start_xen(unsigned long mbi_p)
memmap_type = loader;
}
else if ( efi_enabled(EFI_BOOT) )
memmap_type = "EFI";
else if ( e820_raw_nr != 0 )
{
memmap_type = "Xen-e820";
@@ -881,7 +883,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_LOADER) && i < mbi->mods_count; i++ )
{
if ( mod[i].mod_start & (PAGE_SIZE - 1) )
panic("Bootloader didn't honor module alignment request.");
@@ -1122,7 +1124,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_LOADER) ? mbi->mem_upper : __pa(&_start),
__pa(&_end));
/* Late kexec reservation (dynamic start address). */
+1 -1
View File
@@ -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_RS) ? BOOT_EFI
: acpi_disabled ? BOOT_KBD
: BOOT_ACPI;
}
+1 -1
View File
@@ -814,7 +814,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_RS) )
{
res = efi_get_time();
if ( res )
+15 -4
View File
@@ -934,6 +934,13 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
char *option_str;
bool_t use_cfg_file;
__set_bit(EFI_BOOT, &efi_flags);
__set_bit(EFI_LOADER, &efi_flags);
#ifndef CONFIG_ARM /* Disabled until runtime services implemented. */
__set_bit(EFI_RS, &efi_flags);
#endif
efi_init(ImageHandle, SystemTable);
use_cfg_file = efi_arch_use_config_file(SystemTable);
@@ -1153,7 +1160,6 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
#ifndef CONFIG_ARM /* TODO - runtime service support */
static bool_t __initdata efi_rs_enable = 1;
static bool_t __initdata efi_map_uc;
static void __init parse_efi_param(char *s)
@@ -1171,7 +1177,12 @@ static void __init parse_efi_param(char *s)
*ss = '\0';
if ( !strcmp(s, "rs") )
efi_rs_enable = val;
{
if ( val )
__set_bit(EFI_RS, &efi_flags);
else
__clear_bit(EFI_RS, &efi_flags);
}
else if ( !strcmp(s, "attr=uc") )
efi_map_uc = val;
@@ -1254,7 +1265,7 @@ void __init efi_init_memory(void)
desc->PhysicalStart, desc->PhysicalStart + len - 1,
desc->Type, desc->Attribute);
if ( !efi_rs_enable ||
if ( !efi_enabled(EFI_RS) ||
(!(desc->Attribute & EFI_MEMORY_RUNTIME) &&
(!map_bs ||
(desc->Type != EfiBootServicesCode &&
@@ -1328,7 +1339,7 @@ void __init efi_init_memory(void)
}
}
if ( !efi_rs_enable )
if ( !efi_enabled(EFI_RS) )
{
efi_fw_vendor = NULL;
return;
+8 -6
View File
@@ -29,12 +29,6 @@ void efi_rs_leave(struct efi_rs_state *);
#ifndef COMPAT
/*
* Currently runtime services are not implemented on ARM. To boot Xen with ACPI,
* set efi_enabled to 1, so that Xen can get the ACPI root pointer from EFI.
*/
const bool_t efi_enabled = 1;
#ifndef CONFIG_ARM
# include <asm/i387.h>
# include <asm/xstate.h>
@@ -62,6 +56,9 @@ UINT64 __read_mostly efi_boot_max_var_store_size;
UINT64 __read_mostly efi_boot_remain_var_store_size;
UINT64 __read_mostly efi_boot_max_var_size;
/* Bit field representing available EFI features/properties. */
unsigned int efi_flags;
struct efi __read_mostly efi = {
.acpi = EFI_INVALID_TABLE_ADDR,
.acpi20 = EFI_INVALID_TABLE_ADDR,
@@ -72,6 +69,11 @@ struct efi __read_mostly efi = {
const struct efi_pci_rom *__read_mostly efi_pci_roms;
bool efi_enabled(unsigned int feature)
{
return test_bit(feature, &efi_flags);
}
#ifndef CONFIG_ARM /* TODO - disabled until implemented on ARM */
struct efi_rs_state efi_rs_enter(void)
+1 -1
View File
@@ -160,7 +160,7 @@ static int __init xen_build_init(void)
#ifdef CONFIG_X86
/* Alternatively we may have a CodeView record from an EFI build. */
if ( rc && efi_enabled )
if ( rc && efi_enabled(EFI_LOADER) )
{
const struct pe_external_debug_directory *dir = (const void *)n;
+1 -1
View File
@@ -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_BOOT)) {
if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
return efi.acpi20;
else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
+6 -2
View File
@@ -5,10 +5,13 @@
#include <xen/types.h>
#endif
extern const bool_t efi_enabled;
#define EFI_INVALID_TABLE_ADDR (~0UL)
extern unsigned int efi_flags;
#define EFI_BOOT 0 /* Were we booted from EFI? */
#define EFI_LOADER 1 /* Were we booted directly from EFI loader? */
#define EFI_RS 2 /* Can we use runtime services? */
/* Add fields here only if they need to be referenced from non-EFI code. */
struct efi {
unsigned long mps; /* MPS table */
@@ -28,6 +31,7 @@ union compat_pf_efi_info;
struct xenpf_efi_runtime_call;
struct compat_pf_efi_runtime_call;
bool efi_enabled(unsigned int feature);
void efi_init_memory(void);
bool_t efi_rs_using_pgtables(void);
unsigned long efi_get_time(void);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.