xref: /optee_os/lib/libunw/include/unw/unwind.h (revision c6c416f1bf4617feef23d592155ba7de69bceea9)
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