From patchwork Fri Aug 19 22:43:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Kiper X-Patchwork-Id: 9291299 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 43E42600CB for ; Fri, 19 Aug 2016 22:47:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 473BF295CE for ; Fri, 19 Aug 2016 22:47:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3BC31295D6; Fri, 19 Aug 2016 22:47:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 650E5295CE for ; Fri, 19 Aug 2016 22:47:18 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1basXG-0002r4-Ns; Fri, 19 Aug 2016 22:45:10 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1basXE-0002pC-JO for xen-devel@lists.xenproject.org; Fri, 19 Aug 2016 22:45:08 +0000 Received: from [85.158.143.35] by server-11.bemta-6.messagelabs.com id D9/89-08498-3FB87B75; Fri, 19 Aug 2016 22:45:07 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupikeJIrShJLcpLzFFi42LpnVTnqvu5e3u 4wZzbbBbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8bDR1eZCyYmVbQsncPewPjLt4uRi0NIoINJ YtKHTSwQzhdGiV+POhghnI2MEpsf/4PKTGSUWPj7P1MXIycHm4COxMUvD9lBbBEBJYl7qyYzg RQxC8xhkrjauwusSFjAWOJxQwsriM0ioCrRu/oSC4jNK+Ah8fZSL1izhICiRPezCWwgNidQ/M +mR2C9QgLuEo///GCDqDGW6JvVxzKBkW8BI8MqRo3i1KKy1CJdIwu9pKLM9IyS3MTMHF1DAzO 93NTi4sT01JzEpGK95PzcTYzAcGEAgh2M59cGHmKU5GBSEuX1U9seLsSXlJ9SmZFYnBFfVJqT WnyIUYaDQ0mClwEYfkKCRanpqRVpmTnAwIVJS3DwKInwbukCSvMWFyTmFmemQ6ROMepybFlwY y2TEEtefl6qlDjvOZAiAZCijNI8uBGwKLrEKCslzMsIdJQQT0FqUW5mCar8K0ZxDkYlYd7/IF N4MvNK4Da9AjqCCegIXv4tIEeUJCKkpBoYVWysNykx/b8dUjvFo2b7/Y31BS/uK/esnnb/a+z 3stjDFxhtFHaGOIqvLF68hafKq5v1QKvH+7KaGzFm8Wbl8b+ZfY9WONe9sQvP39Ds+3VywgbF ldMv6TU0Lvz+ysbyllG18qF3tVsura9etrIv8NaijfMYrvSxafhenPo/6L+Ty8TNHX+OK7EUZ yQaajEXFScCALgfSG+dAgAA X-Env-Sender: daniel.kiper@oracle.com X-Msg-Ref: server-7.tower-21.messagelabs.com!1471646705!29378636!1 X-Originating-IP: [141.146.126.69] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogMTQxLjE0Ni4xMjYuNjkgPT4gMjc3MjE4\n X-StarScan-Received: X-StarScan-Version: 8.84; banners=-,-,- X-VirusChecked: Checked Received: (qmail 15608 invoked from network); 19 Aug 2016 22:45:06 -0000 Received: from aserp1040.oracle.com (HELO aserp1040.oracle.com) (141.146.126.69) by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 19 Aug 2016 22:45:06 -0000 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7JMivHH013531 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 19 Aug 2016 22:44:57 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7JMiu3u003183 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 19 Aug 2016 22:44:57 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7JMitck017531; Fri, 19 Aug 2016 22:44:56 GMT Received: from olila.local.net-space.pl (/10.175.190.131) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 19 Aug 2016 15:44:55 -0700 From: Daniel Kiper To: xen-devel@lists.xenproject.org Date: Sat, 20 Aug 2016 00:43:20 +0200 Message-Id: <1471646606-28519-11-git-send-email-daniel.kiper@oracle.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1471646606-28519-1-git-send-email-daniel.kiper@oracle.com> References: <1471646606-28519-1-git-send-email-daniel.kiper@oracle.com> X-Source-IP: aserv0021.oracle.com [141.146.126.233] Cc: jgross@suse.com, sstabellini@kernel.org, andrew.cooper3@citrix.com, cardoe@cardoe.com, pgnet.dev@gmail.com, ning.sun@intel.com, david.vrabel@citrix.com, jbeulich@suse.com, qiaowei.ren@intel.com, gang.wei@intel.com, fu.wei@linaro.org Subject: [Xen-devel] [PATCH v5 10/16] efi: create efi_enabled() X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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 Signed-off-by: Daniel Kiper --- v5 - suggestions/fixes: - squash three patches into one (suggested by Jan Beulich), - introduce all features at once (suggested by Jan Beulich), - efi_enabled() returns bool_t instead of unsigned int (suggested by Jan Beulich), - update commit message. v4 - suggestions/fixes: - rename EFI_PLATFORM to EFI_BOOT (suggested by Jan Beulich), - move EFI_BOOT definition to efi struct definition (suggested by Jan Beulich), - remove unneeded efi.flags initialization (suggested by Jan Beulich), - use __set_bit() instead of set_bit() if possible (suggested by Jan Beulich), - do efi_enabled() cleanup (suggested by Jan Beulich), - improve comments (suggested by Jan Beulich), - improve commit message. v3 - suggestions/fixes: - define efi struct in xen/arch/x86/efi/stub.c in earlier patch (suggested by Jan Beulich), - improve comments (suggested by Jan Beulich), - improve commit message (suggested by Jan Beulich). --- xen/arch/x86/dmi_scan.c | 4 ++-- xen/arch/x86/domain_page.c | 2 +- xen/arch/x86/efi/stub.c | 7 ++++--- xen/arch/x86/mpparse.c | 4 ++-- xen/arch/x86/setup.c | 14 ++++++++------ xen/arch/x86/shutdown.c | 4 ++-- xen/arch/x86/time.c | 2 +- xen/common/efi/boot.c | 17 +++++++++++++---- xen/common/efi/runtime.c | 15 +++++++++------ xen/drivers/acpi/osl.c | 2 +- xen/include/xen/efi.h | 9 +++++++-- 11 files changed, 50 insertions(+), 30 deletions(-) diff --git a/xen/arch/x86/dmi_scan.c b/xen/arch/x86/dmi_scan.c index b049e31..8dcb640 100644 --- a/xen/arch/x86/dmi_scan.c +++ b/xen/arch/x86/dmi_scan.c @@ -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 diff --git a/xen/arch/x86/domain_page.c b/xen/arch/x86/domain_page.c index d86f8fe..7541b91 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_RS) && efi_rs_using_pgtables() ) return NULL; /* diff --git a/xen/arch/x86/efi/stub.c b/xen/arch/x86/efi/stub.c index 07c2bd0..f087023 100644 --- a/xen/arch/x86/efi/stub.c +++ b/xen/arch/x86/efi/stub.c @@ -4,9 +4,10 @@ #include #include -#ifndef efi_enabled -const bool_t efi_enabled = 0; -#endif +bool_t efi_enabled(int feature) +{ + return false; +} void __init efi_init_memory(void) { } diff --git a/xen/arch/x86/mpparse.c b/xen/arch/x86/mpparse.c index ef6557c..c3d5bdc 100644 --- a/xen/arch/x86/mpparse.c +++ b/xen/arch/x86/mpparse.c @@ -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; } diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 8ae897a..360ca59 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -439,8 +439,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) ) @@ -726,7 +726,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); @@ -739,8 +739,10 @@ void __init noreturn __start_xen(unsigned long mbi_p) l3_bootmap[l3_table_offset(BOOTSTRAP_MAP_BASE)] = l3e_from_paddr(__pa(l2_bootmap), __PAGE_HYPERVISOR); - memmap_type = loader; + memmap_type = "EFI"; } + else if ( efi_enabled(EFI_BOOT) ) + memmap_type = "EFI"; else if ( e820_raw_nr != 0 ) { memmap_type = "Xen-e820"; @@ -837,7 +839,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."); @@ -1078,7 +1080,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_BOOT) ? 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 972e20b..b429fd0 100644 --- a/xen/arch/x86/shutdown.c +++ b/xen/arch/x86/shutdown.c @@ -81,7 +81,7 @@ static void __init set_reboot_type(char *str) str++; } - if ( reboot_type == BOOT_EFI && !efi_enabled ) + if ( reboot_type == BOOT_EFI && !efi_enabled(EFI_RS) ) reboot_type = BOOT_INVALID; } custom_param("reboot", set_reboot_type); @@ -119,7 +119,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; } diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index b316f23..34f82cb 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -727,7 +727,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 ) diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c index 125c9ce..d7c484e 100644 --- a/xen/common/efi/boot.c +++ b/xen/common/efi/boot.c @@ -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,10 @@ static void __init parse_efi_param(char *s) *ss = '\0'; if ( !strcmp(s, "rs") ) - efi_rs_enable = val; + { + if ( !val ) + __clear_bit(EFI_RS, &efi_flags); + } else if ( !strcmp(s, "attr=uc") ) efi_map_uc = val; @@ -1254,7 +1263,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 +1337,7 @@ void __init efi_init_memory(void) } } - if ( !efi_rs_enable ) + if ( !efi_enabled(EFI_RS) ) { efi_fw_vendor = NULL; return; diff --git a/xen/common/efi/runtime.c b/xen/common/efi/runtime.c index c256814..6bffda0 100644 --- a/xen/common/efi/runtime.c +++ b/xen/common/efi/runtime.c @@ -10,12 +10,6 @@ DEFINE_XEN_GUEST_HANDLE(CHAR16); #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 # include @@ -43,6 +37,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 fields representing available EFI features/properties. */ +unsigned long efi_flags; + struct efi __read_mostly efi = { .acpi = EFI_INVALID_TABLE_ADDR, .acpi20 = EFI_INVALID_TABLE_ADDR, @@ -53,6 +50,12 @@ struct efi __read_mostly efi = { const struct efi_pci_rom *__read_mostly efi_pci_roms; +/* Test whether EFI_* bits are enabled. */ +bool_t efi_enabled(int feature) +{ + return test_bit(feature, &efi_flags); +} + #ifndef CONFIG_ARM /* TODO - disabled until implemented on ARM */ unsigned long efi_rs_enter(void) { diff --git a/xen/drivers/acpi/osl.c b/xen/drivers/acpi/osl.c index 9a49029..3616dfd 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_BOOT)) { 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..8372ae2 100644 --- a/xen/include/xen/efi.h +++ b/xen/include/xen/efi.h @@ -2,13 +2,17 @@ #define __XEN_EFI_H__ #ifndef __ASSEMBLY__ +#include #include #endif -extern const bool_t efi_enabled; - #define EFI_INVALID_TABLE_ADDR (~0UL) +extern unsigned long 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 +32,7 @@ union compat_pf_efi_info; struct xenpf_efi_runtime_call; struct compat_pf_efi_runtime_call; +bool_t efi_enabled(int feature); void efi_init_memory(void); bool_t efi_rs_using_pgtables(void); unsigned long efi_get_time(void);