*/
        mov     x20, x0         // DTB address
        ldr     x0, [sp, #16]   // relocated _text address
-       mov     x21, x0
+       ldr     x21, =stext_offset
+       add     x21, x0, x21
 
        /*
         * Flush dcache covering current runtime addresses
 
 #endif
 
 #ifdef CONFIG_EFI
+       .globl  stext_offset
+       .set    stext_offset, stext - efi_head
        .align 3
 pe_header:
        .ascii  "PE"
        .long   0                               // SizeOfInitializedData
        .long   0                               // SizeOfUninitializedData
        .long   efi_stub_entry - efi_head       // AddressOfEntryPoint
-       .long   stext - efi_head                // BaseOfCode
+       .long   stext_offset                    // BaseOfCode
 
 extra_header_fields:
        .quad   0                               // ImageBase
        .long   _end - efi_head                 // SizeOfImage
 
        // Everything before the kernel image is considered part of the header
-       .long   stext - efi_head                // SizeOfHeaders
+       .long   stext_offset                    // SizeOfHeaders
        .long   0                               // CheckSum
        .short  0xa                             // Subsystem (EFI application)
        .short  0                               // DllCharacteristics
        .byte   0
        .byte   0                       // end of 0 padding of section name
        .long   _end - stext            // VirtualSize
-       .long   stext - efi_head        // VirtualAddress
+       .long   stext_offset            // VirtualAddress
        .long   _edata - stext          // SizeOfRawData
-       .long   stext - efi_head        // PointerToRawData
+       .long   stext_offset            // PointerToRawData
 
        .long   0               // PointerToRelocations (0 for executables)
        .long   0               // PointerToLineNumbers (0 for executables)