Re: git: cbf845052f1c - main - msi: report error for attempt to use APIC ID > 255
- In reply to: Ed Maste : "git: cbf845052f1c - main - msi: report error for attempt to use APIC ID > 255"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 10 Aug 2023 05:20:55 UTC
On Wed, Aug 09, 2023 at 06:17:12PM +0000, Ed Maste wrote: > The branch main has been updated by emaste: > > URL: https://cgit.FreeBSD.org/src/commit/?id=cbf845052f1c2862a64e66dbaf38e887a7592474 > > commit cbf845052f1c2862a64e66dbaf38e887a7592474 > Author: Ed Maste <emaste@FreeBSD.org> > AuthorDate: 2023-08-08 23:42:09 +0000 > Commit: Ed Maste <emaste@FreeBSD.org> > CommitDate: 2023-08-09 17:52:43 +0000 > > 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 > --- > sys/x86/x86/msi.c | 5 +++++ > 1 file changed, 5 insertions(+) > > 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) { I suspect 0xff is also invalid destination apic id. For the Pentium 4 and Intel Xeon processors, the xAPIC specification extends the local APIC ID field to 8 bits. These can be used to identify up to 255 processors in the system. > + 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);