Commit | Line | Data |
---|---|---|
57553dfd MD |
1 | // SPDX-License-Identifier: MIT |
2 | /* | |
3 | * Copyright 2022-2023 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
4 | */ | |
5 | ||
b8dfb348 MD |
6 | #ifndef SIDE_ABI_TYPE_VALUE_H |
7 | #define SIDE_ABI_TYPE_VALUE_H | |
57553dfd MD |
8 | |
9 | #include <stdint.h> | |
10 | #include <side/macros.h> | |
11 | #include <side/endian.h> | |
12 | ||
35e4f870 MD |
13 | /* |
14 | * SIDE ABI for type values. | |
15 | * | |
16 | * The extensibility scheme for the SIDE ABI for type values is as | |
17 | * follows: | |
18 | * | |
19 | * * Existing type values are never changed nor extended. Type values | |
20 | * can be added to the ABI by reserving a label within enum | |
21 | * side_type_label. | |
22 | * * Each union part of the ABI has an explicit size defined by a | |
23 | * side_padding() member. Each structure and union have a static | |
24 | * assert validating its size. | |
25 | * * Changing the semantic of the existing type value fields is a | |
26 | * breaking ABI change. | |
27 | * | |
28 | * Handling of unknown type values by the tracers: | |
29 | * | |
30 | * * A tracer may choose to support only a subset of the type values | |
31 | * supported by libside. When encountering an unknown or unsupported | |
32 | * type value, the tracer has the option to either disallow the entire | |
33 | * event or skip over the unknown type, both at event registration and | |
34 | * when receiving the side_call arguments. | |
35 | */ | |
36 | ||
57553dfd MD |
37 | enum side_type_label_byte_order { |
38 | SIDE_TYPE_BYTE_ORDER_LE = 0, | |
39 | SIDE_TYPE_BYTE_ORDER_BE = 1, | |
40 | }; | |
41 | ||
465ba030 MD |
42 | #if (SIDE_BYTE_ORDER == SIDE_LITTLE_ENDIAN) |
43 | enum side_integer128_split_index { | |
44 | SIDE_INTEGER128_SPLIT_LOW = 0, | |
45 | SIDE_INTEGER128_SPLIT_HIGH = 1, | |
46 | NR_SIDE_INTEGER128_SPLIT, | |
47 | }; | |
48 | #else | |
49 | enum side_integer128_split_index { | |
50 | SIDE_INTEGER128_SPLIT_HIGH = 0, | |
51 | SIDE_INTEGER128_SPLIT_LOW = 1, | |
52 | NR_SIDE_INTEGER128_SPLIT, | |
53 | }; | |
54 | #endif | |
55 | ||
57553dfd MD |
56 | union side_integer_value { |
57 | uint8_t side_u8; | |
58 | uint16_t side_u16; | |
59 | uint32_t side_u32; | |
60 | uint64_t side_u64; | |
61 | int8_t side_s8; | |
62 | int16_t side_s16; | |
63 | int32_t side_s32; | |
64 | int64_t side_s64; | |
6e5fd288 | 65 | uintptr_t side_uptr; |
465ba030 | 66 | /* Indexed with enum side_integer128_split_index */ |
6e5fd288 | 67 | uint64_t side_u128_split[NR_SIDE_INTEGER128_SPLIT]; |
465ba030 | 68 | int64_t side_s128_split[NR_SIDE_INTEGER128_SPLIT]; |
6e5fd288 MD |
69 | #ifdef __SIZEOF_INT128__ |
70 | unsigned __int128 side_u128; | |
71 | __int128 side_s128; | |
72 | #endif | |
57553dfd MD |
73 | side_padding(32); |
74 | } SIDE_PACKED; | |
75 | side_check_size(union side_integer_value, 32); | |
76 | ||
77 | union side_bool_value { | |
78 | uint8_t side_bool8; | |
79 | uint16_t side_bool16; | |
80 | uint32_t side_bool32; | |
81 | uint64_t side_bool64; | |
82 | side_padding(32); | |
83 | } SIDE_PACKED; | |
84 | side_check_size(union side_bool_value, 32); | |
85 | ||
86 | union side_float_value { | |
87 | #if __HAVE_FLOAT16 | |
88 | _Float16 side_float_binary16; | |
89 | #endif | |
90 | #if __HAVE_FLOAT32 | |
91 | _Float32 side_float_binary32; | |
92 | #endif | |
93 | #if __HAVE_FLOAT64 | |
94 | _Float64 side_float_binary64; | |
95 | #endif | |
96 | #if __HAVE_FLOAT128 | |
97 | _Float128 side_float_binary128; | |
98 | #endif | |
99 | side_padding(32); | |
100 | } SIDE_PACKED; | |
101 | side_check_size(union side_float_value, 32); | |
102 | ||
103 | struct side_type_raw_string { | |
104 | side_ptr_t(const void) p; /* pointer to string */ | |
105 | uint8_t unit_size; /* 1, 2, or 4 bytes */ | |
106 | side_enum_t(enum side_type_label_byte_order, uint8_t) byte_order; | |
107 | } SIDE_PACKED; | |
108 | side_check_size(struct side_type_raw_string, 18); | |
109 | ||
b8dfb348 | 110 | #endif /* SIDE_ABI_TYPE_VALUE_H */ |