summaryrefslogtreecommitdiff
path: root/libpcsxcore/debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpcsxcore/debug.c')
-rw-r--r--libpcsxcore/debug.c411
1 files changed, 240 insertions, 171 deletions
diff --git a/libpcsxcore/debug.c b/libpcsxcore/debug.c
index a4e9ab35..ecc9edc7 100644
--- a/libpcsxcore/debug.c
+++ b/libpcsxcore/debug.c
@@ -19,6 +19,8 @@
#include "r3000a.h"
#include "debug.h"
#include "socket.h"
+#include <dynstr.h>
+#include <stddef.h>
/*
PCSXR Debug console protocol description, version 1.0
@@ -134,7 +136,7 @@ Execution flow control commands (3xx):
Soft (quick) resets.
399
Resets.
-
+
Server outputs:
~~~~~~~~~~~~~~
@@ -236,6 +238,9 @@ static int step_over = 0;
static u32 step_over_addr = 0;
static int mapping_e = 0, mapping_r8 = 0, mapping_r16 = 0, mapping_r32 = 0, mapping_w8 = 0, mapping_w16 = 0, mapping_w32 = 0;
static int breakmp_e = 0, breakmp_r8 = 0, breakmp_r16 = 0, breakmp_r32 = 0, breakmp_w8 = 0, breakmp_w16 = 0, breakmp_w32 = 0;
+static int server_socket, client_socket;
+static char tbuf[513];
+static size_t ptr;
static void ProcessCommands();
@@ -317,6 +322,11 @@ breakpoint_t *find_breakpoint(int number) {
}
void StartDebugger() {
+ enum
+ {
+ PORT_NUMBER = 12345
+ };
+
if (debugger_active)
return;
@@ -326,7 +336,9 @@ void StartDebugger() {
return;
}
- if (StartServer() == -1) {
+ server_socket = StartServer(PORT_NUMBER);
+
+ if (server_socket == -1) {
SysPrintf("%s", _("Unable to start debug server.\n"));
return;
}
@@ -337,7 +349,7 @@ void StartDebugger() {
void StopDebugger() {
if (debugger_active) {
- StopServer();
+ StopServer(server_socket);
SysPrintf("%s", _("Debugger stopped.\n"));
}
@@ -361,6 +373,14 @@ void ResumeDebugger() {
paused = 0;
}
+static void DebugHello(void)
+{
+ static const char hello[] = "000 PCSXR Version " PACKAGE_VERSION " - Debug console\r\n";
+
+ WriteSocket(client_socket, hello, sizeof hello);
+ ptr = 0;
+}
+
void DebugVSync() {
if (!debugger_active || resetting)
return;
@@ -375,7 +395,16 @@ void DebugVSync() {
return;
}
- GetClient();
+ if (client_socket < 1)
+ {
+ client_socket = GetClient(server_socket, 0);
+
+ if (client_socket > 0)
+ {
+ DebugHello();
+ }
+ }
+
ProcessCommands();
}
@@ -398,33 +427,42 @@ void ProcessDebug() {
}
if (!paused) {
if(trace && printpc) {
- char reply[256];
- sprintf(reply, "219 %s\r\n", disR3000AF(psxMemRead32(psxRegs.pc), psxRegs.pc));
- WriteSocket(reply, strlen(reply));
+ struct dynstr reply;
+
+ dynstr_init(&reply);
+ dynstr_append(&reply, "219 %s\r\n", disR3000AF(psxMemRead32(psxRegs.pc), psxRegs.pc));
+ WriteSocket(client_socket, reply.str, reply.len);
+ dynstr_free(&reply);
}
-
+
if(step_over) {
if(psxRegs.pc == step_over_addr) {
- char reply[256];
+ struct dynstr reply;
+
+ dynstr_init(&reply);
step_over = 0;
step_over_addr = 0;
- sprintf(reply, "050 @%08X\r\n", psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ dynstr_append(&reply, "050 @%08X\r\n", psxRegs.pc);
+ WriteSocket(client_socket, reply.str, reply.len);
+ dynstr_free(&reply);
paused = 1;
}
}
-
+
if(run_to) {
if(psxRegs.pc == run_to_addr) {
- char reply[256];
+ struct dynstr reply;
+
run_to = 0;
run_to_addr = 0;
- sprintf(reply, "040 @%08X\r\n", psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ dynstr_init(&reply);
+ dynstr_append(&reply, "040 @%08X\r\n", psxRegs.pc);
+ WriteSocket(client_socket, reply.str, reply.len);
+ dynstr_free(&reply);
paused = 1;
}
}
-
+
DebugCheckBP(psxRegs.pc, BE);
}
if (mapping_e) {
@@ -437,7 +475,17 @@ void ProcessDebug() {
}
}
while (paused) {
- GetClient();
+
+ if (client_socket < 1)
+ {
+ client_socket = GetClient(server_socket, 0);
+
+ if (client_socket > 0)
+ {
+ DebugHello();
+ }
+ }
+
ProcessCommands();
GPU_updateLace();
SysUpdate();
@@ -446,14 +494,31 @@ void ProcessDebug() {
static void ProcessCommands() {
int code, i, dumping;
- FILE *sfile;
- char cmd[257], *arguments, *p, reply[10240], *save, *dump = NULL;
+ char cmd[348], *arguments, *p, *save, *dump = NULL;
u32 reg, value, size = 0, address;
breakpoint_t *bp;
+ size_t len = sizeof cmd;
+ struct dynstr reply;
+
+ if (HasClient(client_socket))
+ {
+ const enum read_socket_err err = ReadSocket(client_socket, cmd, &len);
+
+ switch (err)
+ {
+ case READ_SOCKET_OK:
+ break;
+
+ case READ_SOCKET_ERR_INVALID_ARG:
+ /* Fall through. */
+ case READ_SOCKET_ERR_RECV:
+ /* Fall through. */
+ case READ_SOCKET_SHUTDOWN:
+ /* Fall through. */
+ default:
+ return;
+ }
- if (!HasClient())
- return;
- if (ReadSocket(cmd, 256) > 0) {
arguments = NULL;
if (strlen(cmd) <= 2) {
code = 0;
@@ -475,129 +540,126 @@ static void ProcessCommands() {
dumping = 0;
save = NULL;
+ dynstr_init(&reply);
switch (code) {
case 0x100:
- sprintf(reply, "200 %s\r\n", arguments == NULL ? "OK" : arguments);
+ dynstr_append(&reply, "200 %s\r\n", arguments == NULL ? "OK" : arguments);
break;
case 0x101:
- sprintf(reply, "201 %s\r\n", PACKAGE_VERSION);
+ dynstr_append(&reply, "201 %s\r\n", PACKAGE_VERSION);
break;
case 0x102:
- sprintf(reply, "202 1.0\r\n");
+ dynstr_append(&reply, "202 1.0\r\n");
break;
case 0x103:
- sprintf(reply, "203 %i\r\n", paused ? 1 : trace ? 2 : 0);
+ dynstr_append(&reply, "203 %i\r\n", paused ? 1 : trace ? 2 : 0);
break;
case 0x110:
- sprintf(reply, "210 PC=%08X\r\n", psxRegs.pc);
+ dynstr_append(&reply, "210 PC=%08X\r\n", psxRegs.pc);
break;
case 0x111:
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "511 Malformed 111 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "511 Malformed 111 command '%s'\r\n", cmd);
break;
}
}
if (!arguments) {
- reply[0] = 0;
for (i = 0; i < 32; i++) {
- sprintf(reply, "%s211 %02X(%2.2s)=%08X\r\n", reply, i, disRNameGPR[i], psxRegs.GPR.r[i]);
+ dynstr_append(&reply, "211 %02X(%2.2s)=%08X\r\n", reply, i, disRNameGPR[i], psxRegs.GPR.r[i]);
}
} else {
if ((code >= 0) && (code < 32)) {
- sprintf(reply, "211 %02X(%2.2s)=%08X\r\n", code, disRNameGPR[code], psxRegs.GPR.r[code]);
+ dynstr_append(&reply, "211 %02X(%2.2s)=%08X\r\n", code, disRNameGPR[code], psxRegs.GPR.r[code]);
} else {
- sprintf(reply, "511 Invalid GPR register: %X\r\n", code);
+ dynstr_append(&reply, "511 Invalid GPR register: %X\r\n", code);
}
}
break;
case 0x112:
- sprintf(reply, "212 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi);
+ dynstr_append(&reply, "212 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi);
break;
case 0x113:
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "511 Malformed 113 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "511 Malformed 113 command '%s'\r\n", cmd);
break;
}
}
if (!arguments) {
- reply[0] = 0;
for (i = 0; i < 32; i++) {
- sprintf(reply, "%s213 %02X(%8.8s)=%08X\r\n", reply, i, disRNameCP0[i], psxRegs.CP0.r[i]);
+ dynstr_append(&reply, "213 %02X(%8.8s)=%08X\r\n", i, disRNameCP0[i], psxRegs.CP0.r[i]);
}
} else {
if ((code >= 0) && (code < 32)) {
- sprintf(reply, "213 %02X(%8.8s)=%08X\r\n", code, disRNameCP0[code], psxRegs.CP0.r[code]);
+ dynstr_append(&reply, "213 %02X(%8.8s)=%08X\r\n", code, disRNameCP0[code], psxRegs.CP0.r[code]);
} else {
- sprintf(reply, "511 Invalid COP0 register: %X\r\n", code);
+ dynstr_append(&reply, "511 Invalid COP0 register: %X\r\n", code);
}
}
break;
case 0x114:
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "511 Malformed 114 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "511 Malformed 114 command '%s'\r\n", cmd);
break;
}
}
if (!arguments) {
- reply[0] = 0;
for (i = 0; i < 32; i++) {
- sprintf(reply, "%s214 %02X(%6.6s)=%08X\r\n", reply, i, disRNameCP2C[i], psxRegs.CP2C.r[i]);
+ dynstr_append(&reply, "214 %02X(%6.6s)=%08X\r\n", i, disRNameCP2C[i], psxRegs.CP2C.r[i]);
}
} else {
if ((code >= 0) && (code < 32)) {
- sprintf(reply, "214 %02X(%6.6s)=%08X\r\n", code, disRNameCP2C[code], psxRegs.CP2C.r[code]);
+ dynstr_append(&reply, "214 %02X(%6.6s)=%08X\r\n", code, disRNameCP2C[code], psxRegs.CP2C.r[code]);
} else {
- sprintf(reply, "511 Invalid COP2C register: %X\r\n", code);
+ dynstr_append(&reply, "511 Invalid COP2C register: %X\r\n", code);
}
}
break;
case 0x115:
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "511 Malformed 111 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "511 Malformed 111 command '%s'\r\n", cmd);
break;
}
}
if (!arguments) {
- reply[0] = 0;
for (i = 0; i < 32; i++) {
- sprintf(reply, "%s215 %02X(%4.4s)=%08X\r\n", reply, i, disRNameCP2D[i], psxRegs.CP2D.r[i]);
+ dynstr_append(&reply, "215 %02X(%4.4s)=%08X\r\n", i, disRNameCP2D[i], psxRegs.CP2D.r[i]);
}
} else {
if ((code >= 0) && (code < 32)) {
- sprintf(reply, "215 %02X(%4.4s)=%08X\r\n", code, disRNameCP2D[code], psxRegs.CP2D.r[code]);
+ dynstr_append(&reply, "215 %02X(%4.4s)=%08X\r\n", code, disRNameCP2D[code], psxRegs.CP2D.r[code]);
} else {
- sprintf(reply, "511 Invalid COP2D register: %X\r\n", code);
+ dynstr_append(&reply, "511 Invalid COP2D register: %X\r\n", code);
}
}
break;
case 0x119:
if (arguments) {
if (sscanf(arguments, "%08X", &code) != 1) {
- sprintf(reply, "511 Malformed 119 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "511 Malformed 119 command '%s'\r\n", cmd);
break;
}
}
if (!arguments)
code = psxRegs.pc;
- sprintf(reply, "219 %s\r\n", disR3000AF(psxMemRead32(code), code));
+ dynstr_append(&reply, "219 %s\r\n", disR3000AF(psxMemRead32(code), code));
break;
case 0x121:
if (!arguments || sscanf(arguments, "%02X=%08X", &reg, &value) != 2) {
- sprintf(reply, "500 Malformed 121 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 121 command '%s'\r\n", arguments);
break;
}
if (reg < 32) {
psxRegs.GPR.r[reg] = value;
- sprintf(reply, "221 %02X=%08X\r\n", reg, value);
+ dynstr_append(&reply, "221 %02X=%08X\r\n", reg, value);
} else {
- sprintf(reply, "512 Invalid GPR register: %02X\r\n", reg);
+ dynstr_append(&reply, "512 Invalid GPR register: %02X\r\n", reg);
}
break;
case 0x122:
@@ -607,88 +669,88 @@ static void ProcessCommands() {
reg = 32;
} else {
arguments[2] = 0;
- sprintf(reply, "512 Invalid LO/HI register: '%s'\r\n", arguments);
+ dynstr_append(&reply, "512 Invalid LO/HI register: '%s'\r\n", arguments);
break;
}
if (sscanf(arguments + 3, "%08X", &value) != 1) {
- sprintf(reply, "500 Malformed 122 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 122 command '%s'\r\n", arguments);
} else {
psxRegs.GPR.r[reg] = value;
- sprintf(reply, "222 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi);
+ dynstr_append(&reply, "222 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi);
}
break;
case 0x123:
if (!arguments || sscanf(arguments, "%02X=%08X", &reg, &value) != 2) {
- sprintf(reply, "500 Malformed 123 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 123 command '%s'\r\n", arguments);
break;
}
if (reg < 32) {
psxRegs.CP0.r[reg] = value;
- sprintf(reply, "223 %02X=%08X\r\n", reg, value);
+ dynstr_append(&reply, "223 %02X=%08X\r\n", reg, value);
} else {
- sprintf(reply, "512 Invalid COP0 register: %02X\r\n", reg);
+ dynstr_append(&reply, "512 Invalid COP0 register: %02X\r\n", reg);
}
break;
case 0x124:
if (!arguments || sscanf(arguments, "%02X=%08X", &reg, &value) != 2) {
- sprintf(reply, "500 Malformed 124 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 124 command '%s'\r\n", arguments);
break;
}
if (reg < 32) {
psxRegs.CP2C.r[reg] = value;
- sprintf(reply, "224 %02X=%08X\r\n", reg, value);
+ dynstr_append(&reply, "224 %02X=%08X\r\n", reg, value);
} else {
- sprintf(reply, "512 Invalid COP2C register: %02X\r\n", reg);
+ dynstr_append(&reply, "512 Invalid COP2C register: %02X\r\n", reg);
}
break;
case 0x125:
if (!arguments || sscanf(arguments, "%02X=%08X", &reg, &value) != 2) {
- sprintf(reply, "500 Malformed 121 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 121 command '%s'\r\n", arguments);
break;
}
if (reg < 32) {
psxRegs.CP2D.r[reg] = value;
- sprintf(reply, "225 %02X=%08X\r\n", reg, value);
+ dynstr_append(&reply, "225 %02X=%08X\r\n", reg, value);
} else {
- sprintf(reply, "512 Invalid COP2D register: %02X\r\n", reg);
+ dynstr_append(&reply, "512 Invalid COP2D register: %02X\r\n", reg);
}
break;
case 0x130:
if (!arguments || sscanf(arguments, "%08X@%08X", &size, &address) != 2) {
- sprintf(reply, "500 Malformed 130 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 130 command '%s'\r\n", arguments);
break;
}
if ((address >= 0x80000000) && ((address + size) <= 0x80200000)) {
- sprintf(reply, "230 %08X@%08X\r\n", size, address);
+ dynstr_append(&reply, "230 %08X@%08X\r\n", size, address);
dump = (char *) PSXM(address);
dumping = 1;
} else {
- sprintf(reply, "513 Invalid address or range: '%s'\r\n", arguments);
+ dynstr_append(&reply, "513 Invalid address or range: '%s'\r\n", arguments);
}
break;
case 0x140:
if (!arguments || sscanf(arguments, "%08X@%08X", &size, &address) != 2) {
- sprintf(reply, "500 Malformed 140 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 140 command '%s'\r\n", arguments);
break;
}
if ((address >= 0x80000000) && ((address + size) <= 0x80200000)) {
- sprintf(reply, "240 %08X@%08X\r\n", size, address);
- RawReadSocket((char *)PSXM(address), size);
+ dynstr_append(&reply, "240 %08X@%08X\r\n", size, address);
+ RawReadSocket(client_socket, (char *)PSXM(address), size);
} else {
- sprintf(reply, "514 Invalid address or range: '%s'\r\n", arguments);
+ dynstr_append(&reply, "514 Invalid address or range: '%s'\r\n", arguments);
}
break;
case 0x150:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 150 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 150 command '%s'\r\n", cmd);
break;
}
}
@@ -701,13 +763,13 @@ static void ProcessCommands() {
} else {
mapping_e = 0;
}
- sprintf(reply, "250 Mapping of exec flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "250 Mapping of exec flow %s\r\n", code ? "started" : "stopped");
break;
case 0x151:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 151 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 151 command '%s'\r\n", cmd);
break;
}
}
@@ -719,13 +781,13 @@ static void ProcessCommands() {
} else {
mapping_r8 = 0;
}
- sprintf(reply, "251 Mapping of read8 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "251 Mapping of read8 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x152:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 152 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 152 command '%s'\r\n", cmd);
break;
}
}
@@ -737,13 +799,13 @@ static void ProcessCommands() {
} else {
mapping_r16 = 0;
}
- sprintf(reply, "252 Mapping of read16 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "252 Mapping of read16 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x153:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 153 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 153 command '%s'\r\n", cmd);
break;
}
}
@@ -755,13 +817,13 @@ static void ProcessCommands() {
} else {
mapping_r32 = 0;
}
- sprintf(reply, "253 Mapping of read32 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "253 Mapping of read32 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x154:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 154 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 154 command '%s'\r\n", cmd);
break;
}
}
@@ -773,13 +835,13 @@ static void ProcessCommands() {
} else {
mapping_w8 = 0;
}
- sprintf(reply, "254 Mapping of write8 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "254 Mapping of write8 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x155:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 155 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 155 command '%s'\r\n", cmd);
break;
}
}
@@ -791,13 +853,13 @@ static void ProcessCommands() {
} else {
mapping_w16 = 0;
}
- sprintf(reply, "255 Mapping of write16 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "255 Mapping of write16 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x156:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 156 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 156 command '%s'\r\n", cmd);
break;
}
}
@@ -809,13 +871,13 @@ static void ProcessCommands() {
} else {
mapping_w32 = 0;
}
- sprintf(reply, "256 Mapping of write32 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "256 Mapping of write32 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x160:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 160 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 160 command '%s'\r\n", cmd);
break;
}
}
@@ -824,13 +886,13 @@ static void ProcessCommands() {
} else {
breakmp_e = 0;
}
- sprintf(reply, "260 Break on map of exec flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "260 Break on map of exec flow %s\r\n", code ? "started" : "stopped");
break;
case 0x161:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 161 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 161 command '%s'\r\n", cmd);
break;
}
}
@@ -839,13 +901,13 @@ static void ProcessCommands() {
} else {
breakmp_r8 = 0;
}
- sprintf(reply, "261 Break on map of read8 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "261 Break on map of read8 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x162:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 162 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 162 command '%s'\r\n", cmd);
break;
}
}
@@ -854,13 +916,13 @@ static void ProcessCommands() {
} else {
breakmp_r16 = 0;
}
- sprintf(reply, "262 Break on map of read16 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "262 Break on map of read16 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x163:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 163 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 163 command '%s'\r\n", cmd);
break;
}
}
@@ -869,13 +931,13 @@ static void ProcessCommands() {
} else {
breakmp_r32 = 0;
}
- sprintf(reply, "263 Break on map of read32 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "263 Break on map of read32 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x164:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 164 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 164 command '%s'\r\n", cmd);
break;
}
}
@@ -884,13 +946,13 @@ static void ProcessCommands() {
} else {
breakmp_w8 = 0;
}
- sprintf(reply, "264 Break on map of write8 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "264 Break on map of write8 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x165:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 165 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 165 command '%s'\r\n", cmd);
break;
}
}
@@ -899,13 +961,13 @@ static void ProcessCommands() {
} else {
breakmp_w16 = 0;
}
- sprintf(reply, "265 Break on map of write16 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "265 Break on map of write16 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x166:
code = 1;
if (arguments) {
if (sscanf(arguments, "%02X", &code) != 1) {
- sprintf(reply, "500 Malformed 166 command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Malformed 166 command '%s'\r\n", cmd);
break;
}
}
@@ -914,30 +976,37 @@ static void ProcessCommands() {
} else {
breakmp_w32 = 0;
}
- sprintf(reply, "266 Break on map of write32 flow %s\r\n", code ? "started" : "stopped");
+ dynstr_append(&reply, "266 Break on map of write32 flow %s\r\n", code ? "started" : "stopped");
break;
case 0x170:
- sfile = fopen("flow.idc", "wb");
- fprintf(sfile, "#include <idc.idc>\r\n\r\n");
- fprintf(sfile, "static main(void) {\r\n");
- for (i = 0; i < 0x00200000; i++) {
- if (IsMapMarked(i, MAP_EXEC_JAL)) {
- fprintf(sfile, "\tMakeFunction(0X8%07X,BADADDR);\r\n", i);
+ {
+ {
+ FILE *const sfile = fopen("flow.idc", "wb");
+ fprintf(sfile, "#include <idc.idc>\r\n\r\n");
+ fprintf(sfile, "static main(void) {\r\n");
+ for (i = 0; i < 0x00200000; i++) {
+ if (IsMapMarked(i, MAP_EXEC_JAL)) {
+ fprintf(sfile, "\tMakeFunction(0X8%07X,BADADDR);\r\n", i);
+ }
}
+ fprintf(sfile, "}\r\n");
+ fclose(sfile);
}
- fprintf(sfile, "}\r\n");
- fclose(sfile);
- sfile = fopen("markcode.idc", "wb");
- fprintf(sfile, "#include <idc.idc>\r\n\r\n");
- fprintf(sfile, "static main(void) {\r\n");
- for (i = 0; i < 0x00200000; i++) {
- if (IsMapMarked(i, MAP_EXEC)) {
- fprintf(sfile, "\tMakeCode(0X8%07X);\r\n", i);
+
+ {
+ FILE *const sfile = fopen("markcode.idc", "wb");
+ fprintf(sfile, "#include <idc.idc>\r\n\r\n");
+ fprintf(sfile, "static main(void) {\r\n");
+ for (i = 0; i < 0x00200000; i++) {
+ if (IsMapMarked(i, MAP_EXEC)) {
+ fprintf(sfile, "\tMakeCode(0X8%07X);\r\n", i);
+ }
}
+ fprintf(sfile, "}\r\n");
+ fclose(sfile);
+ dynstr_append(&reply, "270 flow.idc and markcode.idc dumped\r\n");
}
- fprintf(sfile, "}\r\n");
- fclose(sfile);
- sprintf(reply, "270 flow.idc and markcode.idc dumped\r\n");
+ }
break;
case 0x300:
p = arguments;
@@ -946,18 +1015,17 @@ static void ProcessCommands() {
}
if (p == arguments) {
if (first) {
- reply[0] = 0;
for (bp = first; bp; bp = next_breakpoint(bp)) {
- sprintf(reply, "%s400 %X@%08X-%s\r\n", reply, bp->number, bp->address, breakpoint_type_names[bp->type]);
+ dynstr_append(&reply, "%s400 %X@%08X-%s\r\n", bp->number, bp->address, breakpoint_type_names[bp->type]);
}
} else {
- sprintf(reply, "530 No breakpoint\r\n");
+ dynstr_append(&reply, "530 No breakpoint\r\n");
}
} else {
if ((bp = find_breakpoint(code))) {
- sprintf(reply, "400 %X@%08X-%s\r\n", bp->number, bp->address, breakpoint_type_names[bp->type]);
+ dynstr_append(&reply, "400 %X@%08X-%s\r\n", bp->number, bp->address, breakpoint_type_names[bp->type]);
} else {
- sprintf(reply, "530 Invalid breakpoint number: %X\r\n", code);
+ dynstr_append(&reply, "530 Invalid breakpoint number: %X\r\n", code);
}
}
break;
@@ -968,107 +1036,107 @@ static void ProcessCommands() {
}
if (p == arguments) {
while (first != NULL) delete_breakpoint(first);
- sprintf(reply, "401 All breakpoints deleted.\r\n");
+ dynstr_append(&reply, "401 All breakpoints deleted.\r\n");
} else {
if ((bp = find_breakpoint(code))) {
delete_breakpoint(bp);
- sprintf(reply, "401 Breakpoint %X deleted.\r\n", code);
+ dynstr_append(&reply, "401 Breakpoint %X deleted.\r\n", code);
} else {
- sprintf(reply, "530 Invalid breakpoint number: %X\r\n", code);
+ dynstr_append(&reply, "530 Invalid breakpoint number: %X\r\n", code);
}
}
break;
case 0x310:
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
- sprintf(reply, "500 Malformed 310 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 310 command '%s'\r\n", arguments);
break;
}
-// if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
-// sprintf(reply, "531 Invalid address %08X\r\n", address);
-// break;
-// }
+ // if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
+ // dynstr_append(&reply, "531 Invalid address %08X\r\n", address);
+ // break;
+ // }
code = add_breakpoint(BE, address);
- sprintf(reply, "410 %X\r\n", code);
+ dynstr_append(&reply, "410 %X\r\n", code);
break;
case 0x320:
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
- sprintf(reply, "500 Malformed 320 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 320 command '%s'\r\n", arguments);
break;
}
if ((address < 0x80000000) || (address >= 0x80200000)) {
- sprintf(reply, "532 Invalid address %08X\r\n", address);
+ dynstr_append(&reply, "532 Invalid address %08X\r\n", address);
break;
}
code = add_breakpoint(BR1, address);
- sprintf(reply, "420 %X\r\n", code);
+ dynstr_append(&reply, "420 %X\r\n", code);
break;
case 0x321:
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
- sprintf(reply, "500 Malformed 321 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 321 command '%s'\r\n", arguments);
break;
}
if ((address & 1) || (address < 0x80000000) || (address >= 0x80200000)) {
- sprintf(reply, "532 Invalid address %08X\r\n", address);
+ dynstr_append(&reply, "532 Invalid address %08X\r\n", address);
break;
}
code = add_breakpoint(BR2, address);
- sprintf(reply, "421 %X\r\n", code);
+ dynstr_append(&reply, "421 %X\r\n", code);
break;
case 0x322:
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
- sprintf(reply, "500 Malformed 322 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 322 command '%s'\r\n", arguments);
break;
}
if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
- sprintf(reply, "532 Invalid address %08X\r\n", address);
+ dynstr_append(&reply, "532 Invalid address %08X\r\n", address);
break;
}
code = add_breakpoint(BR4, address);
- sprintf(reply, "422 %X\r\n", code);
+ dynstr_append(&reply, "422 %X\r\n", code);
break;
case 0x330:
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
- sprintf(reply, "500 Malformed 330 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 330 command '%s'\r\n", arguments);
break;
}
if ((address < 0x80000000) || (address >= 0x80200000)) {
- sprintf(reply, "533 Invalid address %08X\r\n", address);
+ dynstr_append(&reply, "533 Invalid address %08X\r\n", address);
break;
}
code = add_breakpoint(BW1, address);
- sprintf(reply, "430 %X\r\n", code);
+ dynstr_append(&reply, "430 %X\r\n", code);
break;
case 0x331:
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
- sprintf(reply, "500 Malformed 331 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 331 command '%s'\r\n", arguments);
break;
}
if ((address & 1) || (address < 0x80000000) || (address >= 0x80200000)) {
- sprintf(reply, "533 Invalid address %08X\r\n", address);
+ dynstr_append(&reply, "533 Invalid address %08X\r\n", address);
break;
}
code = add_breakpoint(BW2, address);
- sprintf(reply, "431 %X\r\n", code);
+ dynstr_append(&reply, "431 %X\r\n", code);
break;
case 0x332:
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
- sprintf(reply, "500 Malformed 332 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 332 command '%s'\r\n", arguments);
break;
}
if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
- sprintf(reply, "533 Invalid address %08X\r\n", address);
+ dynstr_append(&reply, "533 Invalid address %08X\r\n", address);
break;
}
code = add_breakpoint(BW4, address);
- sprintf(reply, "432 %X\r\n", code);
+ dynstr_append(&reply, "432 %X\r\n", code);
break;
case 0x390:
paused = 1;
- sprintf(reply, "490 Paused\r\n");
+ dynstr_append(&reply, "490 Paused\r\n");
break;
case 0x391:
paused = 0;
- sprintf(reply, "491 Resumed\r\n");
+ dynstr_append(&reply, "491 Resumed\r\n");
break;
case 0x395:
p = arguments;
@@ -1079,7 +1147,7 @@ static void ProcessCommands() {
trace = 1;
}
paused = 0;
- sprintf(reply, "495 Tracing\r\n");
+ dynstr_append(&reply, "495 Tracing\r\n");
break;
case 0x396:
p = arguments;
@@ -1089,19 +1157,19 @@ static void ProcessCommands() {
if (p == arguments) {
printpc = !printpc;
}
- sprintf(reply, "496 Printing %s\r\n", printpc ? "enabled" : "disabled");
+ dynstr_append(&reply, "496 Printing %s\r\n", printpc ? "enabled" : "disabled");
break;
case 0x398:
paused = 0;
trace = 0;
reset = 2;
- sprintf(reply, "498 Soft resetting\r\n");
+ dynstr_append(&reply, "498 Soft resetting\r\n");
break;
case 0x399:
paused = 0;
trace = 0;
reset = 1;
- sprintf(reply, "499 Resetting\r\n");
+ dynstr_append(&reply, "499 Resetting\r\n");
break;
case 0x3A0:
// run to
@@ -1112,10 +1180,10 @@ static void ProcessCommands() {
paused = 0;
}
if (p == arguments) {
- sprintf(reply, "500 Malformed 3A0 command '%s'\r\n", arguments);
+ dynstr_append(&reply, "500 Malformed 3A0 command '%s'\r\n", arguments);
break;
}
- sprintf(reply, "4A0 run to addr %08X\r\n", run_to_addr);
+ dynstr_append(&reply, "4A0 run to addr %08X\r\n", run_to_addr);
break;
case 0x3A1:
// step over (jal)
@@ -1125,8 +1193,8 @@ static void ProcessCommands() {
step_over = 1;
step_over_addr = psxRegs.pc + 8;
paused = 0;
-
- sprintf(reply, "4A1 step over addr %08X\r\n", psxRegs.pc);
+
+ dynstr_append(&reply, "4A1 step over addr %08X\r\n", psxRegs.pc);
}
else {
trace = 1;
@@ -1135,13 +1203,14 @@ static void ProcessCommands() {
}
break;
default:
- sprintf(reply, "500 Unknown command '%s'\r\n", cmd);
+ dynstr_append(&reply, "500 Unknown command '%s'\r\n", cmd);
break;
}
- WriteSocket(reply, strlen(reply));
+ WriteSocket(client_socket, reply.str, reply.len);
+ dynstr_free(&reply);
if (dumping) {
- WriteSocket(dump, size);
+ WriteSocket(client_socket, dump, size);
}
if (save) {
@@ -1156,11 +1225,11 @@ void DebugCheckBP(u32 address, enum breakpoint_types type) {
if (!debugger_active || reset)
return;
-
+
for (bp = first; bp; bp = next_breakpoint(bp)) {
if ((bp->type == type) && (bp->address == address)) {
sprintf(reply, "030 %X@%08X\r\n", bp->number, psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ WriteSocket(client_socket, reply, strlen(reply));
paused = 1;
return;
}
@@ -1168,49 +1237,49 @@ void DebugCheckBP(u32 address, enum breakpoint_types type) {
if (breakmp_e && type == BE) {
if (!IsMapMarked(address, MAP_EXEC)) {
sprintf(reply, "010 %08X@%08X\r\n", address, psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ WriteSocket(client_socket, reply, strlen(reply));
paused = 1;
}
}
if (breakmp_r8 && type == BR1) {
if (!IsMapMarked(address, MAP_R8)) {
sprintf(reply, "011 %08X@%08X\r\n", address, psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ WriteSocket(client_socket, reply, strlen(reply));
paused = 1;
}
}
if (breakmp_r16 && type == BR2) {
if (!IsMapMarked(address, MAP_R16)) {
sprintf(reply, "012 %08X@%08X\r\n", address, psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ WriteSocket(client_socket, reply, strlen(reply));
paused = 1;
}
}
if (breakmp_r32 && type == BR4) {
if (!IsMapMarked(address, MAP_R32)) {
sprintf(reply, "013 %08X@%08X\r\n", address, psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ WriteSocket(client_socket, reply, strlen(reply));
paused = 1;
}
}
if (breakmp_w8 && type == BW1) {
if (!IsMapMarked(address, MAP_W8)) {
sprintf(reply, "014 %08X@%08X\r\n", address, psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ WriteSocket(client_socket, reply, strlen(reply));
paused = 1;
}
}
if (breakmp_w16 && type == BW2) {
if (!IsMapMarked(address, MAP_W16)) {
sprintf(reply, "015 %08X@%08X\r\n", address, psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ WriteSocket(client_socket, reply, strlen(reply));
paused = 1;
}
}
if (breakmp_w32 && type == BW4) {
if (!IsMapMarked(address, MAP_W32)) {
sprintf(reply, "016 %08X@%08X\r\n", address, psxRegs.pc);
- WriteSocket(reply, strlen(reply));
+ WriteSocket(client_socket, reply, strlen(reply));
paused = 1;
}
}