diff options
| author | Peter Jones <pjones@redhat.com> | 2017-09-28 14:11:51 -0400 |
|---|---|---|
| committer | Peter Jones <pmjones@gmail.com> | 2018-03-12 16:21:43 -0400 |
| commit | 9fdca5bbe11e384198372b86a6b81d5d9e79fa16 (patch) | |
| tree | fd270546473ce1869fd315d29dc984dcd793d928 | |
| parent | 1c2376338d57c900fbc1c2fe6d9c30cfe20e44be (diff) | |
| download | efi-boot-shim-9fdca5bbe11e384198372b86a6b81d5d9e79fa16.tar.gz efi-boot-shim-9fdca5bbe11e384198372b86a6b81d5d9e79fa16.zip | |
Don't use uefi_call_wrapper(), ever.
I'm pretty done with typing uefi_call_wrapper() and counting arguments
every time. Instead, just make the compiler error if we don't have
ms_abi. Also, make it so nothing can use uefi_call_wrapper() directly.
Signed-off-by: Peter Jones <pjones@redhat.com>
| -rw-r--r-- | MokManager.c | 201 | ||||
| -rw-r--r-- | fallback.c | 134 | ||||
| -rw-r--r-- | httpboot.c | 83 | ||||
| -rw-r--r-- | include/hexdump.h | 4 | ||||
| -rw-r--r-- | include/replacements.h | 2 | ||||
| -rw-r--r-- | include/simple_file.h | 2 | ||||
| -rw-r--r-- | include/tpm.h | 1 | ||||
| -rw-r--r-- | lib/console.c | 64 | ||||
| -rw-r--r-- | lib/execute.c | 12 | ||||
| -rw-r--r-- | lib/security_policy.c | 27 | ||||
| -rw-r--r-- | lib/shell.c | 4 | ||||
| -rw-r--r-- | lib/simple_file.c | 66 | ||||
| -rw-r--r-- | lib/variables.c | 57 | ||||
| -rw-r--r-- | netboot.c | 9 | ||||
| -rw-r--r-- | replacements.c | 43 | ||||
| -rw-r--r-- | shim.c | 144 | ||||
| -rw-r--r-- | shim.h | 24 | ||||
| -rw-r--r-- | tpm.c | 30 |
18 files changed, 418 insertions, 489 deletions
diff --git a/MokManager.c b/MokManager.c index 5a7a2f64..6f54163f 100644 --- a/MokManager.c +++ b/MokManager.c @@ -731,31 +731,31 @@ done: static void console_save_and_set_mode(SIMPLE_TEXT_OUTPUT_MODE * SavedMode) { + SIMPLE_TEXT_OUTPUT_INTERFACE *co = ST->ConOut; + if (!SavedMode) { Print(L"Invalid parameter: SavedMode\n"); return; } - CopyMem(SavedMode, ST->ConOut->Mode, sizeof(SIMPLE_TEXT_OUTPUT_MODE)); - uefi_call_wrapper(ST->ConOut->EnableCursor, 2, ST->ConOut, FALSE); - uefi_call_wrapper(ST->ConOut->SetAttribute, 2, ST->ConOut, - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE); + CopyMem(SavedMode, co->Mode, sizeof(SIMPLE_TEXT_OUTPUT_MODE)); + co->EnableCursor(co, FALSE); + co->SetAttribute(co, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE); } static void console_restore_mode(SIMPLE_TEXT_OUTPUT_MODE * SavedMode) { - uefi_call_wrapper(ST->ConOut->EnableCursor, 2, ST->ConOut, - SavedMode->CursorVisible); - uefi_call_wrapper(ST->ConOut->SetCursorPosition, 3, ST->ConOut, - SavedMode->CursorColumn, SavedMode->CursorRow); - uefi_call_wrapper(ST->ConOut->SetAttribute, 2, ST->ConOut, - SavedMode->Attribute); + SIMPLE_TEXT_OUTPUT_INTERFACE *co = ST->ConOut; + + co->EnableCursor(co, SavedMode->CursorVisible); + co->SetCursorPosition(co, SavedMode->CursorColumn, + SavedMode->CursorRow); + co->SetAttribute(co, SavedMode->Attribute); } static INTN reset_system() { - uefi_call_wrapper(RT->ResetSystem, 4, EfiResetWarm, - EFI_SUCCESS, 0, NULL); + gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL); console_notify(L"Failed to reboot\n"); return -1; } @@ -876,12 +876,11 @@ static EFI_STATUS write_db(CHAR16 * db_name, void *MokNew, UINTN MokNewSize) UINTN old_size; UINTN new_size; - efi_status = uefi_call_wrapper(RT->SetVariable, 5, db_name, - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE - | EFI_VARIABLE_BOOTSERVICE_ACCESS - | EFI_VARIABLE_APPEND_WRITE, - MokNewSize, MokNew); + efi_status = gRT->SetVariable(db_name, &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_APPEND_WRITE, + MokNewSize, MokNew); if (!EFI_ERROR(efi_status) || efi_status != EFI_INVALID_PARAMETER) { return efi_status; } @@ -909,12 +908,10 @@ static EFI_STATUS write_db(CHAR16 * db_name, void *MokNew, UINTN MokNewSize) CopyMem(new_data, old_data, old_size); CopyMem(new_data + old_size, MokNew, MokNewSize); - efi_status = uefi_call_wrapper(RT->SetVariable, 5, db_name, - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, - new_size, new_data); - + efi_status = gRT->SetVariable(db_name, &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, + new_size, new_data); out: if (old_size > 0) { FreePool(old_data); @@ -946,10 +943,8 @@ static EFI_STATUS store_keys(void *MokNew, UINTN MokNewSize, int authenticate, } if (authenticate) { - efi_status = uefi_call_wrapper(RT->GetVariable, 5, auth_name, - &SHIM_LOCK_GUID, - &attributes, &auth_size, auth); - + efi_status = gRT->GetVariable(auth_name, &SHIM_LOCK_GUID, + &attributes, &auth_size, auth); if (EFI_ERROR(efi_status) || (auth_size != SHA256_DIGEST_SIZE && auth_size != PASSWORD_CRYPT_SIZE)) { @@ -975,12 +970,10 @@ static EFI_STATUS store_keys(void *MokNew, UINTN MokNewSize, int authenticate, if (!MokNewSize) { /* Delete MOK */ - efi_status = uefi_call_wrapper(RT->SetVariable, 5, db_name, - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE - | - EFI_VARIABLE_BOOTSERVICE_ACCESS, - 0, NULL); + efi_status = gRT->SetVariable(db_name, &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, + 0, NULL); } else { /* Write new MOK */ efi_status = write_db(db_name, MokNew, MokNewSize); @@ -1037,7 +1030,7 @@ static EFI_STATUS mok_reset_prompt(BOOLEAN MokX) EFI_STATUS efi_status; CHAR16 *prompt[] = { NULL, NULL }; - uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut); + ST->ConOut->ClearScreen(ST->ConOut); if (MokX) prompt[0] = L"Erase all stored keys in MokListX?"; @@ -1127,11 +1120,10 @@ static EFI_STATUS write_back_mok_list(MokListNode * list, INTN key_num, ptr = (uint8_t *) ptr + CertList->SignatureListSize; } - efi_status = uefi_call_wrapper(RT->SetVariable, 5, db_name, - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE - | EFI_VARIABLE_BOOTSERVICE_ACCESS, - DataSize, Data); + efi_status = gRT->SetVariable(db_name, &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, + DataSize, Data); if (Data) FreePool(Data); @@ -1276,9 +1268,8 @@ static EFI_STATUS delete_keys(void *MokDel, UINTN MokDelSize, BOOLEAN MokX) auth_name = L"MokDelAuth"; } - efi_status = uefi_call_wrapper(RT->GetVariable, 5, auth_name, - &SHIM_LOCK_GUID, - &attributes, &auth_size, auth); + efi_status = gRT->GetVariable(auth_name, &SHIM_LOCK_GUID, &attributes, + &auth_size, auth); if (EFI_ERROR(efi_status) || (auth_size != SHA256_DIGEST_SIZE && auth_size != PASSWORD_CRYPT_SIZE)) { @@ -1316,10 +1307,9 @@ static EFI_STATUS delete_keys(void *MokDel, UINTN MokDelSize, BOOLEAN MokX) err_strs[1] = L"Erase all keys in MokList!"; } console_alertbox(err_strs); - uefi_call_wrapper(RT->SetVariable, 5, db_name, - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, NULL); + gRT->SetVariable(db_name, &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, NULL); return EFI_ACCESS_DENIED; } @@ -1338,10 +1328,9 @@ static EFI_STATUS delete_keys(void *MokDel, UINTN MokDelSize, BOOLEAN MokX) err_strs[1] = L"Reset MokList!"; } console_alertbox(err_strs); - uefi_call_wrapper(RT->SetVariable, 5, db_name, - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, NULL); + gRT->SetVariable(db_name, &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, NULL); efi_status = EFI_ABORTED; goto error; } @@ -1474,7 +1463,7 @@ static EFI_STATUS mok_sb_prompt(void *MokSB, UINTN MokSBSize) return EFI_INVALID_PARAMETER; } - uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut); + ST->ConOut->ClearScreen(ST->ConOut); message[0] = L"Change Secure Boot state"; message[1] = NULL; @@ -1547,23 +1536,19 @@ static EFI_STATUS mok_sb_prompt(void *MokSB, UINTN MokSBSize) } if (var->MokSBState == 0) { - efi_status = uefi_call_wrapper(RT->SetVariable, - 5, L"MokSBState", - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, - 1, &sbval); + efi_status = gRT->SetVariable(L"MokSBState", &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, + 1, &sbval); if (EFI_ERROR(efi_status)) { console_notify(L"Failed to set Secure Boot state"); return efi_status; } } else { - efi_status = uefi_call_wrapper(RT->SetVariable, - 5, L"MokSBState", - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, - 0, NULL); + efi_status = gRT->SetVariable(L"MokSBState", &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, + 0, NULL); if (EFI_ERROR(efi_status)) { console_notify(L"Failed to delete Secure Boot state"); return efi_status; @@ -1593,7 +1578,7 @@ static EFI_STATUS mok_db_prompt(void *MokDB, UINTN MokDBSize) return EFI_INVALID_PARAMETER; } - uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut); + ST->ConOut->ClearScreen(ST->ConOut); message[0] = L"Change DB state"; message[1] = NULL; @@ -1666,23 +1651,19 @@ static EFI_STATUS mok_db_prompt(void *MokDB, UINTN MokDBSize) } if (var->MokDBState == 0) { - efi_status = uefi_call_wrapper(RT->SetVariable, - 5, L"MokDBState", - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, - 1, &dbval); + efi_status = gRT->SetVariable(L"MokDBState", &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, + 1, &dbval); if (EFI_ERROR(efi_status)) { console_notify(L"Failed to set DB state"); return efi_status; } } else { - efi_status = uefi_call_wrapper(RT->SetVariable, 5, - L"MokDBState", - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, - 0, NULL); + efi_status = gRT->SetVariable(L"MokDBState", &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, + 0, NULL); if (EFI_ERROR(efi_status)) { console_notify(L"Failed to delete DB state"); return efi_status; @@ -1705,7 +1686,7 @@ static EFI_STATUS mok_pw_prompt(void *MokPW, UINTN MokPWSize) return EFI_INVALID_PARAMETER; } - uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut); + ST->ConOut->ClearScreen(ST->ConOut); SetMem(hash, PASSWORD_CRYPT_SIZE, 0); @@ -1721,10 +1702,9 @@ static EFI_STATUS mok_pw_prompt(void *MokPW, UINTN MokPWSize) if (console_yes_no(clear_p) == 0) return EFI_ABORTED; - uefi_call_wrapper(RT->SetVariable, 5, L"MokPWStore", - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE - | EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, NULL); + gRT->SetVariable(L"MokPWStore", &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, NULL); goto mokpw_done; } @@ -1744,12 +1724,10 @@ static EFI_STATUS mok_pw_prompt(void *MokPW, UINTN MokPWSize) if (console_yes_no(set_p) == 0) return EFI_ABORTED; - efi_status = uefi_call_wrapper(RT->SetVariable, 5, - L"MokPWStore", - &SHIM_LOCK_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS, - MokPWSize, MokPW); + efi_status = gRT->SetVariable(L"MokPWStore", &SHIM_LOCK_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS, + MokPWSize, MokPW); if (EFI_ERROR(efi_status)) { console_notify(L"Failed to set MOK password"); return efi_status; @@ -1903,7 +1881,7 @@ static EFI_STATUS mok_hash_enroll(void) } simple_file_read_all(file, &filesize, &data); - simple_file_close(file); + file->Close(file); if (!filesize) { console_error(L"Unable to read file", efi_status); return EFI_BAD_BUFFER_SIZE; @@ -1988,7 +1966,7 @@ static EFI_STATUS mok_key_enroll(void) } simple_file_read_all(file, &filesize, &data); - simple_file_close(file); + file->Close(file); if (!filesize) { console_error(L"Unable to read file", efi_status); return EFI_BAD_BUFFER_SIZE; @@ -2011,9 +1989,8 @@ static BOOLEAN verify_pw(BOOLEAN * protected) *protected = FALSE; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, L"MokPWStore", - &SHIM_LOCK_GUID, &attributes, &size, - pwhash); + efi_status = gRT->GetVariable(L"MokPWStore", &SHIM_LOCK_GUID, &attributes, + &size, pwhash); /* * If anything can attack the password it could just set it to a * known value, so there's no safety advantage in failing to validate @@ -2026,7 +2003,7 @@ static BOOLEAN verify_pw(BOOLEAN * protected) if (attributes & EFI_VARIABLE_RUNTIME_ACCESS) return TRUE; - uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut); + ST->ConOut->ClearScreen(ST->ConOut); /* Draw the background */ console_save_and_set_mode(&SavedMode); @@ -2055,6 +2032,8 @@ static BOOLEAN verify_pw(BOOLEAN * protected) static int draw_countdown() { + SIMPLE_TEXT_OUTPUT_INTERFACE *co = ST->ConOut; + SIMPLE_INPUT_INTERFACE *ci = ST->ConIn; SIMPLE_TEXT_OUTPUT_MODE SavedMode; EFI_INPUT_KEY key; EFI_STATUS efi_status; @@ -2070,8 +2049,7 @@ static int draw_countdown() console_print_box_at(title, -1, 0, 0, -1, -1, 1, 1); - uefi_call_wrapper(ST->ConOut->QueryMode, 4, ST->ConOut, - ST->ConOut->Mode->Mode, &cols, &rows); + co->QueryMode(co, co->Mode->Mode, &cols, &rows); PrintAt((cols - StrLen(message)) / 2, rows / 2, message); while (1) { @@ -2082,11 +2060,10 @@ static int draw_countdown() PrintAt(2, rows - 3, L"Booting in %d second ", timeout); - efi_status = WaitForSingleEvent(ST->ConIn->WaitForKey, wait); + efi_status = WaitForSingleEvent(ci->WaitForKey, wait); if (efi_status != EFI_TIMEOUT) { /* Clear the key in the queue */ - uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, - ST->ConIn, &key); + ci->ReadKeyStroke(ci, &key); break; } @@ -2160,35 +2137,29 @@ static EFI_STATUS enter_mok_menu(EFI_HANDLE image_handle, UINT32 MokXAuth = 0; UINT32 MokXDelAuth = 0; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, L"MokAuth", - &SHIM_LOCK_GUID, - &attributes, &auth_size, auth); + efi_status = gRT->GetVariable(L"MokAuth", &SHIM_LOCK_GUID, + &attributes, &auth_size, auth); if (!EFI_ERROR(efi_status) && (auth_size == SHA256_DIGEST_SIZE || auth_size == PASSWORD_CRYPT_SIZE)) MokAuth = 1; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, - L"MokDelAuth", - &SHIM_LOCK_GUID, - &attributes, &auth_size, auth); + efi_status = gRT->GetVariable(L"MokDelAuth", &SHIM_LOCK_GUID, + &attributes, &auth_size, auth); if (!EFI_ERROR(efi_status) && (auth_size == SHA256_DIGEST_SIZE || auth_size == PASSWORD_CRYPT_SIZE)) MokDelAuth = 1; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, L"MokXAuth", - &SHIM_LOCK_GUID, - &attributes, &auth_size, auth); + efi_status = gRT->GetVariable(L"MokXAuth", &SHIM_LOCK_GUID, + &attributes, &auth_size, auth); if (!EFI_ERROR(efi_status) && (auth_size == SHA256_DIGEST_SIZE || auth_size == PASSWORD_CRYPT_SIZE)) MokXAuth = 1; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, - L"MokXDelAuth", - &SHIM_LOCK_GUID, - &attributes, &auth_size, auth); + efi_status = gRT->GetVariable(L"MokXDelAuth", &SHIM_LOCK_GUID, + &attributes, &auth_size, auth); if (!EFI_ERROR(efi_status) && (auth_size == SHA256_DIGEST_SIZE || auth_size == PASSWORD_CRYPT_SIZE)) @@ -2540,8 +2511,7 @@ static EFI_STATUS setup_rand(void) UINT64 seed; BOOLEAN status; - efi_status = uefi_call_wrapper(RT->GetTime, 2, &time, NULL); - + efi_status = gRT->GetTime(&time, NULL); if (EFI_ERROR(efi_status)) return efi_status; @@ -2551,7 +2521,6 @@ static EFI_STATUS setup_rand(void) ((UINT64) time.Daylight); status = RandomSeed((UINT8 *) & seed, sizeof(seed)); - if (!status) return EFI_ABORTED; @@ -101,7 +101,7 @@ get_file_size(EFI_FILE_HANDLE fh, UINTN *retsize) /* The API here is "Call it once with bs=0, it fills in bs, * then allocate a buffer and ask again to get it filled. */ - efi_status = uefi_call_wrapper(fh->GetInfo, 4, fh, &EFI_FILE_INFO_GUID, &bs, NULL); + efi_status = fh->GetInfo(fh, &EFI_FILE_INFO_GUID, &bs, NULL); if (EFI_ERROR(efi_status) && efi_status != EFI_BUFFER_TOO_SMALL) return efi_status; if (bs == 0) @@ -112,7 +112,7 @@ get_file_size(EFI_FILE_HANDLE fh, UINTN *retsize) Print(L"Could not allocate memory\n"); return EFI_OUT_OF_RESOURCES; } - efi_status = uefi_call_wrapper(fh->GetInfo, 4, fh, &EFI_FILE_INFO_GUID, &bs, buffer); + efi_status = fh->GetInfo(fh, &EFI_FILE_INFO_GUID, &bs, buffer); /* This checks *either* the error from the first GetInfo, if it isn't * the EFI_BUFFER_TOO_SMALL we're expecting, or the second GetInfo * call in *any* case. */ @@ -134,8 +134,7 @@ read_file(EFI_FILE_HANDLE fh, CHAR16 *fullpath, CHAR16 **buffer, UINT64 *bs) EFI_FILE_HANDLE fh2; EFI_STATUS efi_status; - efi_status = uefi_call_wrapper(fh->Open, 5, fh, &fh2, fullpath, - EFI_FILE_READ_ONLY, 0); + efi_status = fh->Open(fh, &fh2, fullpath, EFI_FILE_READ_ONLY, 0); if (EFI_ERROR(efi_status)) { Print(L"Couldn't open \"%s\": %r\n", fullpath, efi_status); return efi_status; @@ -147,32 +146,32 @@ read_file(EFI_FILE_HANDLE fh, CHAR16 *fullpath, CHAR16 **buffer, UINT64 *bs) if (EFI_ERROR(efi_status)) { Print(L"Could not get file size for \"%s\": %r\n", fullpath, efi_status); - uefi_call_wrapper(fh2->Close, 1, fh2); + fh2->Close(fh2); return efi_status; } if (len > 1024 * PAGE_SIZE) { - uefi_call_wrapper(fh2->Close, 1, fh2); + fh2->Close(fh2); return EFI_BAD_BUFFER_SIZE; } b = AllocateZeroPool(len + 2); if (!buffer) { Print(L"Could not allocate memory\n"); - uefi_call_wrapper(fh2->Close, 1, fh2); + fh2->Close(fh2); return EFI_OUT_OF_RESOURCES; } - efi_status = uefi_call_wrapper(fh->Read, 3, fh, &len, b); + efi_status = fh->Read(fh, &len, b); if (EFI_ERROR(efi_status)) { FreePool(buffer); - uefi_call_wrapper(fh2->Close, 1, fh2); + fh2->Close(fh2); Print(L"Could not read file: %r\n", efi_status); return efi_status; } *buffer = b; *bs = len; - uefi_call_wrapper(fh2->Close, 1, fh2); + fh2->Close(fh2); return EFI_SUCCESS; } @@ -251,12 +250,11 @@ add_boot_option(EFI_DEVICE_PATH *hddp, EFI_DEVICE_PATH *fulldp, first_new_option_size = StrLen(arguments) * sizeof (CHAR16); } - efi_status = uefi_call_wrapper(RT->SetVariable, 5, - varname, &GV_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - size, data); + efi_status = gRT->SetVariable(varname, &GV_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + size, data); FreePool(data); @@ -433,9 +431,8 @@ find_boot_option(EFI_DEVICE_PATH *dp, EFI_DEVICE_PATH *fulldp, varname[7] = hexmap[(bootorder[i] & 0x000f) >> 0]; UINTN candidate_size = max_candidate_size; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, varname, - &GV_GUID, NULL, - &candidate_size, candidate); + efi_status = gRT->GetVariable(varname, &GV_GUID, NULL, + &candidate_size, candidate); if (EFI_ERROR(efi_status)) continue; @@ -500,16 +497,15 @@ update_boot_order(void) for (j = 0 ; j < size / sizeof (CHAR16); j++) VerbosePrintUnprefixed(L"%04x ", newbootorder[j]); Print(L"\n"); - efi_status = uefi_call_wrapper(RT->GetVariable, 5, L"BootOrder", - &GV_GUID, NULL, &len, NULL); + efi_status = gRT->GetVariable(L"BootOrder", &GV_GUID, NULL, &len, NULL); if (efi_status == EFI_BUFFER_TOO_SMALL) LibDeleteVariable(L"BootOrder", &GV_GUID); - efi_status = uefi_call_wrapper(RT->SetVariable, 5, L"BootOrder", &GV_GUID, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - size, newbootorder); + efi_status = gRT->SetVariable(L"BootOrder", &GV_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + size, newbootorder); FreePool(newbootorder); return efi_status; } @@ -697,7 +693,7 @@ find_boot_csv(EFI_FILE_HANDLE fh, CHAR16 *dirname) /* The API here is "Call it once with bs=0, it fills in bs, * then allocate a buffer and ask again to get it filled. */ - efi_status = uefi_call_wrapper(fh->GetInfo, 4, fh, &EFI_FILE_INFO_GUID, &bs, NULL); + efi_status = fh->GetInfo(fh, &EFI_FILE_INFO_GUID, &bs, NULL); if (EFI_ERROR(efi_status) && efi_status != EFI_BUFFER_TOO_SMALL) { Print(L"Could not get directory info for \\EFI\\%s\\: %r\n", dirname, efi_status); @@ -712,7 +708,7 @@ find_boot_csv(EFI_FILE_HANDLE fh, CHAR16 *dirname) return EFI_OUT_OF_RESOURCES; } - efi_status = uefi_call_wrapper(fh->GetInfo, 4, fh, &EFI_FILE_INFO_GUID, &bs, buffer); + efi_status = fh->GetInfo(fh, &EFI_FILE_INFO_GUID, &bs, buffer); /* This checks *either* the error from the first GetInfo, if it isn't * the EFI_BUFFER_TOO_SMALL we're expecting, or the second GetInfo * call in *any* case. */ @@ -737,7 +733,7 @@ find_boot_csv(EFI_FILE_HANDLE fh, CHAR16 *dirname) bs = 0; do { bs = 0; - efi_status = uefi_call_wrapper(fh->Read, 3, fh, &bs, NULL); + efi_status = fh->Read(fh, &bs, NULL); if (EFI_ERROR(efi_status) && efi_status != EFI_BUFFER_TOO_SMALL) { Print(L"Could not read \\EFI\\%s\\: %r\n", dirname, @@ -755,7 +751,7 @@ find_boot_csv(EFI_FILE_HANDLE fh, CHAR16 *dirname) return EFI_OUT_OF_RESOURCES; } - efi_status = uefi_call_wrapper(fh->Read, 3, fh, &bs, buffer); + efi_status = fh->Read(fh, &bs, buffer); if (EFI_ERROR(efi_status)) { Print(L"Could not read \\EFI\\%s\\: %r\n", dirname, efi_status); @@ -782,15 +778,14 @@ find_boot_csv(EFI_FILE_HANDLE fh, CHAR16 *dirname) efi_status = EFI_SUCCESS; if (bootarchcsv) { EFI_FILE_HANDLE fh2; - efi_status = uefi_call_wrapper(fh->Open, 5, fh, &fh2, - bootarchcsv, - EFI_FILE_READ_ONLY, 0); + efi_status = fh->Open(fh, &fh2, bootarchcsv, + EFI_FILE_READ_ONLY, 0); if (EFI_ERROR(efi_status) || fh2 == NULL) { Print(L"Couldn't open \\EFI\\%s\\%s: %r\n", dirname, bootarchcsv, efi_status); } else { efi_status = try_boot_csv(fh2, dirname, bootarchcsv); - uefi_call_wrapper(fh2->Close, 1, fh2); + fh2->Close(fh2); if (EFI_ERROR(efi_status)) Print(L"Could not process \\EFI\\%s\\%s: %r\n", dirname, bootarchcsv, efi_status); @@ -798,14 +793,14 @@ find_boot_csv(EFI_FILE_HANDLE fh, CHAR16 *dirname) } if ((EFI_ERROR(efi_status) || !bootarchcsv) && bootcsv) { EFI_FILE_HANDLE fh2; - efi_status = uefi_call_wrapper(fh->Open, 5, fh, &fh2, - bootcsv, EFI_FILE_READ_ONLY, 0); + efi_status = fh->Open(fh, &fh2, bootcsv, + EFI_FILE_READ_ONLY, 0); if (EFI_ERROR(efi_status) || fh2 == NULL) { Print(L"Couldn't open \\EFI\\%s\\%s: %r\n", dirname, bootcsv, efi_status); } else { efi_status = try_boot_csv(fh2, dirname, bootcsv); - uefi_call_wrapper(fh2->Close, 1, fh2); + fh2->Close(fh2); if (EFI_ERROR(efi_status)) Print(L"Could not process \\EFI\\%s\\%s: %r\n", dirname, bootarchcsv, efi_status); @@ -820,8 +815,8 @@ find_boot_options(EFI_HANDLE device) EFI_STATUS efi_status; EFI_FILE_IO_INTERFACE *fio = NULL; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, device, - &FileSystemProtocol, (void **)&fio); + efi_status = gBS->HandleProtocol(device, &FileSystemProtocol, + (void **) &fio); if (EFI_ERROR(efi_status)) { Print(L"Couldn't find file system: %r\n", efi_status); return efi_status; @@ -831,25 +826,24 @@ find_boot_options(EFI_HANDLE device) * *no idea* what frees the memory allocated here. Hopefully * Close() does. */ EFI_FILE_HANDLE fh = NULL; - efi_status = uefi_call_wrapper(fio->OpenVolume, 2, fio, &fh); + efi_status = fio->OpenVolume(fio, &fh); if (EFI_ERROR(efi_status) || fh == NULL) { Print(L"Couldn't open file system: %r\n", efi_status); return efi_status; } EFI_FILE_HANDLE fh2 = NULL; - efi_status = uefi_call_wrapper(fh->Open, 5, fh, &fh2, L"EFI", - EFI_FILE_READ_ONLY, 0); + efi_status = fh->Open(fh, &fh2, L"EFI", EFI_FILE_READ_ONLY, 0); if (EFI_ERROR(efi_status) || fh2 == NULL) { Print(L"Couldn't open EFI: %r\n", efi_status); - uefi_call_wrapper(fh->Close, 1, fh); + fh->Close(fh); return efi_status; } - efi_status = uefi_call_wrapper(fh2->SetPosition, 2, fh2, 0); + efi_status = fh2->SetPosition(fh2, 0); if (EFI_ERROR(efi_status)) { Print(L"Couldn't set file position: %r\n", efi_status); - uefi_call_wrapper(fh2->Close, 1, fh2); - uefi_call_wrapper(fh->Close, 1, fh); + fh2->Close(fh2); + fh->Close(fh); return efi_status; } @@ -857,7 +851,7 @@ find_boot_options(EFI_HANDLE device) UINTN bs; do { bs = 0; - efi_status = uefi_call_wrapper(fh2->Read, 3, fh2, &bs, NULL); + efi_status = fh2->Read(fh2, &bs, NULL); if (EFI_ERROR(efi_status) && efi_status != EFI_BUFFER_TOO_SMALL) { Print(L"Could not read \\EFI\\: %r\n", efi_status); return efi_status; @@ -869,19 +863,19 @@ find_boot_options(EFI_HANDLE device) if (!buffer) { Print(L"Could not allocate memory\n"); /* sure, this might work, why not? */ - uefi_call_wrapper(fh2->Close, 1, fh2); - uefi_call_wrapper(fh->Close, 1, fh); + fh2->Close(fh2); + fh->Close(fh); return EFI_OUT_OF_RESOURCES; } - efi_status = uefi_call_wrapper(fh2->Read, 3, fh2, &bs, buffer); + efi_status = fh2->Read(fh2, &bs, buffer); if (EFI_ERROR(efi_status)) { if (buffer) { FreePool(buffer); buffer = NULL; } - uefi_call_wrapper(fh2->Close, 1, fh2); - uefi_call_wrapper(fh->Close, 1, fh); + fh2->Close(fh2); + fh->Close(fh); return efi_status; } EFI_FILE_INFO *fi = buffer; @@ -901,8 +895,8 @@ find_boot_options(EFI_HANDLE device) VerbosePrint(L"Found directory named \"%s\"\n", fi->FileName); EFI_FILE_HANDLE fh3; - efi_status = uefi_call_wrapper(fh->Open, 5, fh2, &fh3, fi->FileName, - EFI_FILE_READ_ONLY, 0); + efi_status = fh2->Open(fh2, &fh3, fi->FileName, + EFI_FILE_READ_ONLY, 0); if (EFI_ERROR(efi_status)) { Print(L"%d Couldn't open %s: %r\n", __LINE__, fi->FileName, efi_status); FreePool(buffer); @@ -911,7 +905,7 @@ find_boot_options(EFI_HANDLE device) } efi_status = find_boot_csv(fh3, fi->FileName); - uefi_call_wrapper(fh3->Close, 1, fh3); + fh3->Close(fh3); FreePool(buffer); buffer = NULL; if (efi_status == EFI_OUT_OF_RESOURCES) @@ -922,8 +916,8 @@ find_boot_options(EFI_HANDLE device) if (!EFI_ERROR(efi_status) && nbootorder > 0) efi_status = update_boot_order(); - uefi_call_wrapper(fh2->Close, 1, fh2); - uefi_call_wrapper(fh->Close, 1, fh); + fh2->Close(fh2); + fh->Close(fh); return efi_status; } @@ -937,9 +931,8 @@ try_start_first_option(EFI_HANDLE parent_image_handle) return EFI_SUCCESS; } - efi_status = uefi_call_wrapper(BS->LoadImage, 6, 0, - parent_image_handle, first_new_option, - NULL, 0, &image_handle); + efi_status = gBS->LoadImage(0, parent_image_handle, first_new_option, + NULL, 0, &image_handle); if (EFI_ERROR(efi_status)) { CHAR16 *dps = DevicePathToStr(first_new_option); UINTN s = DevicePathSize(first_new_option); @@ -953,23 +946,22 @@ try_start_first_option(EFI_HANDLE parent_image_handle) } Print(L"\n"); - uefi_call_wrapper(BS->Stall, 1, 500000000); + msleep(500000000); return efi_status; } EFI_LOADED_IMAGE *image; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, image_handle, - &LoadedImageProtocol, (void *)&image); + efi_status = gBS->HandleProtocol(image_handle, &LoadedImageProtocol, + (void *) &image); if (!EFI_ERROR(efi_status)) { image->LoadOptions = first_new_option_args; image->LoadOptionsSize = first_new_option_size; } - efi_status = uefi_call_wrapper(BS->StartImage, 3, image_handle, - NULL, NULL); + efi_status = gBS->StartImage(image_handle, NULL, NULL); if (EFI_ERROR(efi_status)) { Print(L"StartImage failed: %r\n", efi_status); - uefi_call_wrapper(BS->Stall, 1, 500000000); + msleep(500000000); } return efi_status; } @@ -1014,9 +1006,8 @@ efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) */ debug_hook(); - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, image, - &LoadedImageProtocol, - (void *)&this_image); + efi_status = gBS->HandleProtocol(image, &LoadedImageProtocol, + (void *) &this_image); if (EFI_ERROR(efi_status)) { Print(L"Error: could not find loaded image: %r\n", efi_status); return efi_status; @@ -1044,11 +1035,10 @@ efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) if (get_fallback_verbose()) { Print(L"Verbose enabled, sleeping for half a second\n"); - uefi_call_wrapper(BS->Stall, 1, 500000); + msleep(500000); } - uefi_call_wrapper(RT->ResetSystem, 4, EfiResetCold, - EFI_SUCCESS, 0, NULL); + gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); return EFI_SUCCESS; } @@ -266,9 +266,9 @@ get_nic_handle (EFI_MAC_ADDRESS *mac) /* Get the list of handles that support the HTTP service binding protocol */ - efi_status = uefi_call_wrapper(BS->LocateHandleBuffer, 5, ByProtocol, - &EFI_HTTP_BINDING_GUID, NULL, &NoHandles, - &buffer); + efi_status = gBS->LocateHandleBuffer(ByProtocol, + &EFI_HTTP_BINDING_GUID, + NULL, &NoHandles, &buffer); if (EFI_ERROR(efi_status)) return NULL; @@ -326,17 +326,16 @@ set_ip6(EFI_HANDLE *nic, IPv6_DEVICE_PATH *ip6node) EFI_IPv6_ADDRESS gateway; EFI_STATUS efi_status; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, nic, - &EFI_IP6_CONFIG_GUID, (VOID **)&ip6cfg); + efi_status = gBS->HandleProtocol(nic, &EFI_IP6_CONFIG_GUID, + (VOID **)&ip6cfg); if (EFI_ERROR(efi_status)) return efi_status; ip6.Address = ip6node->LocalIpAddress; ip6.PrefixLength = ip6node->PrefixLength; ip6.IsAnycast = FALSE; - efi_status = uefi_call_wrapper(ip6cfg->SetData, 4, ip6cfg, - Ip6ConfigDataTypeManualAddress, - sizeof(ip6), &ip6); + efi_status = ip6cfg->SetData(ip6cfg, Ip6ConfigDataTypeManualAddress, + sizeof(ip6), &ip6); if (EFI_ERROR(efi_status)) return efi_status; @@ -344,9 +343,8 @@ set_ip6(EFI_HANDLE *nic, IPv6_DEVICE_PATH *ip6node) if (is_unspecified_addr(gateway)) return EFI_SUCCESS; - efi_status = uefi_call_wrapper(ip6cfg->SetData, 4, ip6cfg, - Ip6ConfigDataTypeGateway, - sizeof(gateway), &gateway); + efi_status = ip6cfg->SetData(ip6cfg, Ip6ConfigDataTypeGateway, + sizeof(gateway), &gateway); if (EFI_ERROR(efi_status)) return efi_status; @@ -361,25 +359,21 @@ set_ip4(EFI_HANDLE *nic, IPv4_DEVICE_PATH *ip4node) EFI_IPv4_ADDRESS gateway; EFI_STATUS efi_status; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, nic, - &EFI_IP4_CONFIG2_GUID, - (VOID **)&ip4cfg2); + efi_status = gBS->HandleProtocol(nic, &EFI_IP4_CONFIG2_GUID, + (VOID **)&ip4cfg2); if (EFI_ERROR(efi_status)) return efi_status; ip4.Address = ip4node->LocalIpAddress; ip4.SubnetMask = ip4node->SubnetMask; - efi_status = uefi_call_wrapper(ip4cfg2->SetData, 4, ip4cfg2, - Ip4Config2DataTypeManualAddress, - sizeof(ip4), &ip4); + efi_status = ip4cfg2->SetData(ip4cfg2, Ip4Config2DataTypeManualAddress, + sizeof(ip4), &ip4); if (EFI_ERROR(efi_status)) return efi_status; gateway = ip4node->GatewayIpAddress; - efi_status = uefi_call_wrapper(ip4cfg2->SetData, 4, ip4cfg2, - Ip4Config2DataTypeGateway, - sizeof(gateway), - &gateway); + efi_status = ip4cfg2->SetData(ip4cfg2, Ip4Config2DataTypeGateway, + sizeof(gateway), &gateway); if (EFI_ERROR(efi_status)) return efi_status; @@ -416,7 +410,7 @@ configure_http (EFI_HTTP_PROTOCOL *http, BOOLEAN is_ip6) http_mode.AccessPoint.IPv6Node = &ip6node; } - return uefi_call_wrapper(http->Configure, 2, http, &http_mode); + return http->Configure(http, &http_mode); } static EFI_STATUS @@ -457,9 +451,9 @@ send_http_request (EFI_HTTP_PROTOCOL *http, CHAR8 *hostname, CHAR8 *uri) tx_token.Message = &tx_message; tx_token.Event = NULL; request_done = FALSE; - efi_status = uefi_call_wrapper(BS->CreateEvent, 5, EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, httpnotify, &request_done, - &tx_token.Event); + efi_status = gBS->CreateEvent(EVT_NOTIFY_SIGNAL, TPL_NOTIFY, + httpnotify, &request_done, + &tx_token.Event); if (EFI_ERROR(efi_status)) { perror(L"Failed to Create Event for HTTP request: %r\n", efi_status); @@ -467,7 +461,7 @@ send_http_request (EFI_HTTP_PROTOCOL *http, CHAR8 *hostname, CHAR8 *uri) } /* Send out the request */ - efi_status = uefi_call_wrapper(http->Request, 2, http, &tx_token); + efi_status = http->Request(http, &tx_token); if (EFI_ERROR(efi_status)) { perror(L"HTTP request failed: %r\n", efi_status); goto error; @@ -475,7 +469,7 @@ send_http_request (EFI_HTTP_PROTOCOL *http, CHAR8 *hostname, CHAR8 *uri) /* Wait for the response */ while (!request_done) - uefi_call_wrapper(http->Poll, 1, http); + http->Poll(http); if (EFI_ERROR(tx_token.Status)) { perror(L"HTTP request: %r\n", tx_token.Status); @@ -483,7 +477,7 @@ send_http_request (EFI_HTTP_PROTOCOL *http, CHAR8 *hostname, CHAR8 *uri) } error: - event_status = uefi_call_wrapper(BS->CloseEvent, 1, tx_token.Event); + event_status = gBS->CloseEvent(tx_token.Event); if (EFI_ERROR(event_status)) { perror(L"Failed to close Event for HTTP request: %r\n", event_status); @@ -521,9 +515,9 @@ receive_http_response(EFI_HTTP_PROTOCOL *http, VOID **buffer, UINT64 *buf_size) rx_token.Message = &rx_message; rx_token.Event = NULL; response_done = FALSE; - efi_status = uefi_call_wrapper(BS->CreateEvent, 5, EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, httpnotify, &response_done, - &rx_token.Event); + efi_status = gBS->CreateEvent(EVT_NOTIFY_SIGNAL, TPL_NOTIFY, + httpnotify, &response_done, + &rx_token.Event); if (EFI_ERROR(efi_status)) { perror(L"Failed to Create Event for HTTP response: %r\n", efi_status); @@ -531,7 +525,7 @@ receive_http_response(EFI_HTTP_PROTOCOL *http, VOID **buffer, UINT64 *buf_size) } /* Notify the firmware to receive the HTTP messages */ - efi_status = uefi_call_wrapper(http->Response, 2, http, &rx_token); + efi_status = http->Response(http, &rx_token); if (EFI_ERROR(efi_status)) { perror(L"HTTP response failed: %r\n", efi_status); goto error; @@ -539,7 +533,7 @@ receive_http_response(EFI_HTTP_PROTOCOL *http, VOID **buffer, UINT64 *buf_size) /* Wait for the response */ while (!response_done) - uefi_call_wrapper(http->Poll, 1, http); + http->Poll(http); if (EFI_ERROR(rx_token.Status)) { perror(L"HTTP response: %r\n", rx_token.Status); @@ -592,15 +586,14 @@ receive_http_response(EFI_HTTP_PROTOCOL *http, VOID **buffer, UINT64 *buf_size) rx_token.Status = EFI_NOT_READY; response_done = FALSE; - efi_status = uefi_call_wrapper(http->Response, 2, http, - &rx_token); + efi_status = http->Response(http, &rx_token); if (EFI_ERROR(efi_status)) { perror(L"HTTP response failed: %r\n", efi_status); goto error; } while (!response_done) - uefi_call_wrapper(http->Poll, 1, http); + http->Poll(http); if (EFI_ERROR(rx_token.Status)) { perror(L"HTTP response: %r\n", rx_token.Status); @@ -619,7 +612,7 @@ receive_http_response(EFI_HTTP_PROTOCOL *http, VOID **buffer, UINT64 *buf_size) } error: - event_status = uefi_call_wrapper(BS->CloseEvent, 1, rx_token.Event); + event_status = gBS->CloseEvent(rx_token.Event); if (EFI_ERROR(event_status)) { perror(L"Failed to close Event for HTTP response: %r\n", event_status); @@ -647,9 +640,8 @@ http_fetch (EFI_HANDLE image, EFI_HANDLE device, *buf_size = 0; /* Open HTTP Service Binding Protocol */ - efi_status = uefi_call_wrapper(BS->OpenProtocol, 6, device, - &EFI_HTTP_BINDING_GUID, (VOID **)&service, - image, NULL, + efi_status = gBS->OpenProtocol(device, &EFI_HTTP_BINDING_GUID, + (VOID **) &service, image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(efi_status)) return efi_status; @@ -657,14 +649,13 @@ http_fetch (EFI_HANDLE image, EFI_HANDLE device, /* Create the ChildHandle from the Service Binding */ /* Set the handle to NULL to request a new handle */ http_handle = NULL; - efi_status = uefi_call_wrapper(service->CreateChild, 2, service, - &http_handle); + efi_status = service->CreateChild(service, &http_handle); if (EFI_ERROR(efi_status)) return efi_status; /* Get the http protocol */ - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, http_handle, - &EFI_HTTP_PROTOCOL_GUID, (VOID **)&http); + efi_status = gBS->HandleProtocol(http_handle, &EFI_HTTP_PROTOCOL_GUID, + (VOID **) &http); if (EFI_ERROR(efi_status)) { perror(L"Failed to get http\n"); goto error; @@ -689,9 +680,7 @@ http_fetch (EFI_HANDLE image, EFI_HANDLE device, } error: - child_status = uefi_call_wrapper(service->DestroyChild, 2, service, - http_handle); - + child_status = service->DestroyChild(service, http_handle); if (EFI_ERROR(efi_status)) { return efi_status; } else if (EFI_ERROR(child_status)) { diff --git a/include/hexdump.h b/include/hexdump.h index c4ffcaec..df3a17a4 100644 --- a/include/hexdump.h +++ b/include/hexdump.h @@ -90,11 +90,11 @@ hexdump(UINT8 *data, UINTN size) sz = format_hex(data+offset, size-offset, hexbuf); if (sz == 0) return; - uefi_call_wrapper(BS->Stall, 1, 200000); + msleep(200000); format_text(data+offset, size-offset, txtbuf); Print(L"%08x %s %s\n", display_offset, hexbuf, txtbuf); - uefi_call_wrapper(BS->Stall, 1, 200000); + msleep(200000); display_offset += sz; offset += sz; diff --git a/include/replacements.h b/include/replacements.h index 5873a720..ab2a5a58 100644 --- a/include/replacements.h +++ b/include/replacements.h @@ -29,6 +29,8 @@ #ifndef SHIM_REPLACEMENTS_H #define SHIM_REPLACEMENTS_H +extern EFI_SYSTEM_TABLE *get_active_systab(void); + typedef enum { VERIFIED_BY_NOTHING, VERIFIED_BY_CERT, diff --git a/include/simple_file.h b/include/simple_file.h index 8d25a761..7b019654 100644 --- a/include/simple_file.h +++ b/include/simple_file.h @@ -9,8 +9,6 @@ EFI_STATUS simple_file_read_all(EFI_FILE *file, UINTN *size, void **buffer); EFI_STATUS simple_file_write_all(EFI_FILE *file, UINTN size, void *buffer); -void -simple_file_close(EFI_FILE *file); EFI_STATUS simple_dir_read_all(EFI_HANDLE image, CHAR16 *name, EFI_FILE_INFO **Entries, int *count); diff --git a/include/tpm.h b/include/tpm.h index 38642390..746e871f 100644 --- a/include/tpm.h +++ b/include/tpm.h @@ -188,3 +188,4 @@ typedef UINT32 TCG_EVENTTYPE; #define PE_COFF_IMAGE 0x0000000000000010 #endif /* SHIM_TPM_H */ +// vim:fenc=utf-8:tw=75 diff --git a/lib/console.c b/lib/console.c index d2081ffd..50687ea4 100644 --- a/lib/console.c +++ b/lib/console.c @@ -38,14 +38,13 @@ SetMem16(CHAR16 *dst, UINT32 n, CHAR16 c) EFI_STATUS console_get_keystroke(EFI_INPUT_KEY *key) { + SIMPLE_INPUT_INTERFACE *ci = ST->ConIn; UINTN EventIndex; EFI_STATUS efi_status; do { - uefi_call_wrapper(BS->WaitForEvent, 3, 1, - &ST->ConIn->WaitForKey, &EventIndex); - efi_status = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, - 2, ST->ConIn, key); + gBS->WaitForEvent(1, &ci->WaitForKey, &EventIndex); + efi_status = ci->ReadKeyStroke(ci, key); } while (efi_status == EFI_NOT_READY); return efi_status; @@ -65,7 +64,7 @@ console_print_box_at(CHAR16 *str_arr[], int highlight, if (lines == 0) return; - uefi_call_wrapper(co->QueryMode, 4, co, co->Mode->Mode, &cols, &rows); + co->QueryMode(co, co->Mode->Mode, &cols, &rows); /* last row on screen is unusable without scrolling, so ignore it */ rows--; @@ -108,8 +107,8 @@ console_print_box_at(CHAR16 *str_arr[], int highlight, Line[0] = BOXDRAW_DOWN_RIGHT; Line[size_cols - 1] = BOXDRAW_DOWN_LEFT; Line[size_cols] = L'\0'; - uefi_call_wrapper(co->SetCursorPosition, 3, co, start_col, start_row); - uefi_call_wrapper(co->OutputString, 2, co, Line); + co->SetCursorPosition(co, start_col, start_row); + co->OutputString(co, Line); int start; if (offset == 0) @@ -140,19 +139,21 @@ console_print_box_at(CHAR16 *str_arr[], int highlight, CopyMem(Line + col + 1, s, min(len, size_cols - 2)*2); } if (line >= 0 && line == highlight) - uefi_call_wrapper(co->SetAttribute, 2, co, EFI_LIGHTGRAY | EFI_BACKGROUND_BLACK); - uefi_call_wrapper(co->SetCursorPosition, 3, co, start_col, i); - uefi_call_wrapper(co->OutputString, 2, co, Line); + co->SetAttribute(co, EFI_LIGHTGRAY | + EFI_BACKGROUND_BLACK); + co->SetCursorPosition(co, start_col, i); + co->OutputString(co, Line); if (line >= 0 && line == highlight) - uefi_call_wrapper(co->SetAttribute, 2, co, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE); + co->SetAttribute(co, EFI_LIGHTGRAY | + EFI_BACKGROUND_BLUE); } SetMem16 (Line, size_cols * 2, BOXDRAW_HORIZONTAL); Line[0] = BOXDRAW_UP_RIGHT; Line[size_cols - 1] = BOXDRAW_UP_LEFT; Line[size_cols] = L'\0'; - uefi_call_wrapper(co->SetCursorPosition, 3, co, start_col, i); - uefi_call_wrapper(co->OutputString, 2, co, Line); + co->SetCursorPosition(co, start_col, i); + co->OutputString(co, Line); FreePool (Line); @@ -166,17 +167,18 @@ console_print_box(CHAR16 *str_arr[], int highlight) EFI_INPUT_KEY key; CopyMem(&SavedConsoleMode, co->Mode, sizeof(SavedConsoleMode)); - uefi_call_wrapper(co->EnableCursor, 2, co, FALSE); - uefi_call_wrapper(co->SetAttribute, 2, co, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE); + co->EnableCursor(co, FALSE); + co->SetAttribute(co, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE); console_print_box_at(str_arr, highlight, 0, 0, -1, -1, 0, count_lines(str_arr)); console_get_keystroke(&key); - uefi_call_wrapper(co->EnableCursor, 2, co, SavedConsoleMode.CursorVisible); - uefi_call_wrapper(co->SetCursorPosition, 3, co, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow); - uefi_call_wrapper(co->SetAttribute, 2, co, SavedConsoleMode.Attribute); + co->EnableCursor(co, SavedConsoleMode.CursorVisible); + co->SetCursorPosition(co, SavedConsoleMode.CursorColumn, + SavedConsoleMode.CursorRow); + co->SetAttribute(co, SavedConsoleMode.Attribute); } int @@ -194,7 +196,7 @@ console_select(CHAR16 *title[], CHAR16* selectors[], unsigned int start) unsigned int selector_offset; UINTN cols, rows; - uefi_call_wrapper(co->QueryMode, 4, co, co->Mode->Mode, &cols, &rows); + co->QueryMode(co, co->Mode->Mode, &cols, &rows); for (i = 0; i < selector_lines; i++) { int len = StrLen(selectors[i]); @@ -229,8 +231,8 @@ console_select(CHAR16 *title[], CHAR16* selectors[], unsigned int start) } CopyMem(&SavedConsoleMode, co->Mode, sizeof(SavedConsoleMode)); - uefi_call_wrapper(co->EnableCursor, 2, co, FALSE); - uefi_call_wrapper(co->SetAttribute, 2, co, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE); + co->EnableCursor(co, FALSE); + co->SetAttribute(co, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE); console_print_box_at(title, -1, 0, 0, -1, -1, 1, count_lines(title)); @@ -268,9 +270,10 @@ console_select(CHAR16 *title[], CHAR16* selectors[], unsigned int start) } while (!(k.ScanCode == SCAN_NULL && k.UnicodeChar == CHAR_CARRIAGE_RETURN)); - uefi_call_wrapper(co->EnableCursor, 2, co, SavedConsoleMode.CursorVisible); - uefi_call_wrapper(co->SetCursorPosition, 3, co, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow); - uefi_call_wrapper(co->SetAttribute, 2, co, SavedConsoleMode.Attribute); + co->EnableCursor(co, SavedConsoleMode.CursorVisible); + co->SetCursorPosition(co, SavedConsoleMode.CursorColumn, + SavedConsoleMode.CursorRow); + co->SetAttribute(co, SavedConsoleMode.Attribute); if (selector < 0) /* ESC pressed */ @@ -405,10 +408,10 @@ console_reset(void) { SIMPLE_TEXT_OUTPUT_INTERFACE *co = ST->ConOut; - uefi_call_wrapper(co->Reset, 2, co, TRUE); + co->Reset(co, TRUE); /* set mode 0 - required to be 80x25 */ - uefi_call_wrapper(co->SetMode, 2, co, 0); - uefi_call_wrapper(co->ClearScreen, 1, co); + co->SetMode(co, 0); + co->ClearScreen(co); } UINT8 verbose; @@ -444,8 +447,7 @@ VOID setup_console (int text) if (text) { new_mode = EfiConsoleControlScreenText; - efi_status = uefi_call_wrapper(concon->GetMode, 4, concon, - &mode, 0, 0); + efi_status = concon->GetMode(concon, &mode, 0, 0); /* If that didn't work, assume it's graphics */ if (EFI_ERROR(efi_status)) mode = EfiConsoleControlScreenGraphics; @@ -453,7 +455,7 @@ VOID setup_console (int text) new_mode = mode; } - uefi_call_wrapper(concon->SetMode, 2, concon, new_mode); + concon->SetMode(concon, new_mode); } static int @@ -480,7 +482,7 @@ print_crypto_errors(EFI_STATUS efi_status, VOID msleep(unsigned long msecs) { - uefi_call_wrapper(BS->Stall, 1, msecs); + gBS->Stall(msecs); } /* This is used in various things to determine if we should print to the diff --git a/lib/execute.c b/lib/execute.c index 7bd775fa..366af3c8 100644 --- a/lib/execute.c +++ b/lib/execute.c @@ -101,23 +101,21 @@ execute(EFI_HANDLE image, CHAR16 *name) EFI_DEVICE_PATH *devpath; CHAR16 *PathName; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, image, - &IMAGE_PROTOCOL, (void **)&li); + efi_status = gBS->HandleProtocol(image, &IMAGE_PROTOCOL, + (void **) &li); if (EFI_ERROR(efi_status)) return efi_status; - efi_status = generate_path(name, li, &devpath, &PathName); if (EFI_ERROR(efi_status)) return efi_status; - efi_status = uefi_call_wrapper(BS->LoadImage, 6, FALSE, image, - devpath, NULL, 0, &h); + efi_status = gBS->LoadImage(FALSE, image, devpath, NULL, 0, &h); if (EFI_ERROR(efi_status)) goto out; - efi_status = uefi_call_wrapper(BS->StartImage, 3, h, NULL, NULL); - uefi_call_wrapper(BS->UnloadImage, 1, h); + efi_status = gBS->StartImage(h, NULL, NULL); + gBS->UnloadImage(h); out: FreePool(PathName); diff --git a/lib/security_policy.c b/lib/security_policy.c index a84b0578..211f1cfd 100644 --- a/lib/security_policy.c +++ b/lib/security_policy.c @@ -10,6 +10,7 @@ #include <efilib.h> #include "shim.h" + #include <variables.h> #include <simple_file.h> #include <errors.h> @@ -84,8 +85,7 @@ security2_policy_authentication ( /* Chain original security policy */ - efi_status = uefi_call_wrapper(es2fa, 5, This, DevicePath, FileBuffer, - FileSize, BootPolicy); + efi_status = es2fa(This, DevicePath, FileBuffer, FileSize, BootPolicy); /* if OK, don't bother with MOK check */ if (!EFI_ERROR(efi_status)) return efi_status; @@ -120,10 +120,10 @@ security_policy_authentication ( VOID *FileBuffer; UINTN FileSize; CHAR16* DevPathStr; + EFI_GUID SIMPLE_FS_PROTOCOL = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; /* Chain original security policy */ - efi_status = uefi_call_wrapper(esfas, 3, This, AuthenticationStatus, - DevicePathConst); + efi_status = esfas(This, AuthenticationStatus, DevicePathConst); /* if OK avoid checking MOK: It's a bit expensive to * read the whole file in again (esfas already did this) */ if (!EFI_ERROR(efi_status)) @@ -133,8 +133,7 @@ security_policy_authentication ( * EFI_SECURITY_VIOLATION */ fail_status = efi_status; - efi_status = uefi_call_wrapper(BS->LocateDevicePath, 3, - &SIMPLE_FS_PROTOCOL, &DevPath, &h); + efi_status = gBS->LocateDevicePath(&SIMPLE_FS_PROTOCOL, &DevPath, &h); if (EFI_ERROR(efi_status)) goto out; @@ -147,7 +146,7 @@ security_policy_authentication ( goto out; efi_status = simple_file_read_all(f, &FileSize, &FileBuffer); - simple_file_close(f); + f->Close(f); if (EFI_ERROR(efi_status)) goto out; @@ -273,13 +272,11 @@ security_policy_install(SecurityHook hook) /* Don't bother with status here. The call is allowed * to fail, since SECURITY2 was introduced in PI 1.2.1 * If it fails, use security2_protocol == NULL as indicator */ - uefi_call_wrapper(BS->LocateProtocol, 3, - &SECURITY2_PROTOCOL_GUID, NULL, + LibLocateProtocol(&SECURITY2_PROTOCOL_GUID, (VOID **) &security2_protocol); - efi_status = uefi_call_wrapper(BS->LocateProtocol, 3, - &SECURITY_PROTOCOL_GUID, NULL, - (VOID **) &security_protocol); + efi_status = LibLocateProtocol(&SECURITY_PROTOCOL_GUID, + (VOID **) &security_protocol); if (EFI_ERROR(efi_status)) /* This one is mandatory, so there's a serious problem */ return efi_status; @@ -308,8 +305,7 @@ security_policy_uninstall(void) if (esfas) { EFI_SECURITY_PROTOCOL *security_protocol; - efi_status = uefi_call_wrapper(BS->LocateProtocol, 3, - &SECURITY_PROTOCOL_GUID, NULL, + efi_status = LibLocateProtocol(&SECURITY_PROTOCOL_GUID, (VOID **) &security_protocol); if (EFI_ERROR(efi_status)) return efi_status; @@ -324,8 +320,7 @@ security_policy_uninstall(void) if (es2fa) { EFI_SECURITY2_PROTOCOL *security2_protocol; - efi_status = uefi_call_wrapper(BS->LocateProtocol, 3, - &SECURITY2_PROTOCOL_GUID, NULL, + efi_status = LibLocateProtocol(&SECURITY2_PROTOCOL_GUID, (VOID **) &security2_protocol); if (EFI_ERROR(efi_status)) return efi_status; diff --git a/lib/shell.c b/lib/shell.c index 79cc41d4..6d2312eb 100644 --- a/lib/shell.c +++ b/lib/shell.c @@ -20,8 +20,8 @@ argsplit(EFI_HANDLE image, int *argc, CHAR16*** ARGV) *argc = 0; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, image, - &LoadedImageProtocol, (VOID **) &info); + efi_status = gBS->HandleProtocol(image, &LoadedImageProtocol, + (VOID **) &info); if (EFI_ERROR(efi_status)) { Print(L"Failed to get arguments\n"); return efi_status; diff --git a/lib/simple_file.c b/lib/simple_file.c index c9500353..8b2324c0 100644 --- a/lib/simple_file.c +++ b/lib/simple_file.c @@ -16,23 +16,21 @@ simple_file_open_by_handle(EFI_HANDLE device, CHAR16 *name, EFI_FILE **file, UIN EFI_FILE_IO_INTERFACE *drive; EFI_FILE *root; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, device, - &EFI_SIMPLE_FILE_SYSTEM_GUID, (void **)&drive); - + efi_status = gBS->HandleProtocol(device, &EFI_SIMPLE_FILE_SYSTEM_GUID, + (void **)&drive); if (EFI_ERROR(efi_status)) { - Print(L"Unable to find simple file protocol (%d)\n", efi_status); + Print(L"Unable to find simple file protocol (%d)\n", + efi_status); goto error; } - efi_status = uefi_call_wrapper(drive->OpenVolume, 2, drive, &root); - + efi_status = drive->OpenVolume(drive, &root); if (EFI_ERROR(efi_status)) { Print(L"Failed to open drive volume (%d)\n", efi_status); goto error; } - efi_status = uefi_call_wrapper(root->Open, 5, root, file, name, - mode, 0); + efi_status = root->Open(root, file, name, mode, 0); error: return efi_status; @@ -47,14 +45,12 @@ simple_file_open(EFI_HANDLE image, CHAR16 *name, EFI_FILE **file, UINT64 mode) EFI_DEVICE_PATH *loadpath = NULL; CHAR16 *PathName = NULL; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, image, - &IMAGE_PROTOCOL, (void **)&li); - + efi_status = gBS->HandleProtocol(image, &IMAGE_PROTOCOL, + (void **) &li); if (EFI_ERROR(efi_status)) return simple_file_open_by_handle(image, name, file, mode); efi_status = generate_path(name, li, &loadpath, &PathName); - if (EFI_ERROR(efi_status)) { Print(L"Unable to generate load path for %s\n", name); return efi_status; @@ -79,8 +75,7 @@ simple_dir_read_all_by_handle(EFI_HANDLE image, EFI_FILE *file, CHAR16* name, EF UINTN size = sizeof(buf); EFI_FILE_INFO *fi = (void *)buf; - efi_status = uefi_call_wrapper(file->GetInfo, 4, file, &EFI_FILE_INFO_GUID, - &size, fi); + efi_status = file->GetInfo(file, &EFI_FILE_INFO_GUID, &size, fi); if (EFI_ERROR(efi_status)) { Print(L"Failed to get file info\n"); goto out; @@ -94,13 +89,13 @@ simple_dir_read_all_by_handle(EFI_HANDLE image, EFI_FILE *file, CHAR16* name, EF *count = 0; for (;;) { UINTN len = sizeof(buf); - efi_status = uefi_call_wrapper(file->Read, 3, file, &len, buf); + efi_status = file->Read(file, &len, buf); if (EFI_ERROR(efi_status) || len == 0) break; (*count)++; size += len; } - uefi_call_wrapper(file->SetPosition, 2, file, 0); + file->SetPosition(file, 0); char *ptr = AllocatePool(size); *entries = (EFI_FILE_INFO *)ptr; @@ -109,13 +104,13 @@ simple_dir_read_all_by_handle(EFI_HANDLE image, EFI_FILE *file, CHAR16* name, EF int i; for (i = 0; i < *count; i++) { UINTN len = size; - uefi_call_wrapper(file->Read, 3, file, &len, ptr); + file->Read(file, &len, ptr); ptr += len; size -= len; } efi_status = EFI_SUCCESS; out: - simple_file_close(file); + file->Close(file); if (EFI_ERROR(efi_status) && *entries) { FreePool(*entries); *entries = NULL; @@ -149,8 +144,7 @@ simple_file_read_all(EFI_FILE *file, UINTN *size, void **buffer) *size = sizeof(buf); fi = (void *)buf; - efi_status = uefi_call_wrapper(file->GetInfo, 4, file, - &EFI_FILE_INFO_GUID, size, fi); + efi_status = file->GetInfo(file, &EFI_FILE_INFO_GUID, size, fi); if (EFI_ERROR(efi_status)) { Print(L"Failed to get file info\n"); return efi_status; @@ -163,8 +157,8 @@ simple_file_read_all(EFI_FILE *file, UINTN *size, void **buffer) Print(L"Failed to allocate buffer of size %d\n", *size); return EFI_OUT_OF_RESOURCES; } - efi_status = uefi_call_wrapper(file->Read, 3, file, size, *buffer); + efi_status = file->Read(file, size, *buffer); return efi_status; } @@ -174,17 +168,10 @@ simple_file_write_all(EFI_FILE *file, UINTN size, void *buffer) { EFI_STATUS efi_status; - efi_status = uefi_call_wrapper(file->Write, 3, file, &size, buffer); - + efi_status = file->Write(file, &size, buffer); return efi_status; } -void -simple_file_close(EFI_FILE *file) -{ - uefi_call_wrapper(file->Close, 1, file); -} - EFI_STATUS simple_volume_selector(CHAR16 **title, CHAR16 **selected, EFI_HANDLE *h) { @@ -194,9 +181,11 @@ simple_volume_selector(CHAR16 **title, CHAR16 **selected, EFI_HANDLE *h) CHAR16 **entries; int val; - uefi_call_wrapper(BS->LocateHandleBuffer, 5, ByProtocol, - &EFI_SIMPLE_FILE_SYSTEM_GUID, NULL, &count, &vol_handles); - + efi_status = gBS->LocateHandleBuffer(ByProtocol, + &EFI_SIMPLE_FILE_SYSTEM_GUID, + NULL, &count, &vol_handles); + if (EFI_ERROR(efi_status)) + return efi_status; if (!count || !vol_handles) return EFI_NOT_FOUND; @@ -212,21 +201,18 @@ simple_volume_selector(CHAR16 **title, CHAR16 **selected, EFI_HANDLE *h) CHAR16 *name; EFI_FILE_IO_INTERFACE *drive; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, - vol_handles[i], + efi_status = gBS->HandleProtocol(vol_handles[i], &EFI_SIMPLE_FILE_SYSTEM_GUID, - (void **)&drive); + (void **) &drive); if (EFI_ERROR(efi_status) || !drive) continue; - efi_status = uefi_call_wrapper(drive->OpenVolume, 2, drive, - &root); + efi_status = drive->OpenVolume(drive, &root); if (EFI_ERROR(efi_status)) continue; - efi_status = uefi_call_wrapper(root->GetInfo, 4, root, - &EFI_FILE_SYSTEM_INFO_GUID, - &size, fi); + efi_status = root->GetInfo(root, &EFI_FILE_SYSTEM_INFO_GUID, + &size, fi); if (EFI_ERROR(efi_status)) continue; diff --git a/lib/variables.c b/lib/variables.c index 122a25d5..9d9ac603 100644 --- a/lib/variables.c +++ b/lib/variables.c @@ -89,7 +89,7 @@ CreateTimeBasedPayload(IN OUT UINTN * DataSize, IN OUT UINT8 ** Data) DescriptorData = (EFI_VARIABLE_AUTHENTICATION_2 *) (NewData); ZeroMem(&Time, sizeof(EFI_TIME)); - efi_status = uefi_call_wrapper(RT->GetTime, 2, &Time, NULL); + efi_status = gRT->GetTime(&Time, NULL); if (EFI_ERROR(efi_status)) { FreePool(NewData); return efi_status; @@ -157,14 +157,12 @@ SetSecureVariable(CHAR16 *var, UINT8 *Data, UINTN len, EFI_GUID owner, return efi_status; } - efi_status = uefi_call_wrapper(RT->SetVariable, 5, var, &owner, - EFI_VARIABLE_NON_VOLATILE - | EFI_VARIABLE_RUNTIME_ACCESS - | EFI_VARIABLE_BOOTSERVICE_ACCESS - | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS - | options, - DataSize, Cert); - + efi_status = gRT->SetVariable(var, &owner, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | + options, DataSize, Cert); return efi_status; } @@ -175,7 +173,8 @@ GetOSIndications(void) UINTN DataSize = sizeof(indications); EFI_STATUS efi_status; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, L"OsIndicationsSupported", &GV_GUID, NULL, &DataSize, &indications); + efi_status = gRT->GetVariable(L"OsIndicationsSupported", &GV_GUID, + NULL, &DataSize, &indications); if (EFI_ERROR(efi_status)) return 0; @@ -188,17 +187,15 @@ SETOSIndicationsAndReboot(UINT64 indications) UINTN DataSize = sizeof(indications); EFI_STATUS efi_status; - efi_status = uefi_call_wrapper(RT->SetVariable, 5, L"OsIndications", - &GV_GUID, - EFI_VARIABLE_NON_VOLATILE - | EFI_VARIABLE_RUNTIME_ACCESS - | EFI_VARIABLE_BOOTSERVICE_ACCESS, - DataSize, &indications); - + efi_status = gRT->SetVariable(L"OsIndications", &GV_GUID, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_BOOTSERVICE_ACCESS, + DataSize, &indications); if (EFI_ERROR(efi_status)) return efi_status; - uefi_call_wrapper(RT->ResetSystem, 4, EfiResetWarm, EFI_SUCCESS, 0, NULL); + gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL); /* does not return */ return EFI_SUCCESS; @@ -212,8 +209,7 @@ get_variable_attr(CHAR16 *var, UINT8 **data, UINTN *len, EFI_GUID owner, *len = 0; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, var, &owner, - NULL, len, NULL); + efi_status = gRT->GetVariable(var, &owner, NULL, len, NULL); if (efi_status != EFI_BUFFER_TOO_SMALL) { if (!EFI_ERROR(efi_status)) /* this should never happen */ return EFI_PROTOCOL_ERROR; @@ -224,8 +220,7 @@ get_variable_attr(CHAR16 *var, UINT8 **data, UINTN *len, EFI_GUID owner, if (!*data) return EFI_OUT_OF_RESOURCES; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, var, &owner, - attributes, len, *data); + efi_status = gRT->GetVariable(var, &owner, attributes, len, *data); if (EFI_ERROR(efi_status)) { FreePool(*data); *data = NULL; @@ -282,8 +277,8 @@ variable_is_setupmode(int default_return) UINTN DataSize = sizeof(SetupMode); EFI_STATUS efi_status; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, L"SetupMode", - &GV_GUID, NULL, &DataSize, &SetupMode); + efi_status = gRT->GetVariable(L"SetupMode", &GV_GUID, NULL, + &DataSize, &SetupMode); if (EFI_ERROR(efi_status)) return default_return; @@ -299,8 +294,8 @@ variable_is_secureboot(void) EFI_STATUS efi_status; DataSize = sizeof(SecureBoot); - efi_status = uefi_call_wrapper(RT->GetVariable, 5, L"SecureBoot", - &GV_GUID, NULL, &DataSize, &SecureBoot); + efi_status = gRT->GetVariable(L"SecureBoot", &GV_GUID, NULL, + &DataSize, &SecureBoot); if (EFI_ERROR(efi_status)) return 0; @@ -333,10 +328,10 @@ variable_enroll_hash(CHAR16 *var, EFI_GUID owner, efi_status = SetSecureVariable(var, sig, sizeof(sig), owner, EFI_VARIABLE_APPEND_WRITE, 0); else - efi_status = uefi_call_wrapper(RT->SetVariable, 5, var, &owner, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_APPEND_WRITE, - sizeof(sig), sig); + efi_status = gRT->SetVariable(var, &owner, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_APPEND_WRITE, + sizeof(sig), sig); return efi_status; } @@ -60,8 +60,8 @@ BOOLEAN findNetboot(EFI_HANDLE device) { EFI_STATUS efi_status; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, device, - &PxeBaseCodeProtocol, (VOID **)&pxe); + efi_status = gBS->HandleProtocol(device, &PxeBaseCodeProtocol, + (VOID **) &pxe); if (EFI_ERROR(efi_status)) { pxe = NULL; return FALSE; @@ -333,9 +333,8 @@ EFI_STATUS FetchNetbootimage(EFI_HANDLE image_handle, VOID **buffer, UINT64 *buf } try_again: - efi_status = uefi_call_wrapper(pxe->Mtftp, 10, pxe, read, *buffer, - overwrite, bufsiz, &blksz, &tftp_addr, - full_path, NULL, nobuffer); + efi_status = pxe->Mtftp(pxe, read, *buffer, overwrite, bufsiz, &blksz, + &tftp_addr, full_path, NULL, nobuffer); if (efi_status == EFI_BUFFER_TOO_SMALL) { /* try again, doubling buf size */ *bufsiz *= 2; diff --git a/replacements.c b/replacements.c index 946b059a..27fbb52d 100644 --- a/replacements.c +++ b/replacements.c @@ -55,6 +55,14 @@ static EFI_SYSTEM_TABLE *systab; +EFI_SYSTEM_TABLE * +get_active_systab(void) +{ + if (systab) + return systab; + return ST; +} + static typeof(systab->BootServices->LoadImage) system_load_image; static typeof(systab->BootServices->StartImage) system_start_image; static typeof(systab->BootServices->Exit) system_exit; @@ -71,6 +79,7 @@ unhook_system_services(void) systab->BootServices->LoadImage = system_load_image; systab->BootServices->StartImage = system_start_image; systab->BootServices->ExitBootServices = system_exit_boot_services; + gBS = systab->BootServices; } static EFI_STATUS EFIAPI @@ -79,12 +88,10 @@ load_image(BOOLEAN BootPolicy, EFI_HANDLE ParentImageHandle, UINTN SourceSize, EFI_HANDLE *ImageHandle) { EFI_STATUS efi_status; - unhook_system_services(); - efi_status = systab->BootServices->LoadImage(BootPolicy, - ParentImageHandle, - DevicePath, SourceBuffer, - SourceSize, ImageHandle); + unhook_system_services(); + efi_status = gBS->LoadImage(BootPolicy, ParentImageHandle, DevicePath, + SourceBuffer, SourceSize, ImageHandle); hook_system_services(systab); if (EFI_ERROR(efi_status)) last_loaded_image = NULL; @@ -103,8 +110,7 @@ start_image(EFI_HANDLE image_handle, UINTN *exit_data_size, CHAR16 **exit_data) loader_is_participating = 1; uninstall_shim_protocols(); } - efi_status = systab->BootServices->StartImage(image_handle, exit_data_size, - exit_data); + efi_status = gBS->StartImage(image_handle, exit_data_size, exit_data); if (EFI_ERROR(efi_status)) { if (image_handle == last_loaded_image) { EFI_STATUS efi_status2 = install_shim_protocols(); @@ -114,9 +120,9 @@ start_image(EFI_HANDLE image_handle, UINTN *exit_data_size, CHAR16 **exit_data) efi_status2); Print(L"shim cannot continue, sorry.\n"); msleep(5000000); - systab->RuntimeServices->ResetSystem( - EfiResetShutdown, - EFI_SECURITY_VIOLATION, 0, NULL); + gRT->ResetSystem(EfiResetShutdown, + EFI_SECURITY_VIOLATION, + 0, NULL); } } hook_system_services(systab); @@ -132,8 +138,7 @@ exit_boot_services(EFI_HANDLE image_key, UINTN map_key) verification_method == VERIFIED_BY_HASH) { unhook_system_services(); EFI_STATUS efi_status; - efi_status = systab->BootServices->ExitBootServices(image_key, - map_key); + efi_status = gBS->ExitBootServices(image_key, map_key); if (EFI_ERROR(efi_status)) hook_system_services(systab); return efi_status; @@ -142,7 +147,7 @@ exit_boot_services(EFI_HANDLE image_key, UINTN map_key) Print(L"Bootloader has not verified loaded image.\n"); Print(L"System is compromised. halting.\n"); msleep(5000000); - systab->RuntimeServices->ResetSystem(EfiResetShutdown, EFI_SECURITY_VIOLATION, 0, NULL); + gRT->ResetSystem(EfiResetShutdown, EFI_SECURITY_VIOLATION, 0, NULL); return EFI_SECURITY_VIOLATION; } @@ -154,8 +159,8 @@ do_exit(EFI_HANDLE ImageHandle, EFI_STATUS ExitStatus, shim_fini(); - efi_status = systab->BootServices->Exit(ImageHandle, ExitStatus, - ExitDataSize, ExitData); + efi_status = gBS->Exit(ImageHandle, ExitStatus, + ExitDataSize, ExitData); if (EFI_ERROR(efi_status)) { EFI_STATUS efi_status2 = shim_init(); @@ -164,9 +169,8 @@ do_exit(EFI_HANDLE ImageHandle, EFI_STATUS ExitStatus, efi_status2); Print(L"shim cannot continue, sorry.\n"); msleep(5000000); - systab->RuntimeServices->ResetSystem( - EfiResetShutdown, - EFI_SECURITY_VIOLATION, 0, NULL); + gRT->ResetSystem(EfiResetShutdown, + EFI_SECURITY_VIOLATION, 0, NULL); } } return efi_status; @@ -176,6 +180,7 @@ void hook_system_services(EFI_SYSTEM_TABLE *local_systab) { systab = local_systab; + gBS = systab->BootServices; /* We need to hook various calls to make this work... */ @@ -204,12 +209,14 @@ void unhook_exit(void) { systab->BootServices->Exit = system_exit; + gBS = systab->BootServices; } void hook_exit(EFI_SYSTEM_TABLE *local_systab) { systab = local_systab; + gBS = local_systab->BootServices; /* we need to hook Exit() so that we can allow users to quit the * bootloader and still e.g. start a new one or run an internal @@ -1324,12 +1324,8 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize, alloc_size = ALIGN_VALUE(context.ImageSize + context.SectionAlignment, PAGE_SIZE); - efi_status = uefi_call_wrapper (BS->AllocatePages, 4, - AllocateAnyPages, - EfiLoaderCode, - alloc_size / PAGE_SIZE, - &alloc_address); - + efi_status = gBS->AllocatePages(AllocateAnyPages, EfiLoaderCode, + alloc_size / PAGE_SIZE, &alloc_address); if (EFI_ERROR(efi_status)) { perror(L"Failed to allocate image buffer\n"); return EFI_OUT_OF_RESOURCES; @@ -1342,8 +1338,7 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize, entry_point = ImageAddress(buffer, context.ImageSize, context.EntryPoint); if (!entry_point) { perror(L"Entry point is invalid\n"); - uefi_call_wrapper(BS->FreePages, 2, alloc_address, - alloc_size / PAGE_SIZE); + gBS->FreePages(alloc_address, alloc_size / PAGE_SIZE); return EFI_UNSUPPORTED; } @@ -1377,8 +1372,7 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize, if (end < base) { perror(L"Section %d has negative size\n", i); - uefi_call_wrapper(BS->FreePages, 2, alloc_address, - alloc_size / PAGE_SIZE); + gBS->FreePages(alloc_address, alloc_size / PAGE_SIZE); return EFI_UNSUPPORTED; } @@ -1499,8 +1493,8 @@ should_use_fallback(EFI_HANDLE image_handle) EFI_STATUS efi_status; int ret = 0; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, image_handle, - &EFI_LOADED_IMAGE_GUID, (void **)&li); + efi_status = gBS->HandleProtocol(image_handle, &EFI_LOADED_IMAGE_GUID, + (void **)&li); if (EFI_ERROR(efi_status)) { perror(L"Could not get image for bootx64.efi: %r\n", efi_status); @@ -1524,23 +1518,22 @@ should_use_fallback(EFI_HANDLE image_handle) if (pathlen < 5 || StrCaseCmp(bootpath + pathlen - 4, L".EFI")) goto error; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, li->DeviceHandle, - &FileSystemProtocol, (void **)&fio); + efi_status = gBS->HandleProtocol(li->DeviceHandle, &FileSystemProtocol, + (void **) &fio); if (EFI_ERROR(efi_status)) { perror(L"Could not get fio for li->DeviceHandle: %r\n", efi_status); goto error; } - efi_status = uefi_call_wrapper(fio->OpenVolume, 2, fio, &vh); + efi_status = fio->OpenVolume(fio, &vh); if (EFI_ERROR(efi_status)) { perror(L"Could not open fio volume: %r\n", efi_status); goto error; } - efi_status = uefi_call_wrapper(vh->Open, 5, vh, &fh, - L"\\EFI\\BOOT" FALLBACK, - EFI_FILE_MODE_READ, 0); + efi_status = vh->Open(vh, &fh, L"\\EFI\\BOOT" FALLBACK, + EFI_FILE_MODE_READ, 0); if (EFI_ERROR(efi_status)) { /* Do not print the error here - this is an acceptable case * for removable media, where we genuinely don't want @@ -1554,9 +1547,9 @@ should_use_fallback(EFI_HANDLE image_handle) ret = 1; error: if (fh) - uefi_call_wrapper(fh->Close, 1, fh); + fh->Close(fh); if (vh) - uefi_call_wrapper(vh->Close, 1, vh); + vh->Close(vh); if (bootpath) FreePool(bootpath); @@ -1672,15 +1665,14 @@ static EFI_STATUS load_image (EFI_LOADED_IMAGE *li, void **data, /* * Open the device */ - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, device, - &EFI_SIMPLE_FILE_SYSTEM_GUID, - (void **)&drive); + efi_status = gBS->HandleProtocol(device, &EFI_SIMPLE_FILE_SYSTEM_GUID, + (void **) &drive); if (EFI_ERROR(efi_status)) { perror(L"Failed to find fs: %r\n", efi_status); goto error; } - efi_status = uefi_call_wrapper(drive->OpenVolume, 2, drive, &root); + efi_status = drive->OpenVolume(drive, &root); if (EFI_ERROR(efi_status)) { perror(L"Failed to open fs: %r\n", efi_status); goto error; @@ -1689,8 +1681,7 @@ static EFI_STATUS load_image (EFI_LOADED_IMAGE *li, void **data, /* * And then open the file */ - efi_status = uefi_call_wrapper(root->Open, 5, root, &grub, PathName, - EFI_FILE_MODE_READ, 0); + efi_status = root->Open(root, &grub, PathName, EFI_FILE_MODE_READ, 0); if (EFI_ERROR(efi_status)) { perror(L"Failed to open %s - %r\n", PathName, efi_status); goto error; @@ -1708,8 +1699,8 @@ static EFI_STATUS load_image (EFI_LOADED_IMAGE *li, void **data, * Find out how big the file is in order to allocate the storage * buffer */ - efi_status = uefi_call_wrapper(grub->GetInfo, 4, grub, &EFI_FILE_INFO_GUID, - &buffersize, fileinfo); + efi_status = grub->GetInfo(grub, &EFI_FILE_INFO_GUID, &buffersize, + fileinfo); if (efi_status == EFI_BUFFER_TOO_SMALL) { FreePool(fileinfo); fileinfo = AllocatePool(buffersize); @@ -1718,9 +1709,8 @@ static EFI_STATUS load_image (EFI_LOADED_IMAGE *li, void **data, efi_status = EFI_OUT_OF_RESOURCES; goto error; } - efi_status = uefi_call_wrapper(grub->GetInfo, 4, grub, - &EFI_FILE_INFO_GUID, &buffersize, - fileinfo); + efi_status = grub->GetInfo(grub, &EFI_FILE_INFO_GUID, + &buffersize, fileinfo); } if (EFI_ERROR(efi_status)) { @@ -1739,13 +1729,11 @@ static EFI_STATUS load_image (EFI_LOADED_IMAGE *li, void **data, /* * Perform the actual read */ - efi_status = uefi_call_wrapper(grub->Read, 3, grub, &buffersize, - *data); + efi_status = grub->Read(grub, &buffersize, *data); if (efi_status == EFI_BUFFER_TOO_SMALL) { FreePool(*data); *data = AllocatePool(buffersize); - efi_status = uefi_call_wrapper(grub->Read, 3, grub, - &buffersize, *data); + efi_status = grub->Read(grub, &buffersize, *data); } if (EFI_ERROR(efi_status)) { perror(L"Unexpected return from initial read: %r, buffersize %x\n", @@ -1860,8 +1848,8 @@ EFI_STATUS start_image(EFI_HANDLE image_handle, CHAR16 *ImagePath) * We need to refer to the loaded image protocol on the running * binary in order to find our path */ - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, image_handle, - &EFI_LOADED_IMAGE_GUID, (void **)&li); + efi_status = gBS->HandleProtocol(image_handle, &EFI_LOADED_IMAGE_GUID, + (void **)&li); if (EFI_ERROR(efi_status)) { perror(L"Unable to init protocol\n"); return efi_status; @@ -1947,7 +1935,7 @@ EFI_STATUS start_image(EFI_HANDLE image_handle, CHAR16 *ImagePath) /* * The binary is trusted and relocated. Run it */ - efi_status = uefi_call_wrapper(entry_point, 2, image_handle, systab); + efi_status = entry_point(image_handle, systab); /* * Restore our original loaded image values @@ -2112,11 +2100,10 @@ EFI_STATUS mirror_mok_list() } if (FullDataSize) { - efi_status = uefi_call_wrapper(RT->SetVariable, 5, L"MokListRT", - &SHIM_LOCK_GUID, - EFI_VARIABLE_BOOTSERVICE_ACCESS - | EFI_VARIABLE_RUNTIME_ACCESS, - FullDataSize, FullData); + efi_status = gRT->SetVariable(L"MokListRT", &SHIM_LOCK_GUID, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + FullDataSize, FullData); if (EFI_ERROR(efi_status)) { perror(L"Failed to set MokListRT: %r\n", efi_status); } @@ -2140,11 +2127,10 @@ EFI_STATUS mirror_mok_list_x() if (EFI_ERROR(efi_status)) return efi_status; - efi_status = uefi_call_wrapper(RT->SetVariable, 5, L"MokListXRT", - &SHIM_LOCK_GUID, - EFI_VARIABLE_BOOTSERVICE_ACCESS - | EFI_VARIABLE_RUNTIME_ACCESS, - DataSize, Data); + efi_status = gRT->SetVariable(L"MokListXRT", &SHIM_LOCK_GUID, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + DataSize, Data); if (EFI_ERROR(efi_status)) { console_error(L"Failed to set MokListRT", efi_status); } @@ -2174,12 +2160,10 @@ EFI_STATUS mirror_mok_sb_state() if (!EFI_ERROR(efi_status) || efi_status != EFI_NOT_FOUND) LibDeleteVariable(L"MokSBStateRT", &SHIM_LOCK_GUID); - efi_status = uefi_call_wrapper(RT->SetVariable, 5, - L"MokSBStateRT", - &SHIM_LOCK_GUID, - EFI_VARIABLE_BOOTSERVICE_ACCESS - | EFI_VARIABLE_RUNTIME_ACCESS, - DataSize, Data); + efi_status = gRT->SetVariable(L"MokSBStateRT", &SHIM_LOCK_GUID, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + DataSize, Data); if (EFI_ERROR(efi_status)) { console_error(L"Failed to set MokSBStateRT", efi_status); } @@ -2197,10 +2181,8 @@ static BOOLEAN check_var(CHAR16 *varname) UINT32 MokVar; UINT32 attributes; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, varname, - &SHIM_LOCK_GUID, &attributes, - &size, (void *)&MokVar); - + efi_status = gRT->GetVariable(varname, &SHIM_LOCK_GUID, &attributes, + &size, (void *)&MokVar); if (!EFI_ERROR(efi_status) || efi_status == EFI_BUFFER_TOO_SMALL) return TRUE; @@ -2244,9 +2226,9 @@ static EFI_STATUS check_mok_sb (void) user_insecure_mode = 0; ignore_db = 0; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, L"MokSBState", - &SHIM_LOCK_GUID, &attributes, - &MokSBStateSize, &MokSBState); + efi_status = gRT->GetVariable(L"MokSBState", &SHIM_LOCK_GUID, + &attributes, &MokSBStateSize, + &MokSBState); if (EFI_ERROR(efi_status)) return EFI_SECURITY_VIOLATION; @@ -2281,9 +2263,9 @@ static EFI_STATUS check_mok_db (void) UINTN MokDBStateSize = sizeof(MokDBState); UINT32 attributes; - efi_status = uefi_call_wrapper(RT->GetVariable, 5, L"MokDBState", - &SHIM_LOCK_GUID, &attributes, - &MokDBStateSize, &MokDBState); + efi_status = gRT->GetVariable(L"MokDBState", &SHIM_LOCK_GUID, + &attributes, &MokDBStateSize, + &MokDBState); if (EFI_ERROR(efi_status)) return EFI_SECURITY_VIOLATION; @@ -2318,11 +2300,10 @@ static EFI_STATUS mok_ignore_db() check_mok_db(); if (ignore_db) { - efi_status = uefi_call_wrapper(RT->SetVariable, 5, L"MokIgnoreDB", - &SHIM_LOCK_GUID, - EFI_VARIABLE_BOOTSERVICE_ACCESS - | EFI_VARIABLE_RUNTIME_ACCESS, - DataSize, (void *)&Data); + efi_status = gRT->SetVariable(L"MokIgnoreDB", &SHIM_LOCK_GUID, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + DataSize, (void *)&Data); if (EFI_ERROR(efi_status)) { perror(L"Failed to set MokIgnoreDB: %r\n", efi_status); } @@ -2477,8 +2458,8 @@ EFI_STATUS set_second_stage (EFI_HANDLE image_handle) load_options = NULL; load_options_size = 0; - efi_status = uefi_call_wrapper(BS->HandleProtocol, 3, image_handle, - &LoadedImageProtocol, (void **) &li); + efi_status = gBS->HandleProtocol(image_handle, &LoadedImageProtocol, + (void **) &li); if (EFI_ERROR(efi_status)) { perror (L"Failed to get load options: %r\n", efi_status); return efi_status; @@ -2744,9 +2725,10 @@ install_shim_protocols(void) /* * Install the protocol */ - efi_status = uefi_call_wrapper(BS->InstallProtocolInterface, 4, - &shim_lock_handle, &SHIM_LOCK_GUID, - EFI_NATIVE_INTERFACE, &shim_lock_interface); + efi_status = gBS->InstallProtocolInterface(&shim_lock_handle, + &SHIM_LOCK_GUID, + EFI_NATIVE_INTERFACE, + &shim_lock_interface); if (EFI_ERROR(efi_status)) { console_error(L"Could not install security protocol", efi_status); @@ -2772,8 +2754,8 @@ uninstall_shim_protocols(void) /* * If we're back here then clean everything up before exiting */ - uefi_call_wrapper(BS->UninstallProtocolInterface, 3, shim_lock_handle, - &SHIM_LOCK_GUID, &shim_lock_interface); + gBS->UninstallProtocolInterface(shim_lock_handle, &SHIM_LOCK_GUID, + &shim_lock_interface); if (!secure_mode()) return; @@ -2932,9 +2914,8 @@ efi_main (EFI_HANDLE passed_image_handle, EFI_SYSTEM_TABLE *passed_systab) Print(L"Something has gone seriously wrong: %r\n", efi_status); Print(L"Shim was unable to measure state into the TPM\n"); msleep(5000000); - uefi_call_wrapper(systab->RuntimeServices->ResetSystem, 4, - EfiResetShutdown, EFI_SECURITY_VIOLATION, - 0, NULL); + gRT->ResetSystem(EfiResetShutdown, EFI_SECURITY_VIOLATION, + 0, NULL); } /* @@ -2948,9 +2929,8 @@ efi_main (EFI_HANDLE passed_image_handle, EFI_SYSTEM_TABLE *passed_systab) Print(L"Something has gone seriously wrong: %r\n", efi_status); Print(L"shim cannot continue, sorry.\n"); msleep(5000000); - uefi_call_wrapper(systab->RuntimeServices->ResetSystem, 4, - EfiResetShutdown, EFI_SECURITY_VIOLATION, - 0, NULL); + gRT->ResetSystem(EfiResetShutdown, EFI_SECURITY_VIOLATION, + 0, NULL); } /* @@ -1,8 +1,32 @@ #ifndef SHIM_H_ #define SHIM_H_ +#if defined __GNUC__ && defined __GNUC_MINOR__ +# define GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +#else +# define GNUC_PREREQ(maj, min) 0 +#endif +#if defined __clang_major__ && defined __clang_minor__ +# define CLANG_PREREQ(maj, min) \ + ((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min)) +#else +# define CLANG_PREREQ(maj, min) 0 +#endif + +#if defined(__x86_64__) +#if !defined(GNU_EFI_USE_MS_ABI) +#error On x86_64 you must use ms_abi (GNU_EFI_USE_MS_ABI) in gnu-efi and shim. +#endif +/* gcc 4.5.4 is the first documented release with -mabi=ms */ +#if !GNUC_PREREQ(4, 7) && !CLANG_PREREQ(3, 4) +#error On x86_64 you must have a compiler new enough to support __attribute__((__ms_abi__)) +#endif +#endif + #include <efi.h> #include <efilib.h> +#undef uefi_call_wrapper #include <stddef.h> @@ -31,7 +31,7 @@ static BOOLEAN tpm_present(efi_tpm_protocol_t *tpm) EFI_PHYSICAL_ADDRESS eventlog, lastevent; caps.Size = (UINT8)sizeof(caps); - efi_status = uefi_call_wrapper(tpm->status_check, 5, tpm, &caps, &flags, + efi_status = tpm->status_check(tpm, &caps, &flags, &eventlog, &lastevent); if (EFI_ERROR(efi_status) || caps.TPMDeactivatedFlag || !caps.TPMPresentFlag) @@ -48,7 +48,7 @@ static EFI_STATUS tpm2_get_caps(efi_tpm2_protocol_t *tpm, caps->Size = (UINT8)sizeof(*caps); - efi_status = uefi_call_wrapper(tpm->get_capability, 2, tpm, caps); + efi_status = tpm->get_capability(tpm, caps); if (EFI_ERROR(efi_status)) return efi_status; @@ -108,8 +108,7 @@ static EFI_STATUS trigger_tcg2_final_events_table(efi_tpm2_protocol_t *tpm2, else log_fmt = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2; - return uefi_call_wrapper(tpm2->get_event_log, 5, tpm2, log_fmt, - &start, &end, &truncated); + return tpm2->get_event_log(tpm2, log_fmt, &start, &end, &truncated); } static EFI_STATUS tpm_locate_protocol(efi_tpm_protocol_t **tpm, @@ -194,15 +193,13 @@ static EFI_STATUS tpm_log_event_raw(EFI_PHYSICAL_ADDRESS buf, UINTN size, themselves if we pass PE_COFF_IMAGE. In case that fails we fall back to measuring without it. */ - efi_status = uefi_call_wrapper(tpm2->hash_log_extend_event, - 5, tpm2, PE_COFF_IMAGE, buf, - (UINT64) size, event); + efi_status = tpm2->hash_log_extend_event(tpm2, + PE_COFF_IMAGE, buf, (UINT64) size, event); } if (!hash || EFI_ERROR(efi_status)) { - efi_status = uefi_call_wrapper(tpm2->hash_log_extend_event, - 5, tpm2, 0, buf, - (UINT64) size, event); + efi_status = tpm2->hash_log_extend_event(tpm2, + 0, buf, (UINT64) size, event); } FreePool(event); return efi_status; @@ -234,15 +231,12 @@ static EFI_STATUS tpm_log_event_raw(EFI_PHYSICAL_ADDRESS buf, UINTN size, hash rather than allowing the firmware to attempt to calculate it */ CopyMem(event->digest, hash, sizeof(event->digest)); - efi_status = uefi_call_wrapper(tpm->log_extend_event, 7, - tpm, 0, 0, TPM_ALG_SHA, - event, &eventnum, - &lastevent); + efi_status = tpm->log_extend_event(tpm, 0, 0, + TPM_ALG_SHA, event, &eventnum, &lastevent); } else { - efi_status = uefi_call_wrapper(tpm->log_extend_event, 7, - tpm, buf, (UINT64)size, - TPM_ALG_SHA, event, - &eventnum, &lastevent); + efi_status = tpm->log_extend_event(tpm, buf, + (UINT64)size, TPM_ALG_SHA, event, &eventnum, + &lastevent); } FreePool(event); return efi_status; |
