Refactor pte_t to be a union which hold page table entry plus pt_t and pt_walk_t structures to simpilfy p2m functions.
Also, introduce some helpers which are using pt_walk_t. Signed-off-by: Oleksii Kurochko <oleksii.kuroc...@gmail.com> --- xen/arch/riscv/include/asm/page.h | 54 ++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/xen/arch/riscv/include/asm/page.h b/xen/arch/riscv/include/asm/page.h index 2af4823170..cb3dea309c 100644 --- a/xen/arch/riscv/include/asm/page.h +++ b/xen/arch/riscv/include/asm/page.h @@ -99,15 +99,67 @@ #endif -/* Page Table entry */ typedef struct { + unsigned long v:1; + unsigned long r:1; + unsigned long w:1; + unsigned long x:1; + unsigned long u:1; + unsigned long g:1; + unsigned long a:1; + unsigned long d:1; + unsigned long rsw:2; +#if RV_STAGE1_MODE == SATP_MODE_SV39 + unsigned long ppn0:9; + unsigned long ppn1:9; + unsigned long ppn2:26; + unsigned long rsw2:7; + unsigned long pbmt:2; + unsigned long n:1; +#elif RV_STAGE1_MODE == SATP_MODE_SV48 + unsigned long ppn0:9; + unsigned long ppn1:9; + unsigned long ppn2:9; + unsigned long ppn3:17; + unsigned long rsw2:7; + unsigned long pbmt:2; + unsigned long n:1; +#else +#error "Add proper bits for SATP_MODE" +#endif +} pt_t; + +typedef struct { + unsigned long rsw:10; +#if RV_STAGE1_MODE == SATP_MODE_SV39 || RV_STAGE1_MODE == SATP_MODE_SV48 + unsigned long ppn: 44; +#else +#error "Add proper bits for SATP_MODE" +#endif + unsigned long rsw2:10; +} pt_walk_t; + +/* Page Table entry */ +typedef union { #ifdef CONFIG_RISCV_64 uint64_t pte; #else uint32_t pte; #endif + pt_t bits; + pt_walk_t walk; } pte_t; +static inline void pte_set_mfn(pte_t *pte, mfn_t mfn) +{ + pte->walk.ppn = mfn_x(mfn); +} + +static inline mfn_t pte_get_mfn(pte_t pte) +{ + return _mfn(pte.walk.ppn); +} + static inline pte_t paddr_to_pte(paddr_t paddr, unsigned int permissions) { -- 2.49.0