Make write via waiting buf
This commit is contained in:
10
inc/device.h
10
inc/device.h
@@ -5,6 +5,7 @@
|
|||||||
#include "runner.h"
|
#include "runner.h"
|
||||||
#include "addrs.h"
|
#include "addrs.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
|
#include "instr.h"
|
||||||
#include <libhmmmm/config.h>
|
#include <libhmmmm/config.h>
|
||||||
#include <libhmmmm/device.h>
|
#include <libhmmmm/device.h>
|
||||||
#include <libhmmmm/mem.h>
|
#include <libhmmmm/mem.h>
|
||||||
@@ -28,7 +29,9 @@ typedef struct
|
|||||||
} device_specs_t;
|
} device_specs_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
prog_counter_t* pc;
|
||||||
|
instr_h_func* instr;
|
||||||
device_mem_t* deviceMem;
|
device_mem_t* deviceMem;
|
||||||
device_specs_t* specs;
|
device_specs_t* specs;
|
||||||
} device_info_t;
|
} 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);
|
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);
|
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 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);
|
void fillSmartWriteSpecs(device_specs_t* specs, smart_write_spec_t* smartWriteSpecs, uint64_t smartWriteSpecsCount);
|
||||||
|
|||||||
34
inc/instr.h
34
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__
|
#endif // ifndef __INSTR_H__
|
||||||
14
src/device.c
14
src/device.c
@@ -52,12 +52,6 @@ void freeDevSpec(void* _specs)
|
|||||||
|
|
||||||
device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
|
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));
|
device_mem_t* devMem = (device_mem_t*)calloc(1, sizeof(device_mem_t));
|
||||||
if (devMem == NULL)
|
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));
|
uint8_t* memwriteCellSegments = calloc(MEM_ACCESS_INTERCEPT_BUF_SIZE, sizeof(uint8_t));
|
||||||
|
|
||||||
if(memwriteCellSegments == NULL)
|
if(memwriteCellSegments == NULL)
|
||||||
{
|
{
|
||||||
sprintf(errbuf, "unable to allocate write interception addrs");
|
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;
|
uint64_t smartAddrWriteMask = 0;
|
||||||
mem_h_read_handler* smartAddrReadHandlers = calloc(memTotalSize, sizeof(mem_h_read_handler));
|
mem_h_read_handler* smartAddrReadHandlers = calloc(memTotalSize, sizeof(mem_h_read_handler));
|
||||||
|
|
||||||
|
if(memwriteCellSegments == NULL)
|
||||||
if (smartAddrReadHandlers == NULL)
|
|
||||||
{
|
{
|
||||||
sprintf(errbuf, "unable to allocate read interception handlers");
|
sprintf(errbuf, "unable to allocate read interception handlers");
|
||||||
free(devMem->memsegShifts);
|
free(devMem->memsegShifts);
|
||||||
@@ -258,13 +250,13 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
|
|||||||
free(devMem);
|
free(devMem);
|
||||||
free(rawCells);
|
free(rawCells);
|
||||||
free(memreadCellAddrs);
|
free(memreadCellAddrs);
|
||||||
free(cells);
|
|
||||||
free(cellNames);
|
|
||||||
free(memwriteCellAddrs);
|
free(memwriteCellAddrs);
|
||||||
free(memwriteCellSegments);
|
free(memwriteCellSegments);
|
||||||
free(memwriteValues);
|
free(memwriteValues);
|
||||||
free(memwriteValuesContainers);
|
free(memwriteValuesContainers);
|
||||||
free(memwriteWordLengths);
|
free(memwriteWordLengths);
|
||||||
|
free(cells);
|
||||||
|
free(cellNames);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user