Linux 4.18.10
[linux/fpc-iii.git] / arch / arm64 / kernel / cpu-reset.S
blob8021b46c97431da9488003675db95f7aa24c671d
1 /*
2  * CPU reset routines
3  *
4  * Copyright (C) 2001 Deep Blue Solutions Ltd.
5  * Copyright (C) 2012 ARM Ltd.
6  * Copyright (C) 2015 Huawei Futurewei Technologies.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
13 #include <linux/linkage.h>
14 #include <asm/assembler.h>
15 #include <asm/sysreg.h>
16 #include <asm/virt.h>
18 .text
19 .pushsection    .idmap.text, "awx"
22  * __cpu_soft_restart(el2_switch, entry, arg0, arg1, arg2) - Helper for
23  * cpu_soft_restart.
24  *
25  * @el2_switch: Flag to indicate a swich to EL2 is needed.
26  * @entry: Location to jump to for soft reset.
27  * arg0: First argument passed to @entry.
28  * arg1: Second argument passed to @entry.
29  * arg2: Third argument passed to @entry.
30  *
31  * Put the CPU into the same state as it would be if it had been reset, and
32  * branch to what would be the reset vector. It must be executed with the
33  * flat identity mapping.
34  */
35 ENTRY(__cpu_soft_restart)
36         /* Clear sctlr_el1 flags. */
37         mrs     x12, sctlr_el1
38         ldr     x13, =SCTLR_ELx_FLAGS
39         bic     x12, x12, x13
40         pre_disable_mmu_workaround
41         msr     sctlr_el1, x12
42         isb
44         cbz     x0, 1f                          // el2_switch?
45         mov     x0, #HVC_SOFT_RESTART
46         hvc     #0                              // no return
48 1:      mov     x18, x1                         // entry
49         mov     x0, x2                          // arg0
50         mov     x1, x3                          // arg1
51         mov     x2, x4                          // arg2
52         br      x18
53 ENDPROC(__cpu_soft_restart)
55 .popsection