Introduce some small helper functions to get and set the system control area origin address from the SIE control block. Signed-off-by: Christoph Schlameuss --- arch/s390/kvm/vsie.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c index eea24562e7db..7bf3e921ca9a 100644 --- a/arch/s390/kvm/vsie.c +++ b/arch/s390/kvm/vsie.c @@ -72,6 +72,22 @@ struct vsie_page { static_assert(sizeof(struct vsie_page) == PAGE_SIZE); +static unsigned long read_scao(struct kvm *kvm, struct kvm_s390_sie_block *scb) +{ + unsigned long vsie_sca = READ_ONCE(scb->scaol) & ~0xfUL; + + if (test_kvm_cpu_feat(kvm, KVM_S390_VM_CPU_FEAT_64BSCAO)) + vsie_sca |= (u64)READ_ONCE(scb->scaoh) << 32; + + return vsie_sca; +} + +static void write_scao(struct kvm_s390_sie_block *scb, unsigned long hpa) +{ + scb->scaoh = (u32)((u64)hpa >> 32); + scb->scaol = (u32)(u64)hpa; +} + /* trigger a validity icpt for the given scb */ static int set_validity_icpt(struct kvm_s390_sie_block *scb, __u16 reason_code) @@ -716,8 +732,7 @@ static void unpin_blocks(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) if (hpa) { unpin_guest_page(vcpu->kvm, vsie_page->sca_gpa, hpa); vsie_page->sca_gpa = 0; - scb_s->scaol = 0; - scb_s->scaoh = 0; + write_scao(scb_s, 0); } hpa = scb_s->itdba; @@ -771,9 +786,7 @@ static int pin_blocks(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) gpa_t gpa; int rc = 0; - gpa = READ_ONCE(scb_o->scaol) & ~0xfUL; - if (test_kvm_cpu_feat(vcpu->kvm, KVM_S390_VM_CPU_FEAT_64BSCAO)) - gpa |= (u64) READ_ONCE(scb_o->scaoh) << 32; + gpa = read_scao(vcpu->kvm, scb_o); if (gpa) { if (gpa < 2 * PAGE_SIZE) rc = set_validity_icpt(scb_s, 0x0038U); @@ -790,8 +803,7 @@ static int pin_blocks(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page) if (rc) goto unpin; vsie_page->sca_gpa = gpa; - scb_s->scaoh = (u32)((u64)hpa >> 32); - scb_s->scaol = (u32)(u64)hpa; + write_scao(scb_s, hpa); } gpa = READ_ONCE(scb_o->itdba) & ~0xffUL; -- 2.55.0