2022-01-15 07:01:10 +01:00
|
|
|
/****************************************************************************
|
2022-11-17 11:17:40 +01:00
|
|
|
* arch/sparc/src/sparc_v8/sparc_v8_doirq.c
|
2022-01-15 07:01:10 +01:00
|
|
|
*
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
|
|
* this work for additional information regarding copyright ownership. The
|
|
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
|
|
* "License"); you may not use this file except in compliance with the
|
|
|
|
* License. You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
* License for the specific language governing permissions and limitations
|
|
|
|
* under the License.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Included Files
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <assert.h>
|
|
|
|
|
2023-01-27 11:13:26 +01:00
|
|
|
#include <nuttx/addrenv.h>
|
2022-01-15 07:01:10 +01:00
|
|
|
#include <nuttx/irq.h>
|
|
|
|
#include <nuttx/arch.h>
|
|
|
|
#include <nuttx/board.h>
|
|
|
|
#include <arch/board/board.h>
|
2023-07-13 11:49:30 +02:00
|
|
|
#include <sched/sched.h>
|
2022-01-15 07:01:10 +01:00
|
|
|
|
2022-11-17 11:17:40 +01:00
|
|
|
#include "sparc_internal.h"
|
2022-01-15 07:01:10 +01:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Pre-processor Definitions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Public Data
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Data
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Functions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Public Functions
|
|
|
|
****************************************************************************/
|
|
|
|
|
2022-11-17 11:17:40 +01:00
|
|
|
uint32_t *sparc_doirq(int irq, uint32_t *regs)
|
2022-01-15 07:01:10 +01:00
|
|
|
{
|
|
|
|
board_autoled_on(LED_INIRQ);
|
|
|
|
#ifdef CONFIG_SUPPRESS_INTERRUPTS
|
|
|
|
PANIC();
|
|
|
|
#else
|
|
|
|
regs = (uint32_t *)((uint32_t)regs + CPU_MINIMUM_STACK_FRAME_SIZE);
|
|
|
|
/* Current regs non-zero indicates that we are processing an interrupt;
|
2022-10-27 09:42:36 +02:00
|
|
|
* CURRENT_REGS is also used to manage interrupt level context switches.
|
2022-01-15 07:01:10 +01:00
|
|
|
*
|
|
|
|
* Nested interrupts are not supported.
|
|
|
|
*/
|
|
|
|
|
2022-10-27 09:42:36 +02:00
|
|
|
DEBUGASSERT(CURRENT_REGS == NULL);
|
|
|
|
CURRENT_REGS = regs;
|
2022-01-15 07:01:10 +01:00
|
|
|
|
|
|
|
/* Deliver the IRQ */
|
|
|
|
|
|
|
|
irq_dispatch(irq, regs);
|
|
|
|
|
|
|
|
/* Check for a context switch. If a context switch occurred, then
|
2022-10-27 09:42:36 +02:00
|
|
|
* CURRENT_REGS will have a different value than it did on entry.
|
2022-01-15 07:01:10 +01:00
|
|
|
* If an interrupt level context switch has occurred, then restore
|
|
|
|
* the floating point state and the establish the correct address
|
|
|
|
* environment before returning from the interrupt.
|
|
|
|
*/
|
|
|
|
|
2022-10-27 09:42:36 +02:00
|
|
|
if (regs != CURRENT_REGS)
|
2022-01-15 07:01:10 +01:00
|
|
|
{
|
|
|
|
#ifdef CONFIG_ARCH_FPU
|
|
|
|
/* Restore floating point registers */
|
|
|
|
|
2022-10-27 09:42:36 +02:00
|
|
|
up_restorefpu((uint32_t *)CURRENT_REGS);
|
2022-01-15 07:01:10 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CONFIG_ARCH_ADDRENV
|
|
|
|
/* Make sure that the address environment for the previously
|
|
|
|
* running task is closed down gracefully (data caches dump,
|
|
|
|
* MMU flushed) and set up the address environment for the new
|
|
|
|
* thread at the head of the ready-to-run list.
|
|
|
|
*/
|
|
|
|
|
2023-01-27 11:13:26 +01:00
|
|
|
addrenv_switch(NULL);
|
2022-01-15 07:01:10 +01:00
|
|
|
#endif
|
2023-07-13 11:49:30 +02:00
|
|
|
|
|
|
|
/* Record the new "running" task when context switch occurred.
|
|
|
|
* g_running_tasks[] is only used by assertion logic for reporting
|
|
|
|
* crashes.
|
|
|
|
*/
|
|
|
|
|
|
|
|
g_running_tasks[this_cpu()] = this_task();
|
2022-01-15 07:01:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* If a context switch occurred while processing the interrupt then
|
2022-10-27 09:42:36 +02:00
|
|
|
* CURRENT_REGS may have change value. If we return any value different
|
2022-01-15 07:01:10 +01:00
|
|
|
* from the input regs, then the lower level will know that a context
|
|
|
|
* switch occurred during interrupt processing.
|
|
|
|
*/
|
|
|
|
|
2022-10-27 09:42:36 +02:00
|
|
|
regs = (uint32_t *)((uint32_t)CURRENT_REGS -
|
arch: Save sigdeliver into xcp in the case of signal self delevery
to avoid the infinite recusive dispatch:
*0 myhandler (signo=27, info=0xf3e38b9c, context=0x0) at ltp/testcases/open_posix_testsuite/conformance/interfaces/sigqueue/7-1.c:39
*1 0x58f1c39e in nxsig_deliver (stcb=0xf4e20f40) at signal/sig_deliver.c:167
*2 0x58fa0664 in up_schedule_sigaction (tcb=0xf4e20f40, sigdeliver=0x58f1bab5 <nxsig_deliver>) at sim/sim_schedulesigaction.c:88
*3 0x58f19907 in nxsig_queue_action (stcb=0xf4e20f40, info=0xf4049334) at signal/sig_dispatch.c:115
*4 0x58f1b089 in nxsig_tcbdispatch (stcb=0xf4e20f40, info=0xf4049334) at signal/sig_dispatch.c:435
*5 0x58f31853 in nxsig_unmask_pendingsignal () at signal/sig_unmaskpendingsignal.c:104
*6 0x58f1ca09 in nxsig_deliver (stcb=0xf4e20f40) at signal/sig_deliver.c:199
*7 0x58fa0664 in up_schedule_sigaction (tcb=0xf4e20f40, sigdeliver=0x58f1bab5 <nxsig_deliver>) at sim/sim_schedulesigaction.c:88
*8 0x58f19907 in nxsig_queue_action (stcb=0xf4e20f40, info=0xf4049304) at signal/sig_dispatch.c:115
*9 0x58f1b089 in nxsig_tcbdispatch (stcb=0xf4e20f40, info=0xf4049304) at signal/sig_dispatch.c:435
*10 0x58f31853 in nxsig_unmask_pendingsignal () at signal/sig_unmaskpendingsignal.c:104
*11 0x58f1ca09 in nxsig_deliver (stcb=0xf4e20f40) at signal/sig_deliver.c:199
*12 0x58fa0664 in up_schedule_sigaction (tcb=0xf4e20f40, sigdeliver=0x58f1bab5 <nxsig_deliver>) at sim/sim_schedulesigaction.c:88
*13 0x58f19907 in nxsig_queue_action (stcb=0xf4e20f40, info=0xf40492d4) at signal/sig_dispatch.c:115
*14 0x58f1b089 in nxsig_tcbdispatch (stcb=0xf4e20f40, info=0xf40492d4) at signal/sig_dispatch.c:435
*15 0x58f31853 in nxsig_unmask_pendingsignal () at signal/sig_unmaskpendingsignal.c:104
*16 0x58f1ca09 in nxsig_deliver (stcb=0xf4e20f40) at signal/sig_deliver.c:199
*17 0x58fa0664 in up_schedule_sigaction (tcb=0xf4e20f40, sigdeliver=0x58f1bab5 <nxsig_deliver>) at sim/sim_schedulesigaction.c:88
*18 0x58f19907 in nxsig_queue_action (stcb=0xf4e20f40, info=0xf40492a4) at signal/sig_dispatch.c:115
*19 0x58f1b089 in nxsig_tcbdispatch (stcb=0xf4e20f40, info=0xf40492a4) at signal/sig_dispatch.c:435
*20 0x58f31853 in nxsig_unmask_pendingsignal () at signal/sig_unmaskpendingsignal.c:104
*21 0x58f1ca09 in nxsig_deliver (stcb=0xf4e20f40) at signal/sig_deliver.c:199
*22 0x58fa0664 in up_schedule_sigaction (tcb=0xf4e20f40, sigdeliver=0x58f1bab5 <nxsig_deliver>) at sim/sim_schedulesigaction.c:88
*23 0x58f19907 in nxsig_queue_action (stcb=0xf4e20f40, info=0xf4049274) at signal/sig_dispatch.c:115
*24 0x58f1b089 in nxsig_tcbdispatch (stcb=0xf4e20f40, info=0xf4049274) at signal/sig_dispatch.c:435
*25 0x58f31853 in nxsig_unmask_pendingsignal () at signal/sig_unmaskpendingsignal.c:104
*26 0x58f1ca09 in nxsig_deliver (stcb=0xf4e20f40) at signal/sig_deliver.c:199
*27 0x58fa0664 in up_schedule_sigaction (tcb=0xf4e20f40, sigdeliver=0x58f1bab5 <nxsig_deliver>) at sim/sim_schedulesigaction.c:88
*28 0x58f19907 in nxsig_queue_action (stcb=0xf4e20f40, info=0xf4049244) at signal/sig_dispatch.c:115
*29 0x58f1b089 in nxsig_tcbdispatch (stcb=0xf4e20f40, info=0xf4049244) at signal/sig_dispatch.c:435
*30 0x58f31853 in nxsig_unmask_pendingsignal () at signal/sig_unmaskpendingsignal.c:104
*31 0x58f1ca09 in nxsig_deliver (stcb=0xf4e20f40) at signal/sig_deliver.c:199
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
2023-05-13 16:35:21 +02:00
|
|
|
CPU_MINIMUM_STACK_FRAME_SIZE);
|
2022-01-15 07:01:10 +01:00
|
|
|
|
2022-10-27 09:42:36 +02:00
|
|
|
/* Set CURRENT_REGS to NULL to indicate that we are no longer in an
|
|
|
|
* interrupt handler.
|
2022-01-15 07:01:10 +01:00
|
|
|
*/
|
|
|
|
|
2022-10-27 09:42:36 +02:00
|
|
|
CURRENT_REGS = NULL;
|
2022-01-15 07:01:10 +01:00
|
|
|
#endif
|
|
|
|
board_autoled_off(LED_INIRQ);
|
|
|
|
return regs;
|
|
|
|
}
|