kprobes: Unpoison stack in jprobe_return() for KASAN
[cascardo/linux.git] / arch / arm64 / kernel / cpu-reset.S
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  */
12
13 #include <linux/linkage.h>
14 #include <asm/assembler.h>
15 #include <asm/sysreg.h>
16 #include <asm/virt.h>
17
18 .text
19 .pushsection    .idmap.text, "ax"
20
21 /*
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         msr     sctlr_el1, x12
41         isb
42
43         cbz     x0, 1f                          // el2_switch?
44         mov     x0, #HVC_SOFT_RESTART
45         hvc     #0                              // no return
46
47 1:      mov     x18, x1                         // entry
48         mov     x0, x2                          // arg0
49         mov     x1, x3                          // arg1
50         mov     x2, x4                          // arg2
51         br      x18
52 ENDPROC(__cpu_soft_restart)
53
54 .popsection