|
@@ -210,6 +210,9 @@ int __init efi_memblock_x86_reserve_range(void)
|
|
|
struct efi_info *e = &boot_params.efi_info;
|
|
|
unsigned long pmap;
|
|
|
|
|
|
+ if (efi_enabled(EFI_PARAVIRT))
|
|
|
+ return 0;
|
|
|
+
|
|
|
#ifdef CONFIG_X86_32
|
|
|
/* Can't handle data above 4GB at this time */
|
|
|
if (e->efi_memmap_hi) {
|
|
@@ -422,14 +425,24 @@ static int __init efi_runtime_init(void)
|
|
|
* the runtime services table so that we can grab the physical
|
|
|
* address of several of the EFI runtime functions, needed to
|
|
|
* set the firmware into virtual mode.
|
|
|
+ *
|
|
|
+ * When EFI_PARAVIRT is in force then we could not map runtime
|
|
|
+ * service memory region because we do not have direct access to it.
|
|
|
+ * However, runtime services are available through proxy functions
|
|
|
+ * (e.g. in case of Xen dom0 EFI implementation they call special
|
|
|
+ * hypercall which executes relevant EFI functions) and that is why
|
|
|
+ * they are always enabled.
|
|
|
*/
|
|
|
- if (efi_enabled(EFI_64BIT))
|
|
|
- rv = efi_runtime_init64();
|
|
|
- else
|
|
|
- rv = efi_runtime_init32();
|
|
|
|
|
|
- if (rv)
|
|
|
- return rv;
|
|
|
+ if (!efi_enabled(EFI_PARAVIRT)) {
|
|
|
+ if (efi_enabled(EFI_64BIT))
|
|
|
+ rv = efi_runtime_init64();
|
|
|
+ else
|
|
|
+ rv = efi_runtime_init32();
|
|
|
+
|
|
|
+ if (rv)
|
|
|
+ return rv;
|
|
|
+ }
|
|
|
|
|
|
set_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
|
|
|
|
@@ -438,6 +451,9 @@ static int __init efi_runtime_init(void)
|
|
|
|
|
|
static int __init efi_memmap_init(void)
|
|
|
{
|
|
|
+ if (efi_enabled(EFI_PARAVIRT))
|
|
|
+ return 0;
|
|
|
+
|
|
|
/* Map the EFI memory map */
|
|
|
memmap.map = early_memremap((unsigned long)memmap.phys_map,
|
|
|
memmap.nr_map * memmap.desc_size);
|
|
@@ -914,6 +930,9 @@ static void __init __efi_enter_virtual_mode(void)
|
|
|
|
|
|
void __init efi_enter_virtual_mode(void)
|
|
|
{
|
|
|
+ if (efi_enabled(EFI_PARAVIRT))
|
|
|
+ return;
|
|
|
+
|
|
|
if (efi_setup)
|
|
|
kexec_enter_virtual_mode();
|
|
|
else
|