Commit | Line | Data |
---|---|---|
f9076ecf GL |
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 |