1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 #include <stdint.h>
12 /***********************************************************************/
13 /* TargetOS Release Number                                             */
14 /***********************************************************************/
15 #define TARGETOS_RELEASE 20184
16 
17 /***********************************************************************/
18 /* General Definitions                                                 */
19 /***********************************************************************/
20 #define i8 char
21 #define si8 int8_t
22 #define i16 int16_t
23 #define i32 int32_t
24 #define i64 int64_t
25 
26 #define ui8 uint8_t
27 #define ui16 uint16_t
28 #define ui32 unsigned int
29 #define ui64 uint64_t
30 
31 #define vi8 volatile int8_t
32 #define vi16 volatile int16_t
33 #define vi32 volatile int32_t
34 
35 #define vui8 volatile uint8_t
36 #define vui16 volatile uint16_t
37 #define vui32 volatile uint32_t
38 
39 #define uint unsigned int
40 #define ulong unsigned long
41 
42 #undef TRUE
43 #define TRUE 1
44 #undef FALSE
45 #define FALSE 0
46 #define ESC 0x1B
47 
48 /***********************************************************************/
49 /* Type Definitions                                                    */
50 /***********************************************************************/
51 
52 // Circular Linked List Structure
53 typedef struct circ_list {
54     struct circ_list* next_fwd;
55     struct circ_list* next_bck;
56 } CircLink;
57 
58 // Volatile Circular Linked List Node (used for task and timer lists)
59 typedef volatile struct vol_circ_list {
60     volatile struct vol_circ_list* next_fwd;
61     volatile struct vol_circ_list* next_bck;
62 } vCircLink;
63 
64 /***********************************************************************/
65 /* Macro Definitions                                                   */
66 /***********************************************************************/
67 #define REG_8(addr) (*(volatile ui8*)(addr))
68 #define REG16(addr) (*(volatile ui16*)(addr))
69 #define REG32(addr) (*(volatile ui32*)(addr))
70 #define REGPTR(addr) (*(void* volatile*)(addr))
71 #define REGPTRC(addr) (*(const void* volatile*)(addr))
72 #define REGPTRV(addr) (*(volatile void* volatile*)(addr))
73 
74 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
75 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
76 
77 #define SEQ_GE(a, b) ((i32)((a) - (b)) >= 0)
78 #define SEQ_GT(a, b) ((i32)((a) - (b)) > 0)
79 #define SEQ_LE(a, b) ((i32)((a) - (b)) <= 0)
80 #define SEQ_LT(a, b) ((i32)((a) - (b)) < 0)
81 
82 #define ALIGN2B(size) (((size) + 1) & ~1)
83 #define ALIGN4B(size) (((size) + 3) & ~3)
84 #define ALIGN8B(size) (((size) + 7) & ~7)
85 #define ALIGN_ADDR(addr, amnt) (void*)((((ui32)(addr) + (amnt)-1) / (amnt)) * amnt)
86 #define ROUND_UP(size, algn) ((((size) + (algn)-1) / (algn)) * algn)
87 
88 #define WR16_LE(val, addr)                             \
89     do {                                               \
90         *((ui8*)(addr) + 0) = (ui8)((uint)(val) >> 0); \
91         *((ui8*)(addr) + 1) = (ui8)((uint)(val) >> 8); \
92     } /*lint -e(717) */                                \
93     while (0)
94 
95 #define WR24_LE(val, addr)                              \
96     do {                                                \
97         *((ui8*)(addr) + 0) = (ui8)((uint)(val) >> 0);  \
98         *((ui8*)(addr) + 1) = (ui8)((uint)(val) >> 8);  \
99         *((ui8*)(addr) + 2) = (ui8)((uint)(val) >> 16); \
100     } /*lint -e(717) */                                 \
101     while (0)
102 
103 #define WR32_LE(val, addr)                              \
104     do {                                                \
105         *((ui8*)(addr) + 0) = (ui8)((uint)(val) >> 0);  \
106         *((ui8*)(addr) + 1) = (ui8)((uint)(val) >> 8);  \
107         *((ui8*)(addr) + 2) = (ui8)((uint)(val) >> 16); \
108         *((ui8*)(addr) + 3) = (ui8)((uint)(val) >> 24); \
109     } /*lint -e(717) */                                 \
110     while (0)
111 
112 #define WR16_BE(val, addr)                             \
113     do {                                               \
114         *((ui8*)(addr) + 0) = (ui8)((uint)(val) >> 8); \
115         *((ui8*)(addr) + 1) = (ui8)((uint)(val) >> 0); \
116     } /*lint -e(717) */                                \
117     while (0)
118 
119 #define WR24_BE(val, addr)                              \
120     do {                                                \
121         *((ui8*)(addr) + 0) = (ui8)((uint)(val) >> 16); \
122         *((ui8*)(addr) + 1) = (ui8)((uint)(val) >> 8);  \
123         *((ui8*)(addr) + 2) = (ui8)((uint)(val) >> 0);  \
124     } /*lint -e(717) */                                 \
125     while (0)
126 
127 #define WR32_BE(val, addr)                              \
128     do {                                                \
129         *((ui8*)(addr) + 0) = (ui8)((uint)(val) >> 24); \
130         *((ui8*)(addr) + 1) = (ui8)((uint)(val) >> 16); \
131         *((ui8*)(addr) + 2) = (ui8)((uint)(val) >> 8);  \
132         *((ui8*)(addr) + 3) = (ui8)((uint)(val) >> 0);  \
133     } /*lint -e(717) */                                 \
134     while (0)
135 
136 #define RD16_LE(addr) (ui16)((*((ui8*)(addr) + 0) << 0) | (*((ui8*)(addr) + 1) << 8))
137 
138 #define RD24_LE(addr) \
139     (ui32)((*((ui8*)(addr) + 0) << 0) | (*((ui8*)(addr) + 1) << 8) | (*((ui8*)(addr) + 2) << 16))
140 
141 #define RD32_LE(addr)                                                                              \
142     (ui32)((*((ui8*)(addr) + 0) << 0) | (*((ui8*)(addr) + 1) << 8) | (*((ui8*)(addr) + 2) << 16) | \
143            (*((ui8*)(addr) + 3) << 24))
144 
145 #define RD16_BE(addr) (ui16)((*((ui8*)(addr) + 0) << 8) | (*((ui8*)(addr) + 1) << 0))
146 
147 #define RD24_BE(addr) \
148     (ui32)((*((ui8*)(addr) + 0) << 16) | (*((ui8*)(addr) + 1) << 8) | (*((ui8*)(addr) + 2) << 0))
149 
150 #define RD32_BE(addr)                                                  \
151     (ui32)((*((ui8*)(addr) + 0) << 24) | (*((ui8*)(addr) + 1) << 16) | \
152            (*((ui8*)(addr) + 2) << 8) | (*((ui8*)(addr) + 3) << 0))
153 
154 #define SWAP32(val)                                                                          \
155     ((((val)&0x000000FFU) << 24) | (((val)&0x0000FF00U) << 8) | (((val)&0x00FF0000U) >> 8) | \
156      (((val)&0xFF000000U) >> 24))
157 
158 #define SWAP16(s) (ui16)(((s) << 8) | (ui8)((uint)(s) >> 8))
159 
160 #define IS_POW2(x) ((x) && (((x) & (~(x) + 1)) == (x)))
161 
162 // Bit Flags Accessor Macros
163 #define SET_FLAG(flags, bit_flag) (flags |= (bit_flag))
164 #define CLR_FLAG(flags, bit_flag) (flags &= ~(bit_flag))
165 #define FLAG_IS_SET(flags, bit_flag) (flags & (bit_flag))
166 #define FLAG_IS_CLR(flags, bit_flag) (!(flags & (bit_flag)))
167 
168 // Circular Linked List Management Macros
169 
170 #define CIRC_LIST_INIT(lst) ((lst)->next_fwd = (lst)->next_bck = (lst))
171 
172 #define CIRC_NODE_APPEND(free_node, list_node)         \
173     do {                                               \
174         (free_node)->next_bck = (list_node)->next_bck; \
175         (free_node)->next_fwd = (list_node);           \
176         (list_node)->next_bck->next_fwd = (free_node); \
177         (list_node)->next_bck = (free_node);           \
178     } while (0)
179 
180 #define CIRC_NODE_INSERT(free_node, list_node)         \
181     do {                                               \
182         (free_node)->next_fwd = (list_node)->next_fwd; \
183         (free_node)->next_bck = (list_node);           \
184         (list_node)->next_fwd->next_bck = (free_node); \
185         (list_node)->next_fwd = (free_node);           \
186     } while (0)
187 
188 #define CIRC_LIST_APPEND(node, list) CIRC_NODE_INSERT(node, list)
189 #define CIRC_LIST_INSERT(node, list) CIRC_NODE_APPEND(node, list)
190 #define CIRC_TO_NODEP(link, offset) (void*)((ui8*)(link)-offset)
191 
192 #define CIRC_HEAD_REMOVE(link)                         \
193     do {                                               \
194         (link)->next_bck = (link)->next_bck->next_bck; \
195         (link)->next_bck->next_fwd = (link);           \
196     } while (0)
197 
198 #define CIRC_NODE_REMOVE(link)                         \
199     do {                                               \
200         (link)->next_bck->next_fwd = (link)->next_fwd; \
201         (link)->next_fwd->next_bck = (link)->next_bck; \
202     } while (0)
203 
204 #define CIRC_LIST_HEAD(list) ((list)->next_bck)
205 #define CIRC_LIST_TAIL(list) ((list)->next_fwd)
206 #define CIRC_LIST_AT_END(link, list) ((link) == (list))
207 #define CIRC_LIST_EMPTY(list) ((list)->next_bck == (list))
208 
209 #ifndef EOF_TFS
210 #define EOF_TFS (-1)
211 #endif
212 
213 #ifdef __cplusplus
214 }
215 #endif
216