diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj
index b2cc380db8..efcec09564 100644
--- a/Source/Core/Core/Core.vcxproj
+++ b/Source/Core/Core/Core.vcxproj
@@ -242,6 +242,7 @@
+
@@ -600,6 +601,7 @@
+
diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters
index 78c9fe01ec..a30d217970 100644
--- a/Source/Core/Core/Core.vcxproj.filters
+++ b/Source/Core/Core/Core.vcxproj.filters
@@ -326,6 +326,9 @@
PowerPC
+
+ PowerPC
+
PowerPC\Cached Interpreter
@@ -1390,6 +1393,9 @@
PowerPC
+
+ PowerPC
+
PowerPC
diff --git a/Source/Core/Core/PowerPC/GDBStub.cpp b/Source/Core/Core/PowerPC/GDBStub.cpp
index d2b635aae7..20a0ed5939 100644
--- a/Source/Core/Core/PowerPC/GDBStub.cpp
+++ b/Source/Core/Core/PowerPC/GDBStub.cpp
@@ -5,17 +5,21 @@
// Originally written by Sven Peter for anergistic.
#include
+#include
#include
#include
-#include
#ifdef _WIN32
+#include
#include
#include
+typedef SSIZE_T ssize_t;
+#define SHUT_RDWR SD_BOTH
#else
#include
#include
#include
#include
+#include
#endif
#include "Common/Logging/Log.h"
@@ -108,7 +112,7 @@ static u8 gdb_read_byte()
{
u8 c = '+';
- const ssize_t res = recv(sock, &c, 1, MSG_WAITALL);
+ const ssize_t res = recv(sock, (char*)&c, 1, MSG_WAITALL);
if (res != 1)
{
ERROR_LOG_FMT(GDB_STUB, "recv failed : {}", res);
@@ -319,7 +323,7 @@ static void gdb_reply(const char* reply)
memset(cmd_bfr, 0, sizeof cmd_bfr);
- cmd_len = strlen(reply);
+ cmd_len = (u32)strlen(reply);
if (cmd_len + 4 > sizeof cmd_bfr)
ERROR_LOG_FMT(GDB_STUB, "cmd_bfr overflow in gdb_reply");
@@ -335,7 +339,7 @@ static void gdb_reply(const char* reply)
DEBUG_LOG_FMT(GDB_STUB, "gdb: reply (len: {}): {}", cmd_len, CommandBufferAsString());
- u8* ptr = cmd_bfr;
+ const char* ptr = (const char*)cmd_bfr;
u32 left = cmd_len + 4;
while (left > 0)
{
@@ -427,41 +431,46 @@ static void gdb_read_register()
id |= hex2char(cmd_bfr[2]);
}
- switch (id)
+ if (id < 32)
{
- case 0 ... 31:
wbe32hex(reply, GPR(id));
- break;
- case 32 ... 63:
+ }
+ else if (id >= 32 && id < 64)
+ {
wbe64hex(reply, rPS(id - 32).PS0AsU64());
- break;
- case 64:
- wbe32hex(reply, PC);
- break;
- case 65:
- wbe32hex(reply, MSR.Hex);
- break;
- case 66:
- wbe32hex(reply, PowerPC::ppcState.cr.Get());
- break;
- case 67:
- wbe32hex(reply, LR);
- break;
- case 68:
- wbe32hex(reply, CTR);
- break;
- case 69:
- wbe32hex(reply, PowerPC::ppcState.spr[SPR_XER]);
- break;
- case 70:
- wbe32hex(reply, 0x0BADC0DE);
- break;
- case 71:
- wbe32hex(reply, FPSCR.Hex);
- break;
- default:
- return gdb_reply("E01");
- break;
+ }
+ else
+ {
+ switch (id)
+ {
+ case 64:
+ wbe32hex(reply, PC);
+ break;
+ case 65:
+ wbe32hex(reply, MSR.Hex);
+ break;
+ case 66:
+ wbe32hex(reply, PowerPC::ppcState.cr.Get());
+ break;
+ case 67:
+ wbe32hex(reply, LR);
+ break;
+ case 68:
+ wbe32hex(reply, CTR);
+ break;
+ case 69:
+ wbe32hex(reply, PowerPC::ppcState.spr[SPR_XER]);
+ break;
+ case 70:
+ wbe32hex(reply, 0x0BADC0DE);
+ break;
+ case 71:
+ wbe32hex(reply, FPSCR.Hex);
+ break;
+ default:
+ return gdb_reply("E01");
+ break;
+ }
}
gdb_reply((char*)reply);
@@ -512,41 +521,46 @@ static void gdb_write_register()
id |= hex2char(cmd_bfr[2]);
}
- switch (id)
+ if (id < 32)
{
- case 0 ... 31:
GPR(id) = re32hex(bufptr);
- break;
- case 32 ... 63:
+ }
+ else if (id >= 32 && id < 64)
+ {
rPS(id - 32).SetPS0(re64hex(bufptr));
- break;
- case 64:
- PC = re32hex(bufptr);
- break;
- case 65:
- MSR.Hex = re32hex(bufptr);
- break;
- case 66:
- PowerPC::ppcState.cr.Set(re32hex(bufptr));
- break;
- case 67:
- LR = re32hex(bufptr);
- break;
- case 68:
- CTR = re32hex(bufptr);
- break;
- case 69:
- PowerPC::ppcState.spr[SPR_XER] = re32hex(bufptr);
- break;
- case 70:
- // do nothing, we dont have MQ
- break;
- case 71:
- FPSCR.Hex = re32hex(bufptr);
- break;
- default:
- return gdb_reply("E01");
- break;
+ }
+ else
+ {
+ switch (id)
+ {
+ case 64:
+ PC = re32hex(bufptr);
+ break;
+ case 65:
+ MSR.Hex = re32hex(bufptr);
+ break;
+ case 66:
+ PowerPC::ppcState.cr.Set(re32hex(bufptr));
+ break;
+ case 67:
+ LR = re32hex(bufptr);
+ break;
+ case 68:
+ CTR = re32hex(bufptr);
+ break;
+ case 69:
+ PowerPC::ppcState.spr[SPR_XER] = re32hex(bufptr);
+ break;
+ case 70:
+ // do nothing, we dont have MQ
+ break;
+ case 71:
+ FPSCR.Hex = re32hex(bufptr);
+ break;
+ default:
+ return gdb_reply("E01");
+ break;
+ }
}
gdb_reply("OK");
@@ -833,7 +847,7 @@ static void gdb_init_generic(int domain, const sockaddr* server_addr, socklen_t
ERROR_LOG_FMT(GDB_STUB, "Failed to create gdb socket");
int on = 1;
- if (setsockopt(tmpsock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on) < 0)
+ if (setsockopt(tmpsock, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof on) < 0)
ERROR_LOG_FMT(GDB_STUB, "Failed to setsockopt");
if (bind(tmpsock, server_addr, server_addrlen) < 0)
@@ -849,7 +863,11 @@ static void gdb_init_generic(int domain, const sockaddr* server_addr, socklen_t
ERROR_LOG_FMT(GDB_STUB, "Failed to accept gdb client");
INFO_LOG_FMT(GDB_STUB, "Client connected.");
+#ifdef _WIN32
+ closesocket(tmpsock);
+#else
close(tmpsock);
+#endif
tmpsock = -1;
}
diff --git a/Source/Core/Core/PowerPC/GDBStub.h b/Source/Core/Core/PowerPC/GDBStub.h
index ab03c460cc..ba9c78963c 100644
--- a/Source/Core/Core/PowerPC/GDBStub.h
+++ b/Source/Core/Core/PowerPC/GDBStub.h
@@ -8,7 +8,7 @@
#include "Common/CommonTypes.h"
-#if defined(_WIN32) || !defined(MSG_WAITALL)
+#ifndef MSG_WAITALL
#define MSG_WAITALL (8)
#endif
diff --git a/Source/VSProps/Base.props b/Source/VSProps/Base.props
index 804ed54fcc..8b3a3b6d31 100644
--- a/Source/VSProps/Base.props
+++ b/Source/VSProps/Base.props
@@ -69,6 +69,7 @@
_ARCH_64=1;_M_X86=1;_M_X86_64=1;%(PreprocessorDefinitions)
_ARCH_64=1;_M_ARM_64=1;%(PreprocessorDefinitions)
HAVE_FFMPEG;%(PreprocessorDefinitions)
+ USE_GDBSTUB;%(PreprocessorDefinitions)