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,
28 
30 
40 typedef enum temu_MemoryAttr {
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 typedef enum temu_MemoryStat {
59 
60 // Private interface, this is not stable yet
61 typedef struct temu_MemorySpaceIface {
63  int (*mapDevice)(void *Obj, uint64_t Addr, uint64_t Len, temu_Object_ *Device,
64  uint32_t Flags);
66  void (*setAttr)(void *Obj, uint64_t Addr, uint64_t Len, temu_MemoryAttr Attr);
68  void (*clearAttr)(void *Obj, uint64_t Addr, uint64_t Len,
69  temu_MemoryAttr Attr);
71  temu_MemoryAttrs (*getAttrs)(void *Obj, uint64_t Addr);
72 
74  int (*mapDeviceWithNamedIface)(void *Obj, uint64_t Addr, uint64_t Len,
75  temu_Object_ *Device, const char *IfaceName,
76  uint32_t Flags);
77 
79  int (*unmapRange)(void *Obj, uint64_t Addr, uint64_t Len);
80 
82  int (*mapDeviceWithIface)(void *Obj, uint64_t Addr, uint64_t Len,
83  temu_Object_ *Device, temu_MemAccessIface *Iface,
84  uint32_t Flags);
85 
86  uint64_t (*getStat)(void *Obj, temu_MemoryStat Stat);
88 
89 TEMU_IFACE_REFERENCE_TYPE(temu_MemorySpace);
90 #define TEMU_MEMORY_SPACE_IFACE_TYPE "temu::MemorySpaceIface"
91 
92 // Private interface, do not use directly
93 #define TEMU_PDC_PSEUDO_UNKNOWN_INSTR 0
94 #define TEMU_PDC_PSEUDO_EOP 1
95 #define TEMU_PDC_PSEUDO_TRAMPOLINE 2
96 #define TEMU_PDC_PSEUDO_POST_DS_0 3
97 #define TEMU_PDC_PSEUDO_POST_DS_1 4
98 #define TEMU_PDC_PSEUDO_ATTRIB_CHECK 5
99 #define TEMU_PDC_PSEUDO_PROFILE 6
100 #define TEMU_PDC_PSEUDO_PRE_TRAMPOLINE 7
101 #define TEMU_PDC_PSEUDO_IDLE 8
102 #define TEMU_PDC_PSEUDO_SKIP 9
103 #define TEMU_PDC_PSEUDO_CALL 10
104 #define TEMU_PDC_PSEUDO_CALL_AND_SKIP 11
105 #define TEMU_PDC_PSEUDO_MULTIPAGE 12
106 #define TEMU_PDC_PSEUDO_OP_COUNT 13
107 
108 typedef struct {
109  uint32_t Instruction;
110  uint32_t Operands;
112 
113 typedef struct {
115  uint64_t ExtParam;
117 
118 typedef struct {
119  void *(*getPDC)(void *Obj, uint64_t Addr);
120  void (*allocPDC)(void *Obj, uint64_t Addr);
121  void (*disposePDC)(void *Obj, uint64_t Addr);
122  void (*writePDC)(void *Obj, uint64_t Addr, void *Inst);
123  void (*clearPDC)(void *Obj, uint64_t Addr);
124  void (*setPseudoOpHandler)(void *Obj, unsigned Opcode, uintptr_t Handler);
125  void (*installTrampoline)(void *Obj, uint64_t Addr,
126  void (*TrampHandler)(void *));
127  void (*installProfile)(void *Obj, uint64_t Addr);
128  void (*removeProfile)(void *Obj, uint64_t Addr);
129 
130  void (*installIdle)(void *Obj, uint64_t Addr);
131  void (*removeIdle)(void *Obj, uint64_t Addr);
132 
133  void (*setBT)(void *Obj, uint64_t Addr, void *BTP);
134 
135  temu_ExtIRInstruction *(*allocPDCChain)(void *Obj, uint64_t Addr);
136  void (*releasePDCChain)(void *Obj, uint64_t Addr);
137 
138  uint64_t (*irToPA)(void *obj, uint64_t addr);
139 
140 
141 } temu_PDCIface;
142 TEMU_IFACE_REFERENCE_TYPE(temu_PDC);
143 #define TEMU_PDC_IFACE_TYPE "PDCIface"
144 
158 TEMU_API int temu_memoryRead(void *mem, uint8_t *buff, uint64_t addr,
159  uint32_t size, int swap);
160 
173 TEMU_API int temu_memoryWrite(void *mem, uint64_t addr, uint8_t *buff,
174  uint32_t size, int swap);
175 
176 
188 TEMU_API int temu_memoryReadData(void *obj, uint64_t addr, uint8_t *buff,
189  unsigned unitSize, uint32_t size,
190  unsigned flags);
191 
202 TEMU_API int temu_memoryWriteData(void *obj, uint64_t addr,
203  const uint8_t *buff, unsigned unitSize,
204  uint32_t size, unsigned flags);
205 
220 TEMU_API int temu_memoryMap(void *Obj, uint64_t Addr, uint64_t Len,
221  void *MemObj, uint32_t Flags);
222 
236 TEMU_API int temu_memoryMapNamedIface(void *Obj, uint64_t Addr, uint64_t Len,
237  void *MemObj, const char *IfaceName,
238  uint32_t Flags);
239 
240 TEMU_API int temu_memoryMapNamedIface2(void *Obj, uint64_t Addr, uint64_t Len,
241  void *MemObj, const char *IfaceName,
242  unsigned Idx, uint32_t Flags);
243 
251 TEMU_API void temu_memorySetAttr(void *Obj, uint64_t Addr, uint64_t Len,
252  temu_MemoryAttr Attr);
253 
261 TEMU_API void temu_memoryClearAttr(void *Obj, uint64_t Addr, uint64_t Len,
262  temu_MemoryAttr Attr);
263 
270 TEMU_API temu_MemoryAttrs temu_memoryGetAttrs(void *Obj, uint64_t Addr);
271 
280 TEMU_API int temu_memoryReadPhys16(void *Obj, uint64_t Addr, uint16_t *Word);
289 TEMU_API int temu_memoryReadPhys16Little(void *Obj, uint64_t Addr, uint16_t *Word);
290 
299 TEMU_API int temu_memoryReadPhys32(void *Obj, uint64_t Addr, uint32_t *Word);
308 TEMU_API int temu_memoryReadPhys32Little(void *Obj, uint64_t Addr, uint32_t *Word);
309 
317 TEMU_API int temu_memoryWritePhys32(void *Obj, uint64_t Addr, uint32_t Word);
318 
326 TEMU_API int temu_memoryWritePhys32Little(void *Obj, uint64_t Addr, uint32_t Word);
327 
348 TEMU_API uint32_t temu_normaliseWrite32(uint32_t OldVal, uint32_t NewVal,
349  int Sz, int Off);
350 
363 TEMU_API uint32_t temu_normaliseRead32(uint32_t Value, int Sz, int Off);
364 
377 TEMU_API uint16_t temu_normaliseRead16(uint16_t Value, int Sz, int Off);
378 
400 TEMU_API uint16_t temu_normaliseWrite16(uint16_t OldVal, uint16_t NewVal,
401  int Sz, int Off);
402 
410 TEMU_API int temu_memoryInstallTrampoline(void *Obj, uint64_t Addr,
411  void (*Tramp)(void *));
412 TEMU_API uint64_t temu_irToPhys(void *obj, uintptr_t ir);
413 
414 #ifdef __cplusplus
415 }
416 #endif
417 
418 #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)
Get attributes for address.
Definition: Memory.h:71
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)
Map device with interface pointer.
Definition: Memory.h:82
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)
Unmap devices in range.
Definition: Memory.h:79
TEMU_API int temu_memoryRead(void *mem, uint8_t *buff, uint64_t addr, uint32_t size, int swap)
Definition: Memory.h:54
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
Definition: Memory.h:57
temu_MemoryAttr
Memory attribute enumeration.
Definition: Memory.h:40
uint64_t(* getStat)(void *Obj, temu_MemoryStat Stat)
Definition: Memory.h:86
void(* clearAttr)(void *Obj, uint64_t Addr, uint64_t Len, temu_MemoryAttr Attr)
Clear attribute bit.
Definition: Memory.h:68
Definition: Memory.h:55
TEMU_API uint16_t temu_normaliseWrite16(uint16_t OldVal, uint16_t NewVal, int Sz, int Off)
#define TEMU_API
Definition: Attributes.h:53
Model is a memory space.
Definition: Memory.h:25
Definition: Memory.h:212
Model is a normal IO device.
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)
Definition: Memory.h:56
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:118
uint32_t Operands
Definition: Memory.h:110
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
Model is a ROM.
Definition: Memory.h:22
Definition: Memory.h:108
temu_IRInstruction Inst
Definition: Memory.h:114
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:109
TEMU_IFACE_REFERENCE_TYPE(temu_MemAccess)
void(* setAttr)(void *Obj, uint64_t Addr, uint64_t Len, temu_MemoryAttr Attr)
Set attribute bit.
Definition: Memory.h:66
User definable.
Definition: Memory.h:46
temu_MemoryStat
Definition: Memory.h:53
Model is a RAM.
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:113
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)
DO NOT USE.
Definition: Memory.h:26
Definition: Memory.h:61
Alias for teMK_IO
Definition: Memory.h:23
uint64_t ExtParam
Definition: Memory.h:115
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)
Map device (using the default MemAccessIface interface)
Definition: Memory.h:63
int(* mapDeviceWithNamedIface)(void *Obj, uint64_t Addr, uint64_t Len, temu_Object_ *Device, const char *IfaceName, uint32_t Flags)
Map device with named interface.
Definition: Memory.h:74