/* Header file for cdbc */ #define CDBC_OP_NOP (0x00) #define CDBC_OP_MOVE (0x01) #define CDBC_OP_DUMP (0x10) #define CDBC_OP_JUMP (0x11) #define CDBC_OP_ADD (0x12) #define CDBC_OP_SUB (0x13) #define CDBC_OP_MUL (0x14) #define CDBC_OP_DIV (0x15) #define CDBC_OP_MOD (0x16) #define CDBC_OP_AND (0x17) #define CDBC_OP_OR (0x18) #define CDBC_OP_NOT (0x19) #define CDBC_OP_XOR (0x1a) #define CDBC_OP_COMPARE (0x1b) #define CDBC_OP_CALL (0x1c) #define CDBC_OP_STALL (0x1d) #define CDBC_OP_RET (0x1e) #define CDBC_OP_MAX_INS_OFFSET (0x1f) /* * Common registers used by CDBC */ #define CDBC_REG_SIZE (8) #define CDBC_REG_OFST (9) #define CDBC_REG_CNT2 (10) #define CDBC_REG_CNT1 (11) #define CDBC_REG_CONTEXT_LO (12) #define CDBC_REG_CONTEXT_HI (13) #define CDBC_REG_FLAG (14) #define CDBC_REG_IPTR (15) #define CDBC_REG_MAX (15) #define CDBC_REG_GEN_MAX (11) #define CDBC_REG_SAVED_MAX (12) /* * Shortcut macros to common registers */ #define R_IP (pbc[CDBC_REG_IPTR]) #define R_COUNT1 (pbc[CDBC_REG_CNT1]) #define R_COUNT2 (pbc[CDBC_REG_CNT2]) #define R_OFFSET (pbc[CDBC_REG_OFST]) #define R_SIZE (pbc[CDBC_REG_SIZE]) #define R_FLAG (pbc[CDBC_REG_FLAG]) #define R(_CDBC_REG_) (pbc[_CDBC_REG_]) #define VAR(_CDBC_OFFSET_) (pbc[_CDBC_OFFSET_]) #define CDBC_INSTRUCTION (pbc[R_IP]) #define IDOMAIN_IMM (0) #define IDOMAIN_REG (1) #define IDOMAIN_VAR (2) #define IDOMAIN_UNKNOWN (3) #define CDBC_FLAG_EQUAL (1U << 0) #define CDBC_FLAG_GREATER (1U << 1) #define CDBC_FLAG_LESS (1U << 2) #define CDBC_FLAG_RSVD (1U << 3) // reserved #define CDBC_FLAG_CARRY (1U << 4) // not supported #define CDBC_FLAG_REMAINDER (1U << 5) // not supported #if CDBC_CFG_SYSTEM_64BIT #define OS_GET_CONTEXT(_OS_CONTEXT_) \ do{ \ CDBC_U64 local_ctx = 0; \ OS_ASSERT( (sizeof(_OS_CONTEXT_) == 8), "CDBC: Context is not 64-bit"); \ local_ctx = R(CDBC_REG_CONTEXT_HI); \ local_ctx <<= 32; \ local_ctx |= R(CDBC_REG_CONTEXT_LO); \ _OS_CONTEXT_ = (PCDBC_VOID)local_ctx; \ } while(0) #else #define OS_GET_CONTEXT(_OS_CONTEXT_) \ do{ \ _OS_CONTEXT_ = (PCDBC_VOID)R(CDBC_REG_CONTEXT_LO); \ } while(0) #endif /* * Endian macros */ #if CDBC_CFG_CPU_LITTLE_ENDIAN /* Endian byte swapping macros */ #define SWAP16(data) ((CDBC_U16)(data)) #define SWAP32(data) ((CDBC_U32)(data)) #elif CDBC_CFG_CPU_BIG_ENDIAN /* Endian byte swapping macros */ #define SWAP16(data) (CDBC_U16) ( \ (((CDBC_U16)data & 0x00FF) << 8) | \ (((CDBC_U16)data & 0xFF00) >> 8) ) #define SWAP32(data) (CDBC_U32) ( \ (((CDBC_U32)data & 0x000000FF) << 24) | \ (((CDBC_U32)data & 0x0000FF00) << 8) | \ (((CDBC_U32)data & 0x00FF0000) >> 8) | \ (((CDBC_U32)data & 0xFF000000) >> 24) ) #endif typedef CDBC_VOID (*PCDBC_INSTRUCTION)(PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_nop (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_move(PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_rdwr(PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_dump(PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_jump(PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_add (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_sub (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_mul (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_div (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_mod (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_and (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_or (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_not (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_xor (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_compare(PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_call(PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_stall(PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID i_ret (PCDBC_U32 pbc, CDBC_U32 instruction); CDBC_VOID cdbc_run(PCDBC_U32 pbc);