mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-11 00:29:11 +01:00
Fix read/write registers.
Fix read/write register support for r0 - rF. Reshuffle to have reads/writes together in code.
This commit is contained in:
parent
465df943a5
commit
764e155a76
@ -25,6 +25,10 @@
|
|||||||
#include "../PowerPC/PowerPC.h"
|
#include "../PowerPC/PowerPC.h"
|
||||||
#include "VideoBackendBase.h"
|
#include "VideoBackendBase.h"
|
||||||
|
|
||||||
|
#ifdef USE_GDBSTUB
|
||||||
|
#include "../PowerPC/GDBStub.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Memory
|
namespace Memory
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -399,14 +399,41 @@ static void wbe64hex(u8 *p, u64 v)
|
|||||||
p[i] = nibble2hex(v >> (60 - 4*i));
|
p[i] = nibble2hex(v >> (60 - 4*i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 re32hex(u8 *p)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
u32 res = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
res = (res << 4) | hex2char(p[i]);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u64 re64hex(u8 *p)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
u64 res = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
res = (res << 4) | hex2char(p[i]);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static void gdb_read_register()
|
static void gdb_read_register()
|
||||||
{
|
{
|
||||||
static u8 reply[64];
|
static u8 reply[64];
|
||||||
u32 id;
|
u32 id;
|
||||||
|
|
||||||
memset(reply, 0, sizeof reply);
|
memset(reply, 0, sizeof reply);
|
||||||
id = hex2char(cmd_bfr[1]) << 4;
|
id = hex2char(cmd_bfr[1]);
|
||||||
|
if (cmd_bfr[2] != '\0')
|
||||||
|
{
|
||||||
|
id <<= 4;
|
||||||
id |= hex2char(cmd_bfr[2]);
|
id |= hex2char(cmd_bfr[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0 ... 31:
|
case 0 ... 31:
|
||||||
@ -458,13 +485,13 @@ static void gdb_read_registers()
|
|||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
wbe32hex(bufptr + i*8, GPR(i));
|
wbe32hex(bufptr + i*8, GPR(i));
|
||||||
}
|
}
|
||||||
bufptr += 32 * 4;
|
bufptr += 32 * 8;
|
||||||
|
|
||||||
|
/*
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
wbe64hex(bufptr + i*16, riPS0(i));
|
wbe32hex(bufptr + i*8, riPS0(i));
|
||||||
}
|
}
|
||||||
bufptr += 64 * 4;
|
bufptr += 32 * 8;
|
||||||
|
|
||||||
wbe32hex(bufptr, PC); bufptr += 4;
|
wbe32hex(bufptr, PC); bufptr += 4;
|
||||||
wbe32hex(bufptr, MSR); bufptr += 4;
|
wbe32hex(bufptr, MSR); bufptr += 4;
|
||||||
wbe32hex(bufptr, GetCR()); bufptr += 4;
|
wbe32hex(bufptr, GetCR()); bufptr += 4;
|
||||||
@ -475,60 +502,21 @@ static void gdb_read_registers()
|
|||||||
wbe32hex(bufptr, PowerPC::ppcState.spr[SPR_XER]); bufptr += 4;
|
wbe32hex(bufptr, PowerPC::ppcState.spr[SPR_XER]); bufptr += 4;
|
||||||
// MQ register not used.
|
// MQ register not used.
|
||||||
wbe32hex(bufptr, 0x0BADC0DE); bufptr += 4;
|
wbe32hex(bufptr, 0x0BADC0DE); bufptr += 4;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
gdb_reply((char *)bfr);
|
gdb_reply((char *)bfr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 re32hex(u8 *p)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
u32 res = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
res = (res << 4) | hex2char(p[i]);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static u64 re64hex(u8 *p)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
u64 res = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
res = (res << 4) | hex2char(p[i]);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gdb_write_registers()
|
static void gdb_write_registers()
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i;
|
||||||
u8 * bufptr = cmd_bfr;
|
u8 * bufptr = cmd_bfr;
|
||||||
|
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
GPR(i) = re32hex(bufptr + i*4);
|
GPR(i) = re32hex(bufptr + i*8);
|
||||||
}
|
}
|
||||||
bufptr += 32 * 4;
|
bufptr += 32 * 8;
|
||||||
|
|
||||||
for (i = 0; i < 32; i++) {
|
|
||||||
riPS0(i) = re64hex(bufptr + i*4);
|
|
||||||
}
|
|
||||||
bufptr += 64 * 4;
|
|
||||||
|
|
||||||
PC = re32hex(bufptr); bufptr += 4;
|
|
||||||
MSR = re32hex(bufptr); bufptr += 4;
|
|
||||||
SetCR(re32hex(bufptr)); bufptr += 4;
|
|
||||||
LR = re32hex(bufptr); bufptr += 4;
|
|
||||||
|
|
||||||
|
|
||||||
CTR = re32hex(bufptr); bufptr += 4;
|
|
||||||
PowerPC::ppcState.spr[SPR_XER] = re32hex(bufptr); bufptr += 4;
|
|
||||||
// MQ register not used.
|
|
||||||
(void)re32hex(bufptr); bufptr += 4;
|
|
||||||
|
|
||||||
|
|
||||||
gdb_reply("OK");
|
gdb_reply("OK");
|
||||||
}
|
}
|
||||||
@ -537,12 +525,15 @@ static void gdb_write_register()
|
|||||||
{
|
{
|
||||||
u32 id;
|
u32 id;
|
||||||
|
|
||||||
id = hex2char(cmd_bfr[1]) << 4;
|
u8 * bufptr = cmd_bfr + 3;
|
||||||
|
|
||||||
|
id = hex2char(cmd_bfr[1]);
|
||||||
|
if (cmd_bfr[2] != '=')
|
||||||
|
{
|
||||||
|
++bufptr;
|
||||||
|
id <<= 4;
|
||||||
id |= hex2char(cmd_bfr[2]);
|
id |= hex2char(cmd_bfr[2]);
|
||||||
|
}
|
||||||
|
|
||||||
u8 * bufptr = cmd_bfr + 4;
|
|
||||||
|
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case 0 ... 31:
|
case 0 ... 31:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user