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; 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;
} }

View File

@ -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);