]>
Commit | Line | Data |
---|---|---|
caab277b | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
fd9fc9f7 MZ |
2 | /* |
3 | * Copyright (C) 2012,2013 - ARM Ltd | |
4 | * Author: Marc Zyngier <marc.zyngier@arm.com> | |
fd9fc9f7 MZ |
5 | */ |
6 | ||
7 | #ifndef __ARM_KVM_ASM_H__ | |
8 | #define __ARM_KVM_ASM_H__ | |
9 | ||
45451914 MZ |
10 | #include <asm/virt.h> |
11 | ||
38500be1 CM |
12 | #define VCPU_WORKAROUND_2_FLAG_SHIFT 0 |
13 | #define VCPU_WORKAROUND_2_FLAG (_AC(1, UL) << VCPU_WORKAROUND_2_FLAG_SHIFT) | |
14 | ||
20163403 MZ |
15 | #define ARM_EXIT_WITH_SERROR_BIT 31 |
16 | #define ARM_EXCEPTION_CODE(x) ((x) & ~(1U << ARM_EXIT_WITH_SERROR_BIT)) | |
58466766 | 17 | #define ARM_EXCEPTION_IS_TRAP(x) (ARM_EXCEPTION_CODE((x)) == ARM_EXCEPTION_TRAP) |
20163403 MZ |
18 | #define ARM_SERROR_PENDING(x) !!((x) & (1U << ARM_EXIT_WITH_SERROR_BIT)) |
19 | ||
fd9fc9f7 | 20 | #define ARM_EXCEPTION_IRQ 0 |
9aecafc8 MZ |
21 | #define ARM_EXCEPTION_EL1_SERROR 1 |
22 | #define ARM_EXCEPTION_TRAP 2 | |
e4e11cc0 | 23 | #define ARM_EXCEPTION_IL 3 |
c94b0cf2 | 24 | /* The hyp-stub will return this for any kvm_call_hyp() call */ |
4993fdcf | 25 | #define ARM_EXCEPTION_HYP_GONE HVC_STUB_ERR |
fd9fc9f7 | 26 | |
71a7e47f CD |
27 | #define kvm_arm_exception_type \ |
28 | {ARM_EXCEPTION_IRQ, "IRQ" }, \ | |
29 | {ARM_EXCEPTION_EL1_SERROR, "SERROR" }, \ | |
30 | {ARM_EXCEPTION_TRAP, "TRAP" }, \ | |
31 | {ARM_EXCEPTION_HYP_GONE, "HYP_GONE" } | |
32 | ||
46c4a30b MR |
33 | #ifndef __ASSEMBLY__ |
34 | ||
35 | #include <linux/mm.h> | |
0c557ed4 | 36 | |
4464e210 | 37 | /* Translate a kernel address of @sym into its equivalent linear mapping */ |
2510ffe1 MZ |
38 | #define kvm_ksym_ref(sym) \ |
39 | ({ \ | |
40 | void *val = &sym; \ | |
41 | if (!is_kernel_in_hyp_mode()) \ | |
46c4a30b | 42 | val = lm_alias(&sym); \ |
2510ffe1 MZ |
43 | val; \ |
44 | }) | |
a0bf9776 | 45 | |
fd9fc9f7 MZ |
46 | struct kvm; |
47 | struct kvm_vcpu; | |
48 | ||
49 | extern char __kvm_hyp_init[]; | |
50 | extern char __kvm_hyp_init_end[]; | |
51 | ||
52 | extern char __kvm_hyp_vector[]; | |
53 | ||
fd9fc9f7 MZ |
54 | extern void __kvm_flush_vm_context(void); |
55 | extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); | |
8199ed0e | 56 | extern void __kvm_tlb_flush_vmid(struct kvm *kvm); |
94d0e598 | 57 | extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu); |
fd9fc9f7 | 58 | |
688c50aa CD |
59 | extern void __kvm_timer_set_cntvoff(u32 cntvoff_low, u32 cntvoff_high); |
60 | ||
3f5c90b8 CD |
61 | extern int kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu); |
62 | ||
63 | extern int __kvm_vcpu_run_nvhe(struct kvm_vcpu *vcpu); | |
1a9b1305 | 64 | |
b2fb1c0d | 65 | extern u64 __vgic_v3_get_ich_vtr_el2(void); |
328e5664 CD |
66 | extern u64 __vgic_v3_read_vmcr(void); |
67 | extern void __vgic_v3_write_vmcr(u32 vmcr); | |
0d98d00b | 68 | extern void __vgic_v3_init_lrs(void); |
b2fb1c0d | 69 | |
56c7f5e7 AB |
70 | extern u32 __kvm_get_mdcr_el2(void); |
71 | ||
85478bab MZ |
72 | /* Home-grown __this_cpu_{ptr,read} variants that always work at HYP */ |
73 | #define __hyp_this_cpu_ptr(sym) \ | |
74 | ({ \ | |
75 | void *__ptr = hyp_symbol_addr(sym); \ | |
76 | __ptr += read_sysreg(tpidr_el2); \ | |
77 | (typeof(&sym))__ptr; \ | |
78 | }) | |
79 | ||
80 | #define __hyp_this_cpu_read(sym) \ | |
81 | ({ \ | |
82 | *__hyp_this_cpu_ptr(sym); \ | |
83 | }) | |
84 | ||
4464e210 CD |
85 | #else /* __ASSEMBLY__ */ |
86 | ||
85478bab MZ |
87 | .macro hyp_adr_this_cpu reg, sym, tmp |
88 | adr_l \reg, \sym | |
4464e210 CD |
89 | mrs \tmp, tpidr_el2 |
90 | add \reg, \reg, \tmp | |
91 | .endm | |
92 | ||
85478bab MZ |
93 | .macro hyp_ldr_this_cpu reg, sym, tmp |
94 | adr_l \reg, \sym | |
95 | mrs \tmp, tpidr_el2 | |
96 | ldr \reg, [\reg, \tmp] | |
97 | .endm | |
98 | ||
99 | .macro get_host_ctxt reg, tmp | |
630a1685 AM |
100 | hyp_adr_this_cpu \reg, kvm_host_data, \tmp |
101 | add \reg, \reg, #HOST_DATA_CONTEXT | |
85478bab MZ |
102 | .endm |
103 | ||
4464e210 CD |
104 | .macro get_vcpu_ptr vcpu, ctxt |
105 | get_host_ctxt \ctxt, \vcpu | |
106 | ldr \vcpu, [\ctxt, #HOST_CONTEXT_VCPU] | |
107 | kern_hyp_va \vcpu | |
108 | .endm | |
109 | ||
fd9fc9f7 MZ |
110 | #endif |
111 | ||
112 | #endif /* __ARM_KVM_ASM_H__ */ |