|
@@ -71,14 +71,37 @@ extern u32 __kvm_get_mdcr_el2(void);
|
|
|
|
|
|
extern u32 __init_stage2_translation(void);
|
|
|
|
|
|
+/* Home-grown __this_cpu_{ptr,read} variants that always work at HYP */
|
|
|
+#define __hyp_this_cpu_ptr(sym) \
|
|
|
+ ({ \
|
|
|
+ void *__ptr = hyp_symbol_addr(sym); \
|
|
|
+ __ptr += read_sysreg(tpidr_el2); \
|
|
|
+ (typeof(&sym))__ptr; \
|
|
|
+ })
|
|
|
+
|
|
|
+#define __hyp_this_cpu_read(sym) \
|
|
|
+ ({ \
|
|
|
+ *__hyp_this_cpu_ptr(sym); \
|
|
|
+ })
|
|
|
+
|
|
|
#else /* __ASSEMBLY__ */
|
|
|
|
|
|
-.macro get_host_ctxt reg, tmp
|
|
|
- adr_l \reg, kvm_host_cpu_state
|
|
|
+.macro hyp_adr_this_cpu reg, sym, tmp
|
|
|
+ adr_l \reg, \sym
|
|
|
mrs \tmp, tpidr_el2
|
|
|
add \reg, \reg, \tmp
|
|
|
.endm
|
|
|
|
|
|
+.macro hyp_ldr_this_cpu reg, sym, tmp
|
|
|
+ adr_l \reg, \sym
|
|
|
+ mrs \tmp, tpidr_el2
|
|
|
+ ldr \reg, [\reg, \tmp]
|
|
|
+.endm
|
|
|
+
|
|
|
+.macro get_host_ctxt reg, tmp
|
|
|
+ hyp_adr_this_cpu \reg, kvm_host_cpu_state, \tmp
|
|
|
+.endm
|
|
|
+
|
|
|
.macro get_vcpu_ptr vcpu, ctxt
|
|
|
get_host_ctxt \ctxt, \vcpu
|
|
|
ldr \vcpu, [\ctxt, #HOST_CONTEXT_VCPU]
|