Important Interfaces
Memory Access Interface
#include "temu-c/Memory/Memory.h"
typedef struct temu_MemTransaction {
uint64_t Va; //!< 64 bit virtual for unified 32/64 bit interface.
uint64_t Pa; //!< 64 bit physical address
uint64_t Value; //!< Resulting value (or written value)
//! Log size of the transaction size it is at most the size of the
//! CPUs max bus size. In case of SPARCv8, this is 4 bytes (double
//! words are issued as two accesses).
uint8_t Size;
//! Used for device models, this will be filled in with the offset
//! from the start address of the device (note it is in practice
//! possible to add a device at multiple locations (which happens in
//! some rare cases)).
uint64_t Offset;
void *Initiator; //!< Initiator of the transaction
void *Page; //!< Page pointer (for caching)
uint64_t Cycles; //!< Cycle cost for memory access
} temu_MemTransaction;
// Exposed to the emulator core by a memory object.
typedef struct temu_MemAccessIface {
void (*fetch)(void *Obj, temu_MemTransaction *Mt);
void (*read)(void *Obj, temu_MemTransaction *Mt);
void (*write)(void *Obj, temu_MemTransaction *Mt);
} temu_MemAccessIface;
IRQ Interface
#include "temu-c/Models/IrqController.h"
typedef struct temu_IrqControllerIface {
void (*raiseInterrupt)(void *Obj, uint8_t Irq);
void (*ackInterrupt)(void *Obj, uint8_t Irq);
} temu_IrqCtrlIface;
Device Interface
#include "temu-c/Models/Device.h"
typedef struct temu_DeviceIface {
void (*reset)(void *Obj, int ResetType);
void (*mapDevice)(void *Obj, uint64_t Address, uint64_t Len);
} temu_DeviceIface;