@@ -27,16 +27,34 @@ static inline void __sysreg_save_user_state(struct kvm_cpu_context *ctxt)
27
27
ctxt_sys_reg (ctxt , TPIDRRO_EL0 ) = read_sysreg (tpidrro_el0 );
28
28
}
29
29
30
- static inline bool ctxt_has_mte (struct kvm_cpu_context * ctxt )
30
+ static inline struct kvm_vcpu * ctxt_to_vcpu (struct kvm_cpu_context * ctxt )
31
31
{
32
32
struct kvm_vcpu * vcpu = ctxt -> __hyp_running_vcpu ;
33
33
34
34
if (!vcpu )
35
35
vcpu = container_of (ctxt , struct kvm_vcpu , arch .ctxt );
36
36
37
+ return vcpu ;
38
+ }
39
+
40
+ static inline bool ctxt_has_mte (struct kvm_cpu_context * ctxt )
41
+ {
42
+ struct kvm_vcpu * vcpu = ctxt_to_vcpu (ctxt );
43
+
37
44
return kvm_has_mte (kern_hyp_va (vcpu -> kvm ));
38
45
}
39
46
47
+ static inline bool ctxt_has_s1pie (struct kvm_cpu_context * ctxt )
48
+ {
49
+ struct kvm_vcpu * vcpu ;
50
+
51
+ if (!cpus_have_final_cap (ARM64_HAS_S1PIE ))
52
+ return false;
53
+
54
+ vcpu = ctxt_to_vcpu (ctxt );
55
+ return kvm_has_feat (kern_hyp_va (vcpu -> kvm ), ID_AA64MMFR3_EL1 , S1PIE , IMP );
56
+ }
57
+
40
58
static inline void __sysreg_save_el1_state (struct kvm_cpu_context * ctxt )
41
59
{
42
60
ctxt_sys_reg (ctxt , SCTLR_EL1 ) = read_sysreg_el1 (SYS_SCTLR );
@@ -55,7 +73,7 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
55
73
ctxt_sys_reg (ctxt , CONTEXTIDR_EL1 ) = read_sysreg_el1 (SYS_CONTEXTIDR );
56
74
ctxt_sys_reg (ctxt , AMAIR_EL1 ) = read_sysreg_el1 (SYS_AMAIR );
57
75
ctxt_sys_reg (ctxt , CNTKCTL_EL1 ) = read_sysreg_el1 (SYS_CNTKCTL );
58
- if (cpus_have_final_cap ( ARM64_HAS_S1PIE )) {
76
+ if (ctxt_has_s1pie ( ctxt )) {
59
77
ctxt_sys_reg (ctxt , PIR_EL1 ) = read_sysreg_el1 (SYS_PIR );
60
78
ctxt_sys_reg (ctxt , PIRE0_EL1 ) = read_sysreg_el1 (SYS_PIRE0 );
61
79
}
@@ -131,7 +149,7 @@ static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt)
131
149
write_sysreg_el1 (ctxt_sys_reg (ctxt , CONTEXTIDR_EL1 ), SYS_CONTEXTIDR );
132
150
write_sysreg_el1 (ctxt_sys_reg (ctxt , AMAIR_EL1 ), SYS_AMAIR );
133
151
write_sysreg_el1 (ctxt_sys_reg (ctxt , CNTKCTL_EL1 ), SYS_CNTKCTL );
134
- if (cpus_have_final_cap ( ARM64_HAS_S1PIE )) {
152
+ if (ctxt_has_s1pie ( ctxt )) {
135
153
write_sysreg_el1 (ctxt_sys_reg (ctxt , PIR_EL1 ), SYS_PIR );
136
154
write_sysreg_el1 (ctxt_sys_reg (ctxt , PIRE0_EL1 ), SYS_PIRE0 );
137
155
}
0 commit comments