mirror of
https://github.com/apache/nuttx.git
synced 2026-09-10 02:46:33 +00:00
debug.h is a NuttX-specific, non-POSIX header. Placing it in the top-level include/ directory creates naming conflicts with external projects that define their own debug.h. This commit moves the canonical header to include/nuttx/debug.h, following the NuttX convention for non-POSIX/non-standard headers, and updates all in-tree references. A backward-compatibility shim is left at include/debug.h that emits a deprecation #warning and re-includes <nuttx/debug.h>, allowing out-of-tree code to continue building while migrating. Signed-off-by: Piyush Patle <piyushpatle228@gmail.com>
192 lines
6.3 KiB
C
192 lines
6.3 KiB
C
/****************************************************************************
|
|
* 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 <nuttx/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 (; ; );
|
|
}
|