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