Commit | Line | Data |
---|---|---|
f35a9205 MZ |
1 | /* |
2 | * Copyright (C) 2012 ARM Ltd. | |
3 | * Author: Marc Zyngier <marc.zyngier@arm.com> | |
4 | * | |
5 | * This program is free software: you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License version 2 as | |
7 | * published by the Free Software Foundation. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License | |
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
16 | */ | |
17 | ||
18 | #ifndef __ASM__VIRT_H | |
19 | #define __ASM__VIRT_H | |
20 | ||
ad72e59f GL |
21 | /* |
22 | * The arm64 hcall implementation uses x0 to specify the hcall type. A value | |
23 | * less than 0xfff indicates a special hcall, such as get/set vector. | |
24 | * Any other value is used as a pointer to the function to call. | |
25 | */ | |
26 | ||
27 | /* HVC_GET_VECTORS - Return the value of the vbar_el2 register. */ | |
28 | #define HVC_GET_VECTORS 0 | |
29 | ||
30 | /* | |
31 | * HVC_SET_VECTORS - Set the value of the vbar_el2 register. | |
32 | * | |
33 | * @x1: Physical address of the new vector table. | |
34 | */ | |
35 | #define HVC_SET_VECTORS 1 | |
36 | ||
f9076ecf GL |
37 | /* |
38 | * HVC_SOFT_RESTART - CPU soft reset, used by the cpu_soft_restart routine. | |
39 | */ | |
40 | #define HVC_SOFT_RESTART 2 | |
41 | ||
828e9834 ML |
42 | #define BOOT_CPU_MODE_EL1 (0xe11) |
43 | #define BOOT_CPU_MODE_EL2 (0xe12) | |
f35a9205 MZ |
44 | |
45 | #ifndef __ASSEMBLY__ | |
46 | ||
82deae0f | 47 | #include <asm/ptrace.h> |
ee78fdc7 | 48 | #include <asm/sections.h> |
1f3d8699 | 49 | #include <asm/sysreg.h> |
82deae0f | 50 | |
f35a9205 MZ |
51 | /* |
52 | * __boot_cpu_mode records what mode CPUs were booted in. | |
53 | * A correctly-implemented bootloader must start all CPUs in the same mode: | |
54 | * In this case, both 32bit halves of __boot_cpu_mode will contain the | |
55 | * same value (either 0 if booted in EL1, BOOT_CPU_MODE_EL2 if booted in EL2). | |
56 | * | |
57 | * Should the bootloader fail to do this, the two values will be different. | |
58 | * This allows the kernel to flag an error when the secondaries have come up. | |
59 | */ | |
60 | extern u32 __boot_cpu_mode[2]; | |
61 | ||
712c6ff4 MZ |
62 | void __hyp_set_vectors(phys_addr_t phys_vector_base); |
63 | phys_addr_t __hyp_get_vectors(void); | |
64 | ||
f35a9205 MZ |
65 | /* Reports the availability of HYP mode */ |
66 | static inline bool is_hyp_mode_available(void) | |
67 | { | |
68 | return (__boot_cpu_mode[0] == BOOT_CPU_MODE_EL2 && | |
69 | __boot_cpu_mode[1] == BOOT_CPU_MODE_EL2); | |
70 | } | |
71 | ||
72 | /* Check if the bootloader has booted CPUs in different modes */ | |
73 | static inline bool is_hyp_mode_mismatched(void) | |
74 | { | |
75 | return __boot_cpu_mode[0] != __boot_cpu_mode[1]; | |
76 | } | |
77 | ||
82deae0f MZ |
78 | static inline bool is_kernel_in_hyp_mode(void) |
79 | { | |
1f3d8699 | 80 | return read_sysreg(CurrentEL) == CurrentEL_EL2; |
82deae0f MZ |
81 | } |
82 | ||
ac1ad20f SP |
83 | #ifdef CONFIG_ARM64_VHE |
84 | extern void verify_cpu_run_el(void); | |
85 | #else | |
86 | static inline void verify_cpu_run_el(void) {} | |
87 | #endif | |
88 | ||
f35a9205 MZ |
89 | #endif /* __ASSEMBLY__ */ |
90 | ||
91 | #endif /* ! __ASM__VIRT_H */ |