diff options
Diffstat (limited to 'arch/arm/kvm/mmio.c')
| -rw-r--r-- | arch/arm/kvm/mmio.c | 46 | 
1 files changed, 18 insertions, 28 deletions
diff --git a/arch/arm/kvm/mmio.c b/arch/arm/kvm/mmio.c index 98a870ff1a5..72a12f2171b 100644 --- a/arch/arm/kvm/mmio.c +++ b/arch/arm/kvm/mmio.c @@ -33,16 +33,16 @@   */  int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run)  { -	__u32 *dest; +	unsigned long *dest;  	unsigned int len;  	int mask;  	if (!run->mmio.is_write) {  		dest = vcpu_reg(vcpu, vcpu->arch.mmio_decode.rt); -		memset(dest, 0, sizeof(int)); +		*dest = 0;  		len = run->mmio.len; -		if (len > 4) +		if (len > sizeof(unsigned long))  			return -EINVAL;  		memcpy(dest, run->mmio.data, len); @@ -50,7 +50,8 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run)  		trace_kvm_mmio(KVM_TRACE_MMIO_READ, len, run->mmio.phys_addr,  				*((u64 *)run->mmio.data)); -		if (vcpu->arch.mmio_decode.sign_extend && len < 4) { +		if (vcpu->arch.mmio_decode.sign_extend && +		    len < sizeof(unsigned long)) {  			mask = 1U << ((len * 8) - 1);  			*dest = (*dest ^ mask) - mask;  		} @@ -65,40 +66,29 @@ static int decode_hsr(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,  	unsigned long rt, len;  	bool is_write, sign_extend; -	if ((vcpu->arch.hsr >> 8) & 1) { +	if (kvm_vcpu_dabt_isextabt(vcpu)) {  		/* cache operation on I/O addr, tell guest unsupported */ -		kvm_inject_dabt(vcpu, vcpu->arch.hxfar); +		kvm_inject_dabt(vcpu, kvm_vcpu_get_hfar(vcpu));  		return 1;  	} -	if ((vcpu->arch.hsr >> 7) & 1) { +	if (kvm_vcpu_dabt_iss1tw(vcpu)) {  		/* page table accesses IO mem: tell guest to fix its TTBR */ -		kvm_inject_dabt(vcpu, vcpu->arch.hxfar); +		kvm_inject_dabt(vcpu, kvm_vcpu_get_hfar(vcpu));  		return 1;  	} -	switch ((vcpu->arch.hsr >> 22) & 0x3) { -	case 0: -		len = 1; -		break; -	case 1: -		len = 2; -		break; -	case 2: -		len = 4; -		break; -	default: -		kvm_err("Hardware is weird: SAS 0b11 is reserved\n"); -		return -EFAULT; -	} +	len = kvm_vcpu_dabt_get_as(vcpu); +	if (unlikely(len < 0)) +		return len; -	is_write = vcpu->arch.hsr & HSR_WNR; -	sign_extend = vcpu->arch.hsr & HSR_SSE; -	rt = (vcpu->arch.hsr & HSR_SRT_MASK) >> HSR_SRT_SHIFT; +	is_write = kvm_vcpu_dabt_iswrite(vcpu); +	sign_extend = kvm_vcpu_dabt_issext(vcpu); +	rt = kvm_vcpu_dabt_get_rd(vcpu);  	if (kvm_vcpu_reg_is_pc(vcpu, rt)) {  		/* IO memory trying to read/write pc */ -		kvm_inject_pabt(vcpu, vcpu->arch.hxfar); +		kvm_inject_pabt(vcpu, kvm_vcpu_get_hfar(vcpu));  		return 1;  	} @@ -112,7 +102,7 @@ static int decode_hsr(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,  	 * The MMIO instruction is emulated and should not be re-executed  	 * in the guest.  	 */ -	kvm_skip_instr(vcpu, (vcpu->arch.hsr >> 25) & 1); +	kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));  	return 0;  } @@ -130,7 +120,7 @@ int io_mem_abort(struct kvm_vcpu *vcpu, struct kvm_run *run,  	 * space do its magic.  	 */ -	if (vcpu->arch.hsr & HSR_ISV) { +	if (kvm_vcpu_dabt_isvalid(vcpu)) {  		ret = decode_hsr(vcpu, fault_ipa, &mmio);  		if (ret)  			return ret;  |