arm64: remove __calc_phys_offset
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 17 Mar 2015 08:14:29 +0000 (09:14 +0100)
committerWill Deacon <will.deacon@arm.com>
Thu, 19 Mar 2015 19:46:02 +0000 (19:46 +0000)
This removes the function __calc_phys_offset and all open coded
virtual to physical address translations using the offset kept
in x28.

Instead, just use absolute or PC-relative symbol references as
appropriate when referring to virtual or physical addresses,
respectively.

Tested-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/kernel/head.S

index 750403c62928e1bd0828527af3fd996abcd0b531..f5ac337f959874e06f35ef1ce9c0141ca9858ac5 100644 (file)
@@ -36,7 +36,7 @@
 #include <asm/page.h>
 #include <asm/virt.h>
 
-#define KERNEL_RAM_VADDR       (PAGE_OFFSET + TEXT_OFFSET)
+#define __PHYS_OFFSET  (KERNEL_START - TEXT_OFFSET)
 
 #if (TEXT_OFFSET & 0xfff) != 0
 #error TEXT_OFFSET must be at least 4KB aligned
 #error TEXT_OFFSET must be less than 2MB
 #endif
 
-       .macro  pgtbl, ttb0, ttb1, virt_to_phys
-       ldr     \ttb1, =swapper_pg_dir
-       ldr     \ttb0, =idmap_pg_dir
-       add     \ttb1, \ttb1, \virt_to_phys
-       add     \ttb0, \ttb0, \virt_to_phys
-       .endm
-
 #ifdef CONFIG_ARM64_64K_PAGES
 #define BLOCK_SHIFT    PAGE_SHIFT
 #define BLOCK_SIZE     PAGE_SIZE
@@ -63,7 +56,7 @@
 #define TABLE_SHIFT    PUD_SHIFT
 #endif
 
-#define KERNEL_START   KERNEL_RAM_VADDR
+#define KERNEL_START   _text
 #define KERNEL_END     _end
 
 /*
@@ -242,7 +235,7 @@ section_table:
 ENTRY(stext)
        mov     x21, x0                         // x21=FDT
        bl      el2_setup                       // Drop to EL1, w20=cpu_boot_mode
-       bl      __calc_phys_offset              // x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET
+       adrp    x24, __PHYS_OFFSET
        bl      set_cpu_boot_mode_flag
 
        bl      __vet_fdt
@@ -342,7 +335,8 @@ ENDPROC(__vet_fdt)
  *   - pgd entry for fixed mappings (TTBR1)
  */
 __create_page_tables:
-       pgtbl   x25, x26, x28                   // idmap_pg_dir and swapper_pg_dir addresses
+       adrp    x25, idmap_pg_dir
+       adrp    x26, swapper_pg_dir
        mov     x27, lr
 
        /*
@@ -371,12 +365,10 @@ __create_page_tables:
         * Create the identity mapping.
         */
        mov     x0, x25                         // idmap_pg_dir
-       ldr     x3, =KERNEL_START
-       add     x3, x3, x28                     // __pa(KERNEL_START)
+       adrp    x3, KERNEL_START                // __pa(KERNEL_START)
        create_pgd_entry x0, x3, x5, x6
-       ldr     x6, =KERNEL_END
        mov     x5, x3                          // __pa(KERNEL_START)
-       add     x6, x6, x28                     // __pa(KERNEL_END)
+       adr_l   x6, KERNEL_END                  // __pa(KERNEL_END)
        create_block_map x0, x7, x3, x5, x6
 
        /*
@@ -385,7 +377,7 @@ __create_page_tables:
        mov     x0, x26                         // swapper_pg_dir
        mov     x5, #PAGE_OFFSET
        create_pgd_entry x0, x5, x3, x6
-       ldr     x6, =KERNEL_END
+       ldr     x6, =KERNEL_END                 // __va(KERNEL_END)
        mov     x3, x24                         // phys offset
        create_block_map x0, x7, x3, x5, x6
 
@@ -537,8 +529,7 @@ ENDPROC(el2_setup)
  * in x20. See arch/arm64/include/asm/virt.h for more info.
  */
 ENTRY(set_cpu_boot_mode_flag)
-       ldr     x1, =__boot_cpu_mode            // Compute __boot_cpu_mode
-       add     x1, x1, x28
+       adr_l   x1, __boot_cpu_mode
        cmp     w20, #BOOT_CPU_MODE_EL2
        b.ne    1f
        add     x1, x1, #4
@@ -569,7 +560,6 @@ ENTRY(__boot_cpu_mode)
         */
 ENTRY(secondary_holding_pen)
        bl      el2_setup                       // Drop to EL1, w20=cpu_boot_mode
-       bl      __calc_phys_offset              // x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET
        bl      set_cpu_boot_mode_flag
        mrs     x0, mpidr_el1
        ldr     x1, =MPIDR_HWID_BITMASK
@@ -588,7 +578,6 @@ ENDPROC(secondary_holding_pen)
         */
 ENTRY(secondary_entry)
        bl      el2_setup                       // Drop to EL1
-       bl      __calc_phys_offset              // x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET
        bl      set_cpu_boot_mode_flag
        b       secondary_startup
 ENDPROC(secondary_entry)
@@ -597,7 +586,8 @@ ENTRY(secondary_startup)
        /*
         * Common entry point for secondary CPUs.
         */
-       pgtbl   x25, x26, x28                   // x25=TTBR0, x26=TTBR1
+       adrp    x25, idmap_pg_dir
+       adrp    x26, swapper_pg_dir
        bl      __cpu_setup                     // initialise processor
 
        ldr     x21, =secondary_data
@@ -631,18 +621,3 @@ __enable_mmu:
        isb
        br      x27
 ENDPROC(__enable_mmu)
-
-/*
- * Calculate the start of physical memory.
- */
-__calc_phys_offset:
-       adr     x0, 1f
-       ldp     x1, x2, [x0]
-       sub     x28, x0, x1                     // x28 = PHYS_OFFSET - PAGE_OFFSET
-       add     x24, x2, x28                    // x24 = PHYS_OFFSET
-       ret
-ENDPROC(__calc_phys_offset)
-
-       .align 3
-1:     .quad   .
-       .quad   PAGE_OFFSET