T32: Updated to recent T32 API.

This commit is contained in:
Martin Hoffmann
2013-03-05 17:29:48 +01:00
parent 4686c27d3d
commit 010137cf54
6 changed files with 772 additions and 426 deletions

View File

@ -1,8 +1,6 @@
/**************************************************************** /****************************************************************
* * * *
* Copyright notice: * * Copyright by Lauterbach GmbH *
* *
* Lauterbach Datentechnik GmbH *
* Alle Rechte vorbehalten - All rights reserved * * Alle Rechte vorbehalten - All rights reserved *
* * * *
***************************************************************** *****************************************************************
@ -16,6 +14,11 @@
#include "t32.h" #include "t32.h"
#if defined(_MSC_VER)
# pragma warning( push )
# pragma warning( disable : 4255 )
#endif
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -36,6 +39,10 @@ typedef int socklen_t;
# include <netdb.h> # include <netdb.h>
# include <in.h> # include <in.h>
# define DONT_USE_ASYNC # define DONT_USE_ASYNC
# define fd_set int
# define FD_ZERO(fdset) (*fdset = 0)
# define FD_SET(fd,fdset) (*fdset |= (1<<(fd)))
# define FD_ISSET(fd,fdset) (*fdset & (1<<(fd)))
#endif #endif
#ifdef __linux__ #ifdef __linux__
@ -49,7 +56,6 @@ typedef int socklen_t;
# include <sys/select.h> # include <sys/select.h>
#endif #endif
#ifdef UNIX_V #ifdef UNIX_V
# include <fcntl.h> # include <fcntl.h>
# include <unistd.h> # include <unistd.h>
@ -58,7 +64,7 @@ typedef int socklen_t;
# include <sys/socket.h> # include <sys/socket.h>
# include <netinet/in.h> # include <netinet/in.h>
# include <netdb.h> # include <netdb.h>
# ifdef HP_UX # if defined(T32HOST_HPUX) || defined(HP_UX)
typedef int socklen_t; typedef int socklen_t;
# else # else
# include <sys/select.h> # include <sys/select.h>
@ -74,9 +80,13 @@ typedef int socklen_t;
# include <inet/netdb.h> # include <inet/netdb.h>
#endif #endif
#if defined(_MSC_VER)
# pragma warning( pop )
#endif
#define PCKLEN_MAX 1472 /* maximum size of UDP-packet */ #define PCKLEN_MAX 1472 /* maximum size of UDP-packet */
#define BUFLEN_MIN 6000 #define BUFLEN_MIN 6000 /* !!! keep in sync with hassist.c remoteapi !!! */
#ifndef MS_WINDOWS #ifndef MS_WINDOWS
# ifndef UNIX_V # ifndef UNIX_V
@ -84,13 +94,6 @@ extern struct hostent * gethostbyaddr();
# endif # endif
#endif #endif
#ifdef DEC_VMS
# define fd_set int
# define FD_ZERO(fdset) (*fdset = 0)
# define FD_SET(fd,fdset) (*fdset |= (1<<(fd)))
# define FD_ISSET(fd,fdset) (*fdset & (1<<(fd)))
#endif
#if defined(DEC_VMS) || defined(MS_WINDOWS) || defined(OS_9) || defined(LINUX) #if defined(DEC_VMS) || defined(MS_WINDOWS) || defined(OS_9) || defined(LINUX)
# define RECEIVEADDR (&ReceiveSocketAddress) # define RECEIVEADDR (&ReceiveSocketAddress)
static struct sockaddr ReceiveSocketAddress; static struct sockaddr ReceiveSocketAddress;
@ -99,7 +102,7 @@ static struct sockaddr ReceiveSocketAddress;
#endif #endif
struct LineStruct { typedef struct LineStruct_s {
char NodeName[80]; /* node name of host running T32 SW */ char NodeName[80]; /* node name of host running T32 SW */
int CommSocket; /* socket for communication */ int CommSocket; /* socket for communication */
unsigned short HostPort; /* Host side port */ unsigned short HostPort; /* Host side port */
@ -114,8 +117,8 @@ struct LineStruct {
unsigned short LastReceiveSeq, LastTransmitSeq; unsigned short LastReceiveSeq, LastTransmitSeq;
unsigned char* LastTransmitBuffer; unsigned char* LastTransmitBuffer;
int LastTransmitSize; int LastTransmitSize;
struct sockaddr_in SocketAddress; struct sockaddr_in SocketAddress;
}; } LineStruct;
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
extern void T32_InstallAsyncSelect(HWND hwnd, int msg); extern void T32_InstallAsyncSelect(HWND hwnd, int msg);
@ -353,8 +356,7 @@ void LINE_LineExit(void)
if (line->CommSocket != -1) { if (line->CommSocket != -1) {
for (i = 0; i < 5; i++) for (i = 0; i < 5; i++)
sendto(line->CommSocket, (char *) discon, 16, 0, sendto(line->CommSocket, (char *) discon, 16, 0, (struct sockaddr *) &(line->SocketAddress), sizeof(line->SocketAddress)); /* send EXIT 4 */
(struct sockaddr *) &(line->SocketAddress), sizeof(line->SocketAddress));
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
closesocket(line->CommSocket); closesocket(line->CommSocket);
@ -403,7 +405,7 @@ int LINE_LineInit(char * message)
line->SocketAddress.sin_port = line->HostPort; /* Port can be determined by line->SocketAddress.sin_port = line->HostPort; /* Port can be determined by
* host */ * host */
if ((line->CommSocket = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { if ((line->CommSocket = (int)socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
strcpy(message, "cannot create socket"); strcpy(message, "cannot create socket");
WinsockErrorMessage(message); WinsockErrorMessage(message);
goto done; goto done;
@ -527,41 +529,51 @@ int LINE_LineTransmit(unsigned char * in, int size)
{ {
int packetSize; int packetSize;
unsigned int tmpl; unsigned int tmpl;
int result;
unsigned int bytesTransmitted = 0;
LineStruct* line = pLineParams; LineStruct* line = pLineParams;
unsigned char receivebuffer[HANDSHAKE_RECEIVEBUFFERSIZE];
line->LastTransmitBuffer = in; line->LastTransmitBuffer = in;
line->LastTransmitSize = size; line->LastTransmitSize = size;
line->LastTransmitSeq = line->TransmitSeq; line->LastTransmitSeq = line->TransmitSeq;
in -= 4; /* space for packet header */ in -= 4; /* space for packet header */
/* Assumed that Host SocketReceivebuffersize is 6000 (see hassist.c) */
do { do {
packetSize = (size > line->PacketSize - 4) ? line->PacketSize - 4 : size; packetSize = (size > line->PacketSize - 4) ? line->PacketSize - 4 : size;
/* When sending multiple packets, the packet header is written inside the /* When sending multiple packets, the packet header is written inside the
message's payload. Original contents needs to be saved/restored */ message's payload. Original contents needs to be saved/restored */
SETLONGVAR(tmpl, in[0]); /* save */ SETLONGVAR(tmpl, in[0]); /* save */
in[0] = 0x11; /* transmit data package */ in[0] = 0x11; /* transmit data package */
in[1] = (size > packetSize) ? 1 : 0; /* more packets follow */ in[1] = (size > packetSize) ? 1 : 0; /* more packets follow */
SETWORDVAR(in[2], line->TransmitSeq); /* packet sequence ID */ SETWORDVAR(in[2], line->TransmitSeq); /* packet sequence ID */
if (sendto(line->CommSocket, if (sendto( line->CommSocket, (char *) in, packetSize + 4, 0, (struct sockaddr *) & line->SocketAddress, sizeof(line->SocketAddress) ) != packetSize + 4) { /* send Data Package 0x11 */
(char *) in, SETLONGVAR(in[0], tmpl); /* restore buffer */
packetSize + 4, 0, return 0;
(struct sockaddr *) & line->SocketAddress, sizeof(line->SocketAddress) }
) != packetSize + 4) { bytesTransmitted += packetSize + 4;
if( (bytesTransmitted + line->PacketSize) > BUFLEN_MIN ) {
socklen_t length;
SETLONGVAR(in[0], tmpl); /* restore buffer */ length=sizeof(struct sockaddr);
return 0;
}
SETLONGVAR(in[0], tmpl); /* restore buffer */
line->TransmitSeq++; if( (result = recvfrom(line->CommSocket, (char *)receivebuffer, 1, 0, (struct sockaddr *) RECEIVEADDR, &length)) < 0) {
in += packetSize; return -1;
size -= packetSize; }
}
SETLONGVAR(in[0], tmpl); /* restore buffer */
line->TransmitSeq++;
in += packetSize;
size -= packetSize;
} }
while (size > 0); /* more packets required? */ while (size > 0); /* more packets required? */
return line->LastTransmitSize; return line->LastTransmitSize;
} }
@ -602,7 +614,7 @@ retry:
if (i == 0) { if (i == 0) {
if (endpoll) { if (endpoll) {
if (GetCurrentTime() < endpoll) { if (GetCurrentTime() < endpoll) {
ScreenDispatcher(line->CommSocket); ScreenDispatcher();
goto retry; goto retry;
} }
} }
@ -616,7 +628,7 @@ retry:
return i; return i;
} }
length = sizeof(struct sockaddr); length = sizeof(struct sockaddr);
return recvfrom(line->CommSocket, dest, size, 0, (struct sockaddr *) RECEIVEADDR, &length); return recvfrom(line->CommSocket, (char *)dest, size, 0, (struct sockaddr *) RECEIVEADDR, &length);
} }
@ -667,6 +679,12 @@ retry:
goto retry; goto retry;
return -1; return -1;
} }
/* we got a handshakepackage */
if( (i == 1) && (dest[0] == '+') )
{
goto retry;
}
if (i <= 4) { if (i <= 4) {
return -1; return -1;
} }
@ -677,7 +695,7 @@ retry:
{ {
T32_NotificationPackage *newPackage, *oldHead; T32_NotificationPackage *newPackage, *oldHead;
newPackage = reinterpret_cast<T32_NotificationPackage*>( malloc(sizeof(T32_NotificationPackage)) ); newPackage = (T32_NotificationPackage *)malloc(sizeof(T32_NotificationPackage));
if (newPackage==NULL) if (newPackage==NULL)
return -1; return -1;
@ -716,8 +734,7 @@ retry:
return -1; return -1;
} }
if (flag == 2) { if (flag == 2) {
if (sendto(line->CommSocket, (char *) handshake, 16, 0, if (sendto(line->CommSocket, (char *) handshake, 16, 0, (struct sockaddr *) &line->SocketAddress, sizeof(line->SocketAddress)) != 16) { /* send Handshake 7 */
(struct sockaddr *) &line->SocketAddress, sizeof(line->SocketAddress)) != 16) {
return -1; return -1;
} }
} }
@ -788,8 +805,7 @@ retry:
SETWORDCONST(packet[6], 0); SETWORDCONST(packet[6], 0);
strcpy((char *) (packet + 8), magicPattern); strcpy((char *) (packet + 8), magicPattern);
if (sendto(line->CommSocket, (char *) packet, 16 /*size*/, 0, if (sendto(line->CommSocket, (char *) packet, 16 /*size*/, 0, (struct sockaddr *) & line->SocketAddress, sizeof(line->SocketAddress)) == -1) { /* Send SyncReq 2 */
(struct sockaddr *) & line->SocketAddress, sizeof(line->SocketAddress)) == -1) {
return -1; return -1;
} }
while (1) { /* empty queue */ while (1) { /* empty queue */
@ -818,7 +834,7 @@ retry:
SETWORDCONST(packet[6], 0); SETWORDCONST(packet[6], 0);
strcpy((char *) (packet + 8), magicPattern); strcpy((char *) (packet + 8), magicPattern);
if (sendto(line->CommSocket, (char *) packet, 16, 0, (struct sockaddr *) & line->SocketAddress, sizeof(line->SocketAddress)) == -1) { if (sendto(line->CommSocket, (char *) packet, 16, 0, (struct sockaddr *) & line->SocketAddress, sizeof(line->SocketAddress)) == -1) { /* Send SyncBack 0x22 */
return -1; return -1;
} }
return 1; return 1;
@ -844,7 +860,7 @@ static int Connection(unsigned char *ipaddrused)
strcpy((char *) (buffer + 8), magicPattern); strcpy((char *) (buffer + 8), magicPattern);
if (sendto(line->CommSocket, (char *) buffer, line->PacketSize, 0, (struct sockaddr *) & line->SocketAddress, sizeof(line->SocketAddress)) == -1) { if (sendto(line->CommSocket, (char *) buffer, line->PacketSize, 0, (struct sockaddr *) & line->SocketAddress, sizeof(line->SocketAddress)) == -1) { /* send ConnectReq 3 */
return 0; return 0;
} }
if ((i = ReceiveWithTimeout(&LongTime, buffer, line->PacketSize)) <= 0) { if ((i = ReceiveWithTimeout(&LongTime, buffer, line->PacketSize)) <= 0) {
@ -879,4 +895,14 @@ static int Connection(unsigned char *ipaddrused)
} }
/* .NET helpers: additional functions to interface managed and unmanaged memory */
#ifdef __cplusplus
extern "C" void *LINE_AllocNewChannel()
{
return malloc(sizeof(LineStruct));
}
extern "C" void LINE_FreeAllocChannel(void * p)
{
free(p);
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -52,6 +52,12 @@ namespace fail {
void showDataRegions(void) const { showMemoryRegions(m_data_memory_map); }; void showDataRegions(void) const { showMemoryRegions(m_data_memory_map); };
void showProgramRegions(void) const { showMemoryRegions(m_program_memory_map); }; void showProgramRegions(void) const { showMemoryRegions(m_program_memory_map); };
/**
* @brief Start real time emulation
*/
void go(void);
void brk(void);
void test(void);
private: private:
const char* m_hostname; //!< The hostname of the T32 device const char* m_hostname; //!< The hostname of the T32 device
const char* m_port; //!< The port to connect as configure in config.t32. Here we use strings, as required by the API const char* m_port; //!< The port to connect as configure in config.t32. Here we use strings, as required by the API

View File

@ -1,35 +1,45 @@
#ifndef __T32_H__ #ifndef __T32_H__
#define __T32_H__ #define __T32_H__
#include <config/VariantConfig.hpp> #if defined(_WIN32) || defined(_WIN64) /* Microsoft Visual C++ or GCC-MinGW ? */
# ifndef MS_WINDOWS
#if defined WIN32 || defined WIN64 # define MS_WINDOWS
#ifndef MS_WINDOWS # endif
#define MS_WINDOWS # define LOW_HIGH
# ifndef _CRT_SECURE_NO_WARNINGS
# define _CRT_SECURE_NO_WARNINGS /* aBi - eliminate pesky deprecation warnings for older routines */
# endif
#endif #endif
#define LOW_HIGH
#if defined(MS_WINDOWS) && defined(DLL_BUILD)
# define T32EXTERN __declspec(dllexport)
# define T32EXPORT __declspec(dllexport)
#else
# define T32EXTERN extern
# define T32EXPORT
#endif #endif
#ifdef DEC_VMS #ifdef DEC_VMS
#define LOW_HIGH_BYTE # define LOW_HIGH_BYTE
#endif #endif
#ifdef DEC_OSF1 #ifdef DEC_OSF1
#define UNIX_V # define UNIX_V
#define LOW_HIGH_BYTE # define LOW_HIGH_BYTE
#endif #endif
#ifdef HP_UX #if defined(T32HOST_HPUX) || defined(HP_UX)
#define UNIX_V # define UNIX_V
#define HIGH_LOW_BYTE # define HIGH_LOW_BYTE
#endif #endif
#ifdef IBM_AIX #ifdef IBM_AIX
#define UNIX_V # define UNIX_V
#define HIGH_LOW_BYTE # define HIGH_LOW_BYTE
#endif #endif
#ifdef __linux__
#if defined(T32HOST_LINUX_X86) || defined(LINUX_86) || defined(__linux__)
# ifndef LINUX # ifndef LINUX
# define LINUX # define LINUX
# endif # endif
@ -42,7 +52,7 @@
# define LOW_HIGH_BYTE # define LOW_HIGH_BYTE
#endif #endif
#ifdef LINUX_PPC #if defined(T32HOST_LINUX_PPC) || defined(LINUX_PPC)
# ifndef LINUX # ifndef LINUX
# define LINUX # define LINUX
# endif # endif
@ -55,9 +65,9 @@
# define LOW_HIGH_BYTE # define LOW_HIGH_BYTE
#endif #endif
#ifdef SUN_SOL #if defined(T32HOST_SOL_SPARC) || defined(SUN_SOL)
#define UNIX_V # define UNIX_V
#define HIGH_LOW_BYTE # define HIGH_LOW_BYTE
#endif #endif
@ -137,9 +147,9 @@ typedef unsigned int dword;
* safely, otherwise we run into hard-to-debug problems with type-promotion and * safely, otherwise we run into hard-to-debug problems with type-promotion and
* parameter-passing conventions on the varying platforms we support. * parameter-passing conventions on the varying platforms we support.
*/ */
extern void T32_callbackBreak(int generic); extern void T32_callbackBreak(int gen_var);
extern void T32_callbackEditExtern(int generic, int lineNr, unsigned char *fileName); extern void T32_callbackEditExtern(int gen_var, int lineNr, unsigned char *fileName);
extern void T32_callbackBreakpointConfig(int generic); extern void T32_callbackBreakpointConfig(int gen_var);
#define T32_API_RECEIVE 0x1 #define T32_API_RECEIVE 0x1
@ -153,14 +163,21 @@ extern void T32_callbackBreakpointConfig(int generic);
#define T32_PCKLEN_MAX 1472 #define T32_PCKLEN_MAX 1472
typedef struct t32_breakpoint {
dword address;
byte enabled;
dword type;
dword auxtype;
} T32_Breakpoint;
typedef struct t32_notification { typedef struct t32_notification {
char payload[T32_PCKLEN_MAX]; /* maximum packet size*/ char payload[T32_PCKLEN_MAX]; /* maximum packet size*/
struct t32_notification *next, *prev; struct t32_notification *next, *prev;
/* T32_NotificationPackage *next; /* T32_NotificationPackage *next;
T32_NotificationPackage *prev; */ T32_NotificationPackage *prev; */
} T32_NotificationPackage; } T32_NotificationPackage;
@ -168,18 +185,20 @@ extern T32_NotificationPackage *T32_NotificationHead, *T32_NotificationTail; /*
#define T32_OK 0
#define T32_COM_RECEIVE_FAIL -1 #define T32_COM_RECEIVE_FAIL -1
#define T32_COM_TRANSMIT_FAIL -2 #define T32_COM_TRANSMIT_FAIL -2
#define T32_COM_PARA_FAIL -3 #define T32_COM_PARA_FAIL -3
#define T32_COM_SEQ_FAIL -4 #define T32_COM_SEQ_FAIL -4
#define T32_MAX_EVENT_FAIL -5 #define T32_MAX_EVENT_FAIL -5
#define T32_MALLOC_FAIL -6 #define T32_MALLOC_FAIL -6
typedef void * T32_TAPACCESS_HANDLE; typedef void * T32_TAPACCESS_HANDLE;
#define T32_TAPACCESS_MAXBITS 0x3b00 /* limited command size through hardcoded buffersizes on host and driver side */
#define EMU_CBMAXDATASIZE 0x3c00
#define T32_TAPACCESS_MAXBITS EMU_CBMAXDATASIZE * 8
#define T32_TAPACCESS_RELEASE ((T32_TAPACCESS_HANDLE)0) #define T32_TAPACCESS_RELEASE ((T32_TAPACCESS_HANDLE)0)
#define T32_TAPACCESS_HOLD ((T32_TAPACCESS_HANDLE)1) #define T32_TAPACCESS_HOLD ((T32_TAPACCESS_HANDLE)1)
@ -211,6 +230,9 @@ typedef void * T32_TAPACCESS_HANDLE;
#define T32_TAPACCESS_SLEEP_HALF_CLOCK 0x7e #define T32_TAPACCESS_SLEEP_HALF_CLOCK 0x7e
#define T32_TAPACCESS_SLEEP T32_TAPACCESS_SLEEP_MS /*just for backwards compatibility*/ #define T32_TAPACCESS_SLEEP T32_TAPACCESS_SLEEP_MS /*just for backwards compatibility*/
#define HANDSHAKE_RECEIVEBUFFERSIZE 20
#define T32_TAPACCESSSEND_HEADERSIZE 6
#define SHIFTRAW_HEADERSIZE_BITS 8*8
#define SHIFTRAW_OPTION_INTERNAL_TMS 0x0001 /*do not use the internal options*/ #define SHIFTRAW_OPTION_INTERNAL_TMS 0x0001 /*do not use the internal options*/
#define SHIFTRAW_OPTION_INTERNAL_TDI 0x0002 #define SHIFTRAW_OPTION_INTERNAL_TDI 0x0002
@ -233,102 +255,123 @@ extern "C" {
#ifndef _NO_PROTO #ifndef _NO_PROTO
extern int T32_Config( const char *, const char * ); extern T32EXPORT int T32_Errno;
extern int T32_Init(void); T32EXTERN int T32_Config( const char *, const char * );
extern int T32_Exit(void); T32EXTERN int T32_Init(void);
extern int T32_Nop(void); T32EXTERN int T32_Exit(void);
extern int T32_NopFail(void); T32EXTERN int T32_Nop(void);
extern int T32_Ping(void); T32EXTERN int T32_NopFail(void);
extern int T32_Stop(void); T32EXTERN int T32_Ping(void);
extern int T32_GetPracticeState(int * ); T32EXTERN int T32_Stop(void);
extern int T32_Attach( int ); T32EXTERN int T32_GetPracticeState(int * );
extern int T32_GetState( int * ); T32EXTERN int T32_Attach( int );
extern int T32_GetCpuInfo( char **, word *, word *, word * ); T32EXTERN int T32_GetState( int * );
extern int T32_GetRam(dword *, dword *, word *); T32EXTERN int T32_GetCpuInfo( char **, word *, word *, word * );
extern int T32_ResetCPU(void); T32EXTERN int T32_GetRam(dword *, dword *, word *);
T32EXTERN int T32_ResetCPU(void);
extern int T32_WriteMemory( dword, int, byte * , int ); T32EXTERN int T32_ReadMemory ( dword address, int access, byte * buffer, int size);
extern int T32_WriteMemoryPipe( dword, int, byte * , int ); T32EXTERN int T32_WriteMemory ( dword address, int access, byte * buffer, int size);
extern int T32_WriteMemoryEx( dword, int, int, int, byte * , int ); T32EXTERN int T32_WriteMemoryPipe ( dword address, int access, byte * buffer, int size);
extern int T32_ReadMemory( dword, int, byte *, int ); T32EXTERN int T32_ReadMemoryEx ( dword address, int segment, int access, int attr, byte * buffer, int size);
extern int T32_ReadMemoryEx( dword, int, int, int, byte * , int ); T32EXTERN int T32_WriteMemoryEx ( dword address, int segment, int access, int attr, byte * buffer, int size);
#define T32_MEMORY_ACCESS_DATA 0x0000 /* Memory access modes used with T32_ReadMemory, T32_WriteMemory, T32_ReadMemoryEx and T32_WriteMemoryEx */
#define T32_MEMORY_ACCESS_PROGRAM 0x0001 #define T32_MEMORY_ACCESS_DATA 0x0000
#define T32_MEMORY_ACCESS_ARM_CP0 0x0002 #define T32_MEMORY_ACCESS_PROGRAM 0x0001
#define T32_MEMORY_ACCESS_ARM_ICE 0x0003 #define T32_MEMORY_ACCESS_ARM_CP0 0x0002
#define T32_MEMORY_ACCESS_ARM_ETM 0x0004 #define T32_MEMORY_ACCESS_ARM_ICE 0x0003
#define T32_MEMORY_ACCESS_ARM_CP14 0x0005 #define T32_MEMORY_ACCESS_ARM_ETM 0x0004
#define T32_MEMORY_ACCESS_ARM_CP15 0x0006 #define T32_MEMORY_ACCESS_ARM_CP14 0x0005
#define T32_MEMORY_ACCESS_ARM_ARM 0x0007 #define T32_MEMORY_ACCESS_ARM_CP15 0x0006
#define T32_MEMORY_ACCESS_ARM_THUMB 0x0008 #define T32_MEMORY_ACCESS_ARM_ARM 0x0007
#define T32_MEMORY_ACCESS_ARM_PHYSICAL_ARM 0x0009 #define T32_MEMORY_ACCESS_ARM_THUMB 0x0008
#define T32_MEMORY_ACCESS_ARM_PHYSICAL_THUMB 0x000a #define T32_MEMORY_ACCESS_ARM_PHYSICAL_ARM 0x0009
#define T32_MEMORY_ACCESS_ARM_ETB 0x000b #define T32_MEMORY_ACCESS_ARM_PHYSICAL_THUMB 0x000a
#define T32_MEMORY_ACCESS_ARM_PHYSICAL_DATA 0x000c #define T32_MEMORY_ACCESS_ARM_ETB 0x000b
#define T32_MEMORY_ACCESS_ARM_PHYSICAL_PROGRAM 0x000d #define T32_MEMORY_ACCESS_ARM_PHYSICAL_DATA 0x000c
#define T32_MEMORY_ACCESS_ARM_DAP 0x000e #define T32_MEMORY_ACCESS_ARM_PHYSICAL_PROGRAM 0x000d
#define T32_MEMORY_ACCESS_ARM_USR 0x000f #define T32_MEMORY_ACCESS_ARM_DAP 0x000e
#define T32_MEMORY_ACCESS_ARM_USR 0x000f
#define T32_MEMORY_ACCESS_MMUBYPASS 0x8000 /* T32_ReadMemoryEx and T32_WriteMemoryEx only */
#define T32_MEMORY_ATTR_WIDTHMASK 0x000f /* Attributes used with T32_ReadMemoryEx and T32_WriteMemoryEx */
#define T32_MEMORY_ATTR_DUALPORT 0x0400 #define T32_MEMORY_ATTR_WIDTHMASK 0x000f
#define T32_MEMORY_ATTR_NOINCREMENT 0x4000 #define T32_MEMORY_ATTR_DUALPORT 0x0400 // 0x0020 ???
#define T32_MEMORY_ATTR_NOINCREMENT 0x4000
extern int T32_WriteRegister( dword, dword, dword * ); T32EXTERN int T32_WriteRegister( dword, dword, dword * );
extern int T32_ReadRegister( dword, dword, dword * ); T32EXTERN int T32_ReadRegister( dword, dword, dword * );
extern int T32_ReadPP( dword * ); T32EXTERN int T32_ReadRegisterByName( char *, dword *, dword *);
extern int T32_WriteBreakpoint( dword, int, int, int ); T32EXTERN int T32_ReadPP( dword * );
extern int T32_ReadBreakpoint( dword, int, word * , int ); T32EXTERN int T32_WriteBreakpoint( dword, int, int, int );
extern int T32_Step(void); T32EXTERN int T32_ReadBreakpoint( dword, int, word * , int );
extern int T32_StepMode(int); T32EXTERN int T32_GetBreakpointList( int *, T32_Breakpoint*, int );
extern int T32_SetMode(int); T32EXTERN int T32_Step(void);
extern int T32_Go(void); T32EXTERN int T32_StepMode(int);
extern int T32_Break(void); T32EXTERN int T32_SetMode(int);
extern int T32_Terminate(int retval); T32EXTERN int T32_Go(void);
extern int T32_Cmd( char * ); T32EXTERN int T32_Break(void);
extern int T32_CmdWin( dword, char * ); T32EXTERN int T32_Terminate(int retval);
extern int T32_EvalGet ( dword * ); T32EXTERN int T32_Cmd( char * );
extern int T32_GetMessage ( char *, word * ); T32EXTERN int T32_CmdWin( dword, char * );
extern int T32_GetTriggerMessage ( char* ); T32EXTERN int T32_EvalGet ( dword * );
extern int T32_GetSymbol ( char *, dword *, dword * , dword * ); T32EXTERN int T32_GetMessage ( char *, word * );
extern int T32_GetSource ( dword, char *, dword * ); T32EXTERN int T32_GetTriggerMessage ( char* );
extern int T32_GetSelectedSource( char *, dword * ); T32EXTERN int T32_GetSymbol ( char *, dword *, dword * , dword * );
T32EXTERN int T32_GetSource ( dword, char *, dword * );
T32EXTERN int T32_GetSelectedSource( char *, dword * );
T32EXTERN int T32_ReadVariableValue ( char *, dword *, dword *);
T32EXTERN int T32_ReadVariableString ( char *, char *, int);
extern int T32_AnaStatusGet( byte *, long *, long *, long * ); T32EXTERN int T32_AnaStatusGet( byte *, long *, long *, long * );
extern int T32_AnaRecordGet( long , byte *, int ); T32EXTERN int T32_AnaRecordGet( long , byte *, int );
extern int T32_GetTraceState(int tracetype, int * state, long * size, long * min, long * max); T32EXTERN int T32_GetTraceState(int tracetype, int * state, long * size, long * min, long * max);
extern int T32_ReadTrace(int tracetype, long record, int nrecords, unsigned long mask, byte * buffer); T32EXTERN int T32_ReadTrace(int tracetype, long record, int nrecords, unsigned long mask, byte * buffer);
typedef void (*T32_NotificationCallback_i_t)(int); typedef void (*T32_NotificationCallback_i_t)(int);
typedef void (*T32_NotificationCallback_iicp_t)(int, int, unsigned char *); typedef void (*T32_NotificationCallback_iicp_t)(int, int, unsigned char *);
#ifndef SUPPRESS_FUNCTION_TYPE_WARNING #ifndef SUPPRESS_FUNCTION_TYPE_WARNING
# if defined(_MSC_VER)
# pragma warning( push )
# pragma warning( disable : 4255 )
# endif
typedef void (*T32_NotificationCallback_t)(); typedef void (*T32_NotificationCallback_t)();
# if defined(_MSC_VER)
# pragma warning( pop )
# endif
extern int T32_NotifyStateEnable( int event, T32_NotificationCallback_t func); extern int T32_NotifyStateEnable( int event, T32_NotificationCallback_t func);
#endif #endif
extern int T32_CheckStateNotify( unsigned param1); T32EXTERN int T32_CheckStateNotify( unsigned param1);
extern void T32_GetSocketHandle( int *t32soc ); T32EXTERN void T32_GetSocketHandle( int *t32soc );
extern T32_TAPACCESS_HANDLE T32_TAPAccessAlloc(void); T32EXTERN T32_TAPACCESS_HANDLE T32_TAPAccessAlloc(void);
extern int T32_TAPAccessExecute(T32_TAPACCESS_HANDLE connection, T32_TAPACCESS_HANDLE connectionhold); T32EXTERN int T32_TAPAccessExecute(T32_TAPACCESS_HANDLE connection, T32_TAPACCESS_HANDLE connectionhold);
extern int T32_TAPAccessFree(T32_TAPACCESS_HANDLE connection); T32EXTERN int T32_TAPAccessFree(T32_TAPACCESS_HANDLE connection);
extern int T32_TAPAccessSetInfo(int irpre, int irpost, int drpre, int drpost, int tristate, int tapstate, int tcklevel, int slave); T32EXTERN int T32_TAPAccessSetInfo(int irpre, int irpost, int drpre, int drpost, int tristate, int tapstate, int tcklevel, int slave);
extern int T32_TAPAccessShiftIR(T32_TAPACCESS_HANDLE connection, int numberofbits, byte * poutbits, byte * pinbits); T32EXTERN int T32_TAPAccessSetInfo2(T32_TAPACCESS_HANDLE connection, int irpre, int irpost, int drpre, int drpost, int tristate, int tapstate, int tcklevel, int slave);
extern int T32_TAPAccessShiftDR(T32_TAPACCESS_HANDLE connection, int numberofbits, byte * poutbits, byte * pinbits); T32EXTERN int T32_TAPAccessShiftIR(T32_TAPACCESS_HANDLE connection, int numberofbits, byte * poutbits, byte * pinbits);
extern int T32_TAPAccessShiftRaw(T32_TAPACCESS_HANDLE connection, int numberofbits, byte * pTMSBits, byte * pTDIBits, byte * pTDOBits, int options); T32EXTERN int T32_TAPAccessShiftDR(T32_TAPACCESS_HANDLE connection, int numberofbits, byte * poutbits, byte * pinbits);
extern int T32_TAPAccessDirect(T32_TAPACCESS_HANDLE connection, int nbytes, byte * poutbytes, byte * pinbytes); T32EXTERN int T32_TAPAccessShiftRaw(T32_TAPACCESS_HANDLE connection, int numberofbits, byte * pTMSBits, byte * pTDIBits, byte * pTDOBits, int options);
extern int T32_TAPAccessRelease(void); T32EXTERN int T32_TAPAccessDirect(T32_TAPACCESS_HANDLE connection, int nbytes, byte * poutbytes, byte * pinbytes);
T32EXTERN int T32_TAPAccessRelease(void);
T32EXTERN unsigned int T32_GetMaxRawShiftSize(unsigned int bitsToTransmit, byte* tmsbuf, byte* tdibuf, byte* tdobuf, unsigned int* options);
extern int T32_Fdx_Resolve(char * name); T32EXTERN int T32_Fdx_Resolve(char * name);
extern int T32_Fdx_Open(char * name, char * mode); T32EXTERN int T32_Fdx_Open(char * name, char * mode);
extern int T32_Fdx_Close(int channel); T32EXTERN int T32_Fdx_Close(int channel);
extern int T32_Fdx_ReceivePoll(int channel, void * data, int width, int maxsize); T32EXTERN int T32_Fdx_ReceivePoll(int channel, void * data, int width, int maxsize);
extern int T32_Fdx_Receive(int channel, void * data, int width, int maxsize); T32EXTERN int T32_Fdx_Receive(int channel, void * data, int width, int maxsize);
extern int T32_Fdx_SendPoll(int channel, void * data, int width, int size); T32EXTERN int T32_Fdx_SendPoll(int channel, void * data, int width, int size);
extern int T32_Fdx_Send(int channel, void * data, int width, int size); T32EXTERN int T32_Fdx_Send(int channel, void * data, int width, int size);
/* /*
* New stream structure, to improve performance for PIPE mode. * New stream structure, to improve performance for PIPE mode.
@ -342,25 +385,24 @@ typedef struct
unsigned char buffer[4096]; unsigned char buffer[4096];
} T32_Fdx_Stream; } T32_Fdx_Stream;
extern T32_Fdx_Stream *T32_Fdx_OpenStream(char *name, char *mode); T32EXTERN T32_Fdx_Stream *T32_Fdx_OpenStream(char *name, char *mode);
extern int T32_Fdx_CloseStream(T32_Fdx_Stream * pstream); T32EXTERN int T32_Fdx_CloseStream(T32_Fdx_Stream * pstream);
extern int T32_Fdx_ReceiveStreamNext(T32_Fdx_Stream * pstream, unsigned char *target, int width, int size); T32EXTERN int T32_Fdx_ReceiveStreamNext(T32_Fdx_Stream * pstream, unsigned char *target, int width, int size);
#define T32_Fdx_ReceiveStream(__pstream,__target,__width,__len) ( \ #define T32_Fdx_ReceiveStream(__pstream,__target,__width,__len) ( \
(((__pstream)->ptr >= (__pstream)->ptrend) ? \ (((__pstream)->ptr >= (__pstream)->ptrend) ? \
T32_Fdx_ReceiveStreamNext(__pstream,__target,__width,__len) : \ T32_Fdx_ReceiveStreamNext(__pstream,__target,__width,__len) : \
((__pstream)->blen = ((__pstream)->ptr[0]|((__pstream)->ptr[1]<<8)), memcpy((__target),(__pstream)->ptr+2,(__pstream)->blen), (__pstream)->ptr += 2+(__pstream)->blen, (__pstream)->blen))) ((__pstream)->blen = ((__pstream)->ptr[0]|((__pstream)->ptr[1]<<8)), memcpy((__target),(__pstream)->ptr+2,(__pstream)->blen), (__pstream)->ptr += 2+(__pstream)->blen, (__pstream)->blen)))
T32EXTERN int T32_GetChannelSize(void);
extern int T32_GetChannelSize(void); T32EXTERN void T32_GetChannelDefaults(void* line);
extern void T32_GetChannelDefaults(void* line); T32EXTERN void T32_SetChannel(void* line);
extern void T32_SetChannel(void* line); T32EXTERN void* T32_GetChannel0(void);
extern void* T32_GetChannel0(void);
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif
#endif

View File

@ -82,6 +82,19 @@ void T32Connector::showMemoryRegions(const memory_map_t& map) const {
} }
} }
void T32Connector::go() {
err(T32_Go());
}
void T32Connector::brk() {
err(T32_Break());
}
#include "sal/t32/T32Constants.hpp"
void T32Connector::test() {
}
/* Default T32 error handler */ /* Default T32 error handler */
bool T32Connector::err(int errornum) const { bool T32Connector::err(int errornum) const {

View File

@ -22,33 +22,37 @@
#include "optionparser_ext.hpp" #include "optionparser_ext.hpp"
#include "T32Connector.hpp" #include "T32Connector.hpp"
using namespace std; #include "t32config.hpp"
static fail::T32Connector t32; using namespace std;
using namespace fail;
static T32Connector t32;
//!< Program options //!< Program options
enum optionIndex { UNKNOWN, HELP, RUN, T32HOST, PORT, PACKLEN }; enum optionIndex { UNKNOWN, HELP, RUN, T32HOST, PORT, PACKLEN };
const option::Descriptor usage[] = const option::Descriptor usage[] =
{ {
{UNKNOWN, 0,"" , "" ,Arg::None, "USAGE: fail-client [options]\n\n" {UNKNOWN, 0,"" , "" ,Arg::None, "USAGE: fail-client [options]\n\nATTENTION:\nOnly setup TCP Port/Packlen here, if you really know what you are doing!\nIt is safer use the CMake configuration (ccmake <BUILDDIR>).\n\n"
"Options:" }, "Options:" },
{HELP, 0,"" , "help",Arg::None, " --help \tPrint usage and exit." }, {HELP, 0,"" , "help",Arg::None, " --help \tPrint usage and exit." },
{RUN, 0,"r", "run",Arg::Required, " --run, -r \tLauterbach script to startup system." }, {RUN, 0,"r", "run",Arg::Required, " --run, -r \tLauterbach script to startup system." },
{T32HOST, 0,"t", "trace32-host",Arg::Required, " --trace32-host, -t <hostname> \tHostname/IP Address of the Trace32 instance. (default: localhost)" }, {T32HOST, 0,"t", "trace32-host",Arg::Required, " --trace32-host, -t <hostname> \tHostname/IP Address of the Trace32 instance. (default: localhost)" },
{PORT, 0,"p", "port",Arg::Required, " --port <NUM>, -p <NUM> \tTCP Port. (default: 20010)" }, {PORT, 0,"p", "port",Arg::Required, " --port <NUM>, -p <NUM> \tTCP Port. (default: " T32_PORTNUM ")" },
{PACKLEN, 0,"l", "packet-length",Arg::Required, " --packet-length, -l <NUM> \tPacket length. (default: 1024)" }, {PACKLEN, 0,"l", "packet-length",Arg::Required, " --packet-length, -l <NUM> \tPacket length. (default: " T32_PACKLEN ")" },
{0,0,0,0,0,0} {0,0,0,0,0,0}
}; };
/* Here we go... */ /* Here we go... */
int main(int argc, char** argv){ int main(int argc, char** argv){
//----------------------------------------------
// Evaluate arguments // Evaluate arguments
argc-=(argc>0); argv+=(argc>0); // skip program name argv[0] if present argc-=(argc>0); argv+=(argc>0); // skip program name argv[0] if present
option::Stats stats(usage, argc, argv); option::Stats stats(usage, argc, argv);
option::Option options[stats.options_max], buffer[stats.buffer_max]; option::Option options[stats.options_max], buffer[stats.buffer_max];
option::Parser parse(usage, argc, argv, options, buffer); option::Parser parse(usage, argc, argv, options, buffer);
return 0;
if (parse.error()){ if (parse.error()){
cerr << "Error parsing arguments." << endl; cerr << "Error parsing arguments." << endl;
return 1; return 1;
@ -76,7 +80,7 @@ int main(int argc, char** argv){
if(options[PACKLEN].count()){ if(options[PACKLEN].count()){
t32.setPacketlength(options[PACKLEN].first()->arg); t32.setPacketlength(options[PACKLEN].first()->arg);
} }
//----------------------------------------------
// Initialize T32 // Initialize T32
if(t32.startup() == false){ if(t32.startup() == false){
cout << "Could not connect to Lauterbach :(" << endl; cout << "Could not connect to Lauterbach :(" << endl;
@ -92,18 +96,19 @@ int main(int argc, char** argv){
// The experiments/traces hopefully set some Breakpoints, we can react on. // The experiments/traces hopefully set some Breakpoints, we can react on.
// We may also provide a timeout, if a TimerListener was set wanted. // We may also provide a timeout, if a TimerListener was set wanted.
/*
while(1) { while(1) {
// Start execution (with next timeout, in any) // Start execution (with next timeout, if any)
t32.go();
// Wait for debugger to stop. // Wait for debugger to stop.
while( t32.isRunning() ) {}
// Evaluate state. // Evaluate state.
t32.test();// TODO
// Call appropriate callback of the SimulatorController. // Call appropriate callback of the SimulatorController.
fail::simulator.onBreakpoint(&fail::simulator.getCPU(0), fail::simulator.getCPU(0).getInstructionPointer(), fail::ANY_ADDR);
// TODO fail::simulator.onMemoryAccess(&fail::simulator.getCPU(0), 0x20002074, 1, true, fail::simulator.getCPU(0).getInstructionPointer());
} }
*/
cout << "[T32 Backend] After startup" << endl; cout << "[T32 Backend] After startup" << endl;
return 0; return 0;
} }