With the original code I observe In function ‘__irq_to_desc’, inlined from ‘route_irq_to_guest’ at arch/arm/irq.c:465:12: arch/arm/irq.c:54:16: error: array subscript -2 is below array bounds of ‘irq_desc_t[32]’ {aka ‘struct irq_desc[32]’} [-Werror=array-bounds=] 54 | return &this_cpu(local_irq_desc)[irq]; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
which looks pretty bogus: How in the world does the compiler arrive at -2 when compiling route_irq_to_guest()? Yet independent of that the function's parameter wants to be of unsigned type anyway, as shown by a vast majority of callers (others use plain int when they really mean non-negative quantities). With that adjustment the code compiles fine again. Signed-off-by: Jan Beulich <jbeul...@suse.com> --- https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116519 --- a/xen/arch/arm/include/asm/irq.h +++ b/xen/arch/arm/include/asm/irq.h @@ -56,7 +56,7 @@ extern const unsigned int nr_irqs; struct irq_desc; struct irqaction; -struct irq_desc *__irq_to_desc(int irq); +struct irq_desc *__irq_to_desc(unsigned int irq); #define irq_to_desc(irq) __irq_to_desc(irq) --- unstable.orig/xen/arch/arm/irq.c 2024-06-28 15:56:44.000000000 +0200 +++ unstable/xen/arch/arm/irq.c 2024-08-28 15:12:10.333607505 +0200 @@ -48,7 +48,7 @@ void irq_end_none(struct irq_desc *irq) static irq_desc_t irq_desc[NR_IRQS]; static DEFINE_PER_CPU(irq_desc_t[NR_LOCAL_IRQS], local_irq_desc); -struct irq_desc *__irq_to_desc(int irq) +struct irq_desc *__irq_to_desc(unsigned int irq) { if ( irq < NR_LOCAL_IRQS ) return &this_cpu(local_irq_desc)[irq];