81 lines
1.6 KiB
C
81 lines
1.6 KiB
C
#pragma once
|
|
|
|
#include <stddef.h>
|
|
#include <uart.h>
|
|
|
|
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 panic(int errno);
|
|
|
|
#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); }
|