~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm64/kernel/relocate_kernel.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0-only */
  2 /*
  3  * kexec for arm64
  4  *
  5  * Copyright (C) Linaro.
  6  * Copyright (C) Huawei Futurewei Technologies.
  7  * Copyright (C) 2021, Microsoft Corporation.
  8  * Pasha Tatashin <pasha.tatashin@soleen.com>
  9  */
 10 
 11 #include <linux/kexec.h>
 12 #include <linux/linkage.h>
 13 
 14 #include <asm/assembler.h>
 15 #include <asm/kexec.h>
 16 #include <asm/page.h>
 17 #include <asm/sysreg.h>
 18 #include <asm/virt.h>
 19 
 20 .macro turn_off_mmu tmp1, tmp2
 21         mov_q   \tmp1, INIT_SCTLR_EL1_MMU_OFF
 22         pre_disable_mmu_workaround
 23         msr     sctlr_el1, \tmp1
 24         isb
 25 .endm
 26 
 27 .section    ".kexec_relocate.text", "ax"
 28 /*
 29  * arm64_relocate_new_kernel - Put a 2nd stage image in place and boot it.
 30  *
 31  * The memory that the old kernel occupies may be overwritten when copying the
 32  * new image to its final location.  To assure that the
 33  * arm64_relocate_new_kernel routine which does that copy is not overwritten,
 34  * all code and data needed by arm64_relocate_new_kernel must be between the
 35  * symbols arm64_relocate_new_kernel and arm64_relocate_new_kernel_end.  The
 36  * machine_kexec() routine will copy arm64_relocate_new_kernel to the kexec
 37  * safe memory that has been set up to be preserved during the copy operation.
 38  */
 39 SYM_CODE_START(arm64_relocate_new_kernel)
 40         /*
 41          * The kimage structure isn't allocated specially and may be clobbered
 42          * during relocation. We must load any values we need from it prior to
 43          * any relocation occurring.
 44          */
 45         ldr     x28, [x0, #KIMAGE_START]
 46         ldr     x27, [x0, #KIMAGE_ARCH_EL2_VECTORS]
 47         ldr     x26, [x0, #KIMAGE_ARCH_DTB_MEM]
 48 
 49         /* Setup the list loop variables. */
 50         ldr     x18, [x0, #KIMAGE_ARCH_ZERO_PAGE] /* x18 = zero page for BBM */
 51         ldr     x17, [x0, #KIMAGE_ARCH_TTBR1]   /* x17 = linear map copy */
 52         ldr     x16, [x0, #KIMAGE_HEAD]         /* x16 = kimage_head */
 53         ldr     x22, [x0, #KIMAGE_ARCH_PHYS_OFFSET]     /* x22 phys_offset */
 54         raw_dcache_line_size x15, x1            /* x15 = dcache line size */
 55         break_before_make_ttbr_switch   x18, x17, x1, x2 /* set linear map */
 56 .Lloop:
 57         and     x12, x16, PAGE_MASK             /* x12 = addr */
 58         sub     x12, x12, x22                   /* Convert x12 to virt */
 59         /* Test the entry flags. */
 60 .Ltest_source:
 61         tbz     x16, IND_SOURCE_BIT, .Ltest_indirection
 62 
 63         /* Invalidate dest page to PoC. */
 64         mov     x19, x13
 65         copy_page x13, x12, x1, x2, x3, x4, x5, x6, x7, x8
 66         add     x1, x19, #PAGE_SIZE
 67         dcache_by_myline_op civac, sy, x19, x1, x15, x20
 68         b       .Lnext
 69 .Ltest_indirection:
 70         tbz     x16, IND_INDIRECTION_BIT, .Ltest_destination
 71         mov     x14, x12                        /* ptr = addr */
 72         b       .Lnext
 73 .Ltest_destination:
 74         tbz     x16, IND_DESTINATION_BIT, .Lnext
 75         mov     x13, x12                        /* dest = addr */
 76 .Lnext:
 77         ldr     x16, [x14], #8                  /* entry = *ptr++ */
 78         tbz     x16, IND_DONE_BIT, .Lloop       /* while (!(entry & DONE)) */
 79         /* wait for writes from copy_page to finish */
 80         dsb     nsh
 81         ic      iallu
 82         dsb     nsh
 83         isb
 84         turn_off_mmu x12, x13
 85 
 86         /* Start new image. */
 87         cbz     x27, .Lel1
 88         mov     x1, x28                         /* kernel entry point */
 89         mov     x2, x26                         /* dtb address */
 90         mov     x3, xzr
 91         mov     x4, xzr
 92         mov     x0, #HVC_SOFT_RESTART
 93         hvc     #0                              /* Jumps from el2 */
 94 .Lel1:
 95         mov     x0, x26                         /* dtb address */
 96         mov     x1, xzr
 97         mov     x2, xzr
 98         mov     x3, xzr
 99         br      x28                             /* Jumps from el1 */
100 SYM_CODE_END(arm64_relocate_new_kernel)

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php