[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 01/20] vfio-ccw: forward halt/clear errors
From: |
Thomas Huth |
Subject: |
[PULL 01/20] vfio-ccw: forward halt/clear errors |
Date: |
Tue, 7 Sep 2021 15:14:30 +0200 |
From: Cornelia Huck <cohuck@redhat.com>
hsch and csch basically have two parts: execute the command,
and perform the halt/clear function. For fully emulated
subchannels, it is pretty clear how it will work: check the
subchannel state, and actually 'perform the halt/clear function'
and set cc 0 if everything looks good.
For passthrough subchannels, some of the checking is done
within QEMU, but some has to be done within the kernel. QEMU's
subchannel state may be such that we can perform the async
function, but the kernel may still get a cc != 0 when it is
actually executing the instruction. In that case, we need to
set the condition actually encountered by the kernel; if we
set cc 0 on error, we would actually need to inject an interrupt
as well.
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Tested-by: Jared Rossi <jrossi@linux.ibm.com>
Message-Id: <20210705163952.736020-2-cohuck@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
hw/s390x/css.c | 38 ++++++++++++++++++++++++++++++++++----
hw/vfio/ccw.c | 4 ++--
2 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index 133ddea575..7d9523f811 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -1206,23 +1206,53 @@ static void sch_handle_start_func_virtual(SubchDev *sch)
}
-static void sch_handle_halt_func_passthrough(SubchDev *sch)
+static IOInstEnding sch_handle_halt_func_passthrough(SubchDev *sch)
{
int ret;
ret = s390_ccw_halt(sch);
if (ret == -ENOSYS) {
sch_handle_halt_func(sch);
+ return IOINST_CC_EXPECTED;
+ }
+ /*
+ * Some conditions may have been detected prior to starting the halt
+ * function; map them to the correct cc.
+ * Note that we map both -ENODEV and -EACCES to cc 3 (there's not really
+ * anything else we can do.)
+ */
+ switch (ret) {
+ case -EBUSY:
+ return IOINST_CC_BUSY;
+ case -ENODEV:
+ case -EACCES:
+ return IOINST_CC_NOT_OPERATIONAL;
+ default:
+ return IOINST_CC_EXPECTED;
}
}
-static void sch_handle_clear_func_passthrough(SubchDev *sch)
+static IOInstEnding sch_handle_clear_func_passthrough(SubchDev *sch)
{
int ret;
ret = s390_ccw_clear(sch);
if (ret == -ENOSYS) {
sch_handle_clear_func(sch);
+ return IOINST_CC_EXPECTED;
+ }
+ /*
+ * Some conditions may have been detected prior to starting the clear
+ * function; map them to the correct cc.
+ * Note that we map both -ENODEV and -EACCES to cc 3 (there's not really
+ * anything else we can do.)
+ */
+ switch (ret) {
+ case -ENODEV:
+ case -EACCES:
+ return IOINST_CC_NOT_OPERATIONAL;
+ default:
+ return IOINST_CC_EXPECTED;
}
}
@@ -1265,9 +1295,9 @@ IOInstEnding do_subchannel_work_passthrough(SubchDev *sch)
SCHIB *schib = &sch->curr_status;
if (schib->scsw.ctrl & SCSW_FCTL_CLEAR_FUNC) {
- sch_handle_clear_func_passthrough(sch);
+ return sch_handle_clear_func_passthrough(sch);
} else if (schib->scsw.ctrl & SCSW_FCTL_HALT_FUNC) {
- sch_handle_halt_func_passthrough(sch);
+ return sch_handle_halt_func_passthrough(sch);
} else if (schib->scsw.ctrl & SCSW_FCTL_START_FUNC) {
return sch_handle_start_func_passthrough(sch);
}
diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
index 000992fb9f..0354737666 100644
--- a/hw/vfio/ccw.c
+++ b/hw/vfio/ccw.c
@@ -199,7 +199,7 @@ again:
case 0:
case -ENODEV:
case -EACCES:
- return 0;
+ return ret;
case -EFAULT:
default:
sch_gen_unit_exception(sch);
@@ -240,7 +240,7 @@ again:
case -EBUSY:
case -ENODEV:
case -EACCES:
- return 0;
+ return ret;
case -EFAULT:
default:
sch_gen_unit_exception(sch);
--
2.27.0
- [PULL 00/20] s390x patches, Thomas Huth, 2021/09/07
- [PULL 01/20] vfio-ccw: forward halt/clear errors,
Thomas Huth <=
- [PULL 02/20] css: fix actl handling for unit exceptions, Thomas Huth, 2021/09/07
- [PULL 03/20] tests/tcg/s390x: Test SIGILL and SIGSEGV handling, Thomas Huth, 2021/09/07
- [PULL 05/20] s390x/ioinst: Fix wrong MSCH alignment check on little endian, Thomas Huth, 2021/09/07
- [PULL 09/20] s390x/tcg: check for addressing exceptions for RRBE, SSKE and ISKE, Thomas Huth, 2021/09/07
- [PULL 04/20] s390x/tcg: fix and optimize SPX (SET PREFIX), Thomas Huth, 2021/09/07
- [PULL 07/20] s390x/tcg: fix ignoring bit 63 when setting the storage key in SSKE, Thomas Huth, 2021/09/07
- [PULL 08/20] s390x/tcg: convert real to absolute address for RRBE, SSKE and ISKE, Thomas Huth, 2021/09/07
- [PULL 06/20] s390x/tcg: wrap address for RRBE, Thomas Huth, 2021/09/07
- [PULL 10/20] s390x/mmu_helper: no need to pass access type to mmu_translate_asce(), Thomas Huth, 2021/09/07
- [PULL 12/20] s390x/mmu_helper: move address validation into mmu_translate*(), Thomas Huth, 2021/09/07