|
@@ -800,9 +800,9 @@ static void kvmppc_complete_mmio_load(struct kvm_vcpu *vcpu,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
- unsigned int rt, unsigned int bytes,
|
|
|
- int is_default_endian)
|
|
|
+static int __kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
+ unsigned int rt, unsigned int bytes,
|
|
|
+ int is_default_endian, int sign_extend)
|
|
|
{
|
|
|
int idx, ret;
|
|
|
bool host_swabbed;
|
|
@@ -827,7 +827,7 @@ int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
vcpu->arch.mmio_host_swabbed = host_swabbed;
|
|
|
vcpu->mmio_needed = 1;
|
|
|
vcpu->mmio_is_write = 0;
|
|
|
- vcpu->arch.mmio_sign_extend = 0;
|
|
|
+ vcpu->arch.mmio_sign_extend = sign_extend;
|
|
|
|
|
|
idx = srcu_read_lock(&vcpu->kvm->srcu);
|
|
|
|
|
@@ -844,6 +844,13 @@ int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
|
|
|
return EMULATE_DO_MMIO;
|
|
|
}
|
|
|
+
|
|
|
+int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
+ unsigned int rt, unsigned int bytes,
|
|
|
+ int is_default_endian)
|
|
|
+{
|
|
|
+ return __kvmppc_handle_load(run, vcpu, rt, bytes, is_default_endian, 0);
|
|
|
+}
|
|
|
EXPORT_SYMBOL_GPL(kvmppc_handle_load);
|
|
|
|
|
|
/* Same as above, but sign extends */
|
|
@@ -851,12 +858,7 @@ int kvmppc_handle_loads(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
unsigned int rt, unsigned int bytes,
|
|
|
int is_default_endian)
|
|
|
{
|
|
|
- int r;
|
|
|
-
|
|
|
- vcpu->arch.mmio_sign_extend = 1;
|
|
|
- r = kvmppc_handle_load(run, vcpu, rt, bytes, is_default_endian);
|
|
|
-
|
|
|
- return r;
|
|
|
+ return __kvmppc_handle_load(run, vcpu, rt, bytes, is_default_endian, 1);
|
|
|
}
|
|
|
|
|
|
int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,
|