mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-08-09 12:08:30 +00:00
hv: refine the e820 add new entry logic
Sometimes the memory to be allocated is not at the end of an entry, that means we have to break one enty into 2 smaller entries, there are two ways to add the new entry to hv_e820, adds to the end or insert it. The initial e820 table is ordered, that's why the e820_alloc_memory interface asssum all entries was sorted, but add new entry to the end will break the orde of hv_e820. So we use insert_e820_entry to replace the add_e820_entry, the new interfeac will keep the orde and users do not need sort again after alloc region Tracked-On: #6690 Acked-by: Anthony Xu <anthony.xu@intel.com> Signed-off-by: Chenli Wei<chenli.wei@linux.intel.com>
This commit is contained in:
parent
364b2b1428
commit
01fa6de42c
@ -102,13 +102,20 @@ uint64_t e820_alloc_memory(uint64_t size_arg, uint64_t max_addr)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_e820_entry(uint64_t addr, uint64_t length, uint64_t type)
|
static void insert_e820_entry(uint32_t index, uint64_t addr, uint64_t length, uint64_t type)
|
||||||
{
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
hv_e820_entries_nr++;
|
hv_e820_entries_nr++;
|
||||||
ASSERT(hv_e820_entries_nr <= E820_MAX_ENTRIES, "e820 entry overflow");
|
ASSERT(hv_e820_entries_nr <= E820_MAX_ENTRIES, "e820 entry overflow");
|
||||||
hv_e820[hv_e820_entries_nr - 1U].baseaddr = addr;
|
|
||||||
hv_e820[hv_e820_entries_nr - 1U].length = length;
|
for (i = hv_e820_entries_nr - 1; i > index; i--) {
|
||||||
hv_e820[hv_e820_entries_nr - 1U].type = type;
|
hv_e820[i] = hv_e820[i-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
hv_e820[index].baseaddr = addr;
|
||||||
|
hv_e820[index].length = length;
|
||||||
|
hv_e820[index].type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t e820_alloc_region(uint64_t addr, uint64_t size)
|
static uint64_t e820_alloc_region(uint64_t addr, uint64_t size)
|
||||||
@ -137,7 +144,7 @@ static uint64_t e820_alloc_region(uint64_t addr, uint64_t size)
|
|||||||
* |entry_start..............................entry_end|
|
* |entry_start..............................entry_end|
|
||||||
*/
|
*/
|
||||||
if (end_pa < entry_end) {
|
if (end_pa < entry_end) {
|
||||||
add_e820_entry(end_pa, entry_end - end_pa, E820_TYPE_RAM);
|
insert_e820_entry(i + 1, end_pa, entry_end - end_pa, E820_TYPE_RAM);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user