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>
50 lines
1.3 KiB
C
50 lines
1.3 KiB
C
#ifndef INCLUDE_XEN_OPS_H
|
|
#define INCLUDE_XEN_OPS_H
|
|
|
|
#include <linux/percpu.h>
|
|
#include <linux/notifier.h>
|
|
#include <linux/efi.h>
|
|
#include <asm/xen/interface.h>
|
|
|
|
DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu);
|
|
|
|
void xen_arch_pre_suspend(void);
|
|
void xen_arch_post_suspend(int suspend_cancelled);
|
|
|
|
void xen_timer_resume(void);
|
|
void xen_arch_resume(void);
|
|
|
|
void xen_resume_notifier_register(struct notifier_block *nb);
|
|
void xen_resume_notifier_unregister(struct notifier_block *nb);
|
|
|
|
int xen_setup_shutdown_event(void);
|
|
|
|
extern unsigned long *xen_contiguous_bitmap;
|
|
int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
|
|
unsigned int address_bits,
|
|
dma_addr_t *dma_handle);
|
|
|
|
void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order);
|
|
|
|
struct vm_area_struct;
|
|
int xen_remap_domain_mfn_range(struct vm_area_struct *vma,
|
|
unsigned long addr,
|
|
xen_pfn_t mfn, int nr,
|
|
pgprot_t prot, unsigned domid,
|
|
struct page **pages);
|
|
int xen_unmap_domain_mfn_range(struct vm_area_struct *vma,
|
|
int numpgs, struct page **pages);
|
|
|
|
bool xen_running_on_version_or_later(unsigned int major, unsigned int minor);
|
|
|
|
#ifdef CONFIG_XEN_EFI
|
|
extern efi_system_table_t *xen_efi_probe(void);
|
|
#else
|
|
static efi_system_table_t __init *xen_efi_probe(void)
|
|
{
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
#endif /* INCLUDE_XEN_OPS_H */
|