aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/xen/enlighten.c
diff options
context:
space:
mode:
authorDaniel Kiper <daniel.kiper@oracle.com>2014-06-30 13:53:02 -0400
committerMatt Fleming <matt.fleming@intel.com>2014-07-18 16:23:58 -0400
commitbe81c8a1da24288b0231be50130a64f5cdffdcd4 (patch)
treeb0e011366af28808fffc44e8de8ca690dd645ad0 /arch/x86/xen/enlighten.c
parentbf1e3ae468aca7ce34110a59ed5d1b877890014b (diff)
xen: Put EFI machinery in place
This patch enables EFI usage under Xen dom0. Standard EFI Linux Kernel infrastructure cannot be used because it requires direct access to EFI data and code. However, in dom0 case it is not possible because above mentioned EFI stuff is fully owned and controlled by Xen hypervisor. In this case all calls from dom0 to EFI must be requested via special hypercall which in turn executes relevant EFI code in behalf of dom0. When dom0 kernel boots it checks for EFI availability on a machine. If it is detected then artificial EFI system table is filled. Native EFI callas are replaced by functions which mimics them by calling relevant hypercall. Later pointer to EFI system table is passed to standard EFI machinery and it continues EFI subsystem initialization taking into account that there is no direct access to EFI boot services, runtime, tables, structures, etc. After that system runs as usual. This patch is based on Jan Beulich and Tang Liang work. Signed-off-by: Jan Beulich <jbeulich@suse.com> Signed-off-by: Tang Liang <liang.tang@oracle.com> Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com> Reviewed-by: David Vrabel <david.vrabel@citrix.com> Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'arch/x86/xen/enlighten.c')
-rw-r--r--arch/x86/xen/enlighten.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index f17b29210ac4..bc89647f0325 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -32,6 +32,7 @@
32#include <linux/gfp.h> 32#include <linux/gfp.h>
33#include <linux/memblock.h> 33#include <linux/memblock.h>
34#include <linux/edd.h> 34#include <linux/edd.h>
35#include <linux/efi.h>
35 36
36#include <xen/xen.h> 37#include <xen/xen.h>
37#include <xen/events.h> 38#include <xen/events.h>
@@ -1520,6 +1521,7 @@ asmlinkage __visible void __init xen_start_kernel(void)
1520{ 1521{
1521 struct physdev_set_iopl set_iopl; 1522 struct physdev_set_iopl set_iopl;
1522 int rc; 1523 int rc;
1524 efi_system_table_t *efi_systab_xen;
1523 1525
1524 if (!xen_start_info) 1526 if (!xen_start_info)
1525 return; 1527 return;
@@ -1715,6 +1717,19 @@ asmlinkage __visible void __init xen_start_kernel(void)
1715 1717
1716 xen_setup_runstate_info(0); 1718 xen_setup_runstate_info(0);
1717 1719
1720 efi_systab_xen = xen_efi_probe();
1721
1722 if (efi_systab_xen) {
1723 strncpy((char *)&boot_params.efi_info.efi_loader_signature, "Xen",
1724 sizeof(boot_params.efi_info.efi_loader_signature));
1725 boot_params.efi_info.efi_systab = (__u32)__pa(efi_systab_xen);
1726 boot_params.efi_info.efi_systab_hi = (__u32)(__pa(efi_systab_xen) >> 32);
1727
1728 set_bit(EFI_BOOT, &efi.flags);
1729 set_bit(EFI_PARAVIRT, &efi.flags);
1730 set_bit(EFI_64BIT, &efi.flags);
1731 }
1732
1718 /* Start the world */ 1733 /* Start the world */
1719#ifdef CONFIG_X86_32 1734#ifdef CONFIG_X86_32
1720 i386_start_kernel(); 1735 i386_start_kernel();