TEMU  2
The Terma Emulator
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
Cpu.h
Go to the documentation of this file.
1 //===-- temu-c/Cpu.h - CPU Interfaces ---------------------------*- C++ -*-===//
2 //
3 // T-EMU: 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 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 #include "temu-c/Support/Objsys.h"
17 #include "temu-c/Models/Power.h"
18 #include <stdint.h>
19 
20 typedef enum {
23  teCS_Idling,
28 
29 
30 typedef enum {
32  teCER_Trap = 2,
35  teCER_Break,
42 
43 // ATC flags
44 #define TEMU_ATC_FETCH 1
45 #define TEMU_ATC_READ (1 << 1)
46 #define TEMU_ATC_WRITE (1 << 2)
47 #define TEMU_ATC_USER (1 << 3)
48 #define TEMU_ATC_SUPER (1 << 4)
49 #define TEMU_ATC_HYPER (1 << 5)
50 
51 // Some types for querying CPU info
52 
53 typedef enum {
54  teEN_Little, // Always little endian
55  teEN_Big, // Always big endian
56  teEN_Dynamic, // Can switch at runtime
57 } temu_Endian;
58 
59 
60 typedef struct {
61  const char *ArchName;
62  const char *ModelName;
63 
64  unsigned VASize; // Virtual address size in bits
65  unsigned PASize; // Physical address size in bits
66  unsigned VATypeSize; // Virtual address type size in bytes
67  unsigned PATypeSize; // Physical address type size in bytes (i.e. 8 for 36 bit PA)
68 
69  unsigned GPRCount; // GPR register count
70  unsigned FPRCount; // FPR register count
71 
74 
76 } temu_CpuInfo;
77 
78 // Named struct type here keeps libclang happy
79 
164 typedef struct temu_CpuIface {
165  void (*reset)(void *Cpu, int ResetType);
166  temu_CpuExitReason (*run)(void *Cpu, uint64_t Cycles);
167  temu_CpuExitReason (*runUntil)(void *Cpu, uint64_t Cycles);
168  temu_CpuExitReason (*step)(void *Cpu, uint64_t Steps);
169  temu_CpuExitReason (*stepUntil)(void *Cpu, uint64_t Steps, uint64_t Cycles);
170 
171  void __attribute__((noreturn)) (*raiseTrap)(void *Obj, int Trap);
172  void (*enterIdleMode)(void *Obj);
173  void __attribute__((noreturn)) (*exitEmuCore)(void *Cpu, temu_CpuExitReason Reason);
174 
175  uint64_t (*getFreq)(void *Cpu);
176  int64_t (*getCycles)(void *Cpu);
177  int64_t (*getSteps)(void *Cpu);
178  temu_CpuState (*getState)(void *Cpu);
179  void (*setPc)(void *Cpu, uint64_t Pc);
180  uint64_t (*getPc)(void *Cpu);
181  void (*setGpr)(void *Cpu, int Reg, uint64_t Value);
182  uint64_t (*getGpr)(void *Cpu, unsigned Reg);
183  void (*setFpr32)(void *Cpu, unsigned Reg, uint32_t Value);
184  uint32_t (*getFpr32)(void *Cpu, unsigned Reg);
185  void (*setFpr64)(void *Cpu, unsigned Reg, uint64_t Value);
186  uint64_t (*getFpr64)(void *Cpu, unsigned Reg);
187  void (*setSpr)(void *Cpu, unsigned Reg, uint64_t Value);
188  uint64_t (*getSpr)(void *Cpu, unsigned Reg);
189  int (*getRegId)(void *Cpu, const char *RegName);
190  const char* (*getRegName)(void *Cpu, int RegId);
191  uint32_t (*assemble)(void *Cpu, const char *AsmStr);
192  char* (*disassemble)(void *Cpu, uint32_t Instr);
193  void (*enableTraps)(void *Cpu);
194  void (*disableTraps)(void *Cpu);
195  void (*invalidateAtc)(void *Obj, uint64_t Addr, uint64_t Pages,
196  uint32_t Flags);
197 
198  uint64_t (*translateAddress)(void *Cpu, uint64_t Va, uint32_t *Flags);
199 
201  void (*setPowerState)(void *Cpu, temu_PowerState Ps);
202 
203  void (*enableTrapEvents)(void *Cpu);
204  void (*disableTrapEvents)(void *Cpu);
205 
206  void (*enableErrorModeEvents)(void *Cpu);
207  void (*disableErrorModeEvents)(void *Cpu);
208 
209  void* (*getMachine)(void *Cpu);
210  void (*raiseTrapNoJmp)(void *Cpu, int Trap);
211 
212  const char* (*getTrapName)(void *Cpu, int Trap);
213 
214  const temu_CpuInfo* (*getCPUInfo)(void *Cpu); // Experimental
215 
216  int (*wakeUp)(void *Cpu);
217 
219  void (*forceEarlyExit)(void *Cpu);
220 } temu_CpuIface;
225 #define TEMU_CPU_IFACE_TYPE "CpuIface"
226 TEMU_IFACE_REFERENCE_TYPE(temu_Cpu);
227 
228 typedef struct {
229  uint32_t TrapId;
231 
232 typedef struct {
233  uint32_t OldMode;
234  uint32_t NewMode;
236 
237 #ifdef __cplusplus
238 }
239 #endif
240 
241 #endif /* ! TEMU_CPU_H */
uint32_t TrapId
Definition: Cpu.h:229
temu_CpuState
Definition: Cpu.h:20
const char * ModelName
Definition: Cpu.h:62
temu_CpuState(* getState)(void *Cpu)
Definition: Cpu.h:178
uint64_t(* getGpr)(void *Cpu, unsigned Reg)
Definition: Cpu.h:182
struct temu_CpuIface temu_CpuIface
Common CPU interface.
Exited due to halting (e.g. sparc error mode)
Definition: Cpu.h:33
Other early exit reason.
Definition: Cpu.h:39
void int Trap
Definition: Cpu.h:171
temu_CpuExitReason(* step)(void *Cpu, uint64_t Steps)
Definition: Cpu.h:168
Emulator panic (e.g. illegal mode transition)
Definition: Cpu.h:40
temu_PowerState
Used to indicate whether a model is powered on.
Definition: Power.h:23
temu_Endian
Definition: Cpu.h:53
uint32_t(* getFpr32)(void *Cpu, unsigned Reg)
Definition: Cpu.h:184
Definition: Cpu.h:55
unsigned GPRCount
Definition: Cpu.h:69
void(* enableTraps)(void *Cpu)
Definition: Cpu.h:193
void(* invalidateAtc)(void *Obj, uint64_t Addr, uint64_t Pages, uint32_t Flags)
Definition: Cpu.h:195
uint32_t OldMode
Definition: Cpu.h:233
temu_Endian InstructionEndianess
Definition: Cpu.h:72
temu_CpuExitReason
Definition: Cpu.h:30
Exited due to watchpoint write hit.
Definition: Cpu.h:38
void(* setFpr32)(void *Cpu, unsigned Reg, uint32_t Value)
Definition: Cpu.h:183
uint64_t(* getFreq)(void *Cpu)
Definition: Cpu.h:175
temu_Endian DataEndianess
Definition: Cpu.h:73
void(* disableTraps)(void *Cpu)
Definition: Cpu.h:194
void(* raiseTrapNoJmp)(void *Cpu, int Trap)
Definition: Cpu.h:210
Normal all ok CPU state.
Definition: Cpu.h:21
void(* enterIdleMode)(void *Obj)
Definition: Cpu.h:172
uint64_t(* getPc)(void *Cpu)
Definition: Cpu.h:180
temu_PowerState(* getPowerState)(void *Cpu)
Definition: Cpu.h:200
#define TEMU_IFACE_REFERENCE_TYPE(N)
Definition: Objsys.h:129
const char * ArchName
Definition: Cpu.h:61
uint64_t(* getSpr)(void *Cpu, unsigned Reg)
Definition: Cpu.h:188
unsigned NumInstructionSets
Definition: Cpu.h:75
void temu_CpuExitReason Reason
Definition: Cpu.h:173
Exited due to watchpoint read hit.
Definition: Cpu.h:37
unsigned VASize
Definition: Cpu.h:64
unsigned VATypeSize
Definition: Cpu.h:66
int(* getRegId)(void *Cpu, const char *RegName)
Definition: Cpu.h:189
void __attribute__((noreturn))(*raiseTrap)(void *Obj
int(* wakeUp)(void *Cpu)
Definition: Cpu.h:216
Exited due to breakpoint hit.
Definition: Cpu.h:36
uint32_t NewMode
Definition: Cpu.h:234
int64_t(* getCycles)(void *Cpu)
Definition: Cpu.h:176
void(* setSpr)(void *Cpu, unsigned Reg, uint64_t Value)
Definition: Cpu.h:187
temu_CpuExitReason(* runUntil)(void *Cpu, uint64_t Cycles)
Definition: Cpu.h:167
void(* enableErrorModeEvents)(void *Cpu)
Definition: Cpu.h:206
void(* setGpr)(void *Cpu, int Reg, uint64_t Value)
Definition: Cpu.h:181
void(* disableErrorModeEvents)(void *Cpu)
Definition: Cpu.h:207
unsigned PATypeSize
Definition: Cpu.h:67
void(* forceEarlyExit)(void *Cpu)
Definition: Cpu.h:219
uint32_t(* assemble)(void *Cpu, const char *AsmStr)
Definition: Cpu.h:191
Normal exit (cannot be passed to early exit)
Definition: Cpu.h:31
unsigned PASize
Definition: Cpu.h:65
unsigned FPRCount
Definition: Cpu.h:70
temu_CpuExitReason(* stepUntil)(void *Cpu, uint64_t Steps, uint64_t Cycles)
Definition: Cpu.h:169
uint64_t(* getFpr64)(void *Cpu, unsigned Reg)
Definition: Cpu.h:186
Common CPU interface.
Definition: Cpu.h:164
temu_CpuExitReason(* run)(void *Cpu, uint64_t Cycles)
Definition: Cpu.h:166
void(* reset)(void *Cpu, int ResetType)
Definition: Cpu.h:165
void(* setPc)(void *Cpu, uint64_t Pc)
Definition: Cpu.h:179
void(* setFpr64)(void *Cpu, unsigned Reg, uint64_t Value)
Definition: Cpu.h:185
uint64_t(* translateAddress)(void *Cpu, uint64_t Va, uint32_t *Flags)
Definition: Cpu.h:198
int64_t(* getSteps)(void *Cpu)
Definition: Cpu.h:177
Exited due to trap (sync trap)
Definition: Cpu.h:32
void(* setPowerState)(void *Cpu, temu_PowerState Ps)
Definition: Cpu.h:201
void(* disableTrapEvents)(void *Cpu)
Definition: Cpu.h:204
void(* enableTrapEvents)(void *Cpu)
Definition: Cpu.h:203