|
|
@@ -264,10 +264,8 @@ static inline ulong kvmppc_get_pc(struct kvm_vcpu *vcpu)
|
|
|
return vcpu->arch.pc;
|
|
|
}
|
|
|
|
|
|
-static inline u32 kvmppc_get_last_inst(struct kvm_vcpu *vcpu)
|
|
|
+static inline u32 kvmppc_get_last_inst_internal(struct kvm_vcpu *vcpu, ulong pc)
|
|
|
{
|
|
|
- ulong pc = kvmppc_get_pc(vcpu);
|
|
|
-
|
|
|
/* Load the instruction manually if it failed to do so in the
|
|
|
* exit path */
|
|
|
if (vcpu->arch.last_inst == KVM_INST_FETCH_FAILED)
|
|
|
@@ -276,6 +274,11 @@ static inline u32 kvmppc_get_last_inst(struct kvm_vcpu *vcpu)
|
|
|
return vcpu->arch.last_inst;
|
|
|
}
|
|
|
|
|
|
+static inline u32 kvmppc_get_last_inst(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ return kvmppc_get_last_inst_internal(vcpu, kvmppc_get_pc(vcpu));
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Like kvmppc_get_last_inst(), but for fetching a sc instruction.
|
|
|
* Because the sc instruction sets SRR0 to point to the following
|
|
|
@@ -283,14 +286,7 @@ static inline u32 kvmppc_get_last_inst(struct kvm_vcpu *vcpu)
|
|
|
*/
|
|
|
static inline u32 kvmppc_get_last_sc(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
- ulong pc = kvmppc_get_pc(vcpu) - 4;
|
|
|
-
|
|
|
- /* Load the instruction manually if it failed to do so in the
|
|
|
- * exit path */
|
|
|
- if (vcpu->arch.last_inst == KVM_INST_FETCH_FAILED)
|
|
|
- kvmppc_ld(vcpu, &pc, sizeof(u32), &vcpu->arch.last_inst, false);
|
|
|
-
|
|
|
- return vcpu->arch.last_inst;
|
|
|
+ return kvmppc_get_last_inst_internal(vcpu, kvmppc_get_pc(vcpu) - 4);
|
|
|
}
|
|
|
|
|
|
static inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu)
|