* [RFC PATCH v12 1/4] hw/vfio/ap: notification handler for AP config changed event
2025-06-06 18:37 [RFC PATCH v12 0/4] Report vfio-ap configuration changes Rorie Reyes
@ 2025-06-06 18:37 ` Rorie Reyes
2025-06-06 18:37 ` [RFC PATCH v12 2/4] hw/vfio/ap: store object indicating AP config changed in a queue Rorie Reyes
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: Rorie Reyes @ 2025-06-06 18:37 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
clg, thuth, akrowiak, rreyes
Register an event notifier handler to process AP configuration
change events by queuing the event and generating a CRW to let
the guest know its AP configuration has changed
Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
Reviewed-by: Anthony Krowiak <akrowiak@linux.ibm.com>
---
hw/vfio/ap.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
index 785c0a0197..93c74ebedb 100644
--- a/hw/vfio/ap.c
+++ b/hw/vfio/ap.c
@@ -18,6 +18,7 @@
#include "hw/vfio/vfio-device.h"
#include "system/iommufd.h"
#include "hw/s390x/ap-device.h"
+#include "hw/s390x/css.h"
#include "qemu/error-report.h"
#include "qemu/event_notifier.h"
#include "qemu/main-loop.h"
@@ -37,6 +38,7 @@ struct VFIOAPDevice {
APDevice apdev;
VFIODevice vdev;
EventNotifier req_notifier;
+ EventNotifier cfg_notifier;
};
OBJECT_DECLARE_SIMPLE_TYPE(VFIOAPDevice, VFIO_AP_DEVICE)
@@ -70,6 +72,18 @@ static void vfio_ap_req_notifier_handler(void *opaque)
}
}
+static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
+{
+ VFIOAPDevice *vapdev = opaque;
+
+ if (!event_notifier_test_and_clear(&vapdev->cfg_notifier)) {
+ return;
+ }
+
+ css_generate_css_crws(0);
+
+}
+
static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
unsigned int irq, Error **errp)
{
@@ -85,6 +99,10 @@ static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
notifier = &vapdev->req_notifier;
fd_read = vfio_ap_req_notifier_handler;
break;
+ case VFIO_AP_CFG_CHG_IRQ_INDEX:
+ notifier = &vapdev->cfg_notifier;
+ fd_read = vfio_ap_cfg_chg_notifier_handler;
+ break;
default:
error_setg(errp, "vfio: Unsupported device irq(%d)", irq);
return false;
@@ -137,6 +155,9 @@ static void vfio_ap_unregister_irq_notifier(VFIOAPDevice *vapdev,
case VFIO_AP_REQ_IRQ_INDEX:
notifier = &vapdev->req_notifier;
break;
+ case VFIO_AP_CFG_CHG_IRQ_INDEX:
+ notifier = &vapdev->cfg_notifier;
+ break;
default:
error_report("vfio: Unsupported device irq(%d)", irq);
return;
@@ -176,6 +197,15 @@ static void vfio_ap_realize(DeviceState *dev, Error **errp)
warn_report_err(err);
}
+ if (!vfio_ap_register_irq_notifier(vapdev, VFIO_AP_CFG_CHG_IRQ_INDEX, &err))
+ {
+ /*
+ * Report this error, but do not make it a failing condition.
+ * Lack of this IRQ in the host does not prevent normal operation.
+ */
+ warn_report_err(err);
+ }
+
return;
error:
@@ -188,6 +218,7 @@ static void vfio_ap_unrealize(DeviceState *dev)
VFIOAPDevice *vapdev = VFIO_AP_DEVICE(dev);
vfio_ap_unregister_irq_notifier(vapdev, VFIO_AP_REQ_IRQ_INDEX);
+ vfio_ap_unregister_irq_notifier(vapdev, VFIO_AP_CFG_CHG_IRQ_INDEX);
vfio_device_detach(&vapdev->vdev);
g_free(vapdev->vdev.name);
}
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [RFC PATCH v12 2/4] hw/vfio/ap: store object indicating AP config changed in a queue
2025-06-06 18:37 [RFC PATCH v12 0/4] Report vfio-ap configuration changes Rorie Reyes
2025-06-06 18:37 ` [RFC PATCH v12 1/4] hw/vfio/ap: notification handler for AP config changed event Rorie Reyes
@ 2025-06-06 18:37 ` Rorie Reyes
2025-06-09 10:19 ` Anthony Krowiak
2025-06-06 18:37 ` [RFC PATCH v12 3/4] hw/vfio/ap: Storing event information for an AP configuration change event Rorie Reyes
2025-06-06 18:37 ` [RFC PATCH v12 4/4] s390: implementing CHSC SEI for AP config change Rorie Reyes
3 siblings, 1 reply; 8+ messages in thread
From: Rorie Reyes @ 2025-06-06 18:37 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
clg, thuth, akrowiak, rreyes
Creates an object indicating that an AP configuration change event
has been received and stores it in a queue. These objects will later
be used to store event information for an AP configuration change
when the CHSC instruction is intercepted.
Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
---
hw/vfio/ap.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
index 93c74ebedb..fc435f5c5b 100644
--- a/hw/vfio/ap.c
+++ b/hw/vfio/ap.c
@@ -41,6 +41,13 @@ struct VFIOAPDevice {
EventNotifier cfg_notifier;
};
+typedef struct APConfigChgEvent {
+ QTAILQ_ENTRY(APConfigChgEvent) next;
+} APConfigChgEvent;
+
+static QTAILQ_HEAD(, APConfigChgEvent) cfg_chg_events =
+ QTAILQ_HEAD_INITIALIZER(cfg_chg_events);
+
OBJECT_DECLARE_SIMPLE_TYPE(VFIOAPDevice, VFIO_AP_DEVICE)
static void vfio_ap_compute_needs_reset(VFIODevice *vdev)
@@ -74,12 +81,17 @@ static void vfio_ap_req_notifier_handler(void *opaque)
static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
{
+ APConfigChgEvent *cfg_chg_event;
VFIOAPDevice *vapdev = opaque;
if (!event_notifier_test_and_clear(&vapdev->cfg_notifier)) {
return;
}
+ cfg_chg_event = g_new0(APConfigChgEvent, 1);
+
+ QTAILQ_INSERT_TAIL(&cfg_chg_events, cfg_chg_event, next);
+
css_generate_css_crws(0);
}
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [RFC PATCH v12 2/4] hw/vfio/ap: store object indicating AP config changed in a queue
2025-06-06 18:37 ` [RFC PATCH v12 2/4] hw/vfio/ap: store object indicating AP config changed in a queue Rorie Reyes
@ 2025-06-09 10:19 ` Anthony Krowiak
2025-06-09 14:00 ` Rorie Reyes
0 siblings, 1 reply; 8+ messages in thread
From: Anthony Krowiak @ 2025-06-09 10:19 UTC (permalink / raw)
To: Rorie Reyes, qemu-devel, qemu-s390x
Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
clg, thuth
On 6/6/25 2:37 PM, Rorie Reyes wrote:
> Creates an object indicating that an AP configuration change event
> has been received and stores it in a queue. These objects will later
> be used to store event information for an AP configuration change
> when the CHSC instruction is intercepted.
>
> Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
See comment below. With that change made:
Reviewed-by: Anthony Krowiak <akrowiak@linux.ibm.com>
> ---
> hw/vfio/ap.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
> index 93c74ebedb..fc435f5c5b 100644
> --- a/hw/vfio/ap.c
> +++ b/hw/vfio/ap.c
> @@ -41,6 +41,13 @@ struct VFIOAPDevice {
> EventNotifier cfg_notifier;
> };
>
> +typedef struct APConfigChgEvent {
> + QTAILQ_ENTRY(APConfigChgEvent) next;
> +} APConfigChgEvent;
> +
> +static QTAILQ_HEAD(, APConfigChgEvent) cfg_chg_events =
> + QTAILQ_HEAD_INITIALIZER(cfg_chg_events);
> +
> OBJECT_DECLARE_SIMPLE_TYPE(VFIOAPDevice, VFIO_AP_DEVICE)
>
> static void vfio_ap_compute_needs_reset(VFIODevice *vdev)
> @@ -74,12 +81,17 @@ static void vfio_ap_req_notifier_handler(void *opaque)
>
> static void vfio_ap_cfg_chg_notifier_handler(void *opaque)
> {
> + APConfigChgEvent *cfg_chg_event;
> VFIOAPDevice *vapdev = opaque;
>
> if (!event_notifier_test_and_clear(&vapdev->cfg_notifier)) {
> return;
> }
>
> + cfg_chg_event = g_new0(APConfigChgEvent, 1);
> +
> + QTAILQ_INSERT_TAIL(&cfg_chg_events, cfg_chg_event, next);
Need locking here:
WITH_QEMU_LOCK_GUARD(&cfg_chg_events_lock) {
QTAILQ_INSERT_TAIL(&cfg_chg_events, cfg_chg_event, next);
}
> +
> css_generate_css_crws(0);
>
> }
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC PATCH v12 2/4] hw/vfio/ap: store object indicating AP config changed in a queue
2025-06-09 10:19 ` Anthony Krowiak
@ 2025-06-09 14:00 ` Rorie Reyes
0 siblings, 0 replies; 8+ messages in thread
From: Rorie Reyes @ 2025-06-09 14:00 UTC (permalink / raw)
To: Anthony Krowiak, qemu-devel, qemu-s390x
Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
clg, thuth
[-- Attachment #1: Type: text/plain, Size: 384 bytes --]
On 6/9/25 6:19 AM, Anthony Krowiak wrote:
>> + QTAILQ_INSERT_TAIL(&cfg_chg_events, cfg_chg_event, next);
>
> Need locking here:
>
> WITH_QEMU_LOCK_GUARD(&cfg_chg_events_lock) {
>
> QTAILQ_INSERT_TAIL(&cfg_chg_events, cfg_chg_event, next);
>
> }
Wouldn't QEMU_LOCK_GUARD(&cfg_chg_events_lock) be better since it's a
one line? Or the fact there's no return here makes it insufficient?
[-- Attachment #2: Type: text/html, Size: 924 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* [RFC PATCH v12 3/4] hw/vfio/ap: Storing event information for an AP configuration change event
2025-06-06 18:37 [RFC PATCH v12 0/4] Report vfio-ap configuration changes Rorie Reyes
2025-06-06 18:37 ` [RFC PATCH v12 1/4] hw/vfio/ap: notification handler for AP config changed event Rorie Reyes
2025-06-06 18:37 ` [RFC PATCH v12 2/4] hw/vfio/ap: store object indicating AP config changed in a queue Rorie Reyes
@ 2025-06-06 18:37 ` Rorie Reyes
2025-06-09 10:40 ` Anthony Krowiak
2025-06-06 18:37 ` [RFC PATCH v12 4/4] s390: implementing CHSC SEI for AP config change Rorie Reyes
3 siblings, 1 reply; 8+ messages in thread
From: Rorie Reyes @ 2025-06-06 18:37 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
clg, thuth, akrowiak, rreyes
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 | 43 ++++++++++++++++++++++++++++++++++++
include/hw/s390x/ap-bridge.h | 39 ++++++++++++++++++++++++++++++++
2 files changed, 82 insertions(+)
diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
index fc435f5c5b..7e3c6278b3 100644
--- a/hw/vfio/ap.c
+++ b/hw/vfio/ap.c
@@ -10,6 +10,7 @@
* directory.
*/
+#include <stdbool.h>
#include "qemu/osdep.h"
#include CONFIG_DEVICES /* CONFIG_IOMMUFD */
#include <linux/vfio.h>
@@ -21,6 +22,7 @@
#include "hw/s390x/css.h"
#include "qemu/error-report.h"
#include "qemu/event_notifier.h"
+#include "qemu/lockable.h"
#include "qemu/main-loop.h"
#include "qemu/module.h"
#include "qemu/option.h"
@@ -48,6 +50,8 @@ typedef struct APConfigChgEvent {
static QTAILQ_HEAD(, APConfigChgEvent) cfg_chg_events =
QTAILQ_HEAD_INITIALIZER(cfg_chg_events);
+static QemuMutex cfg_chg_events_lock;
+
OBJECT_DECLARE_SIMPLE_TYPE(VFIOAPDevice, VFIO_AP_DEVICE)
static void vfio_ap_compute_needs_reset(VFIODevice *vdev)
@@ -96,6 +100,38 @@ 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;
+
+ WITH_QEMU_LOCK_GUARD(&cfg_chg_events_lock) {
+ if (QTAILQ_EMPTY(&cfg_chg_events)) {
+ return EVENT_INFORMATION_NOT_STORED;
+ }
+
+ cfg_chg_event = QTAILQ_FIRST(&cfg_chg_events);
+ QTAILQ_REMOVE(&cfg_chg_events, cfg_chg_event, next);
+ }
+
+ memset(nt0_res, 0, sizeof(*nt0_res));
+ g_free(cfg_chg_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 EVENT_INFORMATION_STORED;
+}
+
+bool ap_chsc_sei_nt0_have_event(void)
+{
+ QEMU_LOCK_GUARD(&cfg_chg_events_lock);
+ return !QTAILQ_EMPTY(&cfg_chg_events);
+}
+
static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
unsigned int irq, Error **errp)
{
@@ -192,6 +228,13 @@ static void vfio_ap_realize(DeviceState *dev, Error **errp)
VFIOAPDevice *vapdev = VFIO_AP_DEVICE(dev);
VFIODevice *vbasedev = &vapdev->vdev;
+ static bool lock_initialized;
+
+ if (!lock_initialized) {
+ qemu_mutex_init(&cfg_chg_events_lock);
+ lock_initialized = true;
+ }
+
if (!vfio_device_get_name(vbasedev, errp)) {
return;
}
diff --git a/include/hw/s390x/ap-bridge.h b/include/hw/s390x/ap-bridge.h
index 470e439a98..7efc52928d 100644
--- a/include/hw/s390x/ap-bridge.h
+++ b/include/hw/s390x/ap-bridge.h
@@ -16,4 +16,43 @@
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
+
+#define EVENT_INFORMATION_NOT_STORED 1
+#define EVENT_INFORMATION_STORED 0
+
+/**
+ * ap_chsc_sei_nt0_get_event - Retrieve the next pending AP config
+ * change event
+ * @res: Pointer to a ChscSeiNt0Res struct to be filled with event
+ * data
+ *
+ * This function checks for any pending AP config change events and,
+ * if present, populates the provided response structure with the
+ * appropriate SEI NT0 fields.
+ *
+ * Return:
+ * EVENT_INFORMATION_STORED - An event was available and written to @res
+ * EVENT_INFORMATION_NOT_STORED - No event was available
+ */
+int ap_chsc_sei_nt0_get_event(void *res);
+
+bool ap_chsc_sei_nt0_have_event(void);
+
#endif
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [RFC PATCH v12 3/4] hw/vfio/ap: Storing event information for an AP configuration change event
2025-06-06 18:37 ` [RFC PATCH v12 3/4] hw/vfio/ap: Storing event information for an AP configuration change event Rorie Reyes
@ 2025-06-09 10:40 ` Anthony Krowiak
0 siblings, 0 replies; 8+ messages in thread
From: Anthony Krowiak @ 2025-06-09 10:40 UTC (permalink / raw)
To: Rorie Reyes, qemu-devel, qemu-s390x
Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
clg, thuth
On 6/6/25 2:37 PM, 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 | 43 ++++++++++++++++++++++++++++++++++++
> include/hw/s390x/ap-bridge.h | 39 ++++++++++++++++++++++++++++++++
> 2 files changed, 82 insertions(+)
>
> diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
> index fc435f5c5b..7e3c6278b3 100644
> --- a/hw/vfio/ap.c
> +++ b/hw/vfio/ap.c
> @@ -10,6 +10,7 @@
> * directory.
> */
>
> +#include <stdbool.h>
> #include "qemu/osdep.h"
> #include CONFIG_DEVICES /* CONFIG_IOMMUFD */
> #include <linux/vfio.h>
> @@ -21,6 +22,7 @@
> #include "hw/s390x/css.h"
> #include "qemu/error-report.h"
> #include "qemu/event_notifier.h"
> +#include "qemu/lockable.h"
> #include "qemu/main-loop.h"
> #include "qemu/module.h"
> #include "qemu/option.h"
> @@ -48,6 +50,8 @@ typedef struct APConfigChgEvent {
> static QTAILQ_HEAD(, APConfigChgEvent) cfg_chg_events =
> QTAILQ_HEAD_INITIALIZER(cfg_chg_events);
>
> +static QemuMutex cfg_chg_events_lock;
> +
> OBJECT_DECLARE_SIMPLE_TYPE(VFIOAPDevice, VFIO_AP_DEVICE)
>
> static void vfio_ap_compute_needs_reset(VFIODevice *vdev)
> @@ -96,6 +100,38 @@ 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;
> +
> + WITH_QEMU_LOCK_GUARD(&cfg_chg_events_lock) {
> + if (QTAILQ_EMPTY(&cfg_chg_events)) {
> + return EVENT_INFORMATION_NOT_STORED;
> + }
> +
> + cfg_chg_event = QTAILQ_FIRST(&cfg_chg_events);
> + QTAILQ_REMOVE(&cfg_chg_events, cfg_chg_event, next);
> + }
> +
> + memset(nt0_res, 0, sizeof(*nt0_res));
> + g_free(cfg_chg_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 EVENT_INFORMATION_STORED;
> +}
> +
> +bool ap_chsc_sei_nt0_have_event(void)
> +{
> + QEMU_LOCK_GUARD(&cfg_chg_events_lock);
> + return !QTAILQ_EMPTY(&cfg_chg_events);
> +}
> +
> static bool vfio_ap_register_irq_notifier(VFIOAPDevice *vapdev,
> unsigned int irq, Error **errp)
> {
> @@ -192,6 +228,13 @@ static void vfio_ap_realize(DeviceState *dev, Error **errp)
> VFIOAPDevice *vapdev = VFIO_AP_DEVICE(dev);
> VFIODevice *vbasedev = &vapdev->vdev;
>
> + static bool lock_initialized;
> +
> + if (!lock_initialized) {
> + qemu_mutex_init(&cfg_chg_events_lock);
> + lock_initialized = true;
> + }
> +
> if (!vfio_device_get_name(vbasedev, errp)) {
> return;
> }
> diff --git a/include/hw/s390x/ap-bridge.h b/include/hw/s390x/ap-bridge.h
> index 470e439a98..7efc52928d 100644
> --- a/include/hw/s390x/ap-bridge.h
> +++ b/include/hw/s390x/ap-bridge.h
> @@ -16,4 +16,43 @@
>
> 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
> +
> +#define EVENT_INFORMATION_NOT_STORED 1
> +#define EVENT_INFORMATION_STORED 0
> +
> +/**
> + * ap_chsc_sei_nt0_get_event - Retrieve the next pending AP config
> + * change event
> + * @res: Pointer to a ChscSeiNt0Res struct to be filled with event
> + * data
> + *
> + * This function checks for any pending AP config change events and,
> + * if present, populates the provided response structure with the
> + * appropriate SEI NT0 fields.
> + *
> + * Return:
> + * EVENT_INFORMATION_STORED - An event was available and written to @res
> + * EVENT_INFORMATION_NOT_STORED - No event was available
> + */
> +int ap_chsc_sei_nt0_get_event(void *res);
> +
> +bool ap_chsc_sei_nt0_have_event(void);
> +
> #endif
^ permalink raw reply [flat|nested] 8+ messages in thread
* [RFC PATCH v12 4/4] s390: implementing CHSC SEI for AP config change
2025-06-06 18:37 [RFC PATCH v12 0/4] Report vfio-ap configuration changes Rorie Reyes
` (2 preceding siblings ...)
2025-06-06 18:37 ` [RFC PATCH v12 3/4] hw/vfio/ap: Storing event information for an AP configuration change event Rorie Reyes
@ 2025-06-06 18:37 ` Rorie Reyes
3 siblings, 0 replies; 8+ messages in thread
From: Rorie Reyes @ 2025-06-06 18:37 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: pbonzini, cohuck, pasic, jjherne, borntraeger, alex.williamson,
clg, thuth, akrowiak, rreyes
Handle interception of the CHSC SEI instruction for requests
indicating the guest's AP configuration has changed.
If configuring --without-default-devices, hw/s390x/ap-stub.c
was created to handle such circumstance. Also added the
following to hw/s390x/meson.build if CONFIG_VFIO_AP is
false, it will use the stub file.
Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com>
Reviewed-by: Anthony Krowiak <akrowiak@linux.ibm.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
---
MAINTAINERS | 1 +
hw/s390x/ap-stub.c | 21 +++++++++++++++++++++
hw/s390x/meson.build | 1 +
target/s390x/ioinst.c | 11 +++++++++--
4 files changed, 32 insertions(+), 2 deletions(-)
create mode 100644 hw/s390x/ap-stub.c
diff --git a/MAINTAINERS b/MAINTAINERS
index aa6763077e..1e84bfeaee 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -112,6 +112,7 @@ F: hw/intc/s390_flic.c
F: hw/intc/s390_flic_kvm.c
F: hw/s390x/
F: hw/vfio/ap.c
+F: hw/s390x/ap-stub.c
F: hw/vfio/ccw.c
F: hw/watchdog/wdt_diag288.c
F: include/hw/s390x/
diff --git a/hw/s390x/ap-stub.c b/hw/s390x/ap-stub.c
new file mode 100644
index 0000000000..001fe5f8b0
--- /dev/null
+++ b/hw/s390x/ap-stub.c
@@ -0,0 +1,21 @@
+/*
+ * VFIO based AP matrix device assignment
+ *
+ * Copyright 2025 IBM Corp.
+ * Author(s): Rorie Reyes <rreyes@linux.ibm.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "hw/s390x/ap-bridge.h"
+
+int ap_chsc_sei_nt0_get_event(void *res)
+{
+ return EVENT_INFORMATION_NOT_STORED;
+}
+
+bool ap_chsc_sei_nt0_have_event(void)
+{
+ return false;
+}
diff --git a/hw/s390x/meson.build b/hw/s390x/meson.build
index 3bbebfd817..99cbcbd7d6 100644
--- a/hw/s390x/meson.build
+++ b/hw/s390x/meson.build
@@ -33,6 +33,7 @@ s390x_ss.add(when: 'CONFIG_S390_CCW_VIRTIO', if_true: files(
))
s390x_ss.add(when: 'CONFIG_TERMINAL3270', if_true: files('3270-ccw.c'))
s390x_ss.add(when: 'CONFIG_VFIO', if_true: files('s390-pci-vfio.c'))
+s390x_ss.add(when: 'CONFIG_VFIO_AP', if_false: files('ap-stub.c'))
virtio_ss = ss.source_set()
virtio_ss.add(files('virtio-ccw.c'))
diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c
index fe62ba5b06..2320dd4c12 100644
--- a/target/s390x/ioinst.c
+++ b/target/s390x/ioinst.c
@@ -18,6 +18,7 @@
#include "trace.h"
#include "hw/s390x/s390-pci-bus.h"
#include "target/s390x/kvm/pv.h"
+#include "hw/s390x/ap-bridge.h"
/* All I/O instructions but chsc use the s format */
static uint64_t get_address_from_regs(CPUS390XState *env, uint32_t ipb,
@@ -574,13 +575,19 @@ out:
static int chsc_sei_nt0_get_event(void *res)
{
- /* no events yet */
+ if (s390_has_feat(S390_FEAT_AP)) {
+ return ap_chsc_sei_nt0_get_event(res);
+ }
+
return 1;
}
static int chsc_sei_nt0_have_event(void)
{
- /* no events yet */
+ if (s390_has_feat(S390_FEAT_AP)) {
+ return ap_chsc_sei_nt0_have_event();
+ }
+
return 0;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread