Signed-off-by: Taylor Simpson <tsimp...@quicinc.com> --- target/hexagon/gdbstub.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+)
diff --git a/target/hexagon/gdbstub.c b/target/hexagon/gdbstub.c index 9c8c04c..b804e97 100644 --- a/target/hexagon/gdbstub.c +++ b/target/hexagon/gdbstub.c @@ -21,6 +21,30 @@ #include "cpu.h" #include "internal.h" +static int gdb_get_vreg(CPUHexagonState *env, GByteArray *mem_buf, int n) +{ + int total = 0; + int i; + for (i = 0; i < MAX_VEC_SIZE_BYTES / sizeof(uint32_t); i++) { + total += gdb_get_regl(mem_buf, env->VRegs[n].uw[i]); + mem_buf += sizeof(uint32_t); + } + return total; +} + +static int gdb_get_qreg(CPUHexagonState *env, GByteArray *mem_buf, int n) +{ + int total = 0; + int i; + for (i = 0; + i < MAX_VEC_SIZE_BYTES / sizeof(uint32_t) / BITS_PER_BYTE; + i++) { + total += gdb_get_regl(mem_buf, env->QRegs[n].uw[i]); + mem_buf += sizeof(uint32_t); + } + return total; +} + int hexagon_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { HexagonCPU *cpu = HEXAGON_CPU(cs); @@ -29,10 +53,42 @@ int hexagon_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) if (n < TOTAL_PER_THREAD_REGS) { return gdb_get_regl(mem_buf, env->gpr[n]); } + n -= TOTAL_PER_THREAD_REGS; + + if (n < NUM_VREGS) { + return gdb_get_vreg(env, mem_buf, n); + } + n -= NUM_VREGS; + + if (n < NUM_QREGS) { + return gdb_get_qreg(env, mem_buf, n); + } g_assert_not_reached(); } +static int gdb_put_vreg(CPUHexagonState *env, uint8_t *mem_buf, int n) +{ + int i; + for (i = 0; i < MAX_VEC_SIZE_BYTES / sizeof(uint32_t); i++) { + env->VRegs[n].uw[i] = ldtul_p(mem_buf); + mem_buf += sizeof(uint32_t); + } + return MAX_VEC_SIZE_BYTES; +} + +static int gdb_put_qreg(CPUHexagonState *env, uint8_t *mem_buf, int n) +{ + int i; + for (i = 0; + i < MAX_VEC_SIZE_BYTES / sizeof(uint32_t) / BITS_PER_BYTE; + i++) { + env->QRegs[n].uw[i] = ldtul_p(mem_buf); + mem_buf += sizeof(uint32_t); + } + return MAX_VEC_SIZE_BYTES / BITS_PER_BYTE; +} + int hexagon_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) { HexagonCPU *cpu = HEXAGON_CPU(cs); @@ -42,6 +98,16 @@ int hexagon_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) env->gpr[n] = ldtul_p(mem_buf); return sizeof(target_ulong); } + n -= TOTAL_PER_THREAD_REGS; + + if (n < NUM_VREGS) { + return gdb_put_vreg(env, mem_buf, n); + } + n -= NUM_VREGS; + + if (n < NUM_QREGS) { + return gdb_put_qreg(env, mem_buf, n); + } g_assert_not_reached(); } -- 2.7.4