summaryrefslogtreecommitdiff
path: root/src/core/gdbstub/gdbstub.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/gdbstub/gdbstub.cpp')
-rw-r--r--src/core/gdbstub/gdbstub.cpp57
1 files changed, 31 insertions, 26 deletions
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp
index 003ce4167..3a2445241 100644
--- a/src/core/gdbstub/gdbstub.cpp
+++ b/src/core/gdbstub/gdbstub.cpp
@@ -57,9 +57,8 @@ const u32 MSG_WAITALL = 8;
57 57
58const u32 R0_REGISTER = 0; 58const u32 R0_REGISTER = 0;
59const u32 R15_REGISTER = 15; 59const u32 R15_REGISTER = 15;
60const u32 CSPR_REGISTER = 25; 60const u32 CPSR_REGISTER = 25;
61const u32 FPSCR_REGISTER = 58; 61const u32 FPSCR_REGISTER = 58;
62const u32 MAX_REGISTERS = 90;
63 62
64namespace GDBStub { 63namespace GDBStub {
65 64
@@ -472,10 +471,10 @@ static void ReadRegister() {
472 471
473 if (id >= R0_REGISTER && id <= R15_REGISTER) { 472 if (id >= R0_REGISTER && id <= R15_REGISTER) {
474 IntToGdbHex(reply, Core::g_app_core->GetReg(id)); 473 IntToGdbHex(reply, Core::g_app_core->GetReg(id));
475 } else if (id == CSPR_REGISTER) { 474 } else if (id == CPSR_REGISTER) {
476 IntToGdbHex(reply, Core::g_app_core->GetCPSR()); 475 IntToGdbHex(reply, Core::g_app_core->GetCPSR());
477 } else if (id > CSPR_REGISTER && id < FPSCR_REGISTER) { 476 } else if (id > CPSR_REGISTER && id < FPSCR_REGISTER) {
478 IntToGdbHex(reply, Core::g_app_core->GetVFPReg(id - CSPR_REGISTER - 1)); // VFP registers should start at 26, so one after CSPR_REGISTER 477 IntToGdbHex(reply, Core::g_app_core->GetVFPReg(id - CPSR_REGISTER - 1)); // VFP registers should start at 26, so one after CSPR_REGISTER
479 } else if (id == FPSCR_REGISTER) { 478 } else if (id == FPSCR_REGISTER) {
480 IntToGdbHex(reply, Core::g_app_core->GetVFPSystemReg(VFP_FPSCR)); // Get FPSCR 479 IntToGdbHex(reply, Core::g_app_core->GetVFPSystemReg(VFP_FPSCR)); // Get FPSCR
481 IntToGdbHex(reply + 8, 0); 480 IntToGdbHex(reply + 8, 0);
@@ -492,21 +491,25 @@ static void ReadRegisters() {
492 memset(buffer, 0, sizeof(buffer)); 491 memset(buffer, 0, sizeof(buffer));
493 492
494 u8* bufptr = buffer; 493 u8* bufptr = buffer;
495 for (int i = 0, reg = 0; i <= MAX_REGISTERS; i++, reg++) { 494 for (int i = 0, reg = 0; reg <= FPSCR_REGISTER; i++, reg++) {
496 if (i <= R15_REGISTER) { 495 if (reg <= R15_REGISTER) {
497 IntToGdbHex(bufptr + i * CHAR_BIT, Core::g_app_core->GetReg(reg)); 496 IntToGdbHex(bufptr + i * CHAR_BIT, Core::g_app_core->GetReg(reg));
498 } else if (i == CSPR_REGISTER) { 497 } else if (reg == CPSR_REGISTER) {
499 IntToGdbHex(bufptr + i * CHAR_BIT, Core::g_app_core->GetCPSR()); 498 IntToGdbHex(bufptr + i * CHAR_BIT, Core::g_app_core->GetCPSR());
500 } else if (i < CSPR_REGISTER) { 499 } else if (reg == CPSR_REGISTER - 1) {
500 // Dummy FPA register, ignore
501 IntToGdbHex(bufptr + i * CHAR_BIT, 0);
502 } else if (reg < CPSR_REGISTER) {
503 // Dummy FPA registers, ignore
501 IntToGdbHex(bufptr + i * CHAR_BIT, 0); 504 IntToGdbHex(bufptr + i * CHAR_BIT, 0);
502 IntToGdbHex(bufptr + (i + 1) * CHAR_BIT, 0); 505 IntToGdbHex(bufptr + (i + 1) * CHAR_BIT, 0);
503 i++; // These registers seem to be all 64bit instead of 32bit, so skip two instead of one 506 IntToGdbHex(bufptr + (i + 2) * CHAR_BIT, 0);
504 reg++; 507 i += 2;
505 } else if (i > CSPR_REGISTER && i < MAX_REGISTERS) { 508 } else if (reg > CPSR_REGISTER && reg < FPSCR_REGISTER) {
506 IntToGdbHex(bufptr + i * CHAR_BIT, Core::g_app_core->GetVFPReg(reg - CSPR_REGISTER - 1)); 509 IntToGdbHex(bufptr + i * CHAR_BIT, Core::g_app_core->GetVFPReg(reg - CPSR_REGISTER - 1));
507 IntToGdbHex(bufptr + (i + 1) * CHAR_BIT, 0); 510 IntToGdbHex(bufptr + (i + 1) * CHAR_BIT, 0);
508 i++; 511 i++;
509 } else if (i == MAX_REGISTERS) { 512 } else if (reg == FPSCR_REGISTER) {
510 IntToGdbHex(bufptr + i * CHAR_BIT, Core::g_app_core->GetVFPSystemReg(VFP_FPSCR)); 513 IntToGdbHex(bufptr + i * CHAR_BIT, Core::g_app_core->GetVFPSystemReg(VFP_FPSCR));
511 } 514 }
512 } 515 }
@@ -527,10 +530,10 @@ static void WriteRegister() {
527 530
528 if (id >= R0_REGISTER && id <= R15_REGISTER) { 531 if (id >= R0_REGISTER && id <= R15_REGISTER) {
529 Core::g_app_core->SetReg(id, GdbHexToInt(buffer_ptr)); 532 Core::g_app_core->SetReg(id, GdbHexToInt(buffer_ptr));
530 } else if (id == CSPR_REGISTER) { 533 } else if (id == CPSR_REGISTER) {
531 Core::g_app_core->SetCPSR(GdbHexToInt(buffer_ptr)); 534 Core::g_app_core->SetCPSR(GdbHexToInt(buffer_ptr));
532 } else if (id > CSPR_REGISTER && id < FPSCR_REGISTER) { 535 } else if (id > CPSR_REGISTER && id < FPSCR_REGISTER) {
533 Core::g_app_core->SetVFPReg(id - CSPR_REGISTER - 1, GdbHexToInt(buffer_ptr)); 536 Core::g_app_core->SetVFPReg(id - CPSR_REGISTER - 1, GdbHexToInt(buffer_ptr));
534 } else if (id == FPSCR_REGISTER) { 537 } else if (id == FPSCR_REGISTER) {
535 Core::g_app_core->SetVFPSystemReg(VFP_FPSCR, GdbHexToInt(buffer_ptr)); 538 Core::g_app_core->SetVFPSystemReg(VFP_FPSCR, GdbHexToInt(buffer_ptr));
536 } else { 539 } else {
@@ -547,18 +550,20 @@ static void WriteRegisters() {
547 if (command_buffer[0] != 'G') 550 if (command_buffer[0] != 'G')
548 return SendReply("E01"); 551 return SendReply("E01");
549 552
550 for (int i = 0, reg = 0; i <= MAX_REGISTERS; i++, reg++) { 553 for (int i = 0, reg = 0; reg <= FPSCR_REGISTER; i++, reg++) {
551 if (i <= R15_REGISTER) { 554 if (reg <= R15_REGISTER) {
552 Core::g_app_core->SetReg(reg, GdbHexToInt(buffer_ptr + i * CHAR_BIT)); 555 Core::g_app_core->SetReg(reg, GdbHexToInt(buffer_ptr + i * CHAR_BIT));
553 } else if (i == CSPR_REGISTER) { 556 } else if (reg == CPSR_REGISTER) {
554 Core::g_app_core->SetCPSR(GdbHexToInt(buffer_ptr + i * CHAR_BIT)); 557 Core::g_app_core->SetCPSR(GdbHexToInt(buffer_ptr + i * CHAR_BIT));
555 } else if (i < CSPR_REGISTER) { 558 } else if (reg == CPSR_REGISTER - 1) {
556 i++; // These registers seem to be all 64bit instead of 32bit, so skip two instead of one 559 // Dummy FPA register, ignore
557 reg++; 560 } else if (reg < CPSR_REGISTER) {
558 } else if (i > CSPR_REGISTER && i < MAX_REGISTERS) { 561 // Dummy FPA registers, ignore
559 Core::g_app_core->SetVFPReg(reg - CSPR_REGISTER - 1, GdbHexToInt(buffer_ptr + i * CHAR_BIT)); 562 i += 2;
563 } else if (reg > CPSR_REGISTER && reg < FPSCR_REGISTER) {
564 Core::g_app_core->SetVFPReg(reg - CPSR_REGISTER - 1, GdbHexToInt(buffer_ptr + i * CHAR_BIT));
560 i++; // Skip padding 565 i++; // Skip padding
561 } else if (i == MAX_REGISTERS) { 566 } else if (reg == FPSCR_REGISTER) {
562 Core::g_app_core->SetVFPSystemReg(VFP_FPSCR, GdbHexToInt(buffer_ptr + i * CHAR_BIT)); 567 Core::g_app_core->SetVFPSystemReg(VFP_FPSCR, GdbHexToInt(buffer_ptr + i * CHAR_BIT));
563 } 568 }
564 } 569 }