Fix xtensa_btdump() to look at the exception frame
Remove xtensa_backtrace_start() since it is not used anymore
This commit is contained in:
parent
19fddc451c
commit
d2eeeee262
4 changed files with 5 additions and 113 deletions
|
|
@ -348,9 +348,5 @@ void xtensa_pminitialize(void);
|
|||
void up_stack_color(FAR void *stackbase, size_t nbytes);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_XTENSA_DUMPBT_ON_ASSERT
|
||||
void xtensa_backtrace_start(uint32_t *pc, uint32_t *sp, uint32_t *next_pc);
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ARCH_XTENSA_SRC_COMMON_XTENSA_H */
|
||||
|
|
|
|||
|
|
@ -1,104 +0,0 @@
|
|||
/****************************************************************************
|
||||
* arch/xtensa/src/common/xtensa_backtrace.S
|
||||
*
|
||||
* 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 <arch/xtensa/core.h>
|
||||
#include <arch/xtensa/xtensa_specregs.h>
|
||||
|
||||
#include "xtensa_abi.h"
|
||||
|
||||
/*
|
||||
* This is how the call stack looks like when calling the function below
|
||||
* from xtensa_dumpstate():
|
||||
*
|
||||
* High Addr
|
||||
* ..................
|
||||
* | i-3 BSA |
|
||||
* | i-1 locals | xtensa_assert()
|
||||
* .................. i-1 SP
|
||||
* | i-2 BSA |
|
||||
* | i locals | xtensa_dumpstate()
|
||||
* ------------------ i SP
|
||||
* | i-1 BSA |
|
||||
* | i+1 locals | xtensa_btdump()
|
||||
* ------------------ i+1 SP
|
||||
* | i BSA |
|
||||
* | i+2 locals | xtensa_backtrace_start()
|
||||
* ------------------ i+2 SP
|
||||
* | i+1 BSA |
|
||||
* | i+3 locals | xtensa_window_spill()
|
||||
* ------------------ i+3 SP
|
||||
* .................. Low Addr
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: xtensa_backtrace_start
|
||||
*
|
||||
* Description:
|
||||
* Get the first frame of the current stack's backtrace.
|
||||
*
|
||||
* Given the following function call flow (B -> A -> X -> xtensa_backtrace_start),
|
||||
* this function will do the following:
|
||||
* - Flush CPU registers and window frames onto the current stack
|
||||
* - Return PC and SP of function A (i.e. start of the stack's backtrace)
|
||||
* - Return PC of function B (i.e. next_pc)
|
||||
*
|
||||
* Input Parameters:
|
||||
* pc - PC of the first frame in the backtrace
|
||||
* sp - SP of the first frame in the backtrace
|
||||
* next_pc - PC of the first frame's caller
|
||||
*
|
||||
* C callable as:
|
||||
* void xtensa_backtrace_start(uint32_t *pc, uint32_t *sp, uint32_t *next_pc)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
.section .iram1, "ax"
|
||||
.global xtensa_backtrace_start
|
||||
.type xtensa_backtrace_start, @function
|
||||
.align 4
|
||||
|
||||
xtensa_backtrace_start:
|
||||
|
||||
ENTRY(32)
|
||||
|
||||
call8 xtensa_window_spill /* Spill registers onto stack (excluding this
|
||||
* function) */
|
||||
|
||||
/* a2, a3, a4 should be out arguments for i SP, i PC, i-1 PC respectively.
|
||||
* Use a5 and a6 as scratch.
|
||||
*/
|
||||
|
||||
l32e a5, sp, -16 /* Get i PC, which is ret address of i+1 */
|
||||
s32i a5, a2, 0 /* Store i PC to arg *pc */
|
||||
l32e a6, sp, -12 /* Get i+1 SP. Used to access i BS */
|
||||
l32e a5, a6, -12 /* Get i SP */
|
||||
s32i a5, a3, 0 /* Store i SP to arg *sp */
|
||||
l32e a5, a6, -16 /* Get i-1 PC, which is ret address of i */
|
||||
s32i a5, a4, 0 /* Store i-1 PC to arg *next_pc */
|
||||
RET0
|
||||
|
||||
.size xtensa_backtrace_start, . - xtensa_backtrace_start
|
||||
|
||||
|
|
@ -232,7 +232,11 @@ static inline void xtensa_btdump(void)
|
|||
int i;
|
||||
bool corrupted = false;
|
||||
|
||||
xtensa_backtrace_start(&pc, &sp, &npc);
|
||||
uint32_t *regs = (uint32_t *)CURRENT_REGS;
|
||||
|
||||
pc = regs[REG_PC];
|
||||
npc = regs[REG_A0]; /* return register */
|
||||
sp = regs[REG_A1]; /* stack pointer */
|
||||
|
||||
_alert("Backtrace0: %x:%x\n", stackpc(pc), sp);
|
||||
|
||||
|
|
|
|||
|
|
@ -50,10 +50,6 @@ ifeq ($(CONFIG_DEBUG_ALERT),y)
|
|||
CMN_CSRCS += xtensa_dumpstate.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_XTENSA_DUMPBT_ON_ASSERT),y)
|
||||
CMN_ASRCS += xtensa_backtrace.S
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_SPINLOCK),y)
|
||||
CMN_CSRCS += xtensa_testset.c
|
||||
endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue