return (unsigned long *)&vcpu_gp_regs(vcpu)->regs.pc;
 }
 
-static inline unsigned long *vcpu_elr_el1(const struct kvm_vcpu *vcpu)
+static inline unsigned long *__vcpu_elr_el1(const struct kvm_vcpu *vcpu)
 {
        return (unsigned long *)&vcpu_gp_regs(vcpu)->elr_el1;
 }
 
+static inline unsigned long vcpu_read_elr_el1(const struct kvm_vcpu *vcpu)
+{
+       if (vcpu->arch.sysregs_loaded_on_cpu)
+               return read_sysreg_el1(elr);
+       else
+               return *__vcpu_elr_el1(vcpu);
+}
+
+static inline void vcpu_write_elr_el1(const struct kvm_vcpu *vcpu, unsigned long v)
+{
+       if (vcpu->arch.sysregs_loaded_on_cpu)
+               write_sysreg_el1(v, elr);
+       else
+               *__vcpu_elr_el1(vcpu) = v;
+}
+
 static inline unsigned long *vcpu_cpsr(const struct kvm_vcpu *vcpu)
 {
        return (unsigned long *)&vcpu_gp_regs(vcpu)->regs.pstate;
 
        bool is_aarch32 = vcpu_mode_is_32bit(vcpu);
        u32 esr = 0;
 
-       *vcpu_elr_el1(vcpu) = *vcpu_pc(vcpu);
+       vcpu_write_elr_el1(vcpu, *vcpu_pc(vcpu));
        *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync);
 
        *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64;
        unsigned long cpsr = *vcpu_cpsr(vcpu);
        u32 esr = (ESR_ELx_EC_UNKNOWN << ESR_ELx_EC_SHIFT);
 
-       *vcpu_elr_el1(vcpu) = *vcpu_pc(vcpu);
+       vcpu_write_elr_el1(vcpu, *vcpu_pc(vcpu));
        *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync);
 
        *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64;