TEMU  3.0
The Terma Emulator
Memory.h
Go to the documentation of this file.
1 //===-- temu-c/Memory.h - Memory Helpers ------------------------*- C++ -*-===//
2 //
3 // TEMU: The Terma Emulator
4 // (c) Terma 2015-2016
5 // Authors: Mattias Holm <maho (at) terma.com>
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef TEMU_SUPPORT_MEMORY
10 #define TEMU_SUPPORT_MEMORY
11 
13 #include "temu-c/Support/Objsys.h"
14 #include <stdint.h>
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 typedef enum temu_MemoryKind {
21  teMK_RAM = 0,
22  teMK_ROM = 1,
23  teMK_MMIO = 2,
24  teMK_IO = 2,
26  teMK_Last = 4, // DO NOT USE
28 
30 
40 typedef enum {
41  teMA_Break = 1,
42  teMA_WatchRead = 1 << 1,
43  teMA_WatchWrite = 1 << 2,
44  teMA_Upset = 1 << 3,
45  teMA_Faulty = 1 << 4,
46  teMA_User1 = 1 << 5,
47  teMA_User2 = 1 << 6,
48  teMA_User3 = 1 << 7,
50 typedef uint8_t temu_MemoryAttrs;
52 
53 // Private interface, this is not stable yet
54 typedef struct temu_MemorySpaceIface {
55  int (*mapDevice)(void *Obj, uint64_t Addr, uint64_t Len, temu_Object_ *Device,
56  uint32_t Flags);
57  void (*setAttr)(void *Obj, uint64_t Addr, uint64_t Len, temu_MemoryAttr Attr);
58  void (*clearAttr)(void *Obj, uint64_t Addr, uint64_t Len,
59  temu_MemoryAttr Attr);
60  temu_MemoryAttrs (*getAttrs)(void *Obj, uint64_t Addr);
61 
62  int (*mapDeviceWithNamedIface)(void *Obj, uint64_t Addr, uint64_t Len,
63  temu_Object_ *Device, const char *IfaceName,
64  uint32_t Flags);
65 
66  int (*unmapRange)(void *Obj, uint64_t Addr, uint64_t Len);
67 
68  int (*mapDeviceWithIface)(void *Obj, uint64_t Addr, uint64_t Len,
69  temu_Object_ *Device, temu_MemAccessIface *Iface,
70  uint32_t Flags);
72 
73 TEMU_IFACE_REFERENCE_TYPE(temu_MemorySpace);
74 #define TEMU_MEMORY_SPACE_IFACE_TYPE "MemorySpaceIface"
75 
76 // Private interface, do not use directly
77 #define TEMU_PDC_PSEUDO_UNKNOWN_INSTR 0
78 #define TEMU_PDC_PSEUDO_EOP 1
79 #define TEMU_PDC_PSEUDO_TRAMPOLINE 2
80 #define TEMU_PDC_PSEUDO_POST_DS_0 3
81 #define TEMU_PDC_PSEUDO_POST_DS_1 4
82 #define TEMU_PDC_PSEUDO_ATTRIB_CHECK 5
83 #define TEMU_PDC_PSEUDO_PROFILE 6
84 #define TEMU_PDC_PSEUDO_PRE_TRAMPOLINE 7
85 #define TEMU_PDC_PSEUDO_MULTIPAGE 8
86 #define TEMU_PDC_PSEUDO_OP_COUNT 9
87 
88 typedef struct {
89  uint32_t Instruction;
90  uint32_t Operands;
92 
93 typedef struct {
95  uint64_t ExtParam;
97 
98 typedef struct {
99  void *(*getPDC)(void *Obj, uint64_t Addr);
100  void (*allocPDC)(void *Obj, uint64_t Addr);
101  void (*disposePDC)(void *Obj, uint64_t Addr);
102  void (*writePDC)(void *Obj, uint64_t Addr, void *Inst);
103  void (*clearPDC)(void *Obj, uint64_t Addr);
104  void (*setPseudoOpHandler)(void *Obj, unsigned Opcode, uintptr_t Handler);
105  void (*installTrampoline)(void *Obj, uint64_t Addr,
106  void (*TrampHandler)(void *));
107  void (*installProfile)(void *Obj, uint64_t Addr);
108  void (*removeProfile)(void *Obj, uint64_t Addr);
109 
110  void (*setBT)(void *Obj, uint64_t Addr, void *BTP);
111 
112  temu_ExtIRInstruction *(*allocPDCChain)(void *Obj, uint64_t Addr);
113  void (*releasePDCChain)(void *Obj, uint64_t Addr);
114 
115  uint64_t (*irToPA)(void *obj, uint64_t addr);
116 } temu_PDCIface;
117 TEMU_IFACE_REFERENCE_TYPE(temu_PDC);
118 #define TEMU_PDC_IFACE_TYPE "PDCIface"
119 
133 TEMU_API int temu_memoryRead(void *mem, uint8_t *buff, uint64_t addr,
134  uint32_t size, int swap);
135 
148 TEMU_API int temu_memoryWrite(void *mem, uint64_t addr, uint8_t *buff,
149  uint32_t size, int swap);
150 
151 
163 TEMU_API int temu_memoryReadData(void *obj, uint64_t addr, uint8_t *buff,
164  unsigned unitSize, uint32_t size,
165  unsigned flags);
166 
177 TEMU_API int temu_memoryWriteData(void *obj, uint64_t addr,
178  const uint8_t *buff, unsigned unitSize,
179  uint32_t size, unsigned flags);
180 
195 TEMU_API int temu_memoryMap(void *Obj, uint64_t Addr, uint64_t Len,
196  void *MemObj, uint32_t Flags);
197 
211 TEMU_API int temu_memoryMapNamedIface(void *Obj, uint64_t Addr, uint64_t Len,
212  void *MemObj, const char *IfaceName,
213  uint32_t Flags);
214 
215 TEMU_API int temu_memoryMapNamedIface2(void *Obj, uint64_t Addr, uint64_t Len,
216  void *MemObj, const char *IfaceName,
217  unsigned Idx, uint32_t Flags);
218 
226 TEMU_API void temu_memorySetAttr(void *Obj, uint64_t Addr, uint64_t Len,
227  temu_MemoryAttr Attr);
228 
236 TEMU_API void temu_memoryClearAttr(void *Obj, uint64_t Addr, uint64_t Len,
237  temu_MemoryAttr Attr);
238 
245 TEMU_API temu_MemoryAttrs temu_memoryGetAttrs(void *Obj, uint64_t Addr);
246 
255 TEMU_API int temu_memoryReadPhys16(void *Obj, uint64_t Addr, uint16_t *Word);
264 TEMU_API int temu_memoryReadPhys16Little(void *Obj, uint64_t Addr, uint16_t *Word);
265 
274 TEMU_API int temu_memoryReadPhys32(void *Obj, uint64_t Addr, uint32_t *Word);
283 TEMU_API int temu_memoryReadPhys32Little(void *Obj, uint64_t Addr, uint32_t *Word);
284 
292 TEMU_API int temu_memoryWritePhys32(void *Obj, uint64_t Addr, uint32_t Word);
293 
301 TEMU_API int temu_memoryWritePhys32Little(void *Obj, uint64_t Addr, uint32_t Word);
302 
323 TEMU_API uint32_t temu_normaliseWrite32(uint32_t OldVal, uint32_t NewVal,
324  int Sz, int Off);
325 
338 TEMU_API uint32_t temu_normaliseRead32(uint32_t Value, int Sz, int Off);
339 
352 TEMU_API uint16_t temu_normaliseRead16(uint16_t Value, int Sz, int Off);
353 
375 TEMU_API uint16_t temu_normaliseWrite16(uint16_t OldVal, uint16_t NewVal,
376  int Sz, int Off);
377 
385 TEMU_API int temu_memoryInstallTrampoline(void *Obj, uint64_t Addr,
386  void (*Tramp)(void *));
387 TEMU_API uint64_t temu_irToPhys(void *obj, uintptr_t ir);
388 
389 #ifdef __cplusplus
390 }
391 #endif
392 
393 #endif /* ! TEMU_SUPPORT_MEMORY */
TEMU_API int temu_memoryReadPhys16(void *Obj, uint64_t Addr, uint16_t *Word)
User definable.
Definition: Memory.h:48
TEMU_API int temu_memoryWritePhys32Little(void *Obj, uint64_t Addr, uint32_t Word)
TEMU_API int temu_memoryMapNamedIface(void *Obj, uint64_t Addr, uint64_t Len, void *MemObj, const char *IfaceName, uint32_t Flags)
temu_MemoryAttrs(* getAttrs)(void *Obj, uint64_t Addr)
Definition: Memory.h:60
TEMU_API uint64_t temu_irToPhys(void *obj, uintptr_t ir)
int(* mapDeviceWithIface)(void *Obj, uint64_t Addr, uint64_t Len, temu_Object_ *Device, temu_MemAccessIface *Iface, uint32_t Flags)
Definition: Memory.h:68
TEMU_API int temu_memoryMap(void *Obj, uint64_t Addr, uint64_t Len, void *MemObj, uint32_t Flags)
TEMU_API void temu_memorySetAttr(void *Obj, uint64_t Addr, uint64_t Len, temu_MemoryAttr Attr)
struct temu_MemorySpaceIface temu_MemorySpaceIface
Write watchpoint set.
Definition: Memory.h:43
int(* unmapRange)(void *Obj, uint64_t Addr, uint64_t Len)
Definition: Memory.h:66
TEMU_API int temu_memoryRead(void *mem, uint8_t *buff, uint64_t addr, uint32_t size, int swap)
uint8_t temu_MemoryAttrs
Definition: Memory.h:50
TEMU_API uint32_t temu_normaliseWrite32(uint32_t OldVal, uint32_t NewVal, int Sz, int Off)
Read watchpoint set.
Definition: Memory.h:42
temu_MemoryAttr
Memory attribute enumeration.
Definition: Memory.h:40
void(* clearAttr)(void *Obj, uint64_t Addr, uint64_t Len, temu_MemoryAttr Attr)
Definition: Memory.h:58
TEMU_API uint16_t temu_normaliseWrite16(uint16_t OldVal, uint16_t NewVal, int Sz, int Off)
#define TEMU_API
Definition: Attributes.h:53
Definition: Memory.h:25
Definition: Memory.h:212
Definition: Memory.h:24
TEMU_API int temu_memoryReadPhys32(void *Obj, uint64_t Addr, uint32_t *Word)
Single event upset.
Definition: Memory.h:44
TEMU_API int temu_memoryReadPhys32Little(void *Obj, uint64_t Addr, uint32_t *Word)
TEMU_API void temu_memoryClearAttr(void *Obj, uint64_t Addr, uint64_t Len, temu_MemoryAttr Attr)
TEMU_API uint16_t temu_normaliseRead16(uint16_t Value, int Sz, int Off)
Breakpoint set.
Definition: Memory.h:41
Definition: Memory.h:98
uint32_t Operands
Definition: Memory.h:90
TEMU_API int temu_memoryMapNamedIface2(void *Obj, uint64_t Addr, uint64_t Len, void *MemObj, const char *IfaceName, unsigned Idx, uint32_t Flags)
#define temu_Object_
Definition: Temu2Compat.h:13
Definition: Memory.h:22
Definition: Memory.h:88
temu_IRInstruction Inst
Definition: Memory.h:94
Multiple event upset / uncorrectable.
Definition: Memory.h:45
TEMU_API int temu_memoryWritePhys32(void *Obj, uint64_t Addr, uint32_t Word)
TEMU_API int temu_memoryWriteData(void *obj, uint64_t addr, const uint8_t *buff, unsigned unitSize, uint32_t size, unsigned flags)
User definable.
Definition: Memory.h:47
uint32_t Instruction
Definition: Memory.h:89
TEMU_IFACE_REFERENCE_TYPE(temu_MemAccess)
void(* setAttr)(void *Obj, uint64_t Addr, uint64_t Len, temu_MemoryAttr Attr)
Definition: Memory.h:57
User definable.
Definition: Memory.h:46
Definition: Memory.h:21
TEMU_API int temu_memoryInstallTrampoline(void *Obj, uint64_t Addr, void(*Tramp)(void *))
TEMU_API uint32_t temu_normaliseRead32(uint32_t Value, int Sz, int Off)
temu_MemoryKind
Definition: Memory.h:20
Definition: Memory.h:93
TEMU_API int temu_memoryReadData(void *obj, uint64_t addr, uint8_t *buff, unsigned unitSize, uint32_t size, unsigned flags)
TEMU_API temu_MemoryAttrs temu_memoryGetAttrs(void *Obj, uint64_t Addr)
Definition: Memory.h:26
Definition: Memory.h:54
Definition: Memory.h:23
uint64_t ExtParam
Definition: Memory.h:95
TEMU_API int temu_memoryReadPhys16Little(void *Obj, uint64_t Addr, uint16_t *Word)
TEMU_API int temu_memoryWrite(void *mem, uint64_t addr, uint8_t *buff, uint32_t size, int swap)
int(* mapDevice)(void *Obj, uint64_t Addr, uint64_t Len, temu_Object_ *Device, uint32_t Flags)
Definition: Memory.h:55
int(* mapDeviceWithNamedIface)(void *Obj, uint64_t Addr, uint64_t Len, temu_Object_ *Device, const char *IfaceName, uint32_t Flags)
Definition: Memory.h:62