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