summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Jones <pjones@redhat.com>2017-09-28 14:11:51 -0400
committerPeter Jones <pmjones@gmail.com>2018-03-12 16:21:43 -0400
commit9fdca5bbe11e384198372b86a6b81d5d9e79fa16 (patch)
treefd270546473ce1869fd315d29dc984dcd793d928
parent1c2376338d57c900fbc1c2fe6d9c30cfe20e44be (diff)
downloadefi-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.c201
-rw-r--r--fallback.c134
-rw-r--r--httpboot.c83
-rw-r--r--include/hexdump.h4
-rw-r--r--include/replacements.h2
-rw-r--r--include/simple_file.h2
-rw-r--r--include/tpm.h1
-rw-r--r--lib/console.c64
-rw-r--r--lib/execute.c12
-rw-r--r--lib/security_policy.c27
-rw-r--r--lib/shell.c4
-rw-r--r--lib/simple_file.c66
-rw-r--r--lib/variables.c57
-rw-r--r--netboot.c9
-rw-r--r--replacements.c43
-rw-r--r--shim.c144
-rw-r--r--shim.h24
-rw-r--r--tpm.c30
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;
diff --git a/fallback.c b/fallback.c
index 4cbbf1c8..1a5cf3f5 100644
--- a/fallback.c
+++ b/fallback.c
@@ -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;
}
diff --git a/httpboot.c b/httpboot.c
index ae49e70b..0fd4ae76 100644
--- a/httpboot.c
+++ b/httpboot.c
@@ -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;
}
diff --git a/netboot.c b/netboot.c
index 893e4e50..ea9e150b 100644
--- a/netboot.c
+++ b/netboot.c
@@ -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
diff --git a/shim.c b/shim.c
index 9c432177..02fde5c6 100644
--- a/shim.c
+++ b/shim.c
@@ -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);
}
/*
diff --git a/shim.h b/shim.h
index 70fdf773..6cbc9e1b 100644
--- a/shim.h
+++ b/shim.h
@@ -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>
diff --git a/tpm.c b/tpm.c
index 1df4d11d..c1b6be75 100644
--- a/tpm.c
+++ b/tpm.c
@@ -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;