/* * dlx.h * $Id: dlx.h,v 1.20 2005/01/28 16:12:45 obi Exp $ * Christoph Berg * Mark Hillebrand */ #ifndef DLX_H #define DLX_H 1 #define INIT_MEMORY_SIZE 32 * 1024*1024 #define MAX_SIZE 32 #define GPR_SIZE 32 #define STACK_R 29 #define FRAME_R 30 #define LINK_R 31 #define CA_SIZE 32 #define SPR_SR 0 #define SPR_ESR 1 #define SPR_ECA 2 #define SPR_EPC 3 #define SPR_EDPC 4 #define SPR_EDATA 5 #define SPR_RM 6 #define SPR_IEEEf 7 #define SPR_FCC 8 // VM architecture: #define SPR_PTO 9 #define SPR_PTL 10 #define SPR_EMODE 11 #define SPR_FRE1 12 #define SPR_FRE2 13 #define SPR_FRE3 14 #define SPR_FRE4 15 #define SPR_MODE 16 #define CA_reset 0x0001 #define CA_ill 0x0002 #define CA_mal 0x0004 #define CA_ipf 0x0008 #define CA_dpf 0x0010 #define CA_trap 0x0020 #define CA_ovf 0x0040 #define CA_FPUovf 0x0080 #define CA_FPUunf 0x0100 #define CA_FPUinx 0x0200 #define CA_FPUdiv0 0x0400 #define CA_FPUinv 0x0800 #define CA_FPUunimpl 0x1000 #define STOP_TRAP_EXIT 0x1 #define STOP_TRAP_OPEN 0x2 #define STOP_TRAP_CLOSE 0x4 #define STOP_TRAP_READ 0x8 #define STOP_TRAP_WRITE 0x10 #define STOP_TRAP_INTERRUPT 0x20 #define STOP_JISR 0x40 #define STOP_RFE 0x80 #define STOP_WARNING 0x100 #define STOP_BBEND 0x200 #define STOP_CHMOD 0x400 #define STOP_JAL 0x800 #define STOP_JR31 0x1000 #define STEP_WARNING(s,arg...) do { \ state.stopflag |= STOP_WARNING; printf(" \e[31;7mWARNING\e[0m " s "\n", arg ); \ } while(0) #define STEP_TRACE(arg...) while( state.trace ) { printf( " " arg ); printf("\n"); break; } extern char** spr_name; extern char* cause_name[CA_SIZE]; // SPR_SIZE variable for architecture extern int SPR_SIZE; struct state_s { unsigned int pc; unsigned int dpc; int gpr[MAX_SIZE]; int fpr[MAX_SIZE]; int spr[MAX_SIZE]; char *memory; int memorysize; int start, maxaddr, text, textsize, data, datasize; int stack; int lastcfi; // last instruction was CFI (with delay slot!) // the following variables control runtime behaviour of the simulator: int stopflag; int stopmask; int trace; int tracetrap; int ex; // external event lines... }; struct prof_s { int instr; int nop, inv, inv_r; int j, jal, trap, rfe; int lb, lh, lw, lbu, lhu, sb, sh, sw; int addio, addi, subio, subi; int andi, ori, xori, lhgi; int clri, sgri, seqi, sgei, slsi, snei, slei, seti; int beqz, beqz_taken, bnez, bnez_taken, jr, jalr; int slli, srli, srai, sll, srl, sra; int addo, add, subo, sub, and, or, xor, lhg; int clr, sgr, seq, sge, sls, sne, sle, set; int movs2i, movi2s; // no profiling for FI/FR type yet }; extern struct state_s state; extern struct prof_s prof; void exrequest(int index); void exservice(int index); void init_state(); void print_gpr(); void print_fpr(int mode); void print_spr(); void print_state(); void init_prof(); void print_prof(); void step(); // TODO not really nice #define ARCH_VM 0x1 extern int arch; // is external since used by memory.c void init_arch(int a); void init_timer(int t); #endif