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