Message ID | 20221020090009.2189-5-frankja@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x: PV fixups | expand |
On Thu, 20 Oct 2022 09:00:06 +0000 Janosch Frank <frankja@linux.ibm.com> wrote: > The current library doesn't support running multiple vms at once as it > stores the validity once and not per vm. Let's move the validity > handling into the vm and introduce a new function to retrieve the vir. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > Reviewed-by: Steffen Eiden <seiden@linux.ibm.com> > Reviewed-by: Nico Boehr <nrb@linux.ibm.com> Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > --- > lib/s390x/sie.c | 27 ++++++++++++++------------- > lib/s390x/sie.h | 6 ++++-- > 2 files changed, 18 insertions(+), 15 deletions(-) > > diff --git a/lib/s390x/sie.c b/lib/s390x/sie.c > index 00aff713..3fee3def 100644 > --- a/lib/s390x/sie.c > +++ b/lib/s390x/sie.c > @@ -15,19 +15,22 @@ > #include <libcflat.h> > #include <alloc_page.h> > > -static bool validity_expected; > -static uint16_t vir; /* Validity interception reason */ > - > -void sie_expect_validity(void) > +void sie_expect_validity(struct vm *vm) > { > - validity_expected = true; > - vir = 0; > + vm->validity_expected = true; > } > > -void sie_check_validity(uint16_t vir_exp) > +uint16_t sie_get_validity(struct vm *vm) > { > + assert(vm->sblk->icptcode == ICPT_VALIDITY); > + return vm->sblk->ipb >> 16; > +} > + > +void sie_check_validity(struct vm *vm, uint16_t vir_exp) > +{ > + uint16_t vir = sie_get_validity(vm); > + > report(vir_exp == vir, "VALIDITY: %x", vir); > - vir = 0; > } > > void sie_handle_validity(struct vm *vm) > @@ -35,11 +38,9 @@ void sie_handle_validity(struct vm *vm) > if (vm->sblk->icptcode != ICPT_VALIDITY) > return; > > - vir = vm->sblk->ipb >> 16; > - > - if (!validity_expected) > - report_abort("VALIDITY: %x", vir); > - validity_expected = false; > + if (!vm->validity_expected) > + report_abort("VALIDITY: %x", sie_get_validity(vm)); > + vm->validity_expected = false; > } > > void sie(struct vm *vm) > diff --git a/lib/s390x/sie.h b/lib/s390x/sie.h > index de91ea5a..320c4218 100644 > --- a/lib/s390x/sie.h > +++ b/lib/s390x/sie.h > @@ -233,14 +233,16 @@ struct vm { > struct vm_uv uv; /* PV UV information */ > /* Ptr to first guest page */ > uint8_t *guest_mem; > + bool validity_expected; > }; > > extern void sie_entry(void); > extern void sie_exit(void); > extern void sie64a(struct kvm_s390_sie_block *sblk, struct vm_save_area *save_area); > void sie(struct vm *vm); > -void sie_expect_validity(void); > -void sie_check_validity(uint16_t vir_exp); > +void sie_expect_validity(struct vm *vm); > +uint16_t sie_get_validity(struct vm *vm); > +void sie_check_validity(struct vm *vm, uint16_t vir_exp); > void sie_handle_validity(struct vm *vm); > void sie_guest_sca_create(struct vm *vm); > void sie_guest_create(struct vm *vm, uint64_t guest_mem, uint64_t guest_mem_len);
diff --git a/lib/s390x/sie.c b/lib/s390x/sie.c index 00aff713..3fee3def 100644 --- a/lib/s390x/sie.c +++ b/lib/s390x/sie.c @@ -15,19 +15,22 @@ #include <libcflat.h> #include <alloc_page.h> -static bool validity_expected; -static uint16_t vir; /* Validity interception reason */ - -void sie_expect_validity(void) +void sie_expect_validity(struct vm *vm) { - validity_expected = true; - vir = 0; + vm->validity_expected = true; } -void sie_check_validity(uint16_t vir_exp) +uint16_t sie_get_validity(struct vm *vm) { + assert(vm->sblk->icptcode == ICPT_VALIDITY); + return vm->sblk->ipb >> 16; +} + +void sie_check_validity(struct vm *vm, uint16_t vir_exp) +{ + uint16_t vir = sie_get_validity(vm); + report(vir_exp == vir, "VALIDITY: %x", vir); - vir = 0; } void sie_handle_validity(struct vm *vm) @@ -35,11 +38,9 @@ void sie_handle_validity(struct vm *vm) if (vm->sblk->icptcode != ICPT_VALIDITY) return; - vir = vm->sblk->ipb >> 16; - - if (!validity_expected) - report_abort("VALIDITY: %x", vir); - validity_expected = false; + if (!vm->validity_expected) + report_abort("VALIDITY: %x", sie_get_validity(vm)); + vm->validity_expected = false; } void sie(struct vm *vm) diff --git a/lib/s390x/sie.h b/lib/s390x/sie.h index de91ea5a..320c4218 100644 --- a/lib/s390x/sie.h +++ b/lib/s390x/sie.h @@ -233,14 +233,16 @@ struct vm { struct vm_uv uv; /* PV UV information */ /* Ptr to first guest page */ uint8_t *guest_mem; + bool validity_expected; }; extern void sie_entry(void); extern void sie_exit(void); extern void sie64a(struct kvm_s390_sie_block *sblk, struct vm_save_area *save_area); void sie(struct vm *vm); -void sie_expect_validity(void); -void sie_check_validity(uint16_t vir_exp); +void sie_expect_validity(struct vm *vm); +uint16_t sie_get_validity(struct vm *vm); +void sie_check_validity(struct vm *vm, uint16_t vir_exp); void sie_handle_validity(struct vm *vm); void sie_guest_sca_create(struct vm *vm); void sie_guest_create(struct vm *vm, uint64_t guest_mem, uint64_t guest_mem_len);