Quantcast
Channel: Raspberry Pi Forums
Viewing all articles
Browse latest Browse all 6980

General • [RP2350] "SIO_IRQ_BELL" interrupt on ARM-CM33 Core1 routed to the wrong vector entry !

$
0
0
Hello everyone,

While implementing a cross-core API in my RTOS, I found that "SIO_IRQ_BELL" on ARM-CM33 Core1 is routed to the wrong vector entry 10 (Reserved entry) instead of vector 42.

I got a HardFault exception (INVSTATE bit set) on core1 when I set the doorbell flag on core0 to trigger the "SIO_IRQ_BELL" interrupt on core1.

After some deep investigation I found that INVSTATE was set because of vector fetch at index 10 of the interrupt vector table which is NULL as it's a reserved vector entry on ARM !

so just I replaced the NULL entry by an ISR handler to avoid the HardFault exception and I confirmed that IRQ42 ISR fetched from IVT index 10 :
irq42_issue.png
To reproduce the issue just set one of the doorbell flag on core0 to trigger the interrupt on core1.

Code on core0 :

Code:

SIO->DOORBELL_OUT_SET.reg |= (1ul << 0);
Code on Core1 :

Code:

#define NVIC_ISER ((volatile uint32*)(0xE000E100UL))#define InterruptIndex 42/* enable global interrupt flag */__asm("cpsie i");/* enable IRQ26 (vector table index 42) */NVIC_ISER[(InterruptIndex - 16U) / 32U] |= (1UL << ((InterruptIndex - 16U) % 32U));/* endless loop */__asm("b .");
The interrupt vector table must be aligned to 128 as described in the RP2350 document.

Code:

//=============================================================================// Types definition//=============================================================================typedef void (*InterruptHandler)(void);void UndefinedHandler(void);void UndefinedHandler(void) { for(;;); }void UndefinedHandler_4(void) { for(;;); }void UndefinedHandler_5(void) { for(;;); }void UndefinedHandler_6(void) { for(;;); }void UndefinedHandler_7(void) { for(;;); }void UndefinedHandler_8(void) { for(;;); }void UndefinedHandler_9(void) { for(;;); }void UndefinedHandler_10(void) { for(;;); }void UndefinedHandler_11(void) { for(;;); }void UndefinedHandler_12(void) { for(;;); }//=============================================================================// Functions prototype//=============================================================================void main_Core1 (void) __attribute__((weak, alias("UndefinedHandler")));void __CORE1_STACK_TOP(void);//=============================================================================// Default interrupts handler //=============================================================================void NMI(void)                   __attribute__((weak, alias("UndefinedHandler")));void HardFault(void)             __attribute__((weak, alias("UndefinedHandler")));void SVCall(void)                __attribute__((weak, alias("UndefinedHandler")));void PendSV(void)                __attribute__((weak, alias("UndefinedHandler")));void SysTickTimer(void)          __attribute__((weak, alias("UndefinedHandler")));void TIMER0_IRQ_0_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void TIMER0_IRQ_1_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void TIMER0_IRQ_2_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void TIMER0_IRQ_3_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void TIMER1_IRQ_0_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void TIMER1_IRQ_1_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void TIMER1_IRQ_2_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void TIMER1_IRQ_3_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void PWM_IRQ_WRAP_0_IRQn(void)   __attribute__((weak, alias("UndefinedHandler")));void PWM_IRQ_WRAP_1_IRQn(void)   __attribute__((weak, alias("UndefinedHandler")));void DMA_IRQ_0_IRQn(void)        __attribute__((weak, alias("UndefinedHandler")));void DMA_IRQ_1_IRQn(void)        __attribute__((weak, alias("UndefinedHandler")));void DMA_IRQ_2_IRQn(void)        __attribute__((weak, alias("UndefinedHandler")));void DMA_IRQ_3_IRQn(void)        __attribute__((weak, alias("UndefinedHandler")));void USBCTRL_IRQ_IRQn(void)      __attribute__((weak, alias("UndefinedHandler")));void PIO0_IRQ_0_IRQn(void)       __attribute__((weak, alias("UndefinedHandler")));void PIO0_IRQ_1_IRQn(void)       __attribute__((weak, alias("UndefinedHandler")));void PIO1_IRQ_0_IRQn(void)       __attribute__((weak, alias("UndefinedHandler")));void PIO1_IRQ_1_IRQn(void)       __attribute__((weak, alias("UndefinedHandler")));void PIO2_IRQ_0_IRQn(void)       __attribute__((weak, alias("UndefinedHandler")));void PIO2_IRQ_1_IRQn(void)       __attribute__((weak, alias("UndefinedHandler")));void IO_IRQ_BANK0_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void IO_IRQ_BANK0_NS_IRQn(void)  __attribute__((weak, alias("UndefinedHandler")));void IO_IRQ_QSPI_IRQn(void)      __attribute__((weak, alias("UndefinedHandler")));void IO_IRQ_QSPI_NS_IRQn(void)   __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_FIFO_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_BELL_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_FIFO_NS_IRQn(void)  __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_BELL_NS_IRQn(void)  __attribute__((weak, alias("UndefinedHandler")));void SIO_IRQ_MTIMECMP_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));void CLOCKS_IRQ_IRQn(void)       __attribute__((weak, alias("UndefinedHandler")));void SPI0_IRQ_IRQn(void)         __attribute__((weak, alias("UndefinedHandler")));void SPI1_IRQ_IRQn(void)         __attribute__((weak, alias("UndefinedHandler")));void UART0_IRQ_IRQn(void)        __attribute__((weak, alias("UndefinedHandler")));void UART1_IRQ_IRQn(void)        __attribute__((weak, alias("UndefinedHandler")));void ADC_IRQ_FIFO_IRQn(void)     __attribute__((weak, alias("UndefinedHandler")));void I2C0_IRQ_IRQn(void)         __attribute__((weak, alias("UndefinedHandler")));void I2C1_IRQ_IRQn(void)         __attribute__((weak, alias("UndefinedHandler")));void OTP_IRQ_IRQn(void)          __attribute__((weak, alias("UndefinedHandler")));void TRNG_IRQ_IRQn(void)         __attribute__((weak, alias("UndefinedHandler")));void PLL_SYS_IRQ_IRQn(void)      __attribute__((weak, alias("UndefinedHandler")));void PLL_USB_IRQ_IRQn(void)      __attribute__((weak, alias("UndefinedHandler")));void POWMAN_IRQ_POW_IRQn(void)   __attribute__((weak, alias("UndefinedHandler")));void POWMAN_IRQ_TIMER_IRQn(void) __attribute__((weak, alias("UndefinedHandler")));//=============================================================================// Interrupt vector table Core1//=============================================================================const InterruptHandler __attribute__((section(".intvect_c1"), aligned(128))) __INTVECT_Core1[] ={    (InterruptHandler)&__CORE1_STACK_TOP,    (InterruptHandler)&main_Core1,    (InterruptHandler)&NMI,    (InterruptHandler)&HardFault,    (InterruptHandler)&UndefinedHandler_4,    (InterruptHandler)&UndefinedHandler_5,    (InterruptHandler)&UndefinedHandler_6,    (InterruptHandler)&UndefinedHandler_7,    (InterruptHandler)&UndefinedHandler_8,    (InterruptHandler)&UndefinedHandler_9,    (InterruptHandler)&UndefinedHandler_10,    (InterruptHandler)&SVCall,    (InterruptHandler)&UndefinedHandler_11,    (InterruptHandler)&UndefinedHandler_12,    (InterruptHandler)&PendSV,    (InterruptHandler)&SysTickTimer,    (InterruptHandler)&TIMER0_IRQ_0_IRQn,    (InterruptHandler)&TIMER0_IRQ_1_IRQn,    (InterruptHandler)&TIMER0_IRQ_2_IRQn,    (InterruptHandler)&TIMER0_IRQ_3_IRQn,    (InterruptHandler)&TIMER1_IRQ_0_IRQn,    (InterruptHandler)&TIMER1_IRQ_1_IRQn,    (InterruptHandler)&TIMER1_IRQ_2_IRQn,    (InterruptHandler)&TIMER1_IRQ_3_IRQn,    (InterruptHandler)&PWM_IRQ_WRAP_0_IRQn,    (InterruptHandler)&PWM_IRQ_WRAP_1_IRQn,    (InterruptHandler)&DMA_IRQ_0_IRQn,    (InterruptHandler)&DMA_IRQ_1_IRQn,    (InterruptHandler)&DMA_IRQ_2_IRQn,    (InterruptHandler)&DMA_IRQ_3_IRQn,    (InterruptHandler)&USBCTRL_IRQ_IRQn,    (InterruptHandler)&PIO0_IRQ_0_IRQn,    (InterruptHandler)&PIO0_IRQ_1_IRQn,    (InterruptHandler)&PIO1_IRQ_0_IRQn,    (InterruptHandler)&PIO1_IRQ_1_IRQn,    (InterruptHandler)&PIO2_IRQ_0_IRQn,    (InterruptHandler)&PIO2_IRQ_1_IRQn,    (InterruptHandler)&IO_IRQ_BANK0_IRQn,    (InterruptHandler)&IO_IRQ_BANK0_NS_IRQn,    (InterruptHandler)&IO_IRQ_QSPI_IRQn,    (InterruptHandler)&IO_IRQ_QSPI_NS_IRQn,    (InterruptHandler)&SIO_IRQ_FIFO_IRQn,    (InterruptHandler)&SIO_IRQ_BELL_IRQn,    (InterruptHandler)&SIO_IRQ_FIFO_NS_IRQn,    (InterruptHandler)&SIO_IRQ_BELL_NS_IRQn,    (InterruptHandler)&SIO_IRQ_MTIMECMP_IRQn,    (InterruptHandler)&CLOCKS_IRQ_IRQn,    (InterruptHandler)&SPI0_IRQ_IRQn,    (InterruptHandler)&SPI1_IRQ_IRQn,    (InterruptHandler)&UART0_IRQ_IRQn,    (InterruptHandler)&UART1_IRQ_IRQn,    (InterruptHandler)&ADC_IRQ_FIFO_IRQn,    (InterruptHandler)&I2C0_IRQ_IRQn,    (InterruptHandler)&I2C1_IRQ_IRQn,    (InterruptHandler)&OTP_IRQ_IRQn,    (InterruptHandler)&TRNG_IRQ_IRQn,    (InterruptHandler)&PLL_SYS_IRQ_IRQn,    (InterruptHandler)&PLL_USB_IRQ_IRQn,    (InterruptHandler)&POWMAN_IRQ_POW_IRQn,    (InterruptHandler)&POWMAN_IRQ_TIMER_IRQn,    (InterruptHandler)0,    (InterruptHandler)0,    (InterruptHandler)0,    (InterruptHandler)0,    (InterruptHandler)0,    (InterruptHandler)0};
Has anyone else experienced this behavior?

Would appreciate any confirmation.

Thanks!

Statistics: Posted by chalandi — Thu May 01, 2025 11:37 pm — Replies 4 — Views 138



Viewing all articles
Browse latest Browse all 6980

Trending Articles