From: Konstantin Shkolnyy <kshk@linux.ibm.com>
To: mjrosato@linux.ibm.com
Cc: alifm@linux.ibm.com, farman@linux.ibm.com,
richard.henderson@linaro.org, iii@linux.ibm.com,
david@kernel.org, cohuck@redhat.com, pasic@linux.ibm.com,
borntraeger@linux.ibm.com, qemu-s390x@nongnu.org,
qemu-devel@nongnu.org, Konstantin Shkolnyy <kshk@linux.ibm.com>
Subject: [PATCH v12 14/17] s390x/pci: Move ioat sanity checks into new function, add error message
Date: Mon, 5 Oct 2026 19:16:40 -0500 [thread overview]
Message-ID: <20261006001643.420929-15-kshk@linux.ibm.com> (raw)
In-Reply-To: <20261006001643.420929-1-kshk@linux.ibm.com>
Extract the pba, pal and g_iota checks from reg_ioat() into a function.
Make it external so that it can also be used in a follow up change.
Provide a new error message to the path that didn't have it.
Signed-off-by: Konstantin Shkolnyy <kshk@linux.ibm.com>
---
hw/s390x/s390-pci-inst.c | 54 ++++++++++++++++++++------------
include/hw/s390x/s390-pci-inst.h | 2 ++
2 files changed, 36 insertions(+), 20 deletions(-)
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
index 98380526d1..98b0ac4990 100644
--- a/hw/s390x/s390-pci-inst.c
+++ b/hw/s390x/s390-pci-inst.c
@@ -1028,32 +1028,26 @@ bool s390_pci_is_translation_enabled(uint64_t g_iota)
return ((g_iota >> 11) & 0x1) != 0; /* "T" bit */
}
-static int reg_ioat(CPUS390XState *env, S390PCIBusDevice *pbdev, ZpciFib fib,
- uintptr_t ra)
+bool s390_pci_ioat_validate(S390PCIBusDevice *pbdev, uint64_t pba,
+ uint64_t pal, uint64_t g_iota, Error **errp)
{
- uint64_t pba = ldq_be_p(&fib.pba);
- uint64_t pal = ldq_be_p(&fib.pal);
- uint64_t g_iota = ldq_be_p(&fib.iota);
uint8_t dt = (g_iota >> 2) & 0x7;
bool t = s390_pci_is_translation_enabled(g_iota);
- pba &= ~0xfff;
- pal |= 0xfff;
if (pba > pal || pba < pbdev->zpci_fn.sdma || pal > pbdev->zpci_fn.edma) {
- s390_program_interrupt(env, PGM_OPERAND, ra);
- return -EINVAL;
+ error_setg(errp,
+ "ioat pba 0x%"PRIx64" pal 0x%"PRIx64" out of device dma range"
+ " [0x%"PRIx64" 0x%"PRIx64"]",
+ pba, pal, pbdev->zpci_fn.sdma, pbdev->zpci_fn.edma);
+ return false;
}
-
/* currently we only support designation type 1 with translation */
if (t && dt != ZPCI_IOTA_RTTO) {
- qemu_log_mask(LOG_GUEST_ERROR,
- "unsupported ioat dt %d t %d\n", dt, t);
- s390_program_interrupt(env, PGM_OPERAND, ra);
- return -EINVAL;
+ error_setg(errp, "unsupported ioat dt %d t %d", dt, t);
+ return false;
} else if (!t && !pbdev->rtr_avail) {
- qemu_log_mask(LOG_GUEST_ERROR, "relaxed translation not allowed\n");
- s390_program_interrupt(env, PGM_OPERAND, ra);
- return -EINVAL;
+ error_setg(errp, "relaxed translation not allowed");
+ return false;
}
/*
@@ -1064,9 +1058,29 @@ static int reg_ioat(CPUS390XState *env, S390PCIBusDevice *pbdev, ZpciFib fib,
* to QEMU for additional IOAT regions.
*/
if (t && pal >= ZPCI_TABLE_SIZE_RT) {
- qemu_log_mask(LOG_GUEST_ERROR,
- "ioat pal 0x%"PRIx64" exceeds max translatable address\n",
- pal);
+ error_setg(errp,
+ "ioat pal 0x%"PRIx64" exceeds max translatable address",
+ pal);
+ return false;
+ }
+ return true;
+}
+
+static int reg_ioat(CPUS390XState *env, S390PCIBusDevice *pbdev, ZpciFib fib,
+ uintptr_t ra)
+{
+ Error *err = NULL;
+ uint64_t pba = ldq_be_p(&fib.pba);
+ uint64_t pal = ldq_be_p(&fib.pal);
+ uint64_t g_iota = ldq_be_p(&fib.iota);
+ bool t = s390_pci_is_translation_enabled(g_iota);
+
+ pba &= ~0xfff;
+ pal |= 0xfff;
+
+ if (!s390_pci_ioat_validate(pbdev, pba, pal, g_iota, &err)) {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s\n", error_get_pretty(err));
+ error_free(err);
s390_program_interrupt(env, PGM_OPERAND, ra);
return -EINVAL;
}
diff --git a/include/hw/s390x/s390-pci-inst.h b/include/hw/s390x/s390-pci-inst.h
index 38268c256e..3493d2ced0 100644
--- a/include/hw/s390x/s390-pci-inst.h
+++ b/include/hw/s390x/s390-pci-inst.h
@@ -100,6 +100,8 @@ typedef struct ZpciFib {
int pci_dereg_irqs(S390PCIBusDevice *pbdev);
void pci_dereg_ioat(S390PCIBusDevice *pbdev);
+bool s390_pci_ioat_validate(S390PCIBusDevice *pbdev, uint64_t pba,
+ uint64_t pal, uint64_t g_iota, Error **errp);
int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_t ra);
int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra);
int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra);
--
2.34.1
next prev parent reply other threads:[~2026-10-06 0:19 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-06 0:16 [PATCH v12 00/17] s390x/pci: Implement migration for emulated devices Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 01/17] s390x/pci: implement IOMMU replay Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 02/17] s390x/pci: Create function to contain translation status check Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 03/17] s390x/pci: Move iommu_mr from S390PCIIOMMU to S390PCIBusDevice Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 04/17] s390x/pci: Move dm_mr " Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 05/17] s390x/pci: Move iotlb " Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 06/17] s390x/pci: Remove a ptr to S390PCIBusDevice from S390PCIIOMMU Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 07/17] s390x/pci: Move/rename enabled from S390PCIIOMMU to S390PCIBusDevice Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 08/17] s390x/pci: Move dma_limit " Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 09/17] s390x/pci: Move g_iota " Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 10/17] s390x/pci: Move pba " Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 11/17] s390x/pci: Move pal " Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 12/17] s390x/pci: Move max_dma_limit " Konstantin Shkolnyy
2026-10-06 0:16 ` [PATCH v12 13/17] s390x/pci: Add a comment explaining S390PCIIOMMU purpose Konstantin Shkolnyy
2026-10-06 0:16 ` Konstantin Shkolnyy [this message]
2026-10-06 16:45 ` [PATCH v12 14/17] s390x/pci: Move ioat sanity checks into new function, add error message Matthew Rosato
2026-10-06 0:16 ` [PATCH v12 15/17] s390x/pci: Provide each zpci device with a unique stable bus "path" Konstantin Shkolnyy
2026-10-06 16:48 ` Matthew Rosato
2026-10-06 20:13 ` Farhan Ali
2026-10-06 0:16 ` [PATCH v12 16/17] s390x/pci: Implement migration for emulated devices Konstantin Shkolnyy
2026-10-06 20:35 ` Matthew Rosato
2026-10-06 21:13 ` Farhan Ali
2026-10-06 0:16 ` [PATCH v12 17/17] s390x/pci: Create function to contain fmb_timer start Konstantin Shkolnyy
2026-10-07 17:35 ` [PATCH v12 00/17] s390x/pci: Implement migration for emulated devices Eric Farman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261006001643.420929-15-kshk@linux.ibm.com \
--to=kshk@linux.ibm.com \
--cc=alifm@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=david@kernel.org \
--cc=farman@linux.ibm.com \
--cc=iii@linux.ibm.com \
--cc=mjrosato@linux.ibm.com \
--cc=pasic@linux.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.