78418239cd5caa7f084e64fcdc6bbec021d3009c
[vpp.git] / src / vppinfra / types.h
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 /*
16   Copyright (c) 2001-2005 Eliot Dresselhaus
17
18   Permission is hereby granted, free of charge, to any person obtaining
19   a copy of this software and associated documentation files (the
20   "Software"), to deal in the Software without restriction, including
21   without limitation the rights to use, copy, modify, merge, publish,
22   distribute, sublicense, and/or sell copies of the Software, and to
23   permit persons to whom the Software is furnished to do so, subject to
24   the following conditions:
25
26   The above copyright notice and this permission notice shall be
27   included in all copies or substantial portions of the Software.
28
29   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33   LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 */
37
38 #ifndef included_clib_types_h
39 #define included_clib_types_h
40
41 /* Standard CLIB types. */
42
43 /* Define signed and unsigned 8, 16, 32, and 64 bit types
44    and machine signed/unsigned word for all architectures. */
45 typedef signed char i8;
46 typedef signed short i16;
47
48 /* Avoid conflicts with Linux asm/types.h when __KERNEL__ */
49 #if defined(CLIB_LINUX_KERNEL)
50 /* Linux also defines u8/u16/u32/u64 types. */
51 #include <asm/types.h>
52 #define CLIB_AVOID_CLASH_WITH_LINUX_TYPES
53
54 #else /* ! CLIB_LINUX_KERNEL */
55
56 typedef unsigned char u8;
57 typedef unsigned short u16;
58 #endif /* ! CLIB_LINUX_KERNEL */
59
60 #if defined (__x86_64__)
61 #ifndef __COVERITY__
62 typedef signed int i128 __attribute__ ((mode (TI)));
63 typedef unsigned int u128 __attribute__ ((mode (TI)));
64 #endif
65 #endif
66
67 #if (defined(i386) || (defined(_mips) && __mips != 64) || defined(powerpc) || defined (__SPU__) || defined(__sparc__) || defined(__arm__) || defined (__xtensa__) || defined(__TMS320C6X__))
68 typedef signed int i32;
69 typedef signed long long i64;
70
71 #ifndef CLIB_AVOID_CLASH_WITH_LINUX_TYPES
72 typedef unsigned int u32;
73 typedef unsigned long long u64;
74 #endif /* CLIB_AVOID_CLASH_WITH_LINUX_TYPES */
75
76 #elif defined(alpha) || (defined(_mips) && __mips == 64) ||                   \
77   defined(__x86_64__) || defined(__powerpc64__) || defined(__aarch64__) ||    \
78   (defined(__riscv) && __riscv_xlen == 64)
79 typedef signed int i32;
80 typedef signed long i64;
81
82 #define log2_uword_bits 6
83 #if defined(_mips)
84 #define clib_address_bits _MIPS_SZPTR
85 #else
86 #define clib_address_bits 64
87 #endif
88
89 #ifndef CLIB_AVOID_CLASH_WITH_LINUX_TYPES
90 typedef unsigned int u32;
91 typedef unsigned long u64;
92 #endif /* CLIB_AVOID_CLASH_WITH_LINUX_TYPES */
93
94 #else
95 #error "can't define types"
96 #endif
97
98 /* Default to 32 bit machines with 32 bit addresses. */
99 #ifndef log2_uword_bits
100 #define log2_uword_bits 5
101 #endif
102
103 /* #ifdef's above define log2_uword_bits. */
104 #define uword_bits (1 << log2_uword_bits)
105
106 #ifndef clib_address_bits
107 #define clib_address_bits 32
108 #endif
109
110 /* Word types. */
111 #if uword_bits == 64
112 /* 64 bit word machines. */
113 typedef i64 word;
114 typedef u64 uword;
115 #else
116 /* 32 bit word machines. */
117 typedef i32 word;
118 typedef u32 uword;
119 #endif
120
121 /* integral type of a pointer (used to cast pointers). */
122 #if clib_address_bits == 64
123 typedef u64 clib_address_t;
124 #else
125 typedef u32 clib_address_t;
126 #endif
127
128 #define CLIB_I8_MAX  __INT8_MAX__
129 #define CLIB_I16_MAX __INT16_MAX__
130 #define CLIB_I32_MAX __INT32_MAX__
131 #define CLIB_I64_MAX __INT64_MAX__
132
133 #define CLIB_U8_MAX  __UINT8_MAX__
134 #define CLIB_U16_MAX __UINT16_MAX__
135 #define CLIB_U32_MAX __UINT32_MAX__
136 #define CLIB_U64_MAX __UINT64_MAX__
137
138 #if clib_address_bits == 64
139 #define CLIB_WORD_MAX  CLIB_I64_MAX
140 #define CLIB_UWORD_MAX CLIB_U64_MAX
141 #else
142 #define CLIB_WORD_MAX  CLIB_I32_MAX
143 #define CLIB_UWORD_MAX CLIB_U32_MAX
144 #endif
145
146 /* These are needed to convert between pointers and machine words.
147    MIPS is currently the only machine that can have different sized
148    pointers and machine words (but only when compiling with 64 bit
149    registers and 32 bit pointers). */
150 static inline __attribute__ ((always_inline)) uword
151 pointer_to_uword (const void *p)
152 {
153   return (uword) (clib_address_t) p;
154 }
155
156 static inline __attribute__ ((always_inline)) uword
157 pointer_is_aligned (void *p, uword align)
158 {
159   if ((pointer_to_uword (p) & (align - 1)) == 0)
160     return 1;
161   return 0;
162 }
163
164 #define uword_to_pointer(u,type) ((type) (clib_address_t) (u))
165
166 /* Any type: can be either word or pointer. */
167 typedef word any;
168
169 /* Floating point types. */
170 typedef double f64;
171 typedef float f32;
172
173 typedef __complex__ float cf32;
174 typedef __complex__ double cf64;
175
176 /* Floating point word size. */
177 typedef f64 fword;
178
179 /* Can be used as either {r,l}value, e.g. these both work
180      clib_mem_unaligned (p, u64) = 99
181      clib_mem_unaligned (p, u64) += 99 */
182
183 #define clib_mem_unaligned(pointer,type) \
184   (((struct { CLIB_PACKED (type _data); } *) (pointer))->_data)
185
186 /* Access memory with specified alignment depending on align argument.
187    As with clib_mem_unaligned, may be used as {r,l}value. */
188 #define clib_mem_aligned(addr,type,align)               \
189   (((struct {                                           \
190        type _data                                       \
191        __attribute__ ((aligned (align), packed));       \
192     } *) (addr))->_data)
193
194 typedef u16 u16u __attribute__ ((aligned (1), __may_alias__));
195 typedef u32 u32u __attribute__ ((aligned (1), __may_alias__));
196 typedef u64 u64u __attribute__ ((aligned (1), __may_alias__));
197 typedef i16 i16u __attribute__ ((aligned (1), __may_alias__));
198 typedef i32 i32u __attribute__ ((aligned (1), __may_alias__));
199 typedef i64 i64u __attribute__ ((aligned (1), __may_alias__));
200 typedef word wordu __attribute__ ((aligned (1), __may_alias__));
201 typedef uword uwordu __attribute__ ((aligned (1), __may_alias__));
202
203 #endif /* included_clib_types_h */
204
205 /*
206  * fd.io coding-style-patch-verification: ON
207  *
208  * Local Variables:
209  * eval: (c-set-style "gnu")
210  * End:
211  */