00001 #ifndef TEMU_CPU_H
00002 #define TEMU_CPU_H
00003
00004 #ifdef __cplusplus
00005 extern "C" {
00006 #endif
00007
00008 #include "temu-c/Support/Objsys.h"
00009
00010 #include <stdint.h>
00011
00012 typedef enum {
00013 teCS_Nominal,
00014 teCS_Halted,
00015
00016 teCS_Idling,
00017
00018
00019 } temu_CpuState;
00020
00021 typedef enum {
00022 teCER_Normal = 0,
00023 teCER_Trap,
00024 teCER_Halt,
00025 teCER_Irq,
00026 teCER_Idle,
00027 teCER_Break,
00028 teCER_WatchR,
00029 teCER_WatchW,
00030 teCER_Early,
00031 } temu_CpuExitReason;
00032
00097 #define TEMU_ATC_FETCH 1
00098 #define TEMU_ATC_READ (1 << 1)
00099 #define TEMU_ATC_WRITE (1 << 2)
00100 #define TEMU_ATC_USER (1 << 3)
00101 #define TEMU_ATC_SUPER (1 << 4)
00102 #define TEMU_ATC_HYPER (1 << 5)
00103
00104
00105 typedef struct temu_CpuIface {
00106 void (*reset)(void *Cpu, int ResetType);
00107 temu_CpuExitReason (*run)(void *Cpu, uint64_t Cycles);
00108 temu_CpuExitReason (*step)(void *Cpu, uint64_t Steps);
00109
00110 void __attribute__((noreturn)) (*raiseTrap)(void *Obj, int Trap);
00111 void (*enterIdleMode)(void *Obj);
00112 void __attribute__((noreturn)) (*exitEmuCore)(void *Cpu, temu_CpuExitReason Reason);
00113
00114 uint64_t (*getFreq)(void *Cpu);
00115 int64_t (*getCycles)(void *Cpu);
00116 int64_t (*getSteps)(void *Cpu);
00117 temu_CpuState (*getState)(void *Cpu);
00118 void (*setPc)(void *Cpu, uint64_t Pc);
00119 uint64_t (*getPc)(void *Cpu);
00120 void (*setGpr)(void *Cpu, int Reg, uint64_t Value);
00121 uint64_t (*getGpr)(void *Cpu, unsigned Reg);
00122 void (*setFpr32)(void *Cpu, unsigned Reg, uint32_t Value);
00123 uint32_t (*getFpr32)(void *Cpu, unsigned Reg);
00124 void (*setFpr64)(void *Cpu, unsigned Reg, uint64_t Value);
00125 uint64_t (*getFpr64)(void *Cpu, unsigned Reg);
00126 uint64_t (*getSpr)(void *Cpu, unsigned Reg);
00127 int (*getRegId)(void *Cpu, const char *RegName);
00128 const char* (*getRegName)(void *Cpu, int RegId);
00129 uint32_t (*assemble)(void *Cpu, const char *AsmStr);
00130 char* (*disassemble)(void *Cpu, uint32_t Instr);
00131 void (*enableTraps)(void *Cpu);
00132 void (*disableTraps)(void *Cpu);
00133 void (*invalidateAtc)(void *Obj, uint64_t Addr, uint64_t Pages,
00134 uint32_t Flags);
00135
00136 uint64_t (*translateAddress)(void *Cpu, uint64_t Va, uint32_t *Flags);
00137 } temu_CpuIface;
00138
00139 OBJSYS_OBJ_TYPE(temu_Cpu);
00140
00141 #ifdef __cplusplus
00142 }
00143 #endif
00144
00145 #endif