@@ -55,8 +55,9 @@
* VA_START - the first kernel virtual address.
*/
#define VA_BITS (CONFIG_ARM64_VA_BITS)
-#define PAGE_OFFSET (UL(0xffffffffffffffff) - \
- (UL(1) << VA_BITS) + 1)
+#define _PAGE_OFFSET(va) (UL(0xffffffffffffffff) - \
+ (UL(1) << (va)) + 1)
+#define PAGE_OFFSET (_PAGE_OFFSET(VA_BITS))
#define PAGE_OFFSET_END (VA_START)
#define KIMAGE_VADDR (MODULES_END)
#define BPF_JIT_REGION_START (KASAN_SHADOW_END)
@@ -325,7 +326,7 @@ static inline void *phys_to_virt(phys_addr_t x)
#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
#define _virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
#else
-#define __virt_to_pgoff(kaddr) (((u64)(kaddr) & ~PAGE_OFFSET) / PAGE_SIZE * sizeof(struct page))
+#define __virt_to_pgoff(kaddr) (((u64)(kaddr) - PAGE_OFFSET) / PAGE_SIZE * sizeof(struct page))
#define __page_to_voff(kaddr) (((u64)(kaddr) - VMEMMAP_START) * PAGE_SIZE / sizeof(struct page))
#define page_to_virt(page) ({ \
@@ -338,8 +339,7 @@ static inline void *phys_to_virt(phys_addr_t x)
#define virt_to_page(vaddr) ((struct page *)((__virt_to_pgoff(vaddr)) | VMEMMAP_START))
-#define _virt_addr_valid(kaddr) pfn_valid((((u64)(kaddr) & ~PAGE_OFFSET) \
- + PHYS_OFFSET) >> PAGE_SHIFT)
+#define _virt_addr_valid(kaddr) pfn_valid(__virt_to_phys((u64)(kaddr)) >> PAGE_SHIFT)
#endif
#endif
This patch introduces _PAGE_OFFSET(va) to allow for computing the largest possible direct linear map for use with 48/52-bit selectable kernel VAs. Also, this patch removes the PAGE_OFFSET bit masking logic in virt_to_pgoff as this optimisation can paint us into a corner for permissible PAGE_OFFSET values in future. Lastly, this patch modifies the definition of _virt_addr_valid to use __virt_to_phys rather than a bitmasked PAGE_OFFSET formula. Signed-off-by: Steve Capper <steve.capper@arm.com> --- arch/arm64/include/asm/memory.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)