Linux Audio

Check our new training course

Loading...
  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[1];
 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
127void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs);
128void __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr);
129void __ubsan_handle_type_mismatch_v1(void *_data, void *ptr);
130void __ubsan_handle_out_of_bounds(void *_data, void *index);
131void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs);
132void __ubsan_handle_builtin_unreachable(void *_data);
133void __ubsan_handle_load_invalid_value(void *_data, void *val);
134void __ubsan_handle_alignment_assumption(void *_data, unsigned long ptr,
135					 unsigned long align,
136					 unsigned long offset);
137
138#endif