blob: 399b161174e4ede520a72480fd5e79a5002b0c09 [file] [log] [blame]
/****************************************************************************
* arch/xtensa/src/common/xtensa_assert.c
*
* SPDX-License-Identifier: Apache-2.0
*
* 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 <debug.h>
#include <assert.h>
#include <nuttx/irq.h>
#include <nuttx/board.h>
#include <nuttx/syslog/syslog.h>
#include <arch/board/board.h>
#include "sched/sched.h"
#include "xtensa.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: xtensa_panic
*
* Description:
* PANIC if an unhandled exception is received:
*
* - NMI exception
* - Debug exception
* - Double exception
* - Kernel exception
* - Co-processor exception
* - High priority level2-6 Exception.
*
* Input Parameters:
* xcptcode - Identifies the unhandled exception (see include/esp32/irq.h)
* regs - The register save are at the time of the interrupt.
*
* Returned Value:
* Does not return
*
****************************************************************************/
void xtensa_panic(int xptcode, uint32_t *regs)
{
struct tcb_s **running_task = &g_running_tasks[this_cpu()];
(*running_task)->xcp.regs = regs;
up_set_interrupt_context(true);
/* We get here when a un-dispatch-able, irrecoverable exception occurs */
board_autoled_on(LED_ASSERTION);
/* Flush any buffered SYSLOG data (from prior to the panic) */
syslog_flush();
_alert("Unhandled Exception %d task: %s\n", xptcode,
get_task_name(running_task()));
PANIC_WITH_REGS("panic", regs); /* Should not return */
for (; ; );
}
/****************************************************************************
* Name: xtensa_user
*
* Description:
* PANIC if certain User Exceptions are received. All values for EXCCAUSE
* are listed below (not all generate PANICs):
*
* 0 IllegalInstructionCause
* Illegal instruction
* 1 SyscallCause
* SYSCALL instruction
* 2 InstructionFetchErrorCause
* Processor internal physical address or data error during instruction
* fetch.
* 3 LoadStoreErrorCause
* Processor internal physical address or data error during load or
* store.
* 4 Level1InterruptCause
* Level-1 interrupt as indicated by set level-1 bits in the INTERRUPT
* register.
* 5 AllocaCause
* MOVSP instruction, if caller's registers are not in the register
* file.
* 6 IntegerDivideByZeroCause
* QUOS, QUOU, REMS, or REMU divisor operand is zero.
* 7 PCValueErrorCause Next PC Value Illegal
* 8 PrivilegedCause
* Attempt to execute a privileged operation when CRING != 0
* 9 LoadStoreAlignmentCause
* Load or store to an unaligned address.
* 10..11 Reserved for Cadence
* 12 InstrPIFDataErrorCause
* PIF data error during instruction fetch.
* 13 LoadStorePIFDataErrorCause
* Synchronous PIF data error during LoadStore access.
* 14 InstrPIFAddrErrorCause
* PIF address error during instruction fetch.
* 15 LoadStorePIFAddrErrorCause
* Synchronous PIF address error during LoadStore access.
* 16 InstTLBMissCause
* Error during Instruction TLB refill
* 17 InstTLBMultiHitCause
* Multiple instruction TLB entries matched
* 18 InstFetchPrivilegeCause
* An instruction fetch referenced a virtual address at a ring level
* less than CRING.
* 19 Reserved for Cadence
* 20 InstFetchProhibitedCause
* An instruction fetch referenced a page mapped with an attribute
* that does not permit instruction fetch.
* 21..23 Reserved for Cadence
* 24 LoadStoreTLBMissCause
* Error during TLB refill for a load or store.
* 25 LoadStoreTLBMultiHitCause
* Multiple TLB entries matched for a load or store.
* 26 LoadStorePrivilegeCause
* A load or store referenced a virtual address at a ring level less
* than CRING.
* 27 Reserved for Cadence
* 28 LoadProhibitedCause
* A load referenced a page mapped with an attribute that does not
* permit loads.
* 29 StoreProhibitedCause
* A store referenced a page mapped with an attribute that does not
* permit stores.
* 30..31 Reserved for Cadence
* 32..39 CoprocessornDisabled
* Coprocessor n instruction when cpn disabled. n varies 0..7 as the
* cause varies 32..39.
* 40..63 Reserved
*
* Input Parameters:
* exccause - Identifies the EXCCAUSE of the user exception
* regs - The register save are at the time of the interrupt.
*
* Returned Value:
* Does not return
*
****************************************************************************/
void xtensa_user_panic(int exccause, uint32_t *regs)
{
struct tcb_s **running_task = &g_running_tasks[this_cpu()];
(*running_task)->xcp.regs = regs;
up_set_interrupt_context(true);
/* We get here when a un-dispatch-able, irrecoverable exception occurs */
board_autoled_on(LED_ASSERTION);
/* Flush any buffered SYSLOG data (from prior to the error) */
syslog_flush();
_alert("User Exception: EXCCAUSE=%04x task: %s\n",
exccause, get_task_name(running_task()));
PANIC_WITH_REGS("user panic", regs); /* Should not return */
for (; ; );
}