summaryrefslogtreecommitdiff
path: root/src/core/gdbstub/gdbstub.cpp
diff options
context:
space:
mode:
authorGravatar polaris-2015-11-21 10:31:02 -0500
committerGravatar polaris-2015-11-22 07:48:26 -0500
commit2732ec758d56df2abd7fbb117982642696b4ef15 (patch)
treeae9e835ac5c9d056504627777cd82cbf3bdb002d /src/core/gdbstub/gdbstub.cpp
parentMerge pull request #1237 from Subv/ubos (diff)
downloadyuzu-2732ec758d56df2abd7fbb117982642696b4ef15.tar.gz
yuzu-2732ec758d56df2abd7fbb117982642696b4ef15.tar.xz
yuzu-2732ec758d56df2abd7fbb117982642696b4ef15.zip
Fix read and write register blocks in gdbstub
Previously, the padding wasn't correctly accounted for which caused the gdbstub to read and write everything after R15 (starting with the dummy FPA registers) incorrectly, which caused CPSR to not be handled correctly. Everything appears to be working as expected with this change.
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 }