| From ab1b6ac682ee3ca7c137d20e8073061de9134e69 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 31 Oct 2024 13:03:16 +0100 |
| Subject: s390/kvm: Mask extra bits from program interrupt code |
| |
| From: Claudio Imbrenda <imbrenda@linux.ibm.com> |
| |
| [ Upstream commit 34fb045eddd300a2d1c0d7de7e83113215c422e3 ] |
| |
| The program interrupt code has some extra bits that are sometimes set |
| by hardware for various reasons; those bits should be ignored when the |
| program interrupt number is needed for interrupt handling. |
| |
| Fixes: 05066cafa925 ("s390/mm/fault: Handle guest-related program interrupts in KVM") |
| Reported-by: Christian Borntraeger <borntraeger@linux.ibm.com> |
| Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> |
| Tested-by: Christian Borntraeger <borntraeger@linux.ibm.com> |
| Link: https://lore.kernel.org/r/20241031120316.25462-1-imbrenda@linux.ibm.com |
| Signed-off-by: Heiko Carstens <hca@linux.ibm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/s390/kvm/kvm-s390.c | 2 +- |
| arch/s390/kvm/vsie.c | 2 +- |
| 2 files changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c |
| index c11e579e23313..7bb5640bb8a71 100644 |
| --- a/arch/s390/kvm/kvm-s390.c |
| +++ b/arch/s390/kvm/kvm-s390.c |
| @@ -4847,7 +4847,7 @@ static int vcpu_post_run_handle_fault(struct kvm_vcpu *vcpu) |
| if (kvm_s390_cur_gmap_fault_is_write()) |
| foll = FOLL_WRITE; |
| |
| - switch (current->thread.gmap_int_code) { |
| + switch (current->thread.gmap_int_code & PGM_INT_CODE_MASK) { |
| case 0: |
| vcpu->stat.exit_null++; |
| break; |
| diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c |
| index 44e25b2654a2d..de9f0dd421979 100644 |
| --- a/arch/s390/kvm/vsie.c |
| +++ b/arch/s390/kvm/vsie.c |
| @@ -923,7 +923,7 @@ static int handle_fault(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) |
| { |
| int rc; |
| |
| - if (current->thread.gmap_int_code == PGM_PROTECTION) |
| + if ((current->thread.gmap_int_code & PGM_INT_CODE_MASK) == PGM_PROTECTION) |
| /* we can directly forward all protection exceptions */ |
| return inject_fault(vcpu, PGM_PROTECTION, |
| current->thread.gmap_teid.addr * PAGE_SIZE, 1); |
| -- |
| 2.53.0 |
| |