blob: 2c0a9bba2e0c3af6fef0ff8011db7d1965aa20bb [file] [log] [blame]
/*
* Copyright (c) 2020 Espressif Systems (Shanghai) Co., Ltd.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <xtensa/coreasm.h>
#include <xtensa/corebits.h>
#include <xtensa/config/system.h>
#include <xtensa/hal.h>
#include <xtensa-asm2-context.h>
.section .iram1, "ax"
.align 4
.global z_xtensa_backtrace_get_start
.type z_xtensa_backtrace_get_start, @function
z_xtensa_backtrace_get_start:
entry a1, 32
/* Spill registers onto stack (excluding this function) */
call8 xthal_window_spill
/* a2, a3, a4 should be out arguments for i PC, i SP, i-1 PC respectively.
* Use a6 and a7 as scratch */
/* Load address for interrupted stack */
l32i a6, a5, 0
/* Load i PC in a7 */
l32i a7, a6, BSA_PC_OFF
/* Store value of i PC in a2 */
s32i a7, a2, 0
/* Load value for (i-1) PC, which return address of i into a7 */
l32i a7, a6, BSA_A0_OFF
/* Store value of (i-1) PC in a4 */
s32i a7, a4, 0
/* Add BASE_SAVE_AREA_SIZE in interrupted stack to get i SP */
addi a6, a6, BASE_SAVE_AREA_SIZE
/* Store i SP in a3 */
s32i a6, a3, 0
retw