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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 Copyright (c) 2001-2005 Eliot Dresselhaus
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:
26 The above copyright notice and this permission notice shall be
27 included in all copies or substantial portions of the Software.
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.
38 #ifndef included_clib_types_h
39 #define included_clib_types_h
41 /* Standard CLIB types. */
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;
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
54 #else /* ! CLIB_LINUX_KERNEL */
56 typedef unsigned char u8;
57 typedef unsigned short u16;
58 #endif /* ! CLIB_LINUX_KERNEL */
60 #if defined (__x86_64__)
62 typedef signed int i128 __attribute__ ((mode (TI)));
63 typedef unsigned int u128 __attribute__ ((mode (TI)));
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;
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 */
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;
82 #define log2_uword_bits 6
84 #define clib_address_bits _MIPS_SZPTR
86 #define clib_address_bits 64
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 */
95 #error "can't define types"
98 /* Default to 32 bit machines with 32 bit addresses. */
99 #ifndef log2_uword_bits
100 #define log2_uword_bits 5
103 /* #ifdef's above define log2_uword_bits. */
104 #define uword_bits (1 << log2_uword_bits)
106 #ifndef clib_address_bits
107 #define clib_address_bits 32
112 /* 64 bit word machines. */
116 /* 32 bit word machines. */
121 /* integral type of a pointer (used to cast pointers). */
122 #if clib_address_bits == 64
123 typedef u64 clib_address_t;
125 typedef u32 clib_address_t;
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__
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__
138 #if clib_address_bits == 64
139 #define CLIB_WORD_MAX CLIB_I64_MAX
140 #define CLIB_UWORD_MAX CLIB_U64_MAX
142 #define CLIB_WORD_MAX CLIB_I32_MAX
143 #define CLIB_UWORD_MAX CLIB_U32_MAX
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)
153 return (uword) (clib_address_t) p;
156 static inline __attribute__ ((always_inline)) uword
157 pointer_is_aligned (void *p, uword align)
159 if ((pointer_to_uword (p) & (align - 1)) == 0)
164 #define uword_to_pointer(u,type) ((type) (clib_address_t) (u))
166 /* Any type: can be either word or pointer. */
169 /* Floating point types. */
173 typedef __complex__ float cf32;
174 typedef __complex__ double cf64;
176 /* Floating point word size. */
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 */
183 #define clib_mem_unaligned(pointer,type) \
184 (((struct { CLIB_PACKED (type _data); } *) (pointer))->_data)
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) \
191 __attribute__ ((aligned (align), packed)); \
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__));
203 #endif /* included_clib_types_h */
206 * fd.io coding-style-patch-verification: ON
209 * eval: (c-set-style "gnu")