Re: git: cbf845052f1c - main - msi: report error for attempt to use APIC ID > 255

From: Konstantin Belousov <kostikbel_at_gmail.com>
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);