summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorheyuanjie87 <[email protected]>2024-06-26 12:16:37 +0800
committerGitHub <[email protected]>2024-06-26 12:16:37 +0800
commitb09a9784f99801a76d44fe1ceb33e371322de0dd (patch)
treee33419eeba2735c26b4bd2c942ffd2d93c129b82
parente390290482ecb74d6627292c78c51efcb02e7733 (diff)
[libcpu/c906]与virt同步 (#9095)
-rw-r--r--libcpu/risc-v/t-head/c906/riscv_mmu.h25
1 files changed, 23 insertions, 2 deletions
diff --git a/libcpu/risc-v/t-head/c906/riscv_mmu.h b/libcpu/risc-v/t-head/c906/riscv_mmu.h
index 6fc614eefb..79a885fd2d 100644
--- a/libcpu/risc-v/t-head/c906/riscv_mmu.h
+++ b/libcpu/risc-v/t-head/c906/riscv_mmu.h
@@ -131,6 +131,12 @@ rt_inline size_t rt_hw_mmu_attr_rm_perm(size_t attr, rt_base_t prot)
{
/* remove write permission for user */
case RT_HW_MMU_PROT_WRITE | RT_HW_MMU_PROT_USER:
+ attr &= ~PTE_W;
+ break;
+ /* remove write permission for kernel */
+ case RT_HW_MMU_PROT_WRITE | RT_HW_MMU_PROT_KERNEL:
+ attr &= ~PTE_W;
+ break;
default:
RT_ASSERT(0);
}
@@ -150,6 +156,8 @@ rt_inline size_t rt_hw_mmu_attr_add_perm(size_t attr, rt_base_t prot)
{
/* add write permission for user */
case RT_HW_MMU_PROT_WRITE | RT_HW_MMU_PROT_USER:
+ attr |= (PTE_R | PTE_W | PTE_U);
+ break;
default:
RT_ASSERT(0);
}
@@ -166,13 +174,26 @@ rt_inline size_t rt_hw_mmu_attr_add_perm(size_t attr, rt_base_t prot)
rt_inline rt_bool_t rt_hw_mmu_attr_test_perm(size_t attr, rt_base_t prot)
{
rt_bool_t rc = 0;
- switch (prot)
+ switch (prot & ~RT_HW_MMU_PROT_USER)
{
/* test write permission for user */
- case RT_HW_MMU_PROT_WRITE | RT_HW_MMU_PROT_USER:
+ case RT_HW_MMU_PROT_WRITE:
+ rc = ((attr & PTE_W) && (attr & PTE_R));
+ break;
+ case RT_HW_MMU_PROT_READ:
+ rc = !!(attr & PTE_R);
+ break;
+ case RT_HW_MMU_PROT_EXECUTE:
+ rc = !!(attr & PTE_X);
+ break;
default:
RT_ASSERT(0);
}
+
+ if (rc && (prot & RT_HW_MMU_PROT_USER))
+ {
+ rc = !!(attr & PTE_U);
+ }
return rc;
}