diff options
Diffstat (limited to 'arch/s390/kvm/intercept.c')
| -rw-r--r-- | arch/s390/kvm/intercept.c | 14 | 
1 files changed, 10 insertions, 4 deletions
| diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index 47a0b642174c..61236102203e 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | #include "kvm-s390.h" | 20 | #include "kvm-s390.h" | 
| 21 | #include "gaccess.h" | 21 | #include "gaccess.h" | 
| 22 | 22 | ||
| 23 | static int handle_lctg(struct kvm_vcpu *vcpu) | 23 | static int handle_lctlg(struct kvm_vcpu *vcpu) | 
| 24 | { | 24 | { | 
| 25 | int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4; | 25 | int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4; | 
| 26 | int reg3 = vcpu->arch.sie_block->ipa & 0x000f; | 26 | int reg3 = vcpu->arch.sie_block->ipa & 0x000f; | 
| @@ -30,7 +30,7 @@ static int handle_lctg(struct kvm_vcpu *vcpu) | |||
| 30 | u64 useraddr; | 30 | u64 useraddr; | 
| 31 | int reg, rc; | 31 | int reg, rc; | 
| 32 | 32 | ||
| 33 | vcpu->stat.instruction_lctg++; | 33 | vcpu->stat.instruction_lctlg++; | 
| 34 | if ((vcpu->arch.sie_block->ipb & 0xff) != 0x2f) | 34 | if ((vcpu->arch.sie_block->ipb & 0xff) != 0x2f) | 
| 35 | return -ENOTSUPP; | 35 | return -ENOTSUPP; | 
| 36 | 36 | ||
| @@ -38,9 +38,12 @@ static int handle_lctg(struct kvm_vcpu *vcpu) | |||
| 38 | if (base2) | 38 | if (base2) | 
| 39 | useraddr += vcpu->arch.guest_gprs[base2]; | 39 | useraddr += vcpu->arch.guest_gprs[base2]; | 
| 40 | 40 | ||
| 41 | if (useraddr & 7) | ||
| 42 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); | ||
| 43 | |||
| 41 | reg = reg1; | 44 | reg = reg1; | 
| 42 | 45 | ||
| 43 | VCPU_EVENT(vcpu, 5, "lctg r1:%x, r3:%x,b2:%x,d2:%x", reg1, reg3, base2, | 46 | VCPU_EVENT(vcpu, 5, "lctlg r1:%x, r3:%x,b2:%x,d2:%x", reg1, reg3, base2, | 
| 44 | disp2); | 47 | disp2); | 
| 45 | 48 | ||
| 46 | do { | 49 | do { | 
| @@ -74,6 +77,9 @@ static int handle_lctl(struct kvm_vcpu *vcpu) | |||
| 74 | if (base2) | 77 | if (base2) | 
| 75 | useraddr += vcpu->arch.guest_gprs[base2]; | 78 | useraddr += vcpu->arch.guest_gprs[base2]; | 
| 76 | 79 | ||
| 80 | if (useraddr & 3) | ||
| 81 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); | ||
| 82 | |||
| 77 | VCPU_EVENT(vcpu, 5, "lctl r1:%x, r3:%x,b2:%x,d2:%x", reg1, reg3, base2, | 83 | VCPU_EVENT(vcpu, 5, "lctl r1:%x, r3:%x,b2:%x,d2:%x", reg1, reg3, base2, | 
| 78 | disp2); | 84 | disp2); | 
| 79 | 85 | ||
| @@ -99,7 +105,7 @@ static intercept_handler_t instruction_handlers[256] = { | |||
| 99 | [0xae] = kvm_s390_handle_sigp, | 105 | [0xae] = kvm_s390_handle_sigp, | 
| 100 | [0xb2] = kvm_s390_handle_priv, | 106 | [0xb2] = kvm_s390_handle_priv, | 
| 101 | [0xb7] = handle_lctl, | 107 | [0xb7] = handle_lctl, | 
| 102 | [0xeb] = handle_lctg, | 108 | [0xeb] = handle_lctlg, | 
| 103 | }; | 109 | }; | 
| 104 | 110 | ||
| 105 | static int handle_noop(struct kvm_vcpu *vcpu) | 111 | static int handle_noop(struct kvm_vcpu *vcpu) | 
