OSDN Git Service

arm64: remove __switch_data object from head.S
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 4 Mar 2015 10:51:48 +0000 (11:51 +0100)
committerWill Deacon <will.deacon@arm.com>
Thu, 19 Mar 2015 19:46:01 +0000 (19:46 +0000)
This removes the confusing __switch_data object from head.S,
and replaces it with standard PC-relative references to the
various symbols it encapsulates.

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
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 88f14a7..42ff109 100644 (file)
@@ -253,7 +253,7 @@ ENTRY(stext)
         * On return, the CPU will be ready for the MMU to be turned on and
         * the TCR will have been set.
         */
-       ldr     x27, __switch_data              // address to jump to after
+       ldr     x27, =__mmap_switched           // address to jump to after
                                                // MMU has been enabled
        adrp    lr, __enable_mmu                // return (PIC) address
        add     lr, lr, #:lo12:__enable_mmu
@@ -420,35 +420,22 @@ __create_page_tables:
 ENDPROC(__create_page_tables)
        .ltorg
 
-       .align  3
-       .type   __switch_data, %object
-__switch_data:
-       .quad   __mmap_switched
-       .quad   __bss_start                     // x6
-       .quad   __bss_stop                      // x7
-       .quad   __fdt_pointer                   // x5
-       .quad   memstart_addr                   // x6
-       .quad   init_thread_union + THREAD_START_SP // sp
-
 /*
- * The following fragment of code is executed with the MMU on in MMU mode, and
- * uses absolute addresses; this is not position independent.
+ * The following fragment of code is executed with the MMU enabled.
  */
+       .set    initial_sp, init_thread_union + THREAD_START_SP
 __mmap_switched:
-       adr     x3, __switch_data + 8
+       adr_l   x6, __bss_start
+       adr_l   x7, __bss_stop
 
-       ldp     x6, x7, [x3], #16
 1:     cmp     x6, x7
        b.hs    2f
        str     xzr, [x6], #8                   // Clear BSS
        b       1b
 2:
-       ldr     x5, [x3], #8
-       ldr     x6, [x3], #8
-       ldr     x16, [x3]
-       mov     sp, x16
-       str     x21, [x5]                       // Save FDT pointer
-       str     x24, [x6]                       // Save PHYS_OFFSET
+       adr_l   sp, initial_sp, x4
+       str_l   x21, __fdt_pointer, x5          // Save FDT pointer
+       str_l   x24, memstart_addr, x6          // Save PHYS_OFFSET
        mov     x29, #0
        b       start_kernel
 ENDPROC(__mmap_switched)