mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-22 05:30:24 +00:00
mmu: refine functions modify_paging & map/unmap/modify mem
add error return for all, which is valid under release version, as at that time, ASSERT in modify_paging is empty. Signed-off-by: Jason Chen CJ <jason.cj.chen@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
0c0d882084
commit
59dea38ee8
@ -838,14 +838,13 @@ static uint64_t break_page_table(struct map_params *map_params, void *paddr,
|
|||||||
return next_page_size;
|
return next_page_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void modify_paging(struct map_params *map_params, void *paddr,
|
static int modify_paging(struct map_params *map_params, void *paddr,
|
||||||
void *vaddr, uint64_t size, uint32_t flags,
|
void *vaddr, uint64_t size, uint32_t flags,
|
||||||
enum mem_map_request_type request_type, bool direct)
|
enum mem_map_request_type request_type, bool direct)
|
||||||
{
|
{
|
||||||
int64_t remaining_size;
|
int64_t remaining_size;
|
||||||
uint64_t adjust_size;
|
uint64_t adjust_size;
|
||||||
uint64_t attr;
|
uint64_t attr;
|
||||||
int status = 0;
|
|
||||||
struct entry_params entry;
|
struct entry_params entry;
|
||||||
uint64_t page_size;
|
uint64_t page_size;
|
||||||
uint64_t vaddr_end = ((uint64_t)vaddr) + size;
|
uint64_t vaddr_end = ((uint64_t)vaddr) + size;
|
||||||
@ -862,9 +861,9 @@ static void modify_paging(struct map_params *map_params, void *paddr,
|
|||||||
|| (map_params == NULL)) {
|
|| (map_params == NULL)) {
|
||||||
pr_err("%s: vaddr=0x%llx size=0x%llx req_type=0x%lx",
|
pr_err("%s: vaddr=0x%llx size=0x%llx req_type=0x%lx",
|
||||||
__func__, vaddr, size, request_type);
|
__func__, vaddr, size, request_type);
|
||||||
status = -EINVAL;
|
ASSERT(0, "Incorrect Arguments");
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
ASSERT(status == 0, "Incorrect Arguments");
|
|
||||||
|
|
||||||
attr = config_page_table_attr(map_params, flags);
|
attr = config_page_table_attr(map_params, flags);
|
||||||
/* Loop until the entire block of memory is appropriately
|
/* Loop until the entire block of memory is appropriately
|
||||||
@ -912,43 +911,60 @@ static void modify_paging(struct map_params *map_params, void *paddr,
|
|||||||
paddr += adjust_size;
|
paddr += adjust_size;
|
||||||
remaining_size -= adjust_size;
|
remaining_size -= adjust_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void map_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
int map_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
||||||
uint64_t size, uint32_t flags)
|
uint64_t size, uint32_t flags)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
/* used for MMU and EPT*/
|
/* used for MMU and EPT*/
|
||||||
modify_paging(map_params, paddr, vaddr, size, flags,
|
ret = modify_paging(map_params, paddr, vaddr, size, flags,
|
||||||
PAGING_REQUEST_TYPE_MAP, true);
|
PAGING_REQUEST_TYPE_MAP, true);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
/* only for EPT */
|
/* only for EPT */
|
||||||
if (map_params->page_table_type == PTT_EPT) {
|
if (map_params->page_table_type == PTT_EPT) {
|
||||||
modify_paging(map_params, vaddr, paddr, size, flags,
|
ret = modify_paging(map_params, vaddr, paddr, size, flags,
|
||||||
PAGING_REQUEST_TYPE_MAP, false);
|
PAGING_REQUEST_TYPE_MAP, false);
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void unmap_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
int unmap_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
||||||
uint64_t size, uint32_t flags)
|
uint64_t size, uint32_t flags)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
/* used for MMU and EPT */
|
/* used for MMU and EPT */
|
||||||
modify_paging(map_params, paddr, vaddr, size, flags,
|
ret = modify_paging(map_params, paddr, vaddr, size, flags,
|
||||||
PAGING_REQUEST_TYPE_UNMAP, true);
|
PAGING_REQUEST_TYPE_UNMAP, true);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
/* only for EPT */
|
/* only for EPT */
|
||||||
if (map_params->page_table_type == PTT_EPT) {
|
if (map_params->page_table_type == PTT_EPT) {
|
||||||
modify_paging(map_params, vaddr, paddr, size, flags,
|
ret = modify_paging(map_params, vaddr, paddr, size, flags,
|
||||||
PAGING_REQUEST_TYPE_UNMAP, false);
|
PAGING_REQUEST_TYPE_UNMAP, false);
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void modify_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
int modify_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
||||||
uint64_t size, uint32_t flags)
|
uint64_t size, uint32_t flags)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
/* used for MMU and EPT*/
|
/* used for MMU and EPT*/
|
||||||
modify_paging(map_params, paddr, vaddr, size, flags,
|
ret = modify_paging(map_params, paddr, vaddr, size, flags,
|
||||||
PAGING_REQUEST_TYPE_MODIFY, true);
|
PAGING_REQUEST_TYPE_MODIFY, true);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
/* only for EPT */
|
/* only for EPT */
|
||||||
if (map_params->page_table_type == PTT_EPT) {
|
if (map_params->page_table_type == PTT_EPT) {
|
||||||
modify_paging(map_params, vaddr, paddr, size, flags,
|
ret = modify_paging(map_params, vaddr, paddr, size, flags,
|
||||||
PAGING_REQUEST_TYPE_MODIFY, false);
|
PAGING_REQUEST_TYPE_MODIFY, false);
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -318,11 +318,11 @@ void *alloc_paging_struct(void);
|
|||||||
void free_paging_struct(void *ptr);
|
void free_paging_struct(void *ptr);
|
||||||
void enable_paging(void *pml4_base_addr);
|
void enable_paging(void *pml4_base_addr);
|
||||||
void init_paging(void);
|
void init_paging(void);
|
||||||
void map_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
int map_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
||||||
uint64_t size, uint32_t flags);
|
uint64_t size, uint32_t flags);
|
||||||
void unmap_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
int unmap_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
||||||
uint64_t size, uint32_t flags);
|
uint64_t size, uint32_t flags);
|
||||||
void modify_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
int modify_mem(struct map_params *map_params, void *paddr, void *vaddr,
|
||||||
uint64_t size, uint32_t flags);
|
uint64_t size, uint32_t flags);
|
||||||
void mmu_invept(struct vcpu *vcpu);
|
void mmu_invept(struct vcpu *vcpu);
|
||||||
bool check_continuous_hpa(struct vm *vm, uint64_t gpa, uint64_t size);
|
bool check_continuous_hpa(struct vm *vm, uint64_t gpa, uint64_t size);
|
||||||
|
Loading…
Reference in New Issue
Block a user