Merge existing fixes from asoc/for-6.5 into new branch
[platform/kernel/linux-starfive.git] / lib / ubsan.h
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