#ifndef __HMMMM_PUB_MEM_H__ #define __HMMMM_PUB_MEM_H__ #include #include #define GET_BIT(n, b) ((uint8_t)((n >> b) & 1)) #define MEM_ACCESS_INTERCEPT_BUF_SIZE 64 // Internal mem handlers typedef void* (*mem_h_read_func)(uint64_t ident, uint64_t addr, void* rawCells); typedef void (*mem_h_write_func)(uint64_t ident, uint64_t addr, void* rawCells, void* data); typedef struct { mem_h_read_func func; uint64_t ident; } mem_h_read_handler; typedef struct { mem_h_write_func func; uint64_t ident; } mem_h_write_handler; typedef struct { void* rawCells; void** cells; uint64_t smartAddrReadMask; uint64_t smartAddrWriteMask; mem_h_read_handler* smartAddrReadHandlers; mem_h_write_handler* smartAddrWriteHandlers; char** memsegNames; uint64_t* memsegShifts; uint64_t* memsegSizes; uint8_t* memsegCellSizes; uint64_t* memreadCellAddrs; uint8_t* memwriteCellSegments; uint64_t* memwriteCellAddrs; uint64_t* memwriteValues; uint8_t memreadLen; uint8_t memwriteLen; } device_mem_t; typedef struct { uint64_t start; uint64_t len; uint8_t wordLen; char* name; } memseg_spec_t; // External handlers typedef void* (*ext_h_read_func)(uint64_t addr, void* rawCells, void* devContext); typedef void (*ext_h_write_func)(uint64_t addr, void* rawCells, void* data, void* devContext); #define READ_MEM(__tgt, __mem, __segno, __addr, __cell_t) \ {\ uint64_t __globalAddr = __mem->memsegShifts[__segno] + __addr; \ if (__mem->smartAddrReadHandlers[__globalAddr].func != NULL) \ { \ /* __tgt = *(__cell_t*)__mem->smartAddrReadHandlers[__globalAddr].func(__mem->smartAddrReadHandlers[__globalAddr].ident, __addr, __mem->rawCells + __mem->memsegShifts[__segno]);*/ \ __tgt = 0;\ } \ else \ { \ __tgt = ((__cell_t*)__mem->cells[__segno])[__addr]; \ } \ __mem->memreadCellAddrs[__mem->memreadLen] = __globalAddr; \ __mem->memreadLen += 1; \ } #define WRITE_MEM(__mem, __segno, __addr, __cell_t, __val) \ { \ uint64_t __globalAddr = ((uint64_t)(__mem->memsegShifts[__segno]) + (uint64_t)(__addr)); \ if (0 && __mem->smartAddrWriteHandlers[__globalAddr].func != NULL) \ { \ /*__cell_t __dat = (__cell_t)(__val);*/ \ /*__mem->smartAddrWriteHandlers[__globalAddr].func(__mem->smartAddrWriteHandlers[__globalAddr].ident, __addr, __mem->rawCells + __mem->memsegShifts[__segno], (void*)&__dat);*/ \ } \ else if(0) \ { \ ((__cell_t*)__mem->cells[__segno])[__addr] = (__cell_t)(__val); \ } \ __mem->memwriteCellAddrs[__mem->memwriteLen] = __addr; \ __mem->memwriteCellSegments[__mem->memwriteLen] = __segno; \ /*__mem->memwriteWordLengths[__mem->memwriteLen] = sizeof(__cell_t);*/ \ (__mem->memwriteValues[__mem->memwriteLen]) = (__cell_t)(__val); \ __mem->memwriteLen += 1; \ } #endif // ifndef __HMMMM_PUB_MEM_H__