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:
Jason Chen CJ 2018-04-05 07:58:49 +08:00 committed by lijinxia
parent 0c0d882084
commit 59dea38ee8
2 changed files with 32 additions and 16 deletions

View File

@ -838,14 +838,13 @@ static uint64_t break_page_table(struct map_params *map_params, void *paddr,
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,
enum mem_map_request_type request_type, bool direct)
{
int64_t remaining_size;
uint64_t adjust_size;
uint64_t attr;
int status = 0;
struct entry_params entry;
uint64_t page_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)) {
pr_err("%s: vaddr=0x%llx size=0x%llx req_type=0x%lx",
__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);
/* 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;
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)
{
int ret = 0;
/* 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);
if (ret < 0)
return ret;
/* only for 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);
}
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)
{
int ret = 0;
/* 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);
if (ret < 0)
return ret;
/* only for 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);
}
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)
{
int ret = 0;
/* 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);
if (ret < 0)
return ret;
/* only for 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);
}
return ret;
}

View File

@ -318,11 +318,11 @@ void *alloc_paging_struct(void);
void free_paging_struct(void *ptr);
void enable_paging(void *pml4_base_addr);
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);
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);
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);
void mmu_invept(struct vcpu *vcpu);
bool check_continuous_hpa(struct vm *vm, uint64_t gpa, uint64_t size);