}
 }
 
-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;
        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);
 
 
        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 */
                        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,