aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2023-08-08 23:42:09 +0000
committerEd Maste <emaste@FreeBSD.org>2023-08-17 14:06:39 +0000
commit044dfb356bb6481af4de4ed0f7ef04c3b638bf71 (patch)
treecf63725b837936601f97d18e36334702d8fa8be7
parent1fb7c59981bc5d4c522521df067caaaa85c42cdb (diff)
downloadsrc-044dfb356bb6481af4de4ed0f7ef04c3b638bf71.tar.gz
src-044dfb356bb6481af4de4ed0f7ef04c3b638bf71.zip
msi: report error for attempt to use APIC ID > 255
The MSI/MSI-X address includes 8 bits to encode the Destination ID. Previously IDs over 255 overlapped with the fixed portion of the address, resulting in an invalid value (and a nonfunctional interrupt). Instead, print an error message and return EINVAL. The interrupt will still not work, but the user will have a clue as to why. PR: 273022 Reviewed by: jhb Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D41395 (cherry picked from commit cbf845052f1c2862a64e66dbaf38e887a7592474)
-rw-r--r--sys/x86/x86/msi.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/sys/x86/x86/msi.c b/sys/x86/x86/msi.c
index f85d4a5161e5..de8f42c0fa68 100644
--- a/sys/x86/x86/msi.c
+++ b/sys/x86/x86/msi.c
@@ -620,6 +620,11 @@ msi_map(int irq, uint64_t *addr, uint32_t *data)
mtx_unlock(&msi_lock);
error = EOPNOTSUPP;
#endif
+ if (error == EOPNOTSUPP && msi->msi_cpu > 0xff) {
+ printf("%s: unsupported destination APIC ID %u\n", __func__,
+ msi->msi_cpu);
+ error = EINVAL;
+ }
if (error == EOPNOTSUPP) {
*addr = INTEL_ADDR(msi);
*data = INTEL_DATA(msi);