diff options
| author | Christian Borntraeger <borntraeger@de.ibm.com> | 2008-07-25 09:53:12 -0400 |
|---|---|---|
| committer | Avi Kivity <avi@qumranet.com> | 2008-07-27 04:36:20 -0400 |
| commit | 5a00a5e7a3e013b2323f87c1b69ff9557eae5ec9 (patch) | |
| tree | 1895de31abc875c5b7d818e9d900a92b6aa507bb | |
| parent | f5e10b09a5f8fc40666c95fe0cd6bcc2b8f11437 (diff) | |
KVM: s390: Fix possible host kernel bug on lctl(g) handling
The lctl(g) instructions require a specific alignment for the parameters.
The architecture requires a specification program check if these alignments
are not used. Enforcing this alignment also removes a possible host BUG,
since the get_guest functions check for proper alignment and emits a BUG.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
| -rw-r--r-- | arch/s390/kvm/intercept.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index f94da68a5c22..61236102203e 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
| @@ -38,6 +38,9 @@ static int handle_lctlg(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, "lctlg 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, |
| @@ -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 | ||
