Initial commit
This commit is contained in:
238
src/hmmmm.c
Normal file
238
src/hmmmm.c
Normal file
@@ -0,0 +1,238 @@
|
||||
#include "hmmmm.h"
|
||||
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef size_t (*_dlib_pubExtractPcounter_t)(device_public_context_t* devContext);
|
||||
typedef size_t (*_dlib_pubExtractOpcode_t)(device_mem_t* devMem, size_t _programCounter);
|
||||
|
||||
typedef uint8_t(*_dlib_pubExtractPcounterSizeWords_t)();
|
||||
|
||||
typedef device_public_context_t* (*_dlib_dev_init_t)(void* specs, char* errbuf);
|
||||
|
||||
typedef uint8_t (*_dlib_makeDeviceTick_t)(device_public_context_t* devInfo);
|
||||
|
||||
typedef uint8_t (*_dlib_deviceType_t)();
|
||||
|
||||
typedef void* (*_dlib_pubExtractPcounterPtr_t)(device_public_context_t* devContext);
|
||||
|
||||
typedef void* (*_dlib_parseSpecsFromConfig_t)(const conf_dev_t* devConf, char* errbuf);
|
||||
|
||||
typedef void (*_dlib_freeSpecs_t)(void* specs);
|
||||
typedef void (*_dlib_freeDevMem_t)(device_mem_t* mem);
|
||||
|
||||
typedef void (*_dlib_fillSmartReadSpecs_t)(void* specs, smart_read_spec_t* smartReadSpecs, uint64_t smartReadSpecsCount);
|
||||
typedef void (*_dlib_fillSmartWriteSpecs_t)(void* specs, smart_write_spec_t* smartWriteSpecs, uint64_t smartWriteSpecsCount);
|
||||
|
||||
instruction_simul_handlers_t* _fillInstructionSimul(void* handle)
|
||||
{
|
||||
instruction_simul_handlers_t* ret = malloc(sizeof(instruction_simul_handlers_t));
|
||||
|
||||
if (ret == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_dlib_pubExtractPcounterPtr_t _dlib_pubExtractPcounterPtr = (_dlib_pubExtractPcounterPtr_t)(uintptr_t)dlsym(handle, "pubExtractPcounterPtr");
|
||||
|
||||
const char *dlib_pubExtractPcounterPtr_error = dlerror();
|
||||
if (dlib_pubExtractPcounterPtr_error) {
|
||||
dlclose(handle);
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret->extractPcounterPtr = _dlib_pubExtractPcounterPtr;
|
||||
|
||||
|
||||
_dlib_pubExtractPcounter_t _dlib_pubExtractPcounter = (_dlib_pubExtractPcounter_t)(uintptr_t)dlsym(handle, "pubExtractPcounter");
|
||||
|
||||
const char *dlib_pubExtractPcounter_error = dlerror();
|
||||
if (dlib_pubExtractPcounter_error) {
|
||||
dlclose(handle);
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret->extractPcounter = _dlib_pubExtractPcounter;
|
||||
|
||||
|
||||
_dlib_pubExtractOpcode_t _dlib_pubExtractOpcode = (_dlib_pubExtractOpcode_t)(uintptr_t)dlsym(handle, "pubExtractOpcode");
|
||||
|
||||
const char *dlib_pubExtractOpcode_error = dlerror();
|
||||
if (dlib_pubExtractOpcode_error) {
|
||||
dlclose(handle);
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret->extractOpcode = _dlib_pubExtractOpcode;
|
||||
|
||||
_dlib_pubExtractPcounterSizeWords_t _dlib_pubExtractPcounterSizeWords = (_dlib_pubExtractPcounterSizeWords_t)(uintptr_t)dlsym(handle, "pubExtractPcounterSizeWords");
|
||||
|
||||
const char *dlib_pubExtractPcounterSizeWords_error = dlerror();
|
||||
if (dlib_pubExtractPcounterSizeWords_error) {
|
||||
dlclose(handle);
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret->extractPcounterSizeWords = _dlib_pubExtractPcounterSizeWords;
|
||||
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
device_lib_t* loadDeviceLib(const char *libpath, char* errbuf)
|
||||
{
|
||||
device_lib_t* dev = malloc(sizeof(device_lib_t));
|
||||
|
||||
if (dev == NULL)
|
||||
{
|
||||
sprintf(errbuf, "unable to allocate device lib struct");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *handle = dlopen(libpath, RTLD_NOW);
|
||||
|
||||
if (!handle) {
|
||||
sprintf(errbuf, "unable to open dl handle");
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dlerror();
|
||||
|
||||
_dlib_dev_init_t _dlib_dev_init = (_dlib_dev_init_t)(uintptr_t)dlsym(handle, "init");
|
||||
|
||||
const char *dlsym_init_error = dlerror();
|
||||
if (dlsym_init_error) {
|
||||
sprintf(errbuf, "unable to find init symbol: %s", dlsym_init_error);
|
||||
dlclose(handle);
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_dlib_makeDeviceTick_t _dlib_makeDeviceTick = (_dlib_makeDeviceTick_t)(uintptr_t)dlsym(handle, "makeDeviceTick");
|
||||
|
||||
|
||||
const char *dlsym_maketick_error = dlerror();
|
||||
if (dlsym_maketick_error) {
|
||||
sprintf(errbuf, "unable to find makeDeviceTick symbol: %s", dlsym_maketick_error);
|
||||
dlclose(handle);
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
_dlib_parseSpecsFromConfig_t _dlib_parseSpecsFromConfig = (_dlib_parseSpecsFromConfig_t)(uintptr_t)dlsym(handle, "parseSpecsFromConfig");
|
||||
|
||||
const char *_dlib_parseSpecsFromConfig_error = dlerror();
|
||||
if (_dlib_parseSpecsFromConfig_error) {
|
||||
sprintf(errbuf, "unable to find parseSpecsFromConfig symbol: %s", _dlib_parseSpecsFromConfig_error);
|
||||
dlclose(handle);
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
_dlib_fillSmartReadSpecs_t _dlib_fillSmartReadSpecs = (_dlib_fillSmartReadSpecs_t)(uintptr_t)dlsym(handle, "fillSmartReadSpecs");
|
||||
|
||||
const char *_dlib_fillSmartReadSpecs_error = dlerror();
|
||||
if (_dlib_fillSmartReadSpecs_error) {
|
||||
sprintf(errbuf, "unable to find fillSmartReadSpecs symbol: %s", _dlib_fillSmartReadSpecs_error);
|
||||
dlclose(handle);
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
_dlib_fillSmartWriteSpecs_t _dlib_fillSmartWriteSpecs = (_dlib_fillSmartWriteSpecs_t)(uintptr_t)dlsym(handle, "fillSmartWriteSpecs");
|
||||
|
||||
const char *_dlib_fillSmartWriteSpecs_error = dlerror();
|
||||
if (_dlib_fillSmartWriteSpecs_error) {
|
||||
sprintf(errbuf, "unable to find fillSmartWriteSpecs symbol: %s", _dlib_fillSmartWriteSpecs_error);
|
||||
dlclose(handle);
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
_dlib_deviceType_t _dlib_deviceType = (_dlib_deviceType_t)(uintptr_t)dlsym(handle, "pubDeviceType");
|
||||
|
||||
const char *dlib_deviceType_error = dlerror();
|
||||
if (dlib_deviceType_error) {
|
||||
sprintf(errbuf, "unable to find pubDeviceType symbol: %s", dlib_deviceType_error);
|
||||
dlclose(handle);
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
_dlib_freeSpecs_t _dlib_freeSpecs = (_dlib_freeSpecs_t)(uintptr_t)dlsym(handle, "freeDevSpecs");
|
||||
|
||||
const char *dlib_freeSpecs_error = dlerror();
|
||||
if (dlib_freeSpecs_error) {
|
||||
sprintf(errbuf, "unable to find freeSpecs symbol: %s", dlib_freeSpecs_error);
|
||||
dlclose(handle);
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
_dlib_freeDevMem_t _dlib_freeDevMem = (_dlib_freeDevMem_t)(uintptr_t)dlsym(handle, "freeDevSpecs");
|
||||
|
||||
const char *dlib_freeDevMem_error = dlerror();
|
||||
if (dlib_freeDevMem_error) {
|
||||
sprintf(errbuf, "unable to find freeDevMem symbol: %s", dlib_freeDevMem_error);
|
||||
dlclose(handle);
|
||||
free(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dev->devContext = NULL;
|
||||
dev->init = _dlib_dev_init;
|
||||
dev->makeDeviceTick = _dlib_makeDeviceTick;
|
||||
dev->parseSpecsFromConfig = _dlib_parseSpecsFromConfig;
|
||||
dev->fillSmartReadSpecs = _dlib_fillSmartReadSpecs;
|
||||
dev->fillSmartWriteSpecs = _dlib_fillSmartWriteSpecs;
|
||||
dev->freeSpecs = _dlib_freeSpecs;
|
||||
dev->freeDevMem = _dlib_freeDevMem;
|
||||
|
||||
uint8_t devType = _dlib_deviceType();
|
||||
|
||||
dev->devType = devType;
|
||||
|
||||
if (devType == EXTENDED_DEVICE_TYPE_DUMMY)
|
||||
{
|
||||
dev->extendedHandlers = NULL;
|
||||
}
|
||||
else if (devType == EXTENDED_DEVICE_TYPE_INSTR_SIMUL)
|
||||
{
|
||||
dev->extendedHandlers = _fillInstructionSimul(handle);
|
||||
if (dev->extendedHandlers == NULL)
|
||||
{
|
||||
free(dev);
|
||||
dlclose(handle);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
free(dev);
|
||||
dlclose(handle);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dev->_dlhandl = handle;
|
||||
|
||||
return dev;
|
||||
}
|
||||
Reference in New Issue
Block a user