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);