summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb_remote.c97
1 files changed, 81 insertions, 16 deletions
diff --git a/gdb_remote.c b/gdb_remote.c
index 9dbfce4..a40068b 100644
--- a/gdb_remote.c
+++ b/gdb_remote.c
@@ -7,20 +7,18 @@
#define WINVER 0x501
#include <winsock2.h>
#include <ws2tcpip.h>
-
-int gdb_sock;
-#define GDB_IN_FD gdb_sock
-#define GDB_OUT_FD gdb_sock
-#define GDB_READ(fd, buf, bufsize) recv(fd, buf, bufsize, 0)
-#define GDB_WRITE(fd, buf, bufsize) send(fd, buf, bufsize, 0)
#else
-#define GDB_IN_FD STDIN_FILENO
-#define GDB_OUT_FD STDOUT_FILENO
-#define GDB_READ read
-#define GDB_WRITE write
+#include <arpa/inet.h>
#include <unistd.h>
+#include <errno.h>
#endif
+#define GDB_READ(fd, buf, bufsize) recv(fd, buf, bufsize, 0)
+#define GDB_WRITE(fd, buf, bufsize) send(fd, buf, bufsize, 0)
+#define GDB_IN_FD gdb_sock
+#define GDB_OUT_FD gdb_sock
+#define INITIAL_BUFFER_SIZE (16*1024)
+
#include "gdb_remote.h"
#include "68kinst.h"
#include "debug.h"
@@ -31,10 +29,6 @@ int gdb_sock;
#include <stdio.h>
#include <string.h>
-
-
-#define INITIAL_BUFFER_SIZE (16*1024)
-
#ifdef DO_DEBUG_PRINT
#define dfprintf fprintf
#else
@@ -48,7 +42,7 @@ size_t bufsize;
int cont = 0;
int expect_break_response=0;
uint32_t resume_pc;
-
+int gdb_sock;
static uint16_t branch_t;
static uint16_t branch_f;
@@ -550,6 +544,61 @@ void gdb_debug_enter(m68k_context * context, uint32_t pc)
}
}
+static int set_socket_reuseaddr(const int socket_fd)
+{
+ const int val = 1;
+ const socklen_t len = sizeof(val);
+ return setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (void*)&val, len);
+}
+
+static inline struct sockaddr_in sockaddr_in_any_ip_with_port(const uint16_t port)
+{
+ struct sockaddr_in server = {0};
+ server.sin_family = AF_INET;
+ server.sin_addr.s_addr = INADDR_ANY;
+ server.sin_port = htons(port);
+ return server;
+}
+
+static inline int SetNonblock(const int fd)
+{
+ const int flags = fcntl(fd, F_GETFL);
+ if (flags == -1) {
+ return errno;
+ }
+ const int ret = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+ if (ret == -1) {
+ return errno;
+ }
+ return 0;
+}
+
+static int setup_socket(const uint16_t port)
+{
+ // This creates the socket - or quits
+ const int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (socket_fd == -1) {
+ perror("Could not create socket");
+ return -1;
+ }
+ // Make TCP port reusable in case of kill or crash.
+ // Deliberate explanation: https://stackoverflow.com/a/3233022
+ if (set_socket_reuseaddr(socket_fd) == -1) {
+ perror("setsockopt failed");
+ close(socket_fd);
+ return -1;
+ }
+ puts("Socket created");
+ const struct sockaddr_in server = sockaddr_in_any_ip_with_port(port);
+ if (bind(socket_fd, (struct sockaddr *)&server, sizeof(server)) == -1) {
+ perror("Bind failed");
+ close(socket_fd);
+ return -1;
+ }
+ printf("Binding to 0.0.0.0:%u done\n", port);
+ return socket_fd;
+}
+
void gdb_remote_init(void)
{
buf = malloc(INITIAL_BUFFER_SIZE);
@@ -582,6 +631,22 @@ void gdb_remote_init(void)
}
socket_close(listen_sock);
#else
- disable_stdout_messages();
+ int listen_sock = setup_socket(3333);
+ if (listen_sock < 0) {
+ fatal_error("Failed to open GDB remote debugging socket");
+ }
+ printf("Listening TCP 0.0.0.0:%u\n", 3333);
+ if (listen(listen_sock, 4) < 0) {
+ close(listen_sock);
+ fatal_error("Failed to listen on GDB remote debugging socket");
+ }
+ struct sockaddr client_address = {0};
+ socklen_t address_len = 0;
+ gdb_sock = accept(listen_sock, &client_address, &address_len);
+ if (gdb_sock < 0) {
+ close(listen_sock);
+ fatal_error("accept returned an error while listening on GDB remote debugging socket");
+ }
+ close(listen_sock);
#endif
}