mirror of https://github.com/RT-Thread/rt-thread
[libcpu][risc-v]add code for handling exception scenarios in _unmap_area.
This commit is contained in:
parent
b04aacbd94
commit
9da813b151
|
@ -263,10 +263,23 @@ static size_t _unmap_area(struct rt_aspace *aspace, void *v_addr)
|
|||
lvl_entry[i] = ((rt_ubase_t *)aspace->page_table + lvl_off[i]);
|
||||
pentry = lvl_entry[i];
|
||||
|
||||
/* check if lvl_entry[0] is valid. if no, return 0 directly. */
|
||||
if (!PTE_USED(*pentry))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* find leaf page table entry */
|
||||
while (PTE_USED(*pentry) && !PAGE_IS_LEAF(*pentry))
|
||||
{
|
||||
i += 1;
|
||||
|
||||
if (i >= 3)
|
||||
{
|
||||
unmapped = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
lvl_entry[i] = ((rt_ubase_t *)PPN_TO_VPN(GET_PADDR(*pentry), PV_OFFSET) +
|
||||
lvl_off[i]);
|
||||
pentry = lvl_entry[i];
|
||||
|
@ -278,6 +291,10 @@ static size_t _unmap_area(struct rt_aspace *aspace, void *v_addr)
|
|||
{
|
||||
_unmap_pte(pentry, lvl_entry, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
unmapped = 0; /* invalid pte, return 0. */
|
||||
}
|
||||
|
||||
return unmapped;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue