mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-23 09:47:44 +00:00
hv: mmu: refine set guest memory region API
1. rename set_vm_memmap to set_vm_memory_region 2. split ept_mmap into ept_mr_add and ept_mr_del Signed-off-by: Li, Fei1 <fei1.li@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
@@ -250,8 +250,7 @@ int register_mmio_emulation_handler(struct vm *vm,
|
||||
* need to unmap it.
|
||||
*/
|
||||
if (is_vm0(vm)) {
|
||||
ept_mmap(vm, start, start, end - start,
|
||||
MAP_UNMAP, 0);
|
||||
ept_mr_del(vm, start, start, end - start);
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
@@ -486,8 +485,8 @@ int ept_misconfig_vmexit_handler(__unused struct vcpu *vcpu)
|
||||
return status;
|
||||
}
|
||||
|
||||
int ept_mmap(struct vm *vm, uint64_t hpa,
|
||||
uint64_t gpa, uint64_t size, uint32_t type, uint32_t prot)
|
||||
int ept_mr_add(struct vm *vm, uint64_t hpa,
|
||||
uint64_t gpa, uint64_t size, uint32_t prot)
|
||||
{
|
||||
struct map_params map_params;
|
||||
uint16_t i;
|
||||
@@ -498,30 +497,22 @@ int ept_mmap(struct vm *vm, uint64_t hpa,
|
||||
map_params.pml4_base = vm->arch_vm.nworld_eptp;
|
||||
map_params.pml4_inverted = vm->arch_vm.m2p;
|
||||
|
||||
if (type == MAP_MEM || type == MAP_MMIO) {
|
||||
/* EPT & VT-d share the same page tables, set SNP bit
|
||||
* to force snooping of PCIe devices if the page
|
||||
* is cachable
|
||||
*/
|
||||
if ((prot & IA32E_EPT_MT_MASK) != IA32E_EPT_UNCACHED) {
|
||||
prot |= IA32E_EPT_SNOOP_CTRL;
|
||||
}
|
||||
map_mem(&map_params, (void *)hpa,
|
||||
(void *)gpa, size, prot);
|
||||
|
||||
} else if (type == MAP_UNMAP) {
|
||||
unmap_mem(&map_params, (void *)hpa, (void *)gpa,
|
||||
size, prot);
|
||||
} else {
|
||||
ASSERT(false, "unknown map type");
|
||||
/* EPT & VT-d share the same page tables, set SNP bit
|
||||
* to force snooping of PCIe devices if the page
|
||||
* is cachable
|
||||
*/
|
||||
if ((prot & IA32E_EPT_MT_MASK) != IA32E_EPT_UNCACHED) {
|
||||
prot |= IA32E_EPT_SNOOP_CTRL;
|
||||
}
|
||||
map_mem(&map_params, (void *)hpa,
|
||||
(void *)gpa, size, prot);
|
||||
|
||||
foreach_vcpu(i, vm, vcpu) {
|
||||
vcpu_make_request(vcpu, ACRN_REQUEST_EPT_FLUSH);
|
||||
}
|
||||
|
||||
dev_dbg(ACRN_DBG_EPT, "ept map: %s hpa: 0x%016llx gpa: 0x%016llx ",
|
||||
type == MAP_UNMAP ? "unmap" : "map", hpa, gpa);
|
||||
dev_dbg(ACRN_DBG_EPT, "%s, hpa: 0x%016llx gpa: 0x%016llx ",
|
||||
__func__, hpa, gpa);
|
||||
dev_dbg(ACRN_DBG_EPT, "size: 0x%016llx prot: 0x%x\n", size, prot);
|
||||
|
||||
return 0;
|
||||
@@ -543,3 +534,27 @@ int ept_mr_modify(struct vm *vm, uint64_t gpa, uint64_t size,
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ept_mr_del(struct vm *vm, uint64_t hpa,
|
||||
uint64_t gpa, uint64_t size)
|
||||
{
|
||||
struct map_params map_params;
|
||||
uint16_t i;
|
||||
struct vcpu *vcpu;
|
||||
|
||||
/* Setup memory map parameters */
|
||||
map_params.page_table_type = PTT_EPT;
|
||||
map_params.pml4_base = vm->arch_vm.nworld_eptp;
|
||||
map_params.pml4_inverted = vm->arch_vm.m2p;
|
||||
|
||||
unmap_mem(&map_params, (void *)hpa, (void *)gpa, size, 0U);
|
||||
|
||||
foreach_vcpu(i, vm, vcpu) {
|
||||
vcpu_make_request(vcpu, ACRN_REQUEST_EPT_FLUSH);
|
||||
}
|
||||
|
||||
dev_dbg(ACRN_DBG_EPT, "%s, hpa 0x%llx gpa 0x%llx size 0x%llx\n",
|
||||
__func__, hpa, gpa, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -614,16 +614,16 @@ int prepare_vm0_memmap_and_e820(struct vm *vm)
|
||||
e820_mem.mem_bottom, e820_mem.mem_top);
|
||||
|
||||
/* create real ept map for all ranges with UC */
|
||||
ept_mmap(vm, e820_mem.mem_bottom, e820_mem.mem_bottom,
|
||||
ept_mr_add(vm, e820_mem.mem_bottom, e820_mem.mem_bottom,
|
||||
(e820_mem.mem_top - e820_mem.mem_bottom),
|
||||
MAP_MMIO, attr_uc);
|
||||
attr_uc);
|
||||
|
||||
/* update ram entries to WB attr */
|
||||
for (i = 0U; i < e820_entries; i++) {
|
||||
entry = &e820[i];
|
||||
if (entry->type == E820_TYPE_RAM) {
|
||||
ept_mmap(vm, entry->baseaddr, entry->baseaddr,
|
||||
entry->length, MAP_MEM, attr_wb);
|
||||
ept_mr_add(vm, entry->baseaddr, entry->baseaddr,
|
||||
entry->length, attr_wb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -641,7 +641,7 @@ int prepare_vm0_memmap_and_e820(struct vm *vm)
|
||||
* will cause EPT violation if sos accesses hv memory
|
||||
*/
|
||||
hv_hpa = get_hv_image_base();
|
||||
ept_mmap(vm, hv_hpa, hv_hpa, CONFIG_RAM_SIZE, MAP_UNMAP, 0U);
|
||||
ept_mr_del(vm, hv_hpa, hv_hpa, CONFIG_RAM_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -2111,9 +2111,9 @@ int vlapic_create(struct vcpu *vcpu)
|
||||
}
|
||||
|
||||
if (is_vcpu_bsp(vcpu)) {
|
||||
ept_mmap(vcpu->vm,
|
||||
ept_mr_add(vcpu->vm,
|
||||
apicv_get_apic_access_addr(vcpu->vm),
|
||||
DEFAULT_APIC_BASE, CPU_PAGE_SIZE, MAP_MMIO,
|
||||
DEFAULT_APIC_BASE, CPU_PAGE_SIZE,
|
||||
IA32E_EPT_W_BIT | IA32E_EPT_R_BIT |
|
||||
IA32E_EPT_UNCACHED);
|
||||
}
|
||||
|
@@ -102,13 +102,13 @@ int vmcall_vmexit_handler(struct vcpu *vcpu)
|
||||
(uint16_t)param2);
|
||||
break;
|
||||
|
||||
case HC_VM_SET_MEMMAP:
|
||||
case HC_VM_SET_MEMORY_REGION:
|
||||
/* param1: vmid */
|
||||
ret = hcall_set_vm_memmap(vm, (uint16_t)param1, param2);
|
||||
ret = hcall_set_vm_memory_region(vm, (uint16_t)param1, param2);
|
||||
break;
|
||||
|
||||
case HC_VM_SET_MEMMAPS:
|
||||
ret = hcall_set_vm_memmaps(vm, param1);
|
||||
case HC_VM_SET_MEMORY_REGIONS:
|
||||
ret = hcall_set_vm_memory_regions(vm, param1);
|
||||
break;
|
||||
|
||||
case HC_VM_PCI_MSIX_REMAP:
|
||||
|
Reference in New Issue
Block a user