Linux Audio

Check our new training course

Loading...
v5.14.15
 1/* SPDX-License-Identifier: GPL-2.0 */
 2#ifndef _LIB_UBSAN_H
 3#define _LIB_UBSAN_H
 4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 5enum {
 6	type_kind_int = 0,
 7	type_kind_float = 1,
 8	type_unknown = 0xffff
 9};
10
11struct type_descriptor {
12	u16 type_kind;
13	u16 type_info;
14	char type_name[1];
15};
16
17struct source_location {
18	const char *file_name;
19	union {
20		unsigned long reported;
21		struct {
22			u32 line;
23			u32 column;
24		};
25	};
26};
27
28struct overflow_data {
29	struct source_location location;
30	struct type_descriptor *type;
31};
32
33struct type_mismatch_data {
34	struct source_location location;
35	struct type_descriptor *type;
36	unsigned long alignment;
37	unsigned char type_check_kind;
38};
39
40struct type_mismatch_data_v1 {
41	struct source_location location;
42	struct type_descriptor *type;
43	unsigned char log_alignment;
44	unsigned char type_check_kind;
45};
46
47struct type_mismatch_data_common {
48	struct source_location *location;
49	struct type_descriptor *type;
50	unsigned long alignment;
51	unsigned char type_check_kind;
52};
53
54struct nonnull_arg_data {
55	struct source_location location;
56	struct source_location attr_location;
57	int arg_index;
58};
59
60struct out_of_bounds_data {
61	struct source_location location;
62	struct type_descriptor *array_type;
63	struct type_descriptor *index_type;
64};
65
66struct shift_out_of_bounds_data {
67	struct source_location location;
68	struct type_descriptor *lhs_type;
69	struct type_descriptor *rhs_type;
70};
71
72struct unreachable_data {
73	struct source_location location;
74};
75
76struct invalid_value_data {
77	struct source_location location;
78	struct type_descriptor *type;
79};
80
81struct alignment_assumption_data {
82	struct source_location location;
83	struct source_location assumption_location;
84	struct type_descriptor *type;
85};
86
87#if defined(CONFIG_ARCH_SUPPORTS_INT128)
88typedef __int128 s_max;
89typedef unsigned __int128 u_max;
90#else
91typedef s64 s_max;
92typedef u64 u_max;
93#endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
95#endif
v6.13.7
  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 */
  9enum 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
 37enum {
 38	type_kind_int = 0,
 39	type_kind_float = 1,
 40	type_unknown = 0xffff
 41};
 42
 43struct type_descriptor {
 44	u16 type_kind;
 45	u16 type_info;
 46	char type_name[];
 47};
 48
 49struct 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
 60struct overflow_data {
 61	struct source_location location;
 62	struct type_descriptor *type;
 63};
 64
 65struct 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
 72struct 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
 79struct 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
 86struct nonnull_arg_data {
 87	struct source_location location;
 88	struct source_location attr_location;
 89	int arg_index;
 90};
 91
 92struct out_of_bounds_data {
 93	struct source_location location;
 94	struct type_descriptor *array_type;
 95	struct type_descriptor *index_type;
 96};
 97
 98struct shift_out_of_bounds_data {
 99	struct source_location location;
100	struct type_descriptor *lhs_type;
101	struct type_descriptor *rhs_type;
102};
103
104struct unreachable_data {
105	struct source_location location;
106};
107
108struct invalid_value_data {
109	struct source_location location;
110	struct type_descriptor *type;
111};
112
113struct 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)
120typedef __int128 s_max;
121typedef unsigned __int128 u_max;
122#else
123typedef s64 s_max;
124typedef 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
140void ubsan_linkage __ubsan_handle_add_overflow(void *data, void *lhs, void *rhs);
141void ubsan_linkage __ubsan_handle_sub_overflow(void *data, void *lhs, void *rhs);
142void ubsan_linkage __ubsan_handle_mul_overflow(void *data, void *lhs, void *rhs);
143void ubsan_linkage __ubsan_handle_negate_overflow(void *_data, void *old_val);
144void ubsan_linkage __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs);
145void ubsan_linkage __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr);
146void ubsan_linkage __ubsan_handle_type_mismatch_v1(void *_data, void *ptr);
147void ubsan_linkage __ubsan_handle_out_of_bounds(void *_data, void *index);
148void ubsan_linkage __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs);
149void ubsan_linkage __ubsan_handle_builtin_unreachable(void *_data);
150void ubsan_linkage __ubsan_handle_load_invalid_value(void *_data, void *val);
151void ubsan_linkage __ubsan_handle_alignment_assumption(void *_data, unsigned long ptr,
152						       unsigned long align,
153						       unsigned long offset);
154
155#endif