^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _PGTABLE_NOPUD_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _PGTABLE_NOPUD_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <asm-generic/pgtable-nop4d.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define __PAGETABLE_PUD_FOLDED 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Having the pud type consist of a p4d gets the size right, and allows
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * us to conceptually access the p4d entry that this pud is folded into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * without casting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) typedef struct { p4d_t p4d; } pud_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define PUD_SHIFT P4D_SHIFT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define PTRS_PER_PUD 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define PUD_SIZE (1UL << PUD_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define PUD_MASK (~(PUD_SIZE-1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * The "p4d_xxx()" functions here are trivial for a folded two-level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * setup: the pud is never bad, and a pud always exists (as it's folded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * into the p4d entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) static inline int p4d_none(p4d_t p4d) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) static inline int p4d_bad(p4d_t p4d) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) static inline int p4d_present(p4d_t p4d) { return 1; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static inline void p4d_clear(p4d_t *p4d) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define pud_ERROR(pud) (p4d_ERROR((pud).p4d))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define p4d_populate(mm, p4d, pud) do { } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define p4d_populate_safe(mm, p4d, pud) do { } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * (puds are folded into p4ds so this doesn't get actually called,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * but the define is needed for a generic inline function.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define set_p4d(p4dptr, p4dval) set_pud((pud_t *)(p4dptr), (pud_t) { p4dval })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) static inline pud_t *pud_offset(p4d_t *p4d, unsigned long address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) return (pud_t *)p4d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define pud_offset pud_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define pud_val(x) (p4d_val((x).p4d))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define __pud(x) ((pud_t) { __p4d(x) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define p4d_page(p4d) (pud_page((pud_t){ p4d }))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define p4d_page_vaddr(p4d) (pud_page_vaddr((pud_t){ p4d }))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * allocating and freeing a pud is trivial: the 1-entry pud is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * inside the p4d, so has no extra memory associated with it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define pud_alloc_one(mm, address) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define pud_free(mm, x) do { } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define pud_free_tlb(tlb, x, a) do { } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #undef pud_addr_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define pud_addr_end(addr, end) (end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #endif /* _PGTABLE_NOPUD_H */