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 {
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 {
56  int (*mapDevice)(void *Obj, uint64_t Addr, uint64_t Len, temu_Object_ *Device,
57  uint32_t Flags);
59  void (*setAttr)(void *Obj, uint64_t Addr, uint64_t Len, temu_MemoryAttr Attr);
61  void (*clearAttr)(void *Obj, uint64_t Addr, uint64_t Len,
62  temu_MemoryAttr Attr);
64  temu_MemoryAttrs (*getAttrs)(void *Obj, uint64_t Addr);
65 
67  int (*mapDeviceWithNamedIface)(void *Obj, uint64_t Addr, uint64_t Len,
68  temu_Object_ *Device, const char *IfaceName,
69  uint32_t Flags);
70 
72  int (*unmapRange)(void *Obj, uint64_t Addr, uint64_t Len);
73 
75  int (*mapDeviceWithIface)(void *Obj, uint64_t Addr, uint64_t Len,
76  temu_Object_ *Device, temu_MemAccessIface *Iface,
77  uint32_t Flags);
79 
80 TEMU_IFACE_REFERENCE_TYPE(temu_MemorySpace);
81 #define TEMU_MEMORY_SPACE_IFACE_TYPE "temu::MemorySpaceIface"
82 
83 // Private interface, do not use directly
84 #define TEMU_PDC_PSEUDO_UNKNOWN_INSTR 0
85 #define TEMU_PDC_PSEUDO_EOP 1
86 #define TEMU_PDC_PSEUDO_TRAMPOLINE 2
87 #define TEMU_PDC_PSEUDO_POST_DS_0 3
88 #define TEMU_PDC_PSEUDO_POST_DS_1 4
89 #define TEMU_PDC_PSEUDO_ATTRIB_CHECK 5
90 #define TEMU_PDC_PSEUDO_PROFILE 6
91 #define TEMU_PDC_PSEUDO_PRE_TRAMPOLINE 7
92 #define TEMU_PDC_PSEUDO_IDLE 8
93 #define TEMU_PDC_PSEUDO_SKIP 9
94 #define TEMU_PDC_PSEUDO_CALL 10
95 #define TEMU_PDC_PSEUDO_CALL_AND_SKIP 11
96 #define TEMU_PDC_PSEUDO_MULTIPAGE 12
97 #define TEMU_PDC_PSEUDO_OP_COUNT 13
98 
99 typedef struct {
100  uint32_t Instruction;
101  uint32_t Operands;
103 
104 typedef struct {
106  uint64_t ExtParam;
108 
109 typedef struct {
110  void *(*getPDC)(void *Obj, uint64_t Addr);
111  void (*allocPDC)(void *Obj, uint64_t Addr);
112  void (*disposePDC)(void *Obj, uint64_t Addr);
113  void (*writePDC)(void *Obj, uint64_t Addr, void *Inst);
114  void (*clearPDC)(void *Obj, uint64_t Addr);
115  void (*setPseudoOpHandler)(void *Obj, unsigned Opcode, uintptr_t Handler);
116  void (*installTrampoline)(void *Obj, uint64_t Addr,
117  void (*TrampHandler)(void *));
118  void (*installProfile)(void *Obj, uint64_t Addr);
119  void (*removeProfile)(void *Obj, uint64_t Addr);
120 
121  void (*installIdle)(void *Obj, uint64_t Addr);
122  void (*removeIdle)(void *Obj, uint64_t Addr);
123 
124  void (*setBT)(void *Obj, uint64_t Addr, void *BTP);
125 
126  temu_ExtIRInstruction *(*allocPDCChain)(void *Obj, uint64_t Addr);
127  void (*releasePDCChain)(void *Obj, uint64_t Addr);
128 
129  uint64_t (*irToPA)(void *obj, uint64_t addr);
130 
131 
132 } temu_PDCIface;
133 TEMU_IFACE_REFERENCE_TYPE(temu_PDC);
134 #define TEMU_PDC_IFACE_TYPE "PDCIface"
135 
149 TEMU_API int temu_memoryRead(void *mem, uint8_t *buff, uint64_t addr,
150  uint32_t size, int swap);
151 
164 TEMU_API int temu_memoryWrite(void *mem, uint64_t addr, uint8_t *buff,
165  uint32_t size, int swap);
166 
167 
179 TEMU_API int temu_memoryReadData(void *obj, uint64_t addr, uint8_t *buff,
180  unsigned unitSize, uint32_t size,
181  unsigned flags);
182 
193 TEMU_API int temu_memoryWriteData(void *obj, uint64_t addr,
194  const uint8_t *buff, unsigned unitSize,
195  uint32_t size, unsigned flags);
196 
211 TEMU_API int temu_memoryMap(void *Obj, uint64_t Addr, uint64_t Len,
212  void *MemObj, uint32_t Flags);
213 
227 TEMU_API int temu_memoryMapNamedIface(void *Obj, uint64_t Addr, uint64_t Len,
228  void *MemObj, const char *IfaceName,
229  uint32_t Flags);
230 
231 TEMU_API int temu_memoryMapNamedIface2(void *Obj, uint64_t Addr, uint64_t Len,
232  void *MemObj, const char *IfaceName,
233  unsigned Idx, uint32_t Flags);
234 
242 TEMU_API void temu_memorySetAttr(void *Obj, uint64_t Addr, uint64_t Len,
243  temu_MemoryAttr Attr);
244 
252 TEMU_API void temu_memoryClearAttr(void *Obj, uint64_t Addr, uint64_t Len,
253  temu_MemoryAttr Attr);
254 
261 TEMU_API temu_MemoryAttrs temu_memoryGetAttrs(void *Obj, uint64_t Addr);
262 
271 TEMU_API int temu_memoryReadPhys16(void *Obj, uint64_t Addr, uint16_t *Word);
280 TEMU_API int temu_memoryReadPhys16Little(void *Obj, uint64_t Addr, uint16_t *Word);
281 
290 TEMU_API int temu_memoryReadPhys32(void *Obj, uint64_t Addr, uint32_t *Word);
299 TEMU_API int temu_memoryReadPhys32Little(void *Obj, uint64_t Addr, uint32_t *Word);
300 
308 TEMU_API int temu_memoryWritePhys32(void *Obj, uint64_t Addr, uint32_t Word);
309 
317 TEMU_API int temu_memoryWritePhys32Little(void *Obj, uint64_t Addr, uint32_t Word);
318 
339 TEMU_API uint32_t temu_normaliseWrite32(uint32_t OldVal, uint32_t NewVal,
340  int Sz, int Off);
341 
354 TEMU_API uint32_t temu_normaliseRead32(uint32_t Value, int Sz, int Off);
355 
368 TEMU_API uint16_t temu_normaliseRead16(uint16_t Value, int Sz, int Off);
369 
391 TEMU_API uint16_t temu_normaliseWrite16(uint16_t OldVal, uint16_t NewVal,
392  int Sz, int Off);
393 
401 TEMU_API int temu_memoryInstallTrampoline(void *Obj, uint64_t Addr,
402  void (*Tramp)(void *));
403 TEMU_API uint64_t temu_irToPhys(void *obj, uintptr_t ir);
404 
405 #ifdef __cplusplus
406 }
407 #endif
408 
409 #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:64
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:75
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:72
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)
Clear attribute bit.
Definition: Memory.h:61
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)
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:109
uint32_t Operands
Definition: Memory.h:101
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:99
temu_IRInstruction Inst
Definition: Memory.h:105
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:100
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:59
User definable.
Definition: Memory.h:46
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:104
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:54
Alias for teMK_IO
Definition: Memory.h:23
uint64_t ExtParam
Definition: Memory.h:106
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:56
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:67