~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/lib/ubsan.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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[];
 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 /*
128  * When generating Runtime Calls, Clang doesn't respect the -mregparm=3
129  * option used on i386: https://github.com/llvm/llvm-project/issues/89670
130  * Fix this for earlier Clang versions by forcing the calling convention
131  * to use non-register arguments.
132  */
133 #if defined(CONFIG_X86_32) && \
134     defined(CONFIG_CC_IS_CLANG) && CONFIG_CLANG_VERSION < 190000
135 # define ubsan_linkage asmlinkage
136 #else
137 # define ubsan_linkage
138 #endif
139 
140 void ubsan_linkage __ubsan_handle_add_overflow(void *data, void *lhs, void *rhs);
141 void ubsan_linkage __ubsan_handle_sub_overflow(void *data, void *lhs, void *rhs);
142 void ubsan_linkage __ubsan_handle_mul_overflow(void *data, void *lhs, void *rhs);
143 void ubsan_linkage __ubsan_handle_negate_overflow(void *_data, void *old_val);
144 void ubsan_linkage __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs);
145 void ubsan_linkage __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr);
146 void ubsan_linkage __ubsan_handle_type_mismatch_v1(void *_data, void *ptr);
147 void ubsan_linkage __ubsan_handle_out_of_bounds(void *_data, void *index);
148 void ubsan_linkage __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs);
149 void ubsan_linkage __ubsan_handle_builtin_unreachable(void *_data);
150 void ubsan_linkage __ubsan_handle_load_invalid_value(void *_data, void *val);
151 void ubsan_linkage __ubsan_handle_alignment_assumption(void *_data, unsigned long ptr,
152                                                        unsigned long align,
153                                                        unsigned long offset);
154 
155 #endif
156 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php