[RFC PATCH 14/34] csky: mm: use proper set_pXd() for generic compile-time folded patable in vmalloc_fault()
Yeoreum Yun
yeoreum.yun at arm.com
Mon Jul 13 06:55:53 PDT 2026
We want to rework how set_pXd() behaves for generic compile-time
folded page tables by disallowing its use and triggering a
compile-time error when it is used improperly, ensuring that the actual
first-level set_pXd() function is used instead.
Since csky's PGTABLE_LEVELS always is 2, use set_pmd() instead of
set_pgd() to handle vmalloc_fault().
There should be no functional change.
Signed-off-by: Yeoreum Yun <yeoreum.yun at arm.com>
---
arch/csky/mm/fault.c | 35 +++++++++++------------------------
1 file changed, 11 insertions(+), 24 deletions(-)
diff --git a/arch/csky/mm/fault.c b/arch/csky/mm/fault.c
index 7ff4011089850..1467ea963806c 100644
--- a/arch/csky/mm/fault.c
+++ b/arch/csky/mm/fault.c
@@ -114,12 +114,12 @@ static inline void bad_area_nosemaphore(struct pt_regs *regs, struct mm_struct *
static inline void vmalloc_fault(struct pt_regs *regs, int code, unsigned long addr)
{
- pgd_t *pgd, *pgd_k;
- pud_t *pud, *pud_k;
- pmd_t *pmd, *pmd_k;
- pte_t *pte_k;
+ pmd_t *pmdp, *pmdp_k, pmd_k;
+ pte_t *ptep_k;
int offset;
+ BUILD_BUG_ON(CONFIG_PGTABLE_LEVELS != 2);
+
/* User mode accesses just cause a SIGSEGV */
if (user_mode(regs)) {
do_trap(regs, SIGSEGV, code, addr);
@@ -135,32 +135,19 @@ static inline void vmalloc_fault(struct pt_regs *regs, int code, unsigned long a
*/
offset = pgd_index(addr);
- pgd = get_pgd() + offset;
- pgd_k = init_mm.pgd + offset;
-
- if (!pgd_present(*pgd_k)) {
- no_context(regs, addr);
- return;
- }
- set_pgd(pgd, *pgd_k);
+ pmdp = (pmd_t *)(get_pgd() + offset);
+ pmdp_k = (pmd_t *)(init_mm.pgd + offset);
- pud = (pud_t *)pgd;
- pud_k = (pud_t *)pgd_k;
- if (!pud_present(*pud_k)) {
+ pmd_k = *pmdp_k;
+ if (!pmd_present(pmd_k)) {
no_context(regs, addr);
return;
}
- pmd = pmd_offset(pud, addr);
- pmd_k = pmd_offset(pud_k, addr);
- if (!pmd_present(*pmd_k)) {
- no_context(regs, addr);
- return;
- }
- set_pmd(pmd, *pmd_k);
+ set_pmd(pmdp, pmd_k);
- pte_k = pte_offset_kernel(pmd_k, addr);
- if (!pte_present(*pte_k)) {
+ ptep_k = pte_offset_kernel(pmdp_k, addr);
+ if (!pte_present(*ptep_k)) {
no_context(regs, addr);
return;
}
--
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
More information about the kvm-riscv
mailing list