mmu: refine functions walk_paging_struct & update_page_table_entry

- walk_paging_struct should return sub_table_addr, if something wrong,
  it return NULL
- update_page_table_entry should return adjusted_size, if something wrong
  it return 0

the change is valid under release version, as at that time, ASSERT in
walk_paging_struct 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 08:25:12 +08:00 committed by Jack Ren
parent bb82504f05
commit c2f86f23c3

View File

@ -364,7 +364,7 @@ static int get_table_entry(void *addr, void *table_base,
return 0; return 0;
} }
static void *walk_paging_struct(void *addr, void *table_base, static void *walk_paging_struct(void *addr, void *table_base,
uint32_t table_level, struct map_params *map_params) uint32_t table_level, struct map_params *map_params)
{ {
uint32_t table_offset; uint32_t table_offset;
@ -373,14 +373,13 @@ static void *walk_paging_struct(void *addr, void *table_base,
/* if table_level == IA32E_PT Just return the same address /* if table_level == IA32E_PT Just return the same address
* can't walk down any further * can't walk down any further
*/ */
void *sub_table_addr = ((table_level == IA32E_PT) ? table_base:NULL); void *sub_table_addr = (table_level == IA32E_PT) ? table_base : NULL;
int status = 0;
if (table_base == NULL || table_level >= IA32E_UNKNOWN if (table_base == NULL || table_level >= IA32E_UNKNOWN
|| map_params == NULL) { || map_params == NULL) {
status = -EINVAL; ASSERT(0, "Incorrect Arguments");
return NULL;
} }
ASSERT(status == 0, "Incorrect Arguments");
table_offset = fetch_page_table_offset(addr, table_level); table_offset = fetch_page_table_offset(addr, table_level);
@ -404,18 +403,16 @@ static void *walk_paging_struct(void *addr, void *table_base,
/* Determine if a valid entry exists */ /* Determine if a valid entry exists */
if ((table_entry & table_present) == 0) { if ((table_entry & table_present) == 0) {
/* No entry present - need to allocate a new table */ /* No entry present - need to allocate a new table */
sub_table_addr = sub_table_addr = alloc_paging_struct();
alloc_paging_struct();
/* Check to ensure memory available for this structure*/ /* Check to ensure memory available for this structure*/
if (sub_table_addr == 0) { if (sub_table_addr == NULL) {
/* Error: Unable to find table memory necessary /* Error: Unable to find table memory necessary
* to map memory * to map memory
*/ */
ASSERT(sub_table_addr == 0, ASSERT(0, "Fail to alloc table memory "
"Fail to find table memory "
"for map memory"); "for map memory");
return sub_table_addr; return NULL;
} }
/* Write entry to current table to reference the new /* Write entry to current table to reference the new
@ -712,6 +709,8 @@ static uint64_t update_page_table_entry(struct map_params *map_params,
/* Walk from the PML4 table to the PDPT table */ /* Walk from the PML4 table to the PDPT table */
table_addr = walk_paging_struct(vaddr, table_addr, IA32E_PML4, table_addr = walk_paging_struct(vaddr, table_addr, IA32E_PML4,
map_params); map_params);
if (table_addr == NULL)
return 0;
if ((remaining_size >= MEM_1G) if ((remaining_size >= MEM_1G)
&& (MEM_ALIGNED_CHECK(vaddr, MEM_1G)) && (MEM_ALIGNED_CHECK(vaddr, MEM_1G))
@ -727,6 +726,8 @@ static uint64_t update_page_table_entry(struct map_params *map_params,
/* Walk from the PDPT table to the PD table */ /* Walk from the PDPT table to the PD table */
table_addr = walk_paging_struct(vaddr, table_addr, table_addr = walk_paging_struct(vaddr, table_addr,
IA32E_PDPT, map_params); IA32E_PDPT, map_params);
if (table_addr == NULL)
return 0;
/* Map this 2 MByte memory region */ /* Map this 2 MByte memory region */
adjustment_size = map_mem_region(vaddr, paddr, adjustment_size = map_mem_region(vaddr, paddr,
table_addr, attr, IA32E_PD, table_type, table_addr, attr, IA32E_PD, table_type,
@ -735,9 +736,13 @@ static uint64_t update_page_table_entry(struct map_params *map_params,
/* Walk from the PDPT table to the PD table */ /* Walk from the PDPT table to the PD table */
table_addr = walk_paging_struct(vaddr, table_addr = walk_paging_struct(vaddr,
table_addr, IA32E_PDPT, map_params); table_addr, IA32E_PDPT, map_params);
if (table_addr == NULL)
return 0;
/* Walk from the PD table to the page table */ /* Walk from the PD table to the page table */
table_addr = walk_paging_struct(vaddr, table_addr = walk_paging_struct(vaddr,
table_addr, IA32E_PD, map_params); table_addr, IA32E_PD, map_params);
if (table_addr == NULL)
return 0;
/* Map this 4 KByte memory region */ /* Map this 4 KByte memory region */
adjustment_size = map_mem_region(vaddr, paddr, adjustment_size = map_mem_region(vaddr, paddr,
table_addr, attr, IA32E_PT, table_addr, attr, IA32E_PT,
@ -745,7 +750,6 @@ static uint64_t update_page_table_entry(struct map_params *map_params,
} }
return adjustment_size; return adjustment_size;
} }
static uint64_t break_page_table(struct map_params *map_params, void *paddr, static uint64_t break_page_table(struct map_params *map_params, void *paddr,
@ -918,6 +922,8 @@ static int modify_paging(struct map_params *map_params, void *paddr,
/* The function return the memory size that one entry can map */ /* The function return the memory size that one entry can map */
adjust_size = update_page_table_entry(map_params, paddr, vaddr, adjust_size = update_page_table_entry(map_params, paddr, vaddr,
page_size, attr, request_type, direct); page_size, attr, request_type, direct);
if (adjust_size == 0)
return -EINVAL;
vaddr += adjust_size; vaddr += adjust_size;
paddr += adjust_size; paddr += adjust_size;
remaining_size -= adjust_size; remaining_size -= adjust_size;