2
1
Fork 0
mirror of https://github.com/yuzu-emu/yuzu.git synced 2024-07-04 23:31:19 +01:00

gdbstub_arch: Directly access SP register

Currently to access the SP register, RegRead and RegWrite rely on a
out-of-bounds array access to reach the next element in a struct. As
of writing only git versions of GCC catch this error.

Specify the SP register when we want to access it in these functions.
This commit is contained in:
lat9nq 2022-06-30 12:40:01 -04:00
parent 01bc0c84f0
commit 7b0affb6e0

View file

@ -191,8 +191,10 @@ std::string GDBStubA64::RegRead(const Kernel::KThread* thread, size_t id) const
const auto& gprs{context.cpu_registers}; const auto& gprs{context.cpu_registers};
const auto& fprs{context.vector_registers}; const auto& fprs{context.vector_registers};
if (id <= SP_REGISTER) { if (id < SP_REGISTER) {
return ValueToHex(gprs[id]); return ValueToHex(gprs[id]);
} else if (id == SP_REGISTER) {
return ValueToHex(context.sp);
} else if (id == PC_REGISTER) { } else if (id == PC_REGISTER) {
return ValueToHex(context.pc); return ValueToHex(context.pc);
} else if (id == PSTATE_REGISTER) { } else if (id == PSTATE_REGISTER) {
@ -215,8 +217,10 @@ void GDBStubA64::RegWrite(Kernel::KThread* thread, size_t id, std::string_view v
auto& context{thread->GetContext64()}; auto& context{thread->GetContext64()};
if (id <= SP_REGISTER) { if (id < SP_REGISTER) {
context.cpu_registers[id] = HexToValue<u64>(value); context.cpu_registers[id] = HexToValue<u64>(value);
} else if (id == SP_REGISTER) {
context.sp = HexToValue<u64>(value);
} else if (id == PC_REGISTER) { } else if (id == PC_REGISTER) {
context.pc = HexToValue<u64>(value); context.pc = HexToValue<u64>(value);
} else if (id == PSTATE_REGISTER) { } else if (id == PSTATE_REGISTER) {