summaryrefslogtreecommitdiff
path: root/pe.c
diff options
context:
space:
mode:
Diffstat (limited to 'pe.c')
-rw-r--r--pe.c149
1 files changed, 3 insertions, 146 deletions
diff --git a/pe.c b/pe.c
index 33056017..d785c44e 100644
--- a/pe.c
+++ b/pe.c
@@ -395,149 +395,6 @@ err:
return efi_status;
}
-static inline uint64_t
-shim_mem_attrs_to_uefi_mem_attrs (uint64_t attrs)
-{
- uint64_t ret = EFI_MEMORY_RP |
- EFI_MEMORY_RO |
- EFI_MEMORY_XP;
-
- if (attrs & MEM_ATTR_R)
- ret &= ~EFI_MEMORY_RP;
-
- if (attrs & MEM_ATTR_W)
- ret &= ~EFI_MEMORY_RO;
-
- if (attrs & MEM_ATTR_X)
- ret &= ~EFI_MEMORY_XP;
-
- return ret;
-}
-
-static inline uint64_t
-uefi_mem_attrs_to_shim_mem_attrs (uint64_t attrs)
-{
- uint64_t ret = MEM_ATTR_R |
- MEM_ATTR_W |
- MEM_ATTR_X;
-
- if (attrs & EFI_MEMORY_RP)
- ret &= ~MEM_ATTR_R;
-
- if (attrs & EFI_MEMORY_RO)
- ret &= ~MEM_ATTR_W;
-
- if (attrs & EFI_MEMORY_XP)
- ret &= ~MEM_ATTR_X;
-
- return ret;
-}
-
-static EFI_STATUS
-get_mem_attrs (uintptr_t addr, size_t size, uint64_t *attrs)
-{
- EFI_MEMORY_ATTRIBUTE_PROTOCOL *proto = NULL;
- EFI_PHYSICAL_ADDRESS physaddr = addr;
- EFI_STATUS efi_status;
-
- efi_status = LibLocateProtocol(&EFI_MEMORY_ATTRIBUTE_PROTOCOL_GUID,
- (VOID **)&proto);
- if (EFI_ERROR(efi_status) || !proto)
- return efi_status;
-
- if (!IS_PAGE_ALIGNED(physaddr) || !IS_PAGE_ALIGNED(size) || size == 0 || attrs == NULL) {
- dprint(L"%a called on 0x%llx-0x%llx and attrs 0x%llx\n",
- __func__, (unsigned long long)physaddr,
- (unsigned long long)(physaddr+size-1),
- attrs);
- return EFI_SUCCESS;
- }
-
- efi_status = proto->GetMemoryAttributes(proto, physaddr, size, attrs);
- *attrs = uefi_mem_attrs_to_shim_mem_attrs (*attrs);
-
- return efi_status;
-}
-
-static EFI_STATUS
-update_mem_attrs(uintptr_t addr, uint64_t size,
- uint64_t set_attrs, uint64_t clear_attrs)
-{
- EFI_MEMORY_ATTRIBUTE_PROTOCOL *proto = NULL;
- EFI_PHYSICAL_ADDRESS physaddr = addr;
- EFI_STATUS efi_status, ret;
- uint64_t before = 0, after = 0, uefi_set_attrs, uefi_clear_attrs;
-
- efi_status = LibLocateProtocol(&EFI_MEMORY_ATTRIBUTE_PROTOCOL_GUID,
- (VOID **)&proto);
- if (EFI_ERROR(efi_status) || !proto)
- return efi_status;
-
- efi_status = get_mem_attrs (addr, size, &before);
- if (EFI_ERROR(efi_status))
- dprint(L"get_mem_attrs(0x%llx, 0x%llx, 0x%llx) -> 0x%lx\n",
- (unsigned long long)addr, (unsigned long long)size,
- &before, efi_status);
-
- if (!IS_PAGE_ALIGNED(physaddr) || !IS_PAGE_ALIGNED(size) || size == 0) {
- dprint(L"%a called on 0x%llx-0x%llx (size 0x%llx) +%a%a%a -%a%a%a\n",
- __func__, (unsigned long long)physaddr,
- (unsigned long long)(physaddr + size - 1),
- (unsigned long long)size,
- (set_attrs & MEM_ATTR_R) ? "r" : "",
- (set_attrs & MEM_ATTR_W) ? "w" : "",
- (set_attrs & MEM_ATTR_X) ? "x" : "",
- (clear_attrs & MEM_ATTR_R) ? "r" : "",
- (clear_attrs & MEM_ATTR_W) ? "w" : "",
- (clear_attrs & MEM_ATTR_X) ? "x" : "");
- return 0;
- }
-
- uefi_set_attrs = shim_mem_attrs_to_uefi_mem_attrs (set_attrs);
- dprint("translating set_attrs from 0x%lx to 0x%lx\n", set_attrs, uefi_set_attrs);
- uefi_clear_attrs = shim_mem_attrs_to_uefi_mem_attrs (clear_attrs);
- dprint("translating clear_attrs from 0x%lx to 0x%lx\n", clear_attrs, uefi_clear_attrs);
- efi_status = EFI_SUCCESS;
- if (uefi_set_attrs) {
- efi_status = proto->SetMemoryAttributes(proto, physaddr, size, uefi_set_attrs);
- if (EFI_ERROR(efi_status)) {
- dprint(L"Failed to set memory attrs:0x%0x physaddr:0x%llx size:0x%0lx status:%r\n",
- uefi_set_attrs, physaddr, size, efi_status);
- }
- }
- if (!EFI_ERROR(efi_status) && uefi_clear_attrs) {
- efi_status = proto->ClearMemoryAttributes(proto, physaddr, size, uefi_clear_attrs);
- if (EFI_ERROR(efi_status)) {
- dprint(L"Failed to clear memory attrs:0x%0x physaddr:0x%llx size:0x%0lx status:%r\n",
- uefi_clear_attrs, physaddr, size, efi_status);
- }
- }
- ret = efi_status;
-
- efi_status = get_mem_attrs (addr, size, &after);
- if (EFI_ERROR(efi_status))
- dprint(L"get_mem_attrs(0x%llx, %llu, 0x%llx) -> 0x%lx\n",
- (unsigned long long)addr, (unsigned long long)size,
- &after, efi_status);
-
- dprint(L"set +%a%a%a -%a%a%a on 0x%llx-0x%llx before:%c%c%c after:%c%c%c\n",
- (set_attrs & MEM_ATTR_R) ? "r" : "",
- (set_attrs & MEM_ATTR_W) ? "w" : "",
- (set_attrs & MEM_ATTR_X) ? "x" : "",
- (clear_attrs & MEM_ATTR_R) ? "r" : "",
- (clear_attrs & MEM_ATTR_W) ? "w" : "",
- (clear_attrs & MEM_ATTR_X) ? "x" : "",
- (unsigned long long)addr, (unsigned long long)(addr + size - 1),
- (before & MEM_ATTR_R) ? 'r' : '-',
- (before & MEM_ATTR_W) ? 'w' : '-',
- (before & MEM_ATTR_X) ? 'x' : '-',
- (after & MEM_ATTR_R) ? 'r' : '-',
- (after & MEM_ATTR_W) ? 'w' : '-',
- (after & MEM_ATTR_X) ? 'x' : '-');
-
- return ret;
-}
-
EFI_STATUS verify_image(void *data, unsigned int datasize,
EFI_LOADED_IMAGE *li,
PE_COFF_LOADER_IMAGE_CONTEXT *context)
@@ -549,7 +406,7 @@ EFI_STATUS verify_image(void *data, unsigned int datasize,
/*
* The binary header contains relevant context and section pointers
*/
- efi_status = read_header(data, datasize, context);
+ efi_status = read_header(data, datasize, context, true);
if (EFI_ERROR(efi_status)) {
perror(L"Failed to read header: %r\n", efi_status);
return efi_status;
@@ -625,7 +482,7 @@ handle_image (void *data, unsigned int datasize,
/*
* The binary header contains relevant context and section pointers
*/
- efi_status = read_header(data, datasize, &context);
+ efi_status = read_header(data, datasize, &context, true);
if (EFI_ERROR(efi_status)) {
perror(L"Failed to read header: %r\n", efi_status);
return efi_status;
@@ -640,7 +497,7 @@ handle_image (void *data, unsigned int datasize,
sha1hash);
if (EFI_ERROR(efi_status)) {
- if (verbose)
+ if (verbose || in_protocol)
console_print(L"Verification failed: %r\n", efi_status);
else
console_error(L"Verification failed", efi_status);