diff options
| author | Shell <[email protected]> | 2024-07-16 20:38:55 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-07-16 20:38:55 +0800 |
| commit | 1d78d11567bc2187d10ca94e63c39cc95ff1195d (patch) | |
| tree | d809e592a293e26527b4ad8e0c13da35b9d0d3d7 /components | |
| parent | d8294de64027696437bc4947c0eec28a3b4a17c4 (diff) | |
[smart] feat: add unmap for null mapper (#9186)
Do unmap before shrink so we don't see mapped entry on page table
insertion, which is not acceptable for riscv implementation of
architecture porting.
Changes:
- add un-mapping of pte on `_null_shrink()`
Signed-off-by: Shell <[email protected]>
Diffstat (limited to 'components')
| -rw-r--r-- | components/lwp/lwp_user_mm.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/components/lwp/lwp_user_mm.c b/components/lwp/lwp_user_mm.c index 01640d5a07..18f10e176f 100644 --- a/components/lwp/lwp_user_mm.c +++ b/components/lwp/lwp_user_mm.c @@ -70,11 +70,29 @@ static void _null_page_fault(struct rt_varea *varea, static rt_err_t _null_shrink(rt_varea_t varea, void *new_start, rt_size_t size) { + char *varea_start = varea->start; + void *rm_start; + void *rm_end; + + if (varea_start == (char *)new_start) + { + rm_start = varea_start + size; + rm_end = varea_start + varea->size; + } + else /* if (varea_start < (char *)new_start) */ + { + RT_ASSERT(varea_start < (char *)new_start); + rm_start = varea_start; + rm_end = new_start; + } + + rt_varea_unmap_range(varea, rm_start, rm_end - rm_start); return RT_EOK; } static rt_err_t _null_split(struct rt_varea *existed, void *unmap_start, rt_size_t unmap_len, struct rt_varea *subset) { + rt_varea_unmap_range(existed, unmap_start, unmap_len); return RT_EOK; } |
