]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
include/arch/arm/arm64: Add PT_Lx_PTE_SET_PADDR()
authorSergiu Moga <sergiu.moga@protonmail.com>
Tue, 18 Apr 2023 11:10:06 +0000 (14:10 +0300)
committerUnikraft <monkey@unikraft.io>
Fri, 11 Aug 2023 10:12:32 +0000 (10:12 +0000)
Implement `Add PT_Lx_PTE_SET_PADDR()`, which allows to set the
physical address in a page table entry.

Signed-off-by: Sergiu Moga <sergiu.moga@protonmail.com>
Reviewed-by: Michalis Pappas <michalis@unikraft.io>
Approved-by: Razvan Deaconescu <razvand@unikraft.io>
Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #908

arch/arm/arm64/include/uk/asm/paging.h

index 733aaee54865deda3d401e0c7016839e72454725..e8582cf348fce6228b69087f1fc78c14654ce281 100644 (file)
@@ -173,6 +173,31 @@ static inline __paddr_t PT_Lx_PTE_PADDR(__pte_t pte, unsigned int lvl)
        return paddr;
 }
 
+static inline __paddr_t PT_Lx_PTE_SET_PADDR(__pte_t pte, unsigned int lvl,
+                                            __paddr_t paddr)
+{
+       static __u64 pte_lx_map_paddr_mask[] = {
+               PTE_L0_PAGE_PADDR_MASK,
+               PTE_L1_BLOCK_PADDR_MASK,
+               PTE_L2_BLOCK_PADDR_MASK
+       };
+
+       if (PAGE_Lx_IS(pte, lvl)) {
+#ifdef CONFIG_LIBUKDEBUG
+               UK_ASSERT(lvl <= PT_MAP_LEVEL_MAX);
+#endif /* CONFIG_LIBUKDEBUG */
+               paddr &= pte_lx_map_paddr_mask[lvl];
+               pte &= ~pte_lx_map_paddr_mask[lvl];
+       } else {
+#ifdef CONFIG_LIBUKDEBUG
+               UK_ASSERT(lvl > PAGE_LEVEL && lvl < PT_LEVELS);
+#endif /* CONFIG_LIBUKDEBUG */
+               paddr &= PTE_Lx_TABLE_PADDR_MASK;
+               pte &= ~PTE_Lx_TABLE_PADDR_MASK;
+       }
+       return pte | paddr;
+}
+
 static inline int ukarch_paddr_range_isvalid(__paddr_t start, __paddr_t end)
 {
 #ifdef CONFIG_LIBUKDEBUG