Skip to content

Commit

Permalink
avoid EFIv2 runtime services on Apple x86 machines
Browse files Browse the repository at this point in the history
While booting a MacBookPro15,2 (the last Intel model, 2019), shim 15.8
gets stuck in RT->QueryVariableInfo().  Previously, these devices
shipped with EFI firmware version 1.10, and we had a quirk in place for
this (#364).  However, Apple updated the firmware to version 2.40, but
it still doesn't implement runtime services.

This patch adds a test for Apple as the vendor, and treats that as
equivalent to having an older major UEFI version.

Signed-off-by: Eduard Acatrinei <[email protected]>
  • Loading branch information
eduardacatrinei authored and vathpela committed Jan 15, 2025
1 parent 196cbb9 commit ad8692e
Showing 1 changed file with 17 additions and 1 deletion.
18 changes: 17 additions & 1 deletion mok.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,22 @@ typedef UINTN SIZE_T;
#define EFI_MAJOR_VERSION(tablep) ((UINT16)((((tablep)->Hdr.Revision) >> 16) & 0xfffful))
#define EFI_MINOR_VERSION(tablep) ((UINT16)(((tablep)->Hdr.Revision) & 0xfffful))

static BOOLEAN is_apple_firmware_vendor(void)
{
CHAR16 vendorbuf[100] = L"";
CHAR16 *vendor = ST->FirmwareVendor;
if (!vendor)
return FALSE;

CopyMem(vendorbuf, vendor, sizeof(vendorbuf) - sizeof(vendorbuf[0]));
dprint(L"FirmwareVendor: \"%s\"\n", vendorbuf);

if (StrnCmp(vendorbuf, L"Apple", 5) == 0)
return TRUE;

return FALSE;
}

static EFI_STATUS
get_max_var_sz(UINT32 attrs, SIZE_T *max_var_szp)
{
Expand All @@ -226,7 +242,7 @@ get_max_var_sz(UINT32 attrs, SIZE_T *max_var_szp)
uint64_t max_var_sz = 0;

*max_var_szp = 0;
if (EFI_MAJOR_VERSION(RT) < 2) {
if (EFI_MAJOR_VERSION(RT) < 2 || is_apple_firmware_vendor()) {
dprint(L"EFI %d.%d; no RT->QueryVariableInfo(). Using 1024!\n",
EFI_MAJOR_VERSION(RT), EFI_MINOR_VERSION(RT));
max_var_sz = remaining_sz = max_storage_sz = 1024;
Expand Down

0 comments on commit ad8692e

Please sign in to comment.