These functions can be invoked by the function that handles interception
of the CHSC SEI instruction for requests indicating the accessibility of
one or more adjunct processors has changed.
Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
---
hw/vfio/ap.c | 39 ++++++++++++++++++++++++++++++++++++
include/hw/s390x/ap-bridge.h | 22 ++++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
index 3fa986ca45..4da246c538 100644
--- a/hw/vfio/ap.c
+++ b/hw/vfio/ap.c
@@ -96,6 +96,45 @@ static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
}
+int ap_chsc_sei_nt0_get_event(void *res)
+{
+ ChscSeiNt0Res *nt0_res = (ChscSeiNt0Res *)res;
+ APConfigChgEvent *cfg_chg_event;
+
+ if (!ap_chsc_sei_nt0_have_event()) {
+ return 1;
+ }
+
+ cfg_chg_event = QTAILQ_FIRST(&cfg_chg_events);
+ memset(nt0_res, 0, sizeof(*nt0_res));
+
+ QTAILQ_REMOVE(&cfg_chg_events, cfg_chg_event, next);
+ g_free(cfg_chg_event);
+
+ /*
+ * If there are any AP configuration change events in the queue,
+ * indicate to the caller that there is pending event info in
+ * the response block
+ */
+ if (ap_chsc_sei_nt0_have_event()) {
+ nt0_res->flags |= PENDING_EVENT_INFO_BITMASK;
+ }
+
+ nt0_res->length = sizeof(ChscSeiNt0Res);
+ nt0_res->code = NT0_RES_RESPONSE_CODE;
+ nt0_res->nt = NT0_RES_NT_DEFAULT;
+ nt0_res->rs = NT0_RES_RS_AP_CHANGE;
+ nt0_res->cc = NT0_RES_CC_AP_CHANGE;
+
+ return 0;
+
+}
+
+int ap_chsc_sei_nt0_have_event(void)
+{
+ return !QTAILQ_EMPTY(&cfg_chg_events);
+}
+
static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
unsigned int irq, Error **errp)
{
diff --git a/include/hw/s390x/ap-bridge.h b/include/hw/s390x/ap-bridge.h
index 470e439a98..f4d838bf99 100644
--- a/include/hw/s390x/ap-bridge.h
+++ b/include/hw/s390x/ap-bridge.h
@@ -16,4 +16,26 @@
void s390_init_ap(void);
+typedef struct ChscSeiNt0Res {
+ uint16_t length;
+ uint16_t code;
+ uint8_t reserved1;
+ uint16_t reserved2;
+ uint8_t nt;
+#define PENDING_EVENT_INFO_BITMASK 0x80;
+ uint8_t flags;
+ uint8_t reserved3;
+ uint8_t rs;
+ uint8_t cc;
+} QEMU_PACKED ChscSeiNt0Res;
+
+#define NT0_RES_RESPONSE_CODE 1;
+#define NT0_RES_NT_DEFAULT 0;
+#define NT0_RES_RS_AP_CHANGE 5;
+#define NT0_RES_CC_AP_CHANGE 3;
+
+int ap_chsc_sei_nt0_get_event(void *res);
+
+int ap_chsc_sei_nt0_have_event(void);
+
#endif
--
2.48.1
On 3/11/25 11:16 AM, Rorie Reyes wrote: > These functions can be invoked by the function that handles interception > of the CHSC SEI instruction for requests indicating the accessibility of > one or more adjunct processors has changed. > > Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com> Reviewed-by: Anthony Krowiak <akrowiak@linux.ibm.com> > --- > hw/vfio/ap.c | 39 ++++++++++++++++++++++++++++++++++++ > include/hw/s390x/ap-bridge.h | 22 ++++++++++++++++++++ > 2 files changed, 61 insertions(+) > > diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c > index 3fa986ca45..4da246c538 100644 > --- a/hw/vfio/ap.c > +++ b/hw/vfio/ap.c > @@ -96,6 +96,45 @@ static void vfio_ap_cfg_chg_notifier_handler(void *opaque) > > } > > +int ap_chsc_sei_nt0_get_event(void *res) > +{ > + ChscSeiNt0Res *nt0_res = (ChscSeiNt0Res *)res; > + APConfigChgEvent *cfg_chg_event; > + > + if (!ap_chsc_sei_nt0_have_event()) { > + return 1; > + } > + > + cfg_chg_event = QTAILQ_FIRST(&cfg_chg_events); > + memset(nt0_res, 0, sizeof(*nt0_res)); > + > + QTAILQ_REMOVE(&cfg_chg_events, cfg_chg_event, next); > + g_free(cfg_chg_event); > + > + /* > + * If there are any AP configuration change events in the queue, > + * indicate to the caller that there is pending event info in > + * the response block > + */ > + if (ap_chsc_sei_nt0_have_event()) { > + nt0_res->flags |= PENDING_EVENT_INFO_BITMASK; > + } > + > + nt0_res->length = sizeof(ChscSeiNt0Res); > + nt0_res->code = NT0_RES_RESPONSE_CODE; > + nt0_res->nt = NT0_RES_NT_DEFAULT; > + nt0_res->rs = NT0_RES_RS_AP_CHANGE; > + nt0_res->cc = NT0_RES_CC_AP_CHANGE; > + > + return 0; > + > +} > + > +int ap_chsc_sei_nt0_have_event(void) > +{ > + return !QTAILQ_EMPTY(&cfg_chg_events); > +} > + > static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev, > unsigned int irq, Error **errp) > { > diff --git a/include/hw/s390x/ap-bridge.h b/include/hw/s390x/ap-bridge.h > index 470e439a98..f4d838bf99 100644 > --- a/include/hw/s390x/ap-bridge.h > +++ b/include/hw/s390x/ap-bridge.h > @@ -16,4 +16,26 @@ > > void s390_init_ap(void); > > +typedef struct ChscSeiNt0Res { > + uint16_t length; > + uint16_t code; > + uint8_t reserved1; > + uint16_t reserved2; > + uint8_t nt; > +#define PENDING_EVENT_INFO_BITMASK 0x80; > + uint8_t flags; > + uint8_t reserved3; > + uint8_t rs; > + uint8_t cc; > +} QEMU_PACKED ChscSeiNt0Res; > + > +#define NT0_RES_RESPONSE_CODE 1; > +#define NT0_RES_NT_DEFAULT 0; > +#define NT0_RES_RS_AP_CHANGE 5; > +#define NT0_RES_CC_AP_CHANGE 3; > + > +int ap_chsc_sei_nt0_get_event(void *res); > + > +int ap_chsc_sei_nt0_have_event(void); > + > #endif
© 2016 - 2025 Red Hat, Inc.