[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2] biosmem: Narrow or widen e820 memory regions as appropriate
From: |
Damien Zammit |
Subject: |
[PATCH v2] biosmem: Narrow or widen e820 memory regions as appropriate |
Date: |
Mon, 14 Feb 2022 06:57:40 +0000 |
---
i386/i386at/biosmem.c | 40 +++++++++++++++++++++++++++++++++-------
1 file changed, 33 insertions(+), 7 deletions(-)
diff --git a/i386/i386at/biosmem.c b/i386/i386at/biosmem.c
index 4f0914ca..354d0529 100644
--- a/i386/i386at/biosmem.c
+++ b/i386/i386at/biosmem.c
@@ -73,14 +73,22 @@ static unsigned int biosmem_nr_boot_data __bootdata;
#define BIOSMEM_MAX_MAP_SIZE 128
/*
- * Memory range types.
+ * Memory range types (as bitmask)
*/
-#define BIOSMEM_TYPE_AVAILABLE 1
-#define BIOSMEM_TYPE_RESERVED 2
-#define BIOSMEM_TYPE_ACPI 3
-#define BIOSMEM_TYPE_NVS 4
-#define BIOSMEM_TYPE_UNUSABLE 5
-#define BIOSMEM_TYPE_DISABLED 6
+#define BIOSMEM_TYPE_AVAILABLE (1u << 0)
+#define BIOSMEM_TYPE_RESERVED (1u << 1)
+#define BIOSMEM_TYPE_ACPI (1u << 2)
+#define BIOSMEM_TYPE_NVS (1u << 3)
+#define BIOSMEM_TYPE_UNUSABLE (1u << 4)
+#define BIOSMEM_TYPE_DISABLED (1u << 5)
+
+/*
+ * Bitmask corresponding to memory ranges that require narrowing
+ * to page boundaries. Unset ranges in the mask require widening.
+ */
+#define BIOSMEM_MASK_NARROW ((BIOSMEM_TYPE_AVAILABLE | \
+ BIOSMEM_TYPE_NVS | \
+ BIOSMEM_TYPE_DISABLED))
/*
* Memory map entry.
@@ -248,6 +256,20 @@ biosmem_unregister_boot_data(phys_addr_t start,
phys_addr_t end)
#ifndef MACH_HYP
+static void __boot
+biosmem_map_adjust_alignment(struct biosmem_map_entry *e)
+{
+ uint64_t end = e->base_addr + e->length;
+
+ if (e->type & BIOSMEM_MASK_NARROW) {
+ e->base_addr = vm_page_round (e->base_addr);
+ e->length = vm_page_trunc (end) - e->base_addr;
+ } else {
+ e->base_addr = vm_page_trunc (e->base_addr);
+ e->length = vm_page_round (end) - e->base_addr;
+ }
+}
+
static void __boot
biosmem_map_build(const struct multiboot_raw_info *mbi)
{
@@ -268,6 +290,8 @@ biosmem_map_build(const struct multiboot_raw_info *mbi)
entry->type = mb_entry->type;
mb_entry = (void *)mb_entry + sizeof(mb_entry->size) + mb_entry->size;
+
+ biosmem_map_adjust_alignment(entry);
entry++;
}
@@ -283,11 +307,13 @@ biosmem_map_build_simple(const struct multiboot_raw_info
*mbi)
entry->base_addr = 0;
entry->length = mbi->mem_lower << 10;
entry->type = BIOSMEM_TYPE_AVAILABLE;
+ biosmem_map_adjust_alignment(entry);
entry++;
entry->base_addr = BIOSMEM_END;
entry->length = mbi->mem_upper << 10;
entry->type = BIOSMEM_TYPE_AVAILABLE;
+ biosmem_map_adjust_alignment(entry);
biosmem_map_size = 2;
}
--
2.34.1
- [PATCH v2] biosmem: Narrow or widen e820 memory regions as appropriate,
Damien Zammit <=