|
From: alex <thi...@gm...> - 2021-10-20 15:31:33
|
# HG changeset patch
# User Alex Olson <ale...@st...>
# Date 1634322959 18000
# Fri Oct 15 13:35:59 2021 -0500
# Node ID 4eda9c0cf72d0fe0c217c251bdef2c5628e0c0a6
# Parent 5bf5c12411d3a4a7e0a552203b40bfe59d5c7789
make efi_memmap_reserve handle gaps like e820_protect_region already does
This revision corrects an inconsistency in the way efi_memmap_reserve
deals with requests that lie within a gap in the memory map.
In such cases, e820_protect_region() created a new range in the map,
however efi_memmap_reserve was doing nothing since its logic was
based on finding an overlapping range.
This revision makes efi_memmap_reserve add a new range. Unlike
the e820 case, the EFI memory map have an "attributes" field as well
and it is somewhat ambigious how to define the attributes of a new map.
Since we are only using this for reserved ranges, the attributes are set to zero
for simplicity...
Signed-off-by: Alex Olson <ale...@st...>
diff -r 5bf5c12411d3 -r 4eda9c0cf72d tboot/common/efi_memmap.c
--- a/tboot/common/efi_memmap.c Wed Sep 15 16:53:34 2021 +0200
+++ b/tboot/common/efi_memmap.c Fri Oct 15 13:35:59 2021 -0500
@@ -144,6 +144,8 @@
* Region has to be aligned to page size, function will round non-aligned
* values. Base address is rounded down, length - up.
*
+ * If the specified region lies within a gap, a new region will be added
+ *
* @param base starting address
* @param length length of region to reserve
*/
@@ -164,6 +166,7 @@
uint64_t end = base + length;
efi_mem_descr_t* desc = NULL;
uint32_t i = 0;
+ bool in_range = false;
while ((desc = efi_memmap_walk(desc)) != NULL) {
uint64_t desc_base = desc->physical_start;
@@ -185,6 +188,9 @@
goto cont;
}
+ /* In all cases below, the current range is involved */
+ in_range = true;
+
/* case 1: the current ram range is within the range:
base, desc_base, desc_end, end */
if ((base <= desc_base) && (desc_end <= end)) {
@@ -250,6 +256,15 @@
++i;
}
+ /* Insert the new region */
+ if ( !in_range ) {
+
+ desc = efi_memmap_walk(NULL);
+ if( !insert_after_region(0, base, length, EFI_RESERVED_TYPE, 0) ) {
+ return false;
+ }
+ }
+
return true;
}
|