root/arch/arm64/kernel/cpu-reset.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * CPU reset routines
   4  *
   5  * Copyright (C) 2001 Deep Blue Solutions Ltd.
   6  * Copyright (C) 2012 ARM Ltd.
   7  * Copyright (C) 2015 Huawei Futurewei Technologies.
   8  */
   9 
  10 #include <linux/linkage.h>
  11 #include <asm/assembler.h>
  12 #include <asm/sysreg.h>
  13 #include <asm/virt.h>
  14 
  15 .text
  16 .pushsection    .idmap.text, "awx"
  17 
  18 /*
  19  * __cpu_soft_restart(el2_switch, entry, arg0, arg1, arg2) - Helper for
  20  * cpu_soft_restart.
  21  *
  22  * @el2_switch: Flag to indicate a switch to EL2 is needed.
  23  * @entry: Location to jump to for soft reset.
  24  * arg0: First argument passed to @entry. (relocation list)
  25  * arg1: Second argument passed to @entry.(physical kernel entry)
  26  * arg2: Third argument passed to @entry. (physical dtb address)
  27  *
  28  * Put the CPU into the same state as it would be if it had been reset, and
  29  * branch to what would be the reset vector. It must be executed with the
  30  * flat identity mapping.
  31  */
  32 ENTRY(__cpu_soft_restart)
  33         /* Clear sctlr_el1 flags. */
  34         mrs     x12, sctlr_el1
  35         ldr     x13, =SCTLR_ELx_FLAGS
  36         bic     x12, x12, x13
  37         pre_disable_mmu_workaround
  38         msr     sctlr_el1, x12
  39         isb
  40 
  41         cbz     x0, 1f                          // el2_switch?
  42         mov     x0, #HVC_SOFT_RESTART
  43         hvc     #0                              // no return
  44 
  45 1:      mov     x18, x1                         // entry
  46         mov     x0, x2                          // arg0
  47         mov     x1, x3                          // arg1
  48         mov     x2, x4                          // arg2
  49         br      x18
  50 ENDPROC(__cpu_soft_restart)
  51 
  52 .popsection

/* [<][>][^][v][top][bottom][index][help] */