[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] Win32 support for the GDB stub (take 3)
From: |
Filip Navara |
Subject: |
[Qemu-devel] [PATCH] Win32 support for the GDB stub (take 3) |
Date: |
Sun, 23 Jan 2005 17:57:10 +0100 |
User-agent: |
Mozilla Thunderbird 0.9 (Windows/20041103) |
Sorry for flooding the list. This version has correctly fixed the Win32
error checks... :-(
Changelog:
2005-01-23 Filip Navara <address@hidden>
* Support for the GDB stub on Win32.
Index: gdbstub.c
===================================================================
RCS file: /cvsroot/qemu/qemu/gdbstub.c,v
retrieving revision 1.23
diff -u -r1.23 gdbstub.c
--- gdbstub.c 17 Jan 2005 22:03:16 -0000 1.23
+++ gdbstub.c 23 Jan 2005 10:30:39 -0000
@@ -19,11 +19,21 @@
*/
#include "vl.h"
+#ifdef _WIN32
+#include <winsock2.h>
+#define SIGTRAP 24
+typedef int socklen_t;
+#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
+#endif
#include <signal.h>
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
+
//#define DEBUG_GDB
enum RSState {
@@ -49,9 +59,13 @@
int ret;
for(;;) {
- ret = read(s->fd, &ch, 1);
+ ret = recv(s->fd, &ch, 1, MSG_NOSIGNAL);
if (ret < 0) {
+#ifdef _WIN32
+ if (WSAGetLastError() != WSAEINTR)
+#else
if (errno != EINTR && errno != EAGAIN)
+#endif
return -1;
} else if (ret == 0) {
return -1;
@@ -67,9 +81,13 @@
int ret;
while (len > 0) {
- ret = write(s->fd, buf, len);
+ ret = send(s->fd, buf, len, MSG_NOSIGNAL);
if (ret < 0) {
+#ifdef _WIN32
+ if (WSAGetLastError() != WSAEINTR)
+#else
if (errno != EINTR && errno != EAGAIN)
+#endif
return;
} else {
buf += ret;
@@ -551,7 +569,7 @@
{
GDBState *s = opaque;
int i;
- if (size == 0) {
+ if (size <= 0) {
/* end of connection */
qemu_del_vm_stop_handler(gdb_vm_stopped, s);
qemu_del_fd_read_handler(s->fd);
@@ -569,6 +587,9 @@
struct sockaddr_in sockaddr;
socklen_t len;
int val, fd;
+#ifdef _WIN32
+ u_long nbio = 1;
+#endif
for(;;) {
len = sizeof(sockaddr);
@@ -583,7 +604,11 @@
/* set short latency */
val = 1;
+#ifdef _WIN32
+ setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&val, sizeof(val));
+#else
setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
+#endif
s = qemu_mallocz(sizeof(GDBState));
if (!s) {
@@ -592,7 +617,11 @@
}
s->fd = fd;
+#ifdef _WIN32
+ ioctlsocket(fd, FIONBIO, &nbio);
+#else
fcntl(fd, F_SETFL, O_NONBLOCK);
+#endif
/* stop the VM */
vm_stop(EXCP_INTERRUPT);
@@ -607,6 +636,9 @@
{
struct sockaddr_in sockaddr;
int fd, val, ret;
+#ifdef _WIN32
+ u_long nbio = 1;
+#endif
fd = socket(PF_INET, SOCK_STREAM, 0);
if (fd < 0) {
@@ -616,7 +648,11 @@
/* allow fast reuse */
val = 1;
+#ifdef _WIN32
+ setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&val, sizeof(val));
+#else
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
+#endif
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(port);
@@ -631,12 +667,21 @@
perror("listen");
return -1;
}
+#ifdef _WIN32
+ ioctlsocket(fd, FIONBIO, &nbio);
+#else
fcntl(fd, F_SETFL, O_NONBLOCK);
+#endif
return fd;
}
int gdbserver_start(int port)
{
+#ifdef _WIN32
+ WSADATA wsaData;
+ if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
+ return -1;
+#endif
gdbserver_fd = gdbserver_open(port);
if (gdbserver_fd < 0)
return -1;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [PATCH] Win32 support for the GDB stub (take 3),
Filip Navara <=