TEMU  3.0
The Terma Emulator
Cpu.h
Go to the documentation of this file.
1 //===-- temu-c/Cpu.h - CPU Interfaces ---------------------------*- C++ -*-===//
2 //
3 // TEMU: The Terma Emulator
4 // (c) Terma 2015
5 // Authors: Mattias Holm <maho (at) terma.com>
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef TEMU_CPU_H
10 #define TEMU_CPU_H
11 
12 #include "temu-c/Support/Objsys.h"
13 #include "temu-c/Models/Power.h"
14 #include <stdint.h>
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 
21 typedef enum temu_CpuState {
24  teCS_Idling,
29 
30 
31 typedef enum temu_CpuExitReason {
33  teCER_Trap = 2,
36  teCER_Break,
43 
44 // ATC flags
45 #define TEMU_ATC_FETCH 1
46 #define TEMU_ATC_READ (1 << 1)
47 #define TEMU_ATC_WRITE (1 << 2)
48 #define TEMU_ATC_USER (1 << 3)
49 #define TEMU_ATC_SUPER (1 << 4)
50 #define TEMU_ATC_HYPER (1 << 5)
51 
52 // Some types for querying CPU info
53 
54 typedef enum temu_Endian {
55  teEN_Little, // Always little endian
56  teEN_Big, // Always big endian
57  teEN_Dynamic, // Can switch at runtime
58 } temu_Endian;
59 
60 
61 typedef struct {
62  const char *ArchName;
63  const char *ModelName;
64 
65  unsigned VASize; // Virtual address size in bits
66  unsigned PASize; // Physical address size in bits
67  unsigned VATypeSize; // Virtual address type size in bytes
68  unsigned PATypeSize; // Physical address type size in bytes (i.e. 8 for 36 bit PA)
69 
70  unsigned GPRCount; // GPR register count
71  unsigned FPRCount; // FPR register count
72 
75 
77 } temu_CpuInfo;
78 
79 // Named struct type here keeps libclang happy
80 
165 typedef struct temu_CpuIface {
166  void (*reset)(void *Cpu, int ResetType);
167  temu_CpuExitReason (*run)(void *Cpu, uint64_t Cycles);
168  temu_CpuExitReason (*runUntil)(void *Cpu, uint64_t Cycles);
169  temu_CpuExitReason (*step)(void *Cpu, uint64_t Steps);
170  temu_CpuExitReason (*stepUntil)(void *Cpu, uint64_t Steps, uint64_t Cycles);
171 
172  void __attribute__((noreturn)) (*raiseTrap)(void *Obj, int Trap);
173  void (*enterIdleMode)(void *Obj);
174  void __attribute__((noreturn)) (*exitEmuCore)(void *Cpu, temu_CpuExitReason Reason);
175 
176  uint64_t (*getFreq)(void *Cpu);
177  int64_t (*getCycles)(void *Cpu);
178  int64_t (*getSteps)(void *Cpu);
179  temu_CpuState (*getState)(void *Cpu);
180  void (*setPc)(void *Cpu, uint64_t Pc);
181  uint64_t (*getPc)(void *Cpu);
182  void (*setGpr)(void *Cpu, int Reg, uint64_t Value);
183  uint64_t (*getGpr)(void *Cpu, unsigned Reg);
184  void (*setFpr32)(void *Cpu, unsigned Reg, uint32_t Value);
185  uint32_t (*getFpr32)(void *Cpu, unsigned Reg);
186  void (*setFpr64)(void *Cpu, unsigned Reg, uint64_t Value);
187  uint64_t (*getFpr64)(void *Cpu, unsigned Reg);
188  void (*setSpr)(void *Cpu, unsigned Reg, uint64_t Value);
189  uint64_t (*getSpr)(void *Cpu, unsigned Reg);
190  int (*getRegId)(void *Cpu, const char *RegName);
191  const char* (*getRegName)(void *Cpu, int RegId);
192  uint32_t (*assemble)(void *Cpu, const char *AsmStr);
193  char* (*disassemble)(void *Cpu, uint32_t Instr);
194  void (*enableTraps)(void *Cpu);
195  void (*disableTraps)(void *Cpu);
196  void (*invalidateAtc)(void *Obj, uint64_t Addr, uint64_t Pages,
197  uint32_t Flags);
198 
199  uint64_t (*translateAddress)(void *Cpu, uint64_t Va, uint32_t *Flags);
200 
202  void (*setPowerState)(void *Cpu, temu_PowerState Ps);
203 
204  void (*enableTrapEvents)(void *Cpu);
205  void (*disableTrapEvents)(void *Cpu);
206 
207  void (*enableErrorModeEvents)(void *Cpu);
208  void (*disableErrorModeEvents)(void *Cpu);
209 
210  void* (*getMachine)(void *Cpu);
211  void (*raiseTrapNoJmp)(void *Cpu, int Trap);
212 
213  const char* (*getTrapName)(void *Cpu, int Trap);
214 
215  const temu_CpuInfo* (*getCPUInfo)(void *Cpu); // Experimental
216 
217  int (*wakeUp)(void *Cpu);
218 
220  void (*forceEarlyExit)(void *Cpu);
221  void* (*translateIRAddress)(void *Obj, uint64_t Va);
226 
227  void (*enableModeSwitchEvents)(void *Obj);
228  void (*disableModeSwitchEvents)(void *Obj);
229 
230  void (*enableProfiling)(void *Obj);
231  void (*disableProfiling)(void *Obj);
232  void (*flushProfileCaches)(void *Obj);
233 } temu_CpuIface;
234 #define TEMU_CPU_IFACE_TYPE "CpuIface"
235 TEMU_IFACE_REFERENCE_TYPE(temu_Cpu);
236 
237 typedef struct {
238  uint32_t TrapId;
239  uint64_t PC;
240  uint64_t nPC;
242 
243 typedef struct {
244  uint32_t OldMode;
245  uint32_t NewMode;
247 
248 // Instruction classification bits
249 #define TEMU_INSTR_BRANCH (1 << 0)
250 #define TEMU_INSTR_INDIRECT_BRANCH (1 << 1)
251 #define TEMU_INSTR_LOAD (1 << 2)
252 #define TEMU_INSTR_STORE (1 << 3)
253 #define TEMU_INSTR_INTEGER (1 << 4)
254 #define TEMU_INSTR_FLOAT (1 << 5)
255 #define TEMU_INSTR_ARITHMETIC (1 << 6)
256 #define TEMU_INSTR_ANNULLED (1 << 7)
257 #define TEMU_INSTR_UNCOND (1 << 8)
258 #define TEMU_INSTR_UNCOND_NEVER (1 << 9)
259 #define TEMU_INSTR_ON_PAGE (1 << 10)
260 #define TEMU_INSTR_MODE_SWITCH (1 << 11)
261 #define TEMU_INSTR_ILLEGAL (1 << 12)
262 
263 typedef struct {
264  void (*branchTargetCounterOverflow)(void *Obj, uint64_t Address, int Taken);
265  void (*blockCounterOverflow)(void *Obj, uint64_t Address);
266  void (*wrotePage)(void *Obj, uint64_t Va, uint64_t Pa);
267  void* (*getRawRuntime)(void *Obj);
269 #define TEMU_TARGET_EXEC_IFACE_TYPE "TargetExecutionIface"
270 TEMU_IFACE_REFERENCE_TYPE(temu_TargetExecution);
271 
272 #define TEMU_STICKY_DO_NOT_EXIT_AT_HALT 1
273 #define TEMU_STICKY_PROFILE_MODE 2
274 #define TEMU_STICKY_DISABLE_IDLE (1 << 2)
275 
276 
277 typedef struct {
278  void (*setResetAddress)(void *Obj, uint64_t Address);
280 #define TEMU_DYNAMIC_RESET_ADDRESS_IFACE_TYPE "temu::DynamicResetAddressIface"
281 TEMU_IFACE_REFERENCE_TYPE(temu_DynamicResetAddress);
282 
283 #ifdef __cplusplus
284 }
285 #endif
286 
287 #endif /* ! TEMU_CPU_H */
Exited due to watchpoint read hit.
Definition: Cpu.h:38
int(* getRegId)(void *Cpu, const char *RegName)
Definition: Cpu.h:190
uint32_t(* getFpr32)(void *Cpu, unsigned Reg)
Definition: Cpu.h:185
void(* setPowerState)(void *Cpu, temu_PowerState Ps)
Definition: Cpu.h:202
Definition: Cpu.h:243
int64_t(* getCycles)(void *Cpu)
Definition: Cpu.h:177
uint32_t OldMode
Definition: Cpu.h:244
Emulator panic (e.g. illegal mode transition)
Definition: Cpu.h:41
Definition: Cpu.h:57
unsigned GPRCount
Definition: Cpu.h:70
uint64_t(* getGpr)(void *Cpu, unsigned Reg)
Definition: Cpu.h:183
unsigned NumInstructionSets
Definition: Cpu.h:76
void(* setGpr)(void *Cpu, int Reg, uint64_t Value)
Definition: Cpu.h:182
Definition: Cpu.h:35
temu_CpuState
Definition: Cpu.h:21
const char * ModelName
Definition: Cpu.h:63
Definition: Cpu.h:55
void __attribute__((noreturn))(*raiseTrap)(void *Obj
Other early exit reason.
Definition: Cpu.h:40
Exited due to watchpoint write hit.
Definition: Cpu.h:39
void(* setFpr64)(void *Cpu, unsigned Reg, uint64_t Value)
Definition: Cpu.h:186
void temu_CpuExitReason Reason
Definition: Cpu.h:174
uint64_t(* getFreq)(void *Cpu)
Definition: Cpu.h:176
Definition: Cpu.h:61
unsigned VATypeSize
Definition: Cpu.h:67
unsigned PASize
Definition: Cpu.h:66
uint64_t(* translateAddress)(void *Cpu, uint64_t Va, uint32_t *Flags)
Definition: Cpu.h:199
temu_PowerState
Used to indicate whether a model is powered on.
Definition: Power.h:23
unsigned PATypeSize
Definition: Cpu.h:68
void(* setPc)(void *Cpu, uint64_t Pc)
Definition: Cpu.h:180
void(* disableErrorModeEvents)(void *Cpu)
Definition: Cpu.h:208
uint32_t NewMode
Definition: Cpu.h:245
uint64_t PC
Program counter when trap occurred.
Definition: Cpu.h:239
Definition: Cpu.h:56
void(* disableTraps)(void *Cpu)
Definition: Cpu.h:195
void(* enableTraps)(void *Cpu)
Definition: Cpu.h:194
int(* wakeUp)(void *Cpu)
Definition: Cpu.h:217
int64_t(* getSteps)(void *Cpu)
Definition: Cpu.h:178
void(* enableModeSwitchEvents)(void *Obj)
Definition: Cpu.h:227
Normal all ok CPU state.
Definition: Cpu.h:22
Exited due to breakpoint hit.
Definition: Cpu.h:37
Definition: Cpu.h:237
temu_CpuState(* getState)(void *Cpu)
Definition: Cpu.h:179
void(* disableProfiling)(void *Obj)
Definition: Cpu.h:231
void(* enableTrapEvents)(void *Cpu)
Definition: Cpu.h:204
Definition: Cpu.h:165
Exited due to halting (e.g. sparc error mode)
Definition: Cpu.h:34
uint64_t nPC
Only valid for targets with delay slots.
Definition: Cpu.h:240
temu_Endian
Definition: Cpu.h:54
Definition: Cpu.h:25
temu_CpuExitReason(* run)(void *Cpu, uint64_t Cycles)
Definition: Cpu.h:167
void(* enterIdleMode)(void *Obj)
Definition: Cpu.h:173
void int Trap
Definition: Cpu.h:172
uint32_t(* assemble)(void *Cpu, const char *AsmStr)
Definition: Cpu.h:192
void(* forceEarlyExit)(void *Cpu)
Definition: Cpu.h:220
void(* reset)(void *Cpu, int ResetType)
Definition: Cpu.h:166
temu_CpuExitReason
Definition: Cpu.h:31
temu_Endian DataEndianess
Definition: Cpu.h:74
uint32_t TrapId
Definition: Cpu.h:238
void(* setSpr)(void *Cpu, unsigned Reg, uint64_t Value)
Definition: Cpu.h:188
Definition: Cpu.h:277
void(* enableProfiling)(void *Obj)
Definition: Cpu.h:230
Definition: Cpu.h:23
temu_CpuExitReason(* runUntil)(void *Cpu, uint64_t Cycles)
Definition: Cpu.h:168
void(* raiseTrapNoJmp)(void *Cpu, int Trap)
Definition: Cpu.h:211
const char * ArchName
Definition: Cpu.h:62
Definition: Cpu.h:263
void(* enableErrorModeEvents)(void *Cpu)
Definition: Cpu.h:207
Normal exit (cannot be passed to early exit)
Definition: Cpu.h:32
uint64_t(* getSpr)(void *Cpu, unsigned Reg)
Definition: Cpu.h:189
void(* flushProfileCaches)(void *Obj)
Definition: Cpu.h:232
TEMU_IFACE_REFERENCE_TYPE(temu_Cpu)
Exited due to trap (sync trap)
Definition: Cpu.h:33
unsigned FPRCount
Definition: Cpu.h:71
struct temu_CpuIface temu_CpuIface
void(* invalidateAtc)(void *Obj, uint64_t Addr, uint64_t Pages, uint32_t Flags)
Definition: Cpu.h:196
void(* setFpr32)(void *Cpu, unsigned Reg, uint32_t Value)
Definition: Cpu.h:184
temu_Endian InstructionEndianess
Definition: Cpu.h:73
temu_CpuExitReason(* step)(void *Cpu, uint64_t Steps)
Definition: Cpu.h:169
unsigned VASize
Definition: Cpu.h:65
void(* disableTrapEvents)(void *Cpu)
Definition: Cpu.h:205
temu_PowerState(* getPowerState)(void *Cpu)
Definition: Cpu.h:201
temu_CpuExitReason(* stepUntil)(void *Cpu, uint64_t Steps, uint64_t Cycles)
Definition: Cpu.h:170
void(* disableModeSwitchEvents)(void *Obj)
Definition: Cpu.h:228
uint64_t(* getFpr64)(void *Cpu, unsigned Reg)
Definition: Cpu.h:187
uint64_t(* getPc)(void *Cpu)
Definition: Cpu.h:181