vppinfra: initial RISC-V support
[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 /* These are needed to convert between pointers and machine words.
129    MIPS is currently the only machine that can have different sized
130    pointers and machine words (but only when compiling with 64 bit
131    registers and 32 bit pointers). */
132 static inline __attribute__ ((always_inline)) uword
133 pointer_to_uword (const void *p)
134 {
135   return (uword) (clib_address_t) p;
136 }
137
138 #define uword_to_pointer(u,type) ((type) (clib_address_t) (u))
139
140 /* Any type: can be either word or pointer. */
141 typedef word any;
142
143 /* Floating point types. */
144 typedef double f64;
145 typedef float f32;
146
147 typedef __complex__ float cf32;
148 typedef __complex__ double cf64;
149
150 /* Floating point word size. */
151 typedef f64 fword;
152
153 /* Can be used as either {r,l}value, e.g. these both work
154      clib_mem_unaligned (p, u64) = 99
155      clib_mem_unaligned (p, u64) += 99 */
156
157 #define clib_mem_unaligned(pointer,type) \
158   (((struct { CLIB_PACKED (type _data); } *) (pointer))->_data)
159
160 /* Access memory with specified alignment depending on align argument.
161    As with clib_mem_unaligned, may be used as {r,l}value. */
162 #define clib_mem_aligned(addr,type,align)               \
163   (((struct {                                           \
164        type _data                                       \
165        __attribute__ ((aligned (align), packed));       \
166     } *) (addr))->_data)
167
168 typedef u16 u16u __attribute__ ((aligned (1)));
169 typedef u32 u32u __attribute__ ((aligned (1)));
170 typedef u64 u64u __attribute__ ((aligned (1)));
171 typedef i16 i16u __attribute__ ((aligned (1)));
172 typedef i32 i32u __attribute__ ((aligned (1)));
173 typedef i64 i64u __attribute__ ((aligned (1)));
174
175 #endif /* included_clib_types_h */
176
177 /*
178  * fd.io coding-style-patch-verification: ON
179  *
180  * Local Variables:
181  * eval: (c-set-style "gnu")
182  * End:
183  */