Merge tag 'signed-efi-2019.01' of git://github.com/agraf/u-boot

Patch queue for efi v2019.01 - 2018-12-27

Three tiny last minute bug fixes:

  - Fix RTS relocation
  - Avoid read after free
  - Fix RTS data positioning (affects BBB)
This commit is contained in:
Tom Rini
2018-12-27 12:59:01 -05:00
3 changed files with 38 additions and 9 deletions

View File

@@ -65,7 +65,8 @@ static void __efi_runtime make_crc_table(void)
int n, k;
uLong poly; /* polynomial exclusive-or pattern */
/* terms of polynomial defining this crc (except x^32): */
static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
static Byte __efi_runtime_data p[] = {
0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26};
/* make exclusive-or pattern from polynomial (0xedb88320L) */
poly = 0L;

View File

@@ -436,14 +436,42 @@ static efi_status_t EFIAPI efi_set_virtual_address_map(
uint32_t descriptor_version,
struct efi_mem_desc *virtmap)
{
ulong runtime_start = (ulong)&__efi_runtime_start &
~(ulong)EFI_PAGE_MASK;
int n = memory_map_size / descriptor_size;
int i;
int rt_code_sections = 0;
EFI_ENTRY("%lx %lx %x %p", memory_map_size, descriptor_size,
descriptor_version, virtmap);
/*
* TODO:
* Further down we are cheating. While really we should implement
* SetVirtualAddressMap() events and ConvertPointer() to allow
* dynamically loaded drivers to expose runtime services, we don't
* today.
*
* So let's ensure we see exactly one single runtime section, as
* that is the built-in one. If we see more (or less), someone must
* have tried adding or removing to that which we don't support yet.
* In that case, let's better fail rather than expose broken runtime
* services.
*/
for (i = 0; i < n; i++) {
struct efi_mem_desc *map = (void*)virtmap +
(descriptor_size * i);
if (map->type == EFI_RUNTIME_SERVICES_CODE)
rt_code_sections++;
}
if (rt_code_sections != 1) {
/*
* We expose exactly one single runtime code section, so
* something is definitely going wrong.
*/
return EFI_EXIT(EFI_INVALID_PARAMETER);
}
/* Rebind mmio pointers */
for (i = 0; i < n; i++) {
struct efi_mem_desc *map = (void*)virtmap +
@@ -483,7 +511,7 @@ static efi_status_t EFIAPI efi_set_virtual_address_map(
map = (void*)virtmap + (descriptor_size * i);
if (map->type == EFI_RUNTIME_SERVICES_CODE) {
ulong new_offset = map->virtual_start -
(runtime_start - gd->relocaddr);
map->physical_start + gd->relocaddr;
efi_runtime_relocate(new_offset, map);
/* Once we're virtual, we can no longer handle

View File

@@ -445,11 +445,6 @@ static int execute(void)
efi_st_error("Failed to write file\n");
return EFI_ST_FAILURE;
}
ret = file->close(file);
if (ret != EFI_SUCCESS) {
efi_st_error("Failed to close file\n");
return EFI_ST_FAILURE;
}
ret = file->getpos(file, &pos);
if (ret != EFI_SUCCESS) {
efi_st_error("GetPosition failed\n");
@@ -460,6 +455,11 @@ static int execute(void)
(unsigned int)pos);
return EFI_ST_FAILURE;
}
ret = file->close(file);
if (ret != EFI_SUCCESS) {
efi_st_error("Failed to close file\n");
return EFI_ST_FAILURE;
}
/* Verify file */
boottime->set_mem(buf, sizeof(buf), 0);