diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2013-05-17 14:41:32 +0200 |
---|---|---|
committer | Gleb Natapov <gleb@redhat.com> | 2013-05-21 11:55:18 +0300 |
commit | dfcf7dc64237dbe1acc2147ad3552f793003874b (patch) | |
tree | 024f9b943d766bdc67990588643034887c7db135 /arch/s390/kvm/priv.c | |
parent | eed3b1e55be07a057ee41a24f04abffeda7b885f (diff) |
s390/kvm: fix psw rewinding in handle_skey
The PSW can wrap if the guest has been running in the 24 bit or 31 bit
addressing mode. Use __rewind_psw to find the correct address.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Diffstat (limited to 'arch/s390/kvm/priv.c')
-rw-r--r-- | arch/s390/kvm/priv.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index 6bbd7b5a0bbe..ecc58a694df7 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c @@ -105,7 +105,8 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu) static int handle_skey(struct kvm_vcpu *vcpu) { vcpu->stat.instruction_storage_key++; - vcpu->arch.sie_block->gpsw.addr -= 4; + vcpu->arch.sie_block->gpsw.addr = + __rewind_psw(vcpu->arch.sie_block->gpsw, 4); VCPU_EVENT(vcpu, 4, "%s", "retrying storage key operation"); return 0; } |