#pragma once #include #include uint32_t msb32(uint32_t); uint64_t msb64(uint64_t); uint64_t lsb64(uint64_t); uint32_t hton32(const uint32_t); uint32_t ntoh32(const uint32_t); uint64_t hton64(const uint64_t); uint64_t ntoh64(const uint64_t); int isdigit(int); int isxdigit(int); int isupper(int); int isspace(int); int32_t atoi32(const char *); uint32_t atoh32(const char *); void exit(int); #define MIN(x, y) (((x) < (y)) ? (x) : (y)) #define MAX(x, y) (((x) < (y)) ? (y) : (x)) #define ALIGN(ptr, cnt) (void *)((( \ ((uint64_t)(ptr) - 1) >> (cnt)) + 1) << (cnt)) #define ALIGN4(ptr) ALIGN(ptr, 2) #define ALIGN8(ptr) ALIGN(ptr, 3) #define ALIGN4K(ptr) ALIGN(ptr, 12) #define BUMP(orig_type, bump_type, ptr) ( \ (ptr = (orig_type*)((bump_type*)ptr + 1)), \ ((bump_type*)ptr - 1) \ ) #define R_SYSREG(ret, reg) \ asm volatile( \ "mrs %[a], " #reg \ : [a] "=r" (ret) \ ) #define W_SYSREG(reg, val) \ asm volatile( \ "mov x0, %[a]" ENDL \ "msr " #reg ", x0" ENDL \ :: [a] "r" (val) \ : "x0" \ ) #define W_SYSREG_IMM(reg, val) \ asm volatile( \ "msr " #reg ", %[a]" \ :: [a] "i" (val) \ ) #define R_REG(ret, reg) \ asm volatile( \ "mov %[a], " #reg \ : [a] "=r" (ret) \ ) #define W_REG(reg, val) \ asm volatile( \ "mov " #reg ", %[a]" \ :: [a] "r" (val) \ ) #define MMIO_W_HELPER(name, reg, mask, offset) \ static inline void name(uint64_t state) \ { *reg = (*reg & ~((mask) << (offset))) | ((state & (mask)) << (offset)); } #define MMIO_R_HELPER(name, reg, mask, offset) \ static inline uint64_t name(void) \ { return (*reg >> (offset)) & (mask); }