]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
c6d30853 AR |
2 | #ifndef _LIB_UBSAN_H |
3 | #define _LIB_UBSAN_H | |
4 | ||
25b84002 KC |
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 | ||
c6d30853 AR |
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; | |
42440c1f AR |
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; | |
c6d30853 AR |
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 | ||
c6d30853 AR |
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 | ||
28abcc96 NC |
113 | struct alignment_assumption_data { |
114 | struct source_location location; | |
115 | struct source_location assumption_location; | |
116 | struct type_descriptor *type; | |
117 | }; | |
118 | ||
c12d3362 | 119 | #if defined(CONFIG_ARCH_SUPPORTS_INT128) |
c6d30853 AR |
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 | ||
26f15e5d AB |
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 | ||
c6d30853 | 138 | #endif |