Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ab893fb9 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Catalin Marinas
Browse files

arm64: introduce KIMAGE_VADDR as the virtual base of the kernel region



This introduces the preprocessor symbol KIMAGE_VADDR which will serve as
the symbolic virtual base of the kernel region, i.e., the kernel's virtual
offset will be KIMAGE_VADDR + TEXT_OFFSET. For now, we define it as being
equal to PAGE_OFFSET, but in the future, it will be moved below it once
we move the kernel virtual mapping out of the linear mapping.

Reviewed-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 324420bf
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -51,7 +51,8 @@
#define VA_BITS			(CONFIG_ARM64_VA_BITS)
#define VA_START		(UL(0xffffffffffffffff) << VA_BITS)
#define PAGE_OFFSET		(UL(0xffffffffffffffff) << (VA_BITS - 1))
#define MODULES_END		(PAGE_OFFSET)
#define KIMAGE_VADDR		(PAGE_OFFSET)
#define MODULES_END		(KIMAGE_VADDR)
#define MODULES_VADDR		(MODULES_END - SZ_64M)
#define PCI_IO_END		(MODULES_VADDR - SZ_2M)
#define PCI_IO_START		(PCI_IO_END - PCI_IO_SIZE)
@@ -75,8 +76,13 @@
 * private definitions which should NOT be used outside memory.h
 * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
 */
#define __virt_to_phys(x)	(((phys_addr_t)(x) - PAGE_OFFSET + PHYS_OFFSET))
#define __virt_to_phys(x) ({						\
	phys_addr_t __x = (phys_addr_t)(x);				\
	__x >= PAGE_OFFSET ? (__x - PAGE_OFFSET + PHYS_OFFSET) :	\
			     (__x - KIMAGE_VADDR + PHYS_OFFSET); })

#define __phys_to_virt(x)	((unsigned long)((x) - PHYS_OFFSET + PAGE_OFFSET))
#define __phys_to_kimg(x)	((unsigned long)((x) - PHYS_OFFSET + KIMAGE_VADDR))

/*
 * Convert a page to/from a physical address
+1 −1
Original line number Diff line number Diff line
@@ -389,7 +389,7 @@ __create_page_tables:
	 * Map the kernel image (starting with PHYS_OFFSET).
	 */
	mov	x0, x26				// swapper_pg_dir
	mov	x5, #PAGE_OFFSET
	ldr	x5, =KIMAGE_VADDR
	create_pgd_entry x0, x5, x3, x6
	ldr	x6, =KERNEL_END			// __va(KERNEL_END)
	mov	x3, x24				// phys offset
+2 −2
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ SECTIONS
		*(.discard.*)
	}

	. = PAGE_OFFSET + TEXT_OFFSET;
	. = KIMAGE_VADDR + TEXT_OFFSET;

	.head.text : {
		_text = .;
@@ -186,4 +186,4 @@ ASSERT(__idmap_text_end - (__idmap_text_start & ~(SZ_4K - 1)) <= SZ_4K,
/*
 * If padding is applied before .head.text, virt<->phys conversions will fail.
 */
ASSERT(_text == (PAGE_OFFSET + TEXT_OFFSET), "HEAD is misaligned")
ASSERT(_text == (KIMAGE_VADDR + TEXT_OFFSET), "HEAD is misaligned")