Message ID | 1541154621-22423-5-git-send-email-pmorel@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x/vfio: VFIO-AP interrupt control interception | expand |
On Fri, 2 Nov 2018 11:30:20 +0100 Pierre Morel <pmorel@linux.ibm.com> wrote: > From: Pierre Morel <pmorel@linux.vnet.ibm.com> Meta: you may want to rewrite your authorship to the shorter address. > > We intercept the PQAP(AQIC) instruction. > > Until we implement AQIC we return a PGM_OPERATION. > > Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> > --- > hw/vfio/ap.c | 10 ++++++++++ > include/hw/s390x/ap-device.h | 9 +++++++++ > target/s390x/kvm.c | 20 ++++++++++++++++++++ > 3 files changed, 39 insertions(+) > > diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c > index 3962bb74e5..d8d9cadc46 100644 > --- a/hw/vfio/ap.c > +++ b/hw/vfio/ap.c > @@ -38,6 +38,16 @@ typedef struct VFIOAPDevice { > #define VFIO_AP_DEVICE(obj) \ > OBJECT_CHECK(VFIOAPDevice, (obj), VFIO_AP_DEVICE_TYPE) > > +/* > + * ap_pqap > + * @env: environment pointing to registers > + * return value: Code Condition > + */ > +int ap_pqap(CPUS390XState *env) > +{ > + return -PGM_OPERATION; > +} I'm not sure whether it makes sense to add such a skeleton handler here; perhaps we should merge with the next patch that actually does something for AQCI? > + > static void vfio_ap_compute_needs_reset(VFIODevice *vdev) > { > vdev->needs_reset = false; > diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h > index 765e9082a3..a83ea096c7 100644 > --- a/include/hw/s390x/ap-device.h > +++ b/include/hw/s390x/ap-device.h > @@ -19,4 +19,13 @@ typedef struct APDevice { > #define AP_DEVICE(obj) \ > OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) > > +#define AP_DEVICE_GET_CLASS(obj) \ > + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) > + > +#define AP_DEVICE_CLASS(klass) \ > + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) Looks like an unrelated change -- does that maybe belong into the next patch? > + > +#include "cpu.h" > +int ap_pqap(CPUS390XState *env); > + > #endif /* HW_S390X_AP_DEVICE_H */ The wiring up looks reasonable.
On 07/11/2018 13:40, Cornelia Huck wrote: > On Fri, 2 Nov 2018 11:30:20 +0100 > Pierre Morel <pmorel@linux.ibm.com> wrote: > >> From: Pierre Morel <pmorel@linux.vnet.ibm.com> > > Meta: you may want to rewrite your authorship to the shorter address. right thanks (this patch is in my queue since too long) > >> >> We intercept the PQAP(AQIC) instruction. >> >> Until we implement AQIC we return a PGM_OPERATION. >> >> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> >> --- >> hw/vfio/ap.c | 10 ++++++++++ >> include/hw/s390x/ap-device.h | 9 +++++++++ >> target/s390x/kvm.c | 20 ++++++++++++++++++++ >> 3 files changed, 39 insertions(+) >> >> diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c >> index 3962bb74e5..d8d9cadc46 100644 >> --- a/hw/vfio/ap.c >> +++ b/hw/vfio/ap.c >> @@ -38,6 +38,16 @@ typedef struct VFIOAPDevice { >> #define VFIO_AP_DEVICE(obj) \ >> OBJECT_CHECK(VFIOAPDevice, (obj), VFIO_AP_DEVICE_TYPE) >> >> +/* >> + * ap_pqap >> + * @env: environment pointing to registers >> + * return value: Code Condition >> + */ >> +int ap_pqap(CPUS390XState *env) >> +{ >> + return -PGM_OPERATION; >> +} > > I'm not sure whether it makes sense to add such a skeleton handler > here; perhaps we should merge with the next patch that actually does > something for AQCI? OK > >> + >> static void vfio_ap_compute_needs_reset(VFIODevice *vdev) >> { >> vdev->needs_reset = false; >> diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h >> index 765e9082a3..a83ea096c7 100644 >> --- a/include/hw/s390x/ap-device.h >> +++ b/include/hw/s390x/ap-device.h >> @@ -19,4 +19,13 @@ typedef struct APDevice { >> #define AP_DEVICE(obj) \ >> OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) >> >> +#define AP_DEVICE_GET_CLASS(obj) \ >> + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) >> + >> +#define AP_DEVICE_CLASS(klass) \ >> + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) > > Looks like an unrelated change -- does that maybe belong into the next > patch? Seems indeed. > >> + >> +#include "cpu.h" >> +int ap_pqap(CPUS390XState *env); >> + >> #endif /* HW_S390X_AP_DEVICE_H */ > > The wiring up looks reasonable. > Thanks, Pierre
diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c index 3962bb74e5..d8d9cadc46 100644 --- a/hw/vfio/ap.c +++ b/hw/vfio/ap.c @@ -38,6 +38,16 @@ typedef struct VFIOAPDevice { #define VFIO_AP_DEVICE(obj) \ OBJECT_CHECK(VFIOAPDevice, (obj), VFIO_AP_DEVICE_TYPE) +/* + * ap_pqap + * @env: environment pointing to registers + * return value: Code Condition + */ +int ap_pqap(CPUS390XState *env) +{ + return -PGM_OPERATION; +} + static void vfio_ap_compute_needs_reset(VFIODevice *vdev) { vdev->needs_reset = false; diff --git a/include/hw/s390x/ap-device.h b/include/hw/s390x/ap-device.h index 765e9082a3..a83ea096c7 100644 --- a/include/hw/s390x/ap-device.h +++ b/include/hw/s390x/ap-device.h @@ -19,4 +19,13 @@ typedef struct APDevice { #define AP_DEVICE(obj) \ OBJECT_CHECK(APDevice, (obj), AP_DEVICE_TYPE) +#define AP_DEVICE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(APDeviceClass, (obj), AP_DEVICE_TYPE) + +#define AP_DEVICE_CLASS(klass) \ + OBJECT_CLASS_CHECK(APDeviceClass, (klass), AP_DEVICE_TYPE) + +#include "cpu.h" +int ap_pqap(CPUS390XState *env); + #endif /* HW_S390X_AP_DEVICE_H */ diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index 2ebf26adfe..3eac59549d 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -45,6 +45,7 @@ #include "trace.h" #include "hw/s390x/s390-pci-inst.h" #include "hw/s390x/s390-pci-bus.h" +#include "hw/s390x/ap-device.h" #include "hw/s390x/ipl.h" #include "hw/s390x/ebcdic.h" #include "exec/memattrs.h" @@ -88,6 +89,7 @@ #define PRIV_B2_CHSC 0x5f #define PRIV_B2_SIGA 0x74 #define PRIV_B2_XSCH 0x76 +#define PRIV_B2_PQAP 0xaf #define PRIV_EB_SQBS 0x8a #define PRIV_EB_PCISTB 0xd0 @@ -1154,6 +1156,21 @@ static int kvm_sclp_service_call(S390CPU *cpu, struct kvm_run *run, return 0; } +static int kvm_ap_pqap(S390CPU *cpu, uint16_t ipbh0) +{ + int r; + + r = ap_pqap(&cpu->env); + + if (r < 0) { + kvm_s390_program_interrupt(cpu, -r); + } else { + setcc(cpu, r); + } + + return 0; +} + static int handle_b2(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) { CPUS390XState *env = &cpu->env; @@ -1216,6 +1233,9 @@ static int handle_b2(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) case PRIV_B2_SCLP_CALL: rc = kvm_sclp_service_call(cpu, run, ipbh0); break; + case PRIV_B2_PQAP: + rc = kvm_ap_pqap(cpu, ipbh0); + break; default: rc = -1; DPRINTF("KVM: unhandled PRIV: 0xb2%x\n", ipa1);