From 9da813b1511fc61de192b6255d7a3abc030d3b54 Mon Sep 17 00:00:00 2001 From: ligr Date: Thu, 13 Mar 2025 12:29:55 +0800 Subject: [PATCH] [libcpu][risc-v]add code for handling exception scenarios in _unmap_area. --- libcpu/risc-v/common64/mmu.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libcpu/risc-v/common64/mmu.c b/libcpu/risc-v/common64/mmu.c index db5a79b5a3..badb7bebe6 100644 --- a/libcpu/risc-v/common64/mmu.c +++ b/libcpu/risc-v/common64/mmu.c @@ -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; }