efi/libstub/arm: Make efi_entry() an ordinary PE/COFF entrypoint
[linux-2.6-microblaze.git] / arch / arm64 / kernel / efi-entry.S
index 304d5b0..4cfd03c 100644 (file)
 
 #include <asm/assembler.h>
 
-#define EFI_LOAD_ERROR 0x8000000000000001
-
        __INIT
 
-       /*
-        * We arrive here from the EFI boot manager with:
-        *
-        *    * CPU in little-endian mode
-        *    * MMU on with identity-mapped RAM
-        *    * Icache and Dcache on
-        *
-        * We will most likely be running from some place other than where
-        * we want to be. The kernel image wants to be placed at TEXT_OFFSET
-        * from start of RAM.
-        */
-ENTRY(entry)
-       /*
-        * Create a stack frame to save FP/LR with extra space
-        * for image_addr variable passed to efi_entry().
-        */
-       stp     x29, x30, [sp, #-32]!
-       mov     x29, sp
-
-       /*
-        * Call efi_entry to do the real work.
-        * x0 and x1 are already set up by firmware. Current runtime
-        * address of image is calculated and passed via *image_addr.
-        *
-        * unsigned long efi_entry(void *handle,
-        *                         efi_system_table_t *sys_table,
-        *                         unsigned long *image_addr) ;
-        */
-       adr_l   x8, _text
-       add     x2, sp, 16
-       str     x8, [x2]
-       bl      efi_entry
-       cmn     x0, #1
-       b.eq    efi_load_fail
-
+ENTRY(efi_enter_kernel)
        /*
         * efi_entry() will have copied the kernel image if necessary and we
-        * return here with device tree address in x0 and the kernel entry
-        * point stored at *image_addr. Save those values in registers which
-        * are callee preserved.
-        */
-       mov     x20, x0         // DTB address
-       ldr     x0, [sp, #16]   // relocated _text address
-       ldr     w21, =stext_offset
-       add     x21, x0, x21
-
-       /*
-        * Calculate size of the kernel Image (same for original and copy).
+        * end up here with device tree address in x1 and the kernel entry
+        * point stored in x0. Save those values in registers which are
+        * callee preserved.
         */
-       adr_l   x1, _text
-       adr_l   x2, _edata
-       sub     x1, x2, x1
+       mov     x19, x0                 // relocated Image address
+       mov     x20, x1                 // DTB address
 
        /*
         * Flush the copied Image to the PoC, and ensure it is not shadowed by
         * stale icache entries from before relocation.
         */
+       ldr     w1, =kernel_size
        bl      __flush_dcache_area
        ic      ialluis
+       dsb     sy
 
        /*
-        * Ensure that the rest of this function (in the original Image) is
-        * visible when the caches are disabled. The I-cache can't have stale
-        * entries for the VA range of the current image, so no maintenance is
-        * necessary.
+        * Jump across, into the copy of the image that we just cleaned
+        * to the PoC, so that we can safely disable the MMU and caches.
         */
-       adr     x0, entry
-       adr     x1, entry_end
-       sub     x1, x1, x0
-       bl      __flush_dcache_area
-
+       ldr     w0, .Ljmp
+       sub     x0, x19, w0, sxtw
+       br      x0
+0:
        /* Turn off Dcache and MMU */
        mrs     x0, CurrentEL
        cmp     x0, #CurrentEL_EL2
@@ -109,12 +63,6 @@ ENTRY(entry)
        mov     x1, xzr
        mov     x2, xzr
        mov     x3, xzr
-       br      x21
-
-efi_load_fail:
-       mov     x0, #EFI_LOAD_ERROR
-       ldp     x29, x30, [sp], #32
-       ret
-
-entry_end:
-ENDPROC(entry)
+       b       stext
+ENDPROC(efi_enter_kernel)
+.Ljmp: .long   _text - 0b