summaryrefslogtreecommitdiff
path: root/src/core/gdbstub/gdbstub.cpp
diff options
context:
space:
mode:
authorGravatar polaris-2015-10-21 07:14:43 -0400
committerGravatar polaris-2015-10-21 07:14:43 -0400
commit53aa55fcaa6491d2cc0836e25f9303f7ba4126f3 (patch)
tree11c4ca8780c1d5b01a3e80f809470f7c8ef70c38 /src/core/gdbstub/gdbstub.cpp
parentFix buffer overflow comments (diff)
downloadyuzu-53aa55fcaa6491d2cc0836e25f9303f7ba4126f3.tar.gz
yuzu-53aa55fcaa6491d2cc0836e25f9303f7ba4126f3.tar.xz
yuzu-53aa55fcaa6491d2cc0836e25f9303f7ba4126f3.zip
Try to add support for VFP registers
Diffstat (limited to 'src/core/gdbstub/gdbstub.cpp')
-rw-r--r--src/core/gdbstub/gdbstub.cpp25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp
index 0d586ca10..a6977302c 100644
--- a/src/core/gdbstub/gdbstub.cpp
+++ b/src/core/gdbstub/gdbstub.cpp
@@ -56,6 +56,7 @@ const u32 MSG_WAITALL = 8;
56const u32 R0_REGISTER = 0; 56const u32 R0_REGISTER = 0;
57const u32 R15_REGISTER = 15; 57const u32 R15_REGISTER = 15;
58const u32 CSPR_REGISTER = 25; 58const u32 CSPR_REGISTER = 25;
59const u32 FPSCR_REGISTER = 58;
59 60
60namespace GDBStub { 61namespace GDBStub {
61 62
@@ -468,6 +469,10 @@ static void ReadRegister() {
468 IntToHex(reply, Core::g_app_core->GetReg(id)); 469 IntToHex(reply, Core::g_app_core->GetReg(id));
469 } else if (id == CSPR_REGISTER) { 470 } else if (id == CSPR_REGISTER) {
470 IntToHex(reply, Core::g_app_core->GetCPSR()); 471 IntToHex(reply, Core::g_app_core->GetCPSR());
472 } else if (id > CSPR_REGISTER && id < FPSCR_REGISTER) {
473 IntToHex(reply, Core::g_app_core->GetVFPReg(id - CSPR_REGISTER - 1)); // VFP registers should start at 26, so one after CSPR_REGISTER
474 } else if (id == FPSCR_REGISTER) {
475 IntToHex(reply, Core::g_app_core->GetVFPSystemReg(VFP_FPSCR)); // Get FPSCR
471 } else { 476 } else {
472 return SendReply("E01"); 477 return SendReply("E01");
473 } 478 }
@@ -481,15 +486,19 @@ static void ReadRegisters() {
481 memset(buffer, 0, sizeof(buffer)); 486 memset(buffer, 0, sizeof(buffer));
482 487
483 u8* bufptr = buffer; 488 u8* bufptr = buffer;
484 for (int i = 0; i <= CSPR_REGISTER; i++) { 489 for (int i = 0; i <= FPSCR_REGISTER; i++) {
485 if (i <= R15_REGISTER) { 490 if (i <= R15_REGISTER) {
486 IntToHex(bufptr + i * 8, Core::g_app_core->GetReg(i)); 491 IntToHex(bufptr + i * 8, Core::g_app_core->GetReg(i));
487 } else if (i == CSPR_REGISTER) { 492 } else if (i == CSPR_REGISTER) {
488 IntToHex(bufptr + i * 8, Core::g_app_core->GetCPSR()); 493 IntToHex(bufptr + i * 8, Core::g_app_core->GetCPSR());
489 } else { 494 } else if (i < CSPR_REGISTER) {
490 IntToHex(bufptr + i * 8, 0); 495 IntToHex(bufptr + i * 8, 0);
491 IntToHex(bufptr + (i + 1) * 8, 0); 496 IntToHex(bufptr + (i + 1) * 8, 0);
492 i++; // These registers seem to be all 64bit instead of 32bit, so skip two instead of one 497 i++; // These registers seem to be all 64bit instead of 32bit, so skip two instead of one
498 } else if (i > CSPR_REGISTER && i < FPSCR_REGISTER) {
499 IntToHex(bufptr + i * 8, Core::g_app_core->GetVFPReg(i - CSPR_REGISTER - 1));
500 } else if (i == FPSCR_REGISTER) {
501 IntToHex(bufptr + i * 8, Core::g_app_core->GetVFPSystemReg(VFP_FPSCR));
493 } 502 }
494 } 503 }
495 504
@@ -511,6 +520,10 @@ static void WriteRegister() {
511 Core::g_app_core->SetReg(id, HexToInt(buffer_ptr)); 520 Core::g_app_core->SetReg(id, HexToInt(buffer_ptr));
512 } else if (id == CSPR_REGISTER) { 521 } else if (id == CSPR_REGISTER) {
513 Core::g_app_core->SetCPSR(HexToInt(buffer_ptr)); 522 Core::g_app_core->SetCPSR(HexToInt(buffer_ptr));
523 } else if (id > CSPR_REGISTER && id < FPSCR_REGISTER) {
524 Core::g_app_core->SetVFPReg(id - CSPR_REGISTER - 1, HexToInt(buffer_ptr));
525 } else if (id == FPSCR_REGISTER) {
526 Core::g_app_core->SetVFPSystemReg(VFP_FPSCR, HexToInt(buffer_ptr));
514 } else { 527 } else {
515 return SendReply("E01"); 528 return SendReply("E01");
516 } 529 }
@@ -525,13 +538,17 @@ static void WriteRegisters() {
525 if (command_buffer[0] != 'G') 538 if (command_buffer[0] != 'G')
526 return SendReply("E01"); 539 return SendReply("E01");
527 540
528 for (int i = 0; i <= CSPR_REGISTER; i++) { 541 for (int i = 0; i <= FPSCR_REGISTER; i++) {
529 if (i <= R15_REGISTER) { 542 if (i <= R15_REGISTER) {
530 Core::g_app_core->SetReg(i, HexToInt(buffer_ptr + i * 8)); 543 Core::g_app_core->SetReg(i, HexToInt(buffer_ptr + i * 8));
531 } else if (i == CSPR_REGISTER) { 544 } else if (i == CSPR_REGISTER) {
532 Core::g_app_core->SetCPSR(HexToInt(buffer_ptr + i * 8)); 545 Core::g_app_core->SetCPSR(HexToInt(buffer_ptr + i * 8));
533 } else { 546 } else if (i < CSPR_REGISTER) {
534 i++; // These registers seem to be all 64bit instead of 32bit, so skip two instead of one 547 i++; // These registers seem to be all 64bit instead of 32bit, so skip two instead of one
548 } else if (i > CSPR_REGISTER && i < FPSCR_REGISTER) {
549 Core::g_app_core->SetVFPReg(i - CSPR_REGISTER - 1, HexToInt(buffer_ptr + i * 8));
550 } else if (i == FPSCR_REGISTER) {
551 Core::g_app_core->SetVFPSystemReg(VFP_FPSCR, HexToInt(buffer_ptr + i * 8));
535 } 552 }
536 } 553 }
537 554