1e1a6547dSJerome Forissier /* SPDX-License-Identifier: (BSD-2-Clause AND MIT-CMU) */ 2e1a6547dSJerome Forissier /*- 3e1a6547dSJerome Forissier * Copyright (c) 2015-2019, Linaro Limited 4e1a6547dSJerome Forissier * Copyright (c) 2000, 2001 Ben Harris 5e1a6547dSJerome Forissier * Copyright (c) 1996 Scott K. Stevens 6e1a6547dSJerome Forissier * 7e1a6547dSJerome Forissier * Mach Operating System 8e1a6547dSJerome Forissier * Copyright (c) 1991,1990 Carnegie Mellon University 9e1a6547dSJerome Forissier * All Rights Reserved. 10e1a6547dSJerome Forissier * 11e1a6547dSJerome Forissier * Permission to use, copy, modify and distribute this software and its 12e1a6547dSJerome Forissier * documentation is hereby granted, provided that both the copyright 13e1a6547dSJerome Forissier * notice and this permission notice appear in all copies of the 14e1a6547dSJerome Forissier * software, derivative works or modified versions, and any portions 15e1a6547dSJerome Forissier * thereof, and that both notices appear in supporting documentation. 16e1a6547dSJerome Forissier * 17e1a6547dSJerome Forissier * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 18e1a6547dSJerome Forissier * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 19e1a6547dSJerome Forissier * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 20e1a6547dSJerome Forissier * 21e1a6547dSJerome Forissier * Carnegie Mellon requests users of this software to return to 22e1a6547dSJerome Forissier * 23e1a6547dSJerome Forissier * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 24e1a6547dSJerome Forissier * School of Computer Science 25e1a6547dSJerome Forissier * Carnegie Mellon University 26e1a6547dSJerome Forissier * Pittsburgh PA 15213-3890 27e1a6547dSJerome Forissier * 28e1a6547dSJerome Forissier * any improvements or extensions that they make and grant Carnegie the 29e1a6547dSJerome Forissier * rights to redistribute these changes. 30e1a6547dSJerome Forissier * 31e1a6547dSJerome Forissier * $FreeBSD$ 32e1a6547dSJerome Forissier */ 33e1a6547dSJerome Forissier 34e1a6547dSJerome Forissier #ifndef UNW_UNWIND_H 35e1a6547dSJerome Forissier #define UNW_UNWIND_H 36e1a6547dSJerome Forissier 37e1a6547dSJerome Forissier #include <compiler.h> 38e1a6547dSJerome Forissier #include <types_ext.h> 39e1a6547dSJerome Forissier 40e1a6547dSJerome Forissier /* The state of the unwind process (32-bit mode) */ 41e1a6547dSJerome Forissier struct unwind_state_arm32 { 42e1a6547dSJerome Forissier uint32_t registers[16]; 43e1a6547dSJerome Forissier uint32_t start_pc; 44e1a6547dSJerome Forissier vaddr_t insn; 45e1a6547dSJerome Forissier unsigned int entries; 46e1a6547dSJerome Forissier unsigned int byte; 47e1a6547dSJerome Forissier uint16_t update_mask; 48e1a6547dSJerome Forissier }; 49e1a6547dSJerome Forissier 50e1a6547dSJerome Forissier #ifdef CFG_UNWIND 51e1a6547dSJerome Forissier /* 52e1a6547dSJerome Forissier * Unwind a 32-bit stack. 53e1a6547dSJerome Forissier * @stack, @stack_size: the bottom of the stack and its size, respectively. 54e1a6547dSJerome Forissier * Returns false when there is nothing more to unwind. 55e1a6547dSJerome Forissier */ 56e1a6547dSJerome Forissier bool unwind_stack_arm32(struct unwind_state_arm32 *state, 57e1a6547dSJerome Forissier vaddr_t stack, size_t stack_size); 58e1a6547dSJerome Forissier 59e1a6547dSJerome Forissier void print_stack_arm32(struct unwind_state_arm32 *state, 60e1a6547dSJerome Forissier vaddr_t stack, size_t stack_size); 61e1a6547dSJerome Forissier #else 62e1a6547dSJerome Forissier static inline bool unwind_stack_arm32(struct unwind_state_arm32 *state __unused, 63e1a6547dSJerome Forissier vaddr_t stack __unused, 64e1a6547dSJerome Forissier size_t stack_size __unused) 65e1a6547dSJerome Forissier { 66e1a6547dSJerome Forissier return false; 67e1a6547dSJerome Forissier } 68e1a6547dSJerome Forissier 69e1a6547dSJerome Forissier static inline void print_stack_arm32(struct unwind_state_arm32 *state __unused, 70e1a6547dSJerome Forissier vaddr_t stack __unused, 71e1a6547dSJerome Forissier size_t stack_size __unused) 72e1a6547dSJerome Forissier { 73e1a6547dSJerome Forissier } 74e1a6547dSJerome Forissier #endif 75e1a6547dSJerome Forissier 76e1a6547dSJerome Forissier /* 77e1a6547dSJerome Forissier * External helper function. Must be implemented by the caller of the 32-bit 78e1a6547dSJerome Forissier * stack unwinding functions. 79e1a6547dSJerome Forissier */ 80e1a6547dSJerome Forissier bool find_exidx(vaddr_t addr, vaddr_t *idx_start, vaddr_t *idx_end); 81e1a6547dSJerome Forissier 82e1a6547dSJerome Forissier /* The state of the unwind process (64-bit mode) */ 83e1a6547dSJerome Forissier struct unwind_state_arm64 { 84e1a6547dSJerome Forissier uint64_t fp; 85e1a6547dSJerome Forissier uint64_t sp; 86e1a6547dSJerome Forissier uint64_t pc; 87e1a6547dSJerome Forissier }; 88e1a6547dSJerome Forissier 89e1a6547dSJerome Forissier #if defined(ARM64) && defined(CFG_UNWIND) 90e1a6547dSJerome Forissier /* 91e1a6547dSJerome Forissier * Unwind a 64-bit stack. 92e1a6547dSJerome Forissier * @stack, @stack_size: the bottom of the stack and its size, respectively. 93e1a6547dSJerome Forissier * Returns false when there is nothing more to unwind. 94e1a6547dSJerome Forissier */ 95e1a6547dSJerome Forissier bool unwind_stack_arm64(struct unwind_state_arm64 *state, 96e1a6547dSJerome Forissier vaddr_t stack, size_t stack_size); 97e1a6547dSJerome Forissier 98e1a6547dSJerome Forissier void print_stack_arm64(struct unwind_state_arm64 *state, 99e1a6547dSJerome Forissier vaddr_t stack, size_t stack_size); 100e1a6547dSJerome Forissier #else 101e1a6547dSJerome Forissier static inline bool unwind_stack_arm64(struct unwind_state_arm64 *state __unused, 102e1a6547dSJerome Forissier vaddr_t stack __unused, 103e1a6547dSJerome Forissier size_t stack_size __unused) 104e1a6547dSJerome Forissier { 105e1a6547dSJerome Forissier return false; 106e1a6547dSJerome Forissier } 107e1a6547dSJerome Forissier 108e1a6547dSJerome Forissier static inline void print_stack_arm64(struct unwind_state_arm64 *state __unused, 109e1a6547dSJerome Forissier vaddr_t stack __unused, 110e1a6547dSJerome Forissier size_t stack_size __unused) 111e1a6547dSJerome Forissier { 112e1a6547dSJerome Forissier } 113e1a6547dSJerome Forissier #endif 114e1a6547dSJerome Forissier 115e1a6547dSJerome Forissier /* 116e1a6547dSJerome Forissier * External helper function optionally implemented by the caller of the 64-bit 117e1a6547dSJerome Forissier * stack unwinding functions. 118e1a6547dSJerome Forissier */ 119e1a6547dSJerome Forissier void ftrace_map_lr(uint64_t *lr); 120e1a6547dSJerome Forissier 121*c6c416f1SRuchika Gupta /* Strip out PAuth tags from LR content if applicable */ 122*c6c416f1SRuchika Gupta void pauth_strip_pac(uint64_t *lr); 123*c6c416f1SRuchika Gupta 124e1a6547dSJerome Forissier #endif /*UNW_UNWIND_H*/ 125