zephyr/arch/xtensa/include/xtensa_stack.h
Daniel Leung 5b84bb4f4a xtensa: check stack frame pointer before dumping registers
Check that the stack frame pointer is valid before dumping
any registers while handling exceptions. If the pointer is
invalid, anything it points to will probably be also be
invalid. Accessing them may result in another access
violation.

Signed-off-by: Daniel Leung <daniel.leung@intel.com>
2024-06-21 09:59:36 +02:00

59 lines
1.6 KiB
C

/*
* Copyright (c) 2024 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_ARCH_XTENSA_XTENSA_STACK_H_
#define ZEPHYR_ARCH_XTENSA_XTENSA_STACK_H_
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <xtensa_asm2_context.h>
/**
* @defgroup xtensa_stack_internal_apis Xtensa Stack related Internal APIs
* @ingroup xtensa_stack_apis
* @{
*/
/**
* @brief Check if memory region is within correct stack boundaries.
*
* Check if the memory region [@a addr, (@a addr + @a sz)) is within
* correct stack boundaries:
* - Interrupt stack if servicing interrupts.
* - Privileged stack if in kernel mode doing syscalls.
* - Thread stack otherwise.
*
* @note When @ps == UINT32_MAX, it checks the whole range of stack
* object because we cannot get PS via frame pointer yet.
*
* @param addr Beginning address of memory region to check.
* @param sz Size of memory region to check. Can be zero.
* @param ps PS register value of interrupted context. Use UINT32_MAX if
* PS cannot be determined at time of call.
*
* @return True if memory region is outside stack bounds, false otherwise.
*/
bool xtensa_is_outside_stack_bounds(uintptr_t addr, size_t sz, uint32_t ps);
/**
* @brief Check if frame pointer is within correct stack boundaries.
*
* Check if the frame pointer and its associated BSA (base save area) are
* within correct stack boundaries. Use @ref xtensa_is_outside_stack_bounds
* to determine validity.
*
* @param frame Frame Pointer. Cannot be NULL.
*/
bool xtensa_is_frame_pointer_valid(_xtensa_irq_stack_frame_raw_t *frame);
/**
* @}
*/
#endif /* ZEPHYR_ARCH_XTENSA_XTENSA_STACK_H_ */