From 65e7b458613f3ea30e6cc149673f216d0b4e4a94 Mon Sep 17 00:00:00 2001 From: nikto_b Date: Sun, 12 Apr 2026 16:33:57 +0300 Subject: [PATCH] Make write via waiting buf --- inc/device.h | 10 +++++++++- inc/instr.h | 34 ---------------------------------- src/device.c | 14 +++----------- 3 files changed, 12 insertions(+), 46 deletions(-) diff --git a/inc/device.h b/inc/device.h index 72ba89e..a5684b5 100644 --- a/inc/device.h +++ b/inc/device.h @@ -5,6 +5,7 @@ #include "runner.h" #include "addrs.h" #include "mem.h" +#include "instr.h" #include #include #include @@ -28,7 +29,9 @@ typedef struct } device_specs_t; typedef struct -{ +{ + prog_counter_t* pc; + instr_h_func* instr; device_mem_t* deviceMem; device_specs_t* specs; } device_info_t; @@ -42,6 +45,11 @@ uint8_t makeDeviceTick(device_public_context_t* devContext); device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf); +size_t pubExtractPcounter(device_public_context_t* devContext); +size_t pubExtractOpcode(device_mem_t* devMem, size_t _programCounter); +void* pubExtractPcounterPtr(device_public_context_t* devContext); +uint8_t pubExtractPcounterSizeWords(); + device_specs_t* parseSpecsFromConfig(const conf_dev_t* devConf, char* errbuf); void fillSmartReadSpecs(device_specs_t* specs, smart_read_spec_t* smartReadSpecs, uint64_t smartReadSpecsCount); void fillSmartWriteSpecs(device_specs_t* specs, smart_write_spec_t* smartWriteSpecs, uint64_t smartWriteSpecsCount); diff --git a/inc/instr.h b/inc/instr.h index 74e4998..27709b0 100644 --- a/inc/instr.h +++ b/inc/instr.h @@ -57,38 +57,4 @@ opcode_t extractOpcode(device_mem_t* devMem, prog_counter_t programCounter); - -#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]); \ - } \ - 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 = __mem->memsegShifts[__segno] + __addr; \ - if (__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 \ - { \ - ((__cell_t*)__mem->cells[__segno])[__addr] = (__cell_t)(__val); \ - } \ - __mem->memwriteCellAddrs[__mem->memwriteLen] = __globalAddr; \ - __mem->memwriteLen += 1; \ -} - - - #endif // ifndef __INSTR_H__ \ No newline at end of file diff --git a/src/device.c b/src/device.c index ba834ab..45bfdfa 100644 --- a/src/device.c +++ b/src/device.c @@ -52,12 +52,6 @@ void freeDevSpec(void* _specs) device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf) { - if (devSpec->memSpecsCount < 2) - { - sprintf(errbuf, "invalid amount of mem specs: %u", devSpec->memSpecsCount); - return NULL; - } - device_mem_t* devMem = (device_mem_t*)calloc(1, sizeof(device_mem_t)); if (devMem == NULL) { @@ -157,7 +151,6 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf) } uint8_t* memwriteCellSegments = calloc(MEM_ACCESS_INTERCEPT_BUF_SIZE, sizeof(uint8_t)); - if(memwriteCellSegments == NULL) { sprintf(errbuf, "unable to allocate write interception addrs"); @@ -229,8 +222,7 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf) uint64_t smartAddrWriteMask = 0; mem_h_read_handler* smartAddrReadHandlers = calloc(memTotalSize, sizeof(mem_h_read_handler)); - - if (smartAddrReadHandlers == NULL) + if(memwriteCellSegments == NULL) { sprintf(errbuf, "unable to allocate read interception handlers"); free(devMem->memsegShifts); @@ -258,13 +250,13 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf) free(devMem); free(rawCells); free(memreadCellAddrs); - free(cells); - free(cellNames); free(memwriteCellAddrs); free(memwriteCellSegments); free(memwriteValues); free(memwriteValuesContainers); free(memwriteWordLengths); + free(cells); + free(cellNames); return NULL; }