/* *********************************************************************** */ /* APU API Implementation */ /* */ /* $Id: t32apu.c 119760 2020-04-15 07:44:51Z jboch $ */ /* $LastChangedRevision: 119760 $ */ /* $LastChangedBy: jboch $ */ /* */ /* (c) Lauterbach GmbH */ /* http://www.lauterbach.com/ */ /* */ /* Documentation: pdf/api_apu.pdf. */ /* *********************************************************************** */ #include "t32apu.h" /************************************************************************** APU entry **************************************************************************/ int APU_EXPORT APUAPI APU_Interface(apuContext context, apuCallbackStruct * cbs) { int result; #if APU_ARCHITECTURE_WIDTH == 8 cbs->x.init.argpword = cbs->x.init.argpword64; cbs->x.init.argpaddress = cbs->x.init.argpaddress64; #else cbs->x.init.argpword = cbs->x.init.argpword32; cbs->x.init.argpaddress = cbs->x.init.argpaddress32; #endif result = APU_Init(context, cbs); /* report our version back to TRACE32 */ cbs->x.init.version = APU_VERSION; return result; } /************************************************************************** Generic configuration functions **************************************************************************/ void APUAPI APU_Printf(apuContext context, const char *format, ...) { va_list ap; va_start(ap, format); (*((apuInfo *) context)->printf) (context, format, ap); va_end(ap); } void APUAPI APU_Warning(apuContext context, const char *format, ...) { va_list ap; va_start(ap, format); (*((apuInfo *) context)->warning) (context, format, ap); va_end(ap); } void APUAPI APU_DefineEndianess(apuContext context, int endianess) { (*((apuInfo *) context)->defineEndianess) (context, endianess); } void APUAPI APU_DefineMemory(apuContext context, int id, const char * name, int width, int flags) { (*((apuInfo *) context)->defineMemory) (context, id, name, width, flags); } void APUAPI APU_DefineSoftbreak(apuContext context, int width, const unsigned char * data) { (*((apuInfo *) context)->defineSoftbreak) (context, width, data); } int APUAPI APU_GetSymbol(apuContext context, const char * name, apuWord * paddress, int * pflags) { if ((*((apuInfo *) context)->getSymbol) == 0) return APU_FAIL; return (*((apuInfo *) context)->getSymbol) (context, name, paddress, pflags, APU_ARCHITECTURE_WIDTH); } /************************************************************************** Callback register functions **************************************************************************/ void * APUAPI APU_RegisterCommandCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerCommandCallback) (context, func, proprietary); } void * APUAPI APU_RegisterGetStateCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerGetStateCallback)(context, func, proprietary); } void * APUAPI APU_RegisterResetCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerResetCallback)(context, func, proprietary); } void * APUAPI APU_RegisterExitCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerExitCallback)(context, func, proprietary); } void * APUAPI APU_RegisterStepCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerStepCallback)(context, func, proprietary); } void * APUAPI APU_RegisterGoCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerGoCallback)(context, func, proprietary); } void * APUAPI APU_RegisterBreakCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerBreakCallback)(context, func, proprietary); } void * APUAPI APU_RegisterMemoryReadCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerReadMemoryCallback)(context, func, proprietary, APU_ARCHITECTURE_WIDTH); } void * APUAPI APU_RegisterMemoryWriteCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerWriteMemoryCallback)(context, func, proprietary, APU_ARCHITECTURE_WIDTH); } void * APUAPI APU_RegisterDisassemblerCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary, int mininstlen, int maxinstlen) { return (*((apuInfo *) context)->registerDisassemblerCallback)(context, func, proprietary, mininstlen, maxinstlen, APU_ARCHITECTURE_WIDTH); } void * APUAPI APU_RegisterSteppingCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerSteppingCallback)(context, func, proprietary, APU_ARCHITECTURE_WIDTH); } void * APUAPI APU_RegisterAssemblerCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { if ((*((apuInfo *) context)->registerAssemblerCallback) == 0) return (void *) 0; return (*((apuInfo *) context)->registerAssemblerCallback)(context, func, proprietary, APU_ARCHITECTURE_WIDTH); } void * APUAPI APU_RegisterTranslateCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary) { return (*((apuInfo *) context)->registerTranslateCallback)(context, func, proprietary, APU_ARCHITECTURE_WIDTH); } void * APUAPI APU_RegisterBreakpointCallback(apuContext context, apuCallbackFunctionPtr func, apuPtr proprietary, int bptypes) { return (*((apuInfo *) context)->registerBreakpointCallback)(context, func, proprietary, bptypes, APU_ARCHITECTURE_WIDTH); } /************************************************************************** Memory and target access functions **************************************************************************/ int APUAPI APU_GetState(apuContext context, int * pstate) { return (*((apuInfo *) context)->getState) (context, pstate); } int APUAPI APU_ReadMemory(apuContext context, apuWord address, int flags, unsigned char * pdata, int size, int width) { #if APU_ARCHITECTURE_WIDTH == 8 return (*((apuInfo *) context)->readMemory64) (context, address, flags, pdata, size, width); #else return (*((apuInfo *) context)->readMemory32) (context, address, flags, pdata, size, width); #endif } int APUAPI APU_WriteMemory(apuContext context, apuWord address, int flags, unsigned char * pdata, int size, int width) { #if APU_ARCHITECTURE_WIDTH == 8 return (*((apuInfo *) context)->writeMemory64) (context, address, flags, pdata, size, width); #else return (*((apuInfo *) context)->writeMemory32) (context, address, flags, pdata, size, width); #endif } int APUAPI APU_ExecuteCommand(apuContext context, char * cmdline) { return (*((apuInfo *) context)->executeCommand) (context, cmdline); }