gdbstub: remove more WIN32 ifdefs, refactor pipe setup code to be re-usable
This commit is contained in:
parent
747f7b114b
commit
dbc1f06662
|
@ -48,29 +48,6 @@
|
||||||
#endif
|
#endif
|
||||||
#endif // HOST_WINDOWS
|
#endif // HOST_WINDOWS
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#define RECV(A,B,C) recv(A, B, C, 0)
|
|
||||||
#define SEND(A,B,C) send(A, (char*)B, C, 0)
|
|
||||||
#define CLOSESOCKET(A) closesocket(A)
|
|
||||||
#define SOCKLEN_T int
|
|
||||||
static int set_socket_nodelay(int socket) {
|
|
||||||
BOOL nodelay_opt = 1;
|
|
||||||
return setsockopt( socket, IPPROTO_TCP, TCP_NODELAY,
|
|
||||||
(char*)&nodelay_opt, sizeof( nodelay_opt));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define INVALID_SOCKET -1
|
|
||||||
#define RECV(A,B,C) read(A, (char*)B, C)
|
|
||||||
#define SEND(A,B,C) write(A, B, C)
|
|
||||||
#define CLOSESOCKET(A) close(A)
|
|
||||||
#define SOCKLEN_T socklen_t
|
|
||||||
static int set_socket_nodelay(int socket) {
|
|
||||||
int nodelay_opt = 1;
|
|
||||||
return setsockopt( socket, IPPROTO_TCP, TCP_NODELAY,
|
|
||||||
&nodelay_opt, sizeof( nodelay_opt));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
slock *cpu_mutex = NULL;
|
slock *cpu_mutex = NULL;
|
||||||
|
|
||||||
|
@ -92,6 +69,113 @@ slock *cpu_mutex = NULL;
|
||||||
#define LOG_ERROR( fmt, ...)
|
#define LOG_ERROR( fmt, ...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#define RECV(A,B,C) recv(A, B, C, 0)
|
||||||
|
#define SEND(A,B,C) send(A, (char*)B, C, 0)
|
||||||
|
#define CLOSESOCKET(A) closesocket(A)
|
||||||
|
#define SOCKLEN_T int
|
||||||
|
static int set_socket_nodelay(int socket) {
|
||||||
|
BOOL nodelay_opt = 1;
|
||||||
|
return setsockopt( socket, IPPROTO_TCP, TCP_NODELAY,
|
||||||
|
(char*)&nodelay_opt, sizeof( nodelay_opt));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int INIT_SOCKETS(void) {
|
||||||
|
/* initialise the winsock library */
|
||||||
|
WORD wVersionRequested;
|
||||||
|
WSADATA wsaData;
|
||||||
|
wVersionRequested = MAKEWORD( 2, 2 );
|
||||||
|
return WSAStartup( wVersionRequested, &wsaData );
|
||||||
|
}
|
||||||
|
|
||||||
|
struct socket_creator_data {
|
||||||
|
SOCKET_TYPE *sock;
|
||||||
|
int port_num;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
static DWORD WINAPI
|
||||||
|
control_creator( LPVOID lpParameter)
|
||||||
|
{
|
||||||
|
struct socket_creator_data *my_data = (struct socket_creator_data *)lpParameter;
|
||||||
|
|
||||||
|
*my_data->sock = socket( PF_INET, SOCK_STREAM, 0);
|
||||||
|
|
||||||
|
if ( *my_data->sock != INVALID_SOCKET) {
|
||||||
|
int connect_res;
|
||||||
|
struct sockaddr_in clientService;
|
||||||
|
|
||||||
|
clientService.sin_family = AF_INET;
|
||||||
|
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
|
||||||
|
clientService.sin_port = htons( my_data->port_num);
|
||||||
|
|
||||||
|
connect_res = connect( *my_data->sock, (SOCKADDR*) &clientService, sizeof(clientService));
|
||||||
|
|
||||||
|
if ( connect_res == SOCKET_ERROR) {
|
||||||
|
LOG_ERROR( "Failed to connect to socket\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int INIT_PIPE(SOCKET_TYPE *pipefds) {
|
||||||
|
struct socket_creator_data temp_data = {
|
||||||
|
pipefds,
|
||||||
|
24689
|
||||||
|
};
|
||||||
|
SOCKET_TYPE temp_sock = createSocket ( temp_data.port_num);
|
||||||
|
HANDLE temp_thread = INVALID_HANDLE_VALUE;
|
||||||
|
DWORD temp_threadID;
|
||||||
|
|
||||||
|
res = -1;
|
||||||
|
|
||||||
|
if ( temp_sock != -1) {
|
||||||
|
/* create a thread to connect to this socket */
|
||||||
|
temp_thread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)control_creator, &temp_data, 0, &temp_threadID);
|
||||||
|
if ( temp_thread != INVALID_HANDLE_VALUE) {
|
||||||
|
struct sockaddr_in ignore_addr;
|
||||||
|
int addr_size = sizeof( ignore_addr);
|
||||||
|
|
||||||
|
pipefds[1] = accept( temp_sock, (struct sockaddr *)&ignore_addr, &addr_size);
|
||||||
|
|
||||||
|
if ( pipefds[1] != INVALID_SOCKET) {
|
||||||
|
if (set_socket_nodelay( pipefds+1) == 0) {
|
||||||
|
closesocket( temp_sock);
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( res != 0) {
|
||||||
|
LOG_ERROR( "Failed to create pipe\n");
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define INVALID_SOCKET -1
|
||||||
|
#define RECV(A,B,C) read(A, (char*)B, C)
|
||||||
|
#define SEND(A,B,C) write(A, B, C)
|
||||||
|
#define CLOSESOCKET(A) close(A)
|
||||||
|
#define SOCKLEN_T socklen_t
|
||||||
|
static int set_socket_nodelay(int socket) {
|
||||||
|
int nodelay_opt = 1;
|
||||||
|
return setsockopt( socket, IPPROTO_TCP, TCP_NODELAY,
|
||||||
|
&nodelay_opt, sizeof( nodelay_opt));
|
||||||
|
}
|
||||||
|
#define INIT_SOCKETS() 0
|
||||||
|
static int INIT_PIPE(SOCKET_TYPE *pipefds) {
|
||||||
|
int res;
|
||||||
|
res = pipe( pipefds);
|
||||||
|
if ( res != 0) {
|
||||||
|
LOG_ERROR( "Failed to create pipe \"%s\"\n", strerror( errno));
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define LITTLE_ENDIAN_TO_UINT32_T( v) (\
|
#define LITTLE_ENDIAN_TO_UINT32_T( v) (\
|
||||||
((v)[3] << 24) | \
|
((v)[3] << 24) | \
|
||||||
((v)[2] << 16) | \
|
((v)[2] << 16) | \
|
||||||
|
@ -1410,46 +1494,6 @@ static const armcpu_memory_iface gdb_memory_iface = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
struct socket_creator_data {
|
|
||||||
SOCKET_TYPE *sock;
|
|
||||||
int port_num;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
static DWORD WINAPI
|
|
||||||
control_creator( LPVOID lpParameter)
|
|
||||||
{
|
|
||||||
struct socket_creator_data *my_data = (struct socket_creator_data *)lpParameter;
|
|
||||||
|
|
||||||
*my_data->sock = socket( PF_INET, SOCK_STREAM, 0);
|
|
||||||
|
|
||||||
if ( *my_data->sock != INVALID_SOCKET) {
|
|
||||||
int connect_res;
|
|
||||||
struct sockaddr_in clientService;
|
|
||||||
|
|
||||||
clientService.sin_family = AF_INET;
|
|
||||||
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
|
|
||||||
clientService.sin_port = htons( my_data->port_num);
|
|
||||||
|
|
||||||
connect_res = connect( *my_data->sock, (SOCKADDR*) &clientService, sizeof(clientService));
|
|
||||||
|
|
||||||
if ( connect_res == SOCKET_ERROR) {
|
|
||||||
LOG_ERROR( "Failed to connect to socket\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
gdbstub_handle_t
|
gdbstub_handle_t
|
||||||
|
@ -1492,69 +1536,8 @@ createStub_gdb( uint16_t port,
|
||||||
stub->write_breakpoints = NULL;
|
stub->write_breakpoints = NULL;
|
||||||
stub->access_breakpoints = NULL;
|
stub->access_breakpoints = NULL;
|
||||||
|
|
||||||
#ifdef WIN32
|
if ( INIT_SOCKETS() != 0) return NULL;
|
||||||
/* initialise the winsock library */
|
if ( (res = INIT_PIPE(stub->ctl_pipe)) == 0) {
|
||||||
{
|
|
||||||
WORD wVersionRequested;
|
|
||||||
WSADATA wsaData;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
wVersionRequested = MAKEWORD( 2, 2 );
|
|
||||||
|
|
||||||
err = WSAStartup( wVersionRequested, &wsaData );
|
|
||||||
if ( err != 0 ) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
struct socket_creator_data temp_data = {
|
|
||||||
&stub->ctl_pipe[0],
|
|
||||||
24689
|
|
||||||
};
|
|
||||||
SOCKET_TYPE temp_sock = createSocket ( temp_data.port_num);
|
|
||||||
HANDLE temp_thread = INVALID_HANDLE_VALUE;
|
|
||||||
DWORD temp_threadID;
|
|
||||||
|
|
||||||
res = -1;
|
|
||||||
|
|
||||||
if ( temp_sock != -1) {
|
|
||||||
/* create a thread to connect to this socket */
|
|
||||||
temp_thread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)control_creator, &temp_data, 0, &temp_threadID);
|
|
||||||
if ( temp_thread != INVALID_HANDLE_VALUE) {
|
|
||||||
struct sockaddr_in ignore_addr;
|
|
||||||
int addr_size = sizeof( ignore_addr);
|
|
||||||
|
|
||||||
stub->ctl_pipe[1] = accept( temp_sock, (struct sockaddr *)&ignore_addr, &addr_size);
|
|
||||||
|
|
||||||
if ( stub->ctl_pipe[1] != INVALID_SOCKET) {
|
|
||||||
BOOL nodelay_opt = 1;
|
|
||||||
int set_res;
|
|
||||||
|
|
||||||
/* make the socket NODELAY */
|
|
||||||
set_res = setsockopt( stub->ctl_pipe[1], IPPROTO_TCP, TCP_NODELAY,
|
|
||||||
(char*)&nodelay_opt, sizeof( nodelay_opt));
|
|
||||||
if ( set_res == 0) {
|
|
||||||
closesocket( temp_sock);
|
|
||||||
res = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( res != 0) {
|
|
||||||
LOG_ERROR( "Failed to create control socket\n");
|
|
||||||
}
|
|
||||||
#else /* not WIN32 */
|
|
||||||
/* create the control pipe */
|
|
||||||
res = pipe( stub->ctl_pipe);
|
|
||||||
|
|
||||||
if ( res != 0) {
|
|
||||||
LOG_ERROR( "Failed to create control pipe \"%s\"\n", strerror( errno));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else {
|
|
||||||
stub->active = 1;
|
stub->active = 1;
|
||||||
stub->emu_stub_state = gdb_stub_state::RUNNING_EMU_GDB_STATE;
|
stub->emu_stub_state = gdb_stub_state::RUNNING_EMU_GDB_STATE;
|
||||||
stub->ctl_stub_state = gdb_stub_state::STOPPED_GDB_STATE;
|
stub->ctl_stub_state = gdb_stub_state::STOPPED_GDB_STATE;
|
||||||
|
|
Loading…
Reference in New Issue