This improves readability as well as allows re-use in coming patches. Signed-off-by: Christoph Schlameuss --- arch/s390/kvm/vsie.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c index ced2ca4ce5b584403d900ed11cb064919feda8e9..3d602bbd1f70b7bd8ddc2c54d43027dc37a6e032 100644 --- a/arch/s390/kvm/vsie.c +++ b/arch/s390/kvm/vsie.c @@ -95,6 +95,25 @@ static int set_validity_icpt(struct kvm_s390_sie_block *scb, return 1; } +/* The sca header must not cross pages etc. */ +static int validate_scao(struct kvm_vcpu *vcpu, struct kvm_s390_sie_block *scb, gpa_t gpa) +{ + int offset; + + if (gpa < 2 * PAGE_SIZE) + return set_validity_icpt(scb, 0x0038U); + if ((gpa & ~0x1fffUL) == kvm_s390_get_prefix(vcpu)) + return set_validity_icpt(scb, 0x0011U); + + if (sie_uses_esca(scb)) + offset = offsetof(struct esca_block, cpu[0]) - 1; + else + offset = offsetof(struct bsca_block, cpu[0]) - 1; + if ((gpa & PAGE_MASK) != ((gpa + offset) & PAGE_MASK)) + return set_validity_icpt(scb, 0x003bU); + return false; +} + /* mark the prefix as unmapped, this will block the VSIE */ static void prefix_unmapped(struct vsie_page *vsie_page) { @@ -791,13 +810,7 @@ static int pin_blocks(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) gpa = read_scao(vcpu->kvm, scb_o); if (gpa) { - if (gpa < 2 * PAGE_SIZE) - rc = set_validity_icpt(scb_s, 0x0038U); - else if ((gpa & ~0x1fffUL) == kvm_s390_get_prefix(vcpu)) - rc = set_validity_icpt(scb_s, 0x0011U); - else if ((gpa & PAGE_MASK) != - ((gpa + sizeof(struct bsca_block) - 1) & PAGE_MASK)) - rc = set_validity_icpt(scb_s, 0x003bU); + rc = validate_scao(vcpu, scb_o, gpa); if (!rc) { rc = pin_guest_page(vcpu->kvm, gpa, &hpa); if (rc) -- 2.51.1