195 lines
2.2 KiB
C
195 lines
2.2 KiB
C
|
#ifndef RV32CPU_H
|
||
|
#define RV32CPU_H
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
/*
|
||
|
* This is a structure encoding for the registers of
|
||
|
* the rv32 cpu.
|
||
|
* It allows access of register x0 using :
|
||
|
* structname.x0, structname.zero, structname.x[0]
|
||
|
* This way, access can be really flexible
|
||
|
*/
|
||
|
typedef struct RV32_CPU_REGS
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
uint32_t x0;
|
||
|
uint32_t zero;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x1;
|
||
|
uint32_t ra;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x2;
|
||
|
uint32_t sp;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x3;
|
||
|
uint32_t gp;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x4;
|
||
|
uint32_t tp;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x5;
|
||
|
uint32_t t0;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x6;
|
||
|
uint32_t t1;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x7;
|
||
|
uint32_t t2;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x8;
|
||
|
uint32_t s0;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x9;
|
||
|
uint32_t s1;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x10;
|
||
|
uint32_t a0;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x11;
|
||
|
uint32_t a1;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x12;
|
||
|
uint32_t a2;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x13;
|
||
|
uint32_t a3;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x14;
|
||
|
uint32_t a4;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x15;
|
||
|
uint32_t a5;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x16;
|
||
|
uint32_t a6;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x17;
|
||
|
uint32_t a7;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x18;
|
||
|
uint32_t s2;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x19;
|
||
|
uint32_t s3;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x20;
|
||
|
uint32_t s4;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x21;
|
||
|
uint32_t s5;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x22;
|
||
|
uint32_t s6;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x23;
|
||
|
uint32_t s7;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x24;
|
||
|
uint32_t s8;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x25;
|
||
|
uint32_t s9;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x26;
|
||
|
uint32_t s10;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x27;
|
||
|
uint32_t s11;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x28;
|
||
|
uint32_t t3;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x29;
|
||
|
uint32_t t4;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x30;
|
||
|
uint32_t t5;
|
||
|
};
|
||
|
union
|
||
|
{
|
||
|
uint32_t x31;
|
||
|
uint32_t t6;
|
||
|
};
|
||
|
};
|
||
|
uint32_t x[32];
|
||
|
};
|
||
|
} rv32_cpu_regs_t;
|
||
|
|
||
|
typedef struct RV32_CPU
|
||
|
{
|
||
|
rv32_cpu_regs_t regs;
|
||
|
uint32_t pc;
|
||
|
} rv32_cpu_t;
|
||
|
|
||
|
extern rv32_cpu_t* cpu0;
|
||
|
void cpu_init();
|
||
|
void cpu_loop(rv32_cpu_t* cpu);
|
||
|
|
||
|
#endif
|