efi/boot.c makes a call to QueryVariableInfo on all systems. However,
as it is only promised for UEFI 2.0+ systems, pre-UEFI systems can
hang or crash on this call. The below patch adds a version check, a
technique used in other parts of the Xen EFI codebase.
Signed-off-by: Eric Shelton <eshelton@pobox.com>
diff -ur a/xen/xen/arch/x86/efi/boot.c b/xen/xen/arch/x86/efi/boot.c
--- a/xen/xen/arch/x86/efi/boot.c 2013-05-22 22:01:43.340000000 -0400
+++ b/xen/xen/arch/x86/efi/boot.c 2013-05-22 22:01:25.712000000 -0400
@@ -1241,12 +1241,20 @@
setup_efi_pci();
/* Get snapshot of variable store parameters. */
- status = efi_rs->QueryVariableInfo(EFI_VARIABLE_NON_VOLATILE |
- EFI_VARIABLE_BOOTSERVICE_ACCESS |
- EFI_VARIABLE_RUNTIME_ACCESS,
- &efi_boot_max_var_store_size,
- &efi_boot_remain_var_store_size,
- &efi_boot_max_var_size);
+ if ((efi_version >> 16) < 2)
+ {
+ status = EFI_INCOMPATIBLE_VERSION;
+ }
+ else
+ {
+ /* only available in UEFI ver 2.0+ */
+ status = efi_rs->QueryVariableInfo(EFI_VARIABLE_NON_VOLATILE |
+ EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ EFI_VARIABLE_RUNTIME_ACCESS,
+ &efi_boot_max_var_store_size,
+ &efi_boot_remain_var_store_size,
+ &efi_boot_max_var_size);
+ }
if ( EFI_ERROR(status) )
{
efi_boot_max_var_store_size = 0;