xtensa: Fix noreturn attribute on error handlers in asm2
In asm2, the machine exception handler runs in interrupt context (this is good: it allows us to defer the test against exception type until after we have done the stack switch and dispatched any true interrupts), but that means that the user error handler needs to be invoked and then return through the interrupt exit code. So the __attribute__(__noreturn__) that it was being decorated with was incorrect. And actually fatal, as with gcc xtensa will crash trying to return from a noreturn call. Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
This commit is contained in:
parent
c3c4ea730d
commit
3f5027f835
2 changed files with 16 additions and 10 deletions
|
@ -44,7 +44,7 @@ const NANO_ESF _default_esf = {
|
|||
*
|
||||
* @return This function does not return.
|
||||
*/
|
||||
FUNC_NORETURN void _NanoFatalErrorHandler(unsigned int reason,
|
||||
XTENSA_ERR_NORET void _NanoFatalErrorHandler(unsigned int reason,
|
||||
const NANO_ESF *pEsf)
|
||||
{
|
||||
switch (reason) {
|
||||
|
@ -179,14 +179,14 @@ static void dump_exc_state(void)
|
|||
}
|
||||
|
||||
|
||||
FUNC_NORETURN void FatalErrorHandler(void)
|
||||
XTENSA_ERR_NORET void FatalErrorHandler(void)
|
||||
{
|
||||
printk("*** Unhandled exception ****\n");
|
||||
dump_exc_state();
|
||||
_NanoFatalErrorHandler(_NANO_ERR_HW_EXCEPTION, &_default_esf);
|
||||
}
|
||||
|
||||
FUNC_NORETURN void ReservedInterruptHandler(unsigned int intNo)
|
||||
XTENSA_ERR_NORET void ReservedInterruptHandler(unsigned int intNo)
|
||||
{
|
||||
printk("*** Reserved Interrupt ***\n");
|
||||
dump_exc_state();
|
||||
|
@ -232,7 +232,7 @@ void exit(int return_code)
|
|||
*
|
||||
* @return N/A
|
||||
*/
|
||||
FUNC_NORETURN __weak void _SysFatalErrorHandler(unsigned int reason,
|
||||
XTENSA_ERR_NORET __weak void _SysFatalErrorHandler(unsigned int reason,
|
||||
const NANO_ESF *pEsf)
|
||||
{
|
||||
ARG_UNUSED(pEsf);
|
||||
|
|
|
@ -120,10 +120,16 @@ extern void _irq_priority_set(u32_t irq, u32_t prio, u32_t flags);
|
|||
/* Spurious interrupt handler. Throws an error if called */
|
||||
extern void _irq_spurious(void *unused);
|
||||
|
||||
FUNC_NORETURN void _SysFatalErrorHandler(unsigned int reason,
|
||||
#ifdef CONFIG_XTENSA_ASM2
|
||||
#define XTENSA_ERR_NORET /**/
|
||||
#else
|
||||
#define XTENSA_ERR_NORET FUNC_NORETURN
|
||||
#endif
|
||||
|
||||
XTENSA_ERR_NORET void _SysFatalErrorHandler(unsigned int reason,
|
||||
const NANO_ESF *esf);
|
||||
|
||||
FUNC_NORETURN void _NanoFatalErrorHandler(unsigned int reason,
|
||||
XTENSA_ERR_NORET void _NanoFatalErrorHandler(unsigned int reason,
|
||||
const NANO_ESF *pEsf);
|
||||
|
||||
extern u32_t _timer_cycle_get_32(void);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue