diff options
Diffstat (limited to 'src/core/gdbstub/gdbstub.cpp')
| -rw-r--r-- | src/core/gdbstub/gdbstub.cpp | 25 |
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; | |||
| 56 | const u32 R0_REGISTER = 0; | 56 | const u32 R0_REGISTER = 0; |
| 57 | const u32 R15_REGISTER = 15; | 57 | const u32 R15_REGISTER = 15; |
| 58 | const u32 CSPR_REGISTER = 25; | 58 | const u32 CSPR_REGISTER = 25; |
| 59 | const u32 FPSCR_REGISTER = 58; | ||
| 59 | 60 | ||
| 60 | namespace GDBStub { | 61 | namespace 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 | ||