1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _LIB_UBSAN_H |
3 | #define _LIB_UBSAN_H |
4 | |
5 | /* |
6 | * ABI defined by Clang's UBSAN enum SanitizerHandler: |
7 | * https://github.com/llvm/llvm-project/blob/release/16.x/clang/lib/CodeGen/CodeGenFunction.h#L113 |
8 | */ |
9 | enum ubsan_checks { |
10 | ubsan_add_overflow, |
11 | ubsan_builtin_unreachable, |
12 | ubsan_cfi_check_fail, |
13 | ubsan_divrem_overflow, |
14 | ubsan_dynamic_type_cache_miss, |
15 | ubsan_float_cast_overflow, |
16 | ubsan_function_type_mismatch, |
17 | ubsan_implicit_conversion, |
18 | ubsan_invalid_builtin, |
19 | ubsan_invalid_objc_cast, |
20 | ubsan_load_invalid_value, |
21 | ubsan_missing_return, |
22 | ubsan_mul_overflow, |
23 | ubsan_negate_overflow, |
24 | ubsan_nullability_arg, |
25 | ubsan_nullability_return, |
26 | ubsan_nonnull_arg, |
27 | ubsan_nonnull_return, |
28 | ubsan_out_of_bounds, |
29 | ubsan_pointer_overflow, |
30 | ubsan_shift_out_of_bounds, |
31 | ubsan_sub_overflow, |
32 | ubsan_type_mismatch, |
33 | ubsan_alignment_assumption, |
34 | ubsan_vla_bound_not_positive, |
35 | }; |
36 | |
37 | enum { |
38 | type_kind_int = 0, |
39 | type_kind_float = 1, |
40 | type_unknown = 0xffff |
41 | }; |
42 | |
43 | struct type_descriptor { |
44 | u16 type_kind; |
45 | u16 type_info; |
46 | char type_name[1]; |
47 | }; |
48 | |
49 | struct source_location { |
50 | const char *file_name; |
51 | union { |
52 | unsigned long reported; |
53 | struct { |
54 | u32 line; |
55 | u32 column; |
56 | }; |
57 | }; |
58 | }; |
59 | |
60 | struct overflow_data { |
61 | struct source_location location; |
62 | struct type_descriptor *type; |
63 | }; |
64 | |
65 | struct type_mismatch_data { |
66 | struct source_location location; |
67 | struct type_descriptor *type; |
68 | unsigned long alignment; |
69 | unsigned char type_check_kind; |
70 | }; |
71 | |
72 | struct type_mismatch_data_v1 { |
73 | struct source_location location; |
74 | struct type_descriptor *type; |
75 | unsigned char log_alignment; |
76 | unsigned char type_check_kind; |
77 | }; |
78 | |
79 | struct type_mismatch_data_common { |
80 | struct source_location *location; |
81 | struct type_descriptor *type; |
82 | unsigned long alignment; |
83 | unsigned char type_check_kind; |
84 | }; |
85 | |
86 | struct nonnull_arg_data { |
87 | struct source_location location; |
88 | struct source_location attr_location; |
89 | int arg_index; |
90 | }; |
91 | |
92 | struct out_of_bounds_data { |
93 | struct source_location location; |
94 | struct type_descriptor *array_type; |
95 | struct type_descriptor *index_type; |
96 | }; |
97 | |
98 | struct shift_out_of_bounds_data { |
99 | struct source_location location; |
100 | struct type_descriptor *lhs_type; |
101 | struct type_descriptor *rhs_type; |
102 | }; |
103 | |
104 | struct unreachable_data { |
105 | struct source_location location; |
106 | }; |
107 | |
108 | struct invalid_value_data { |
109 | struct source_location location; |
110 | struct type_descriptor *type; |
111 | }; |
112 | |
113 | struct alignment_assumption_data { |
114 | struct source_location location; |
115 | struct source_location assumption_location; |
116 | struct type_descriptor *type; |
117 | }; |
118 | |
119 | #if defined(CONFIG_ARCH_SUPPORTS_INT128) |
120 | typedef __int128 s_max; |
121 | typedef unsigned __int128 u_max; |
122 | #else |
123 | typedef s64 s_max; |
124 | typedef u64 u_max; |
125 | #endif |
126 | |
127 | void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs); |
128 | void __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr); |
129 | void __ubsan_handle_type_mismatch_v1(void *_data, void *ptr); |
130 | void __ubsan_handle_out_of_bounds(void *_data, void *index); |
131 | void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs); |
132 | void __ubsan_handle_builtin_unreachable(void *_data); |
133 | void __ubsan_handle_load_invalid_value(void *_data, void *val); |
134 | void __ubsan_handle_alignment_assumption(void *_data, unsigned long ptr, |
135 | unsigned long align, |
136 | unsigned long offset); |
137 | |
138 | #endif |
139 | |