/* * RX gdb server stub * * Copyright (c) 2019 Yoshinori Sato * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2 or later, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ #include "qemu/osdep.h" #include "qemu-common.h" #include "cpu.h" #include "exec/gdbstub.h" int rx_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) { RXCPU *cpu = RX_CPU(cs); CPURXState *env = &cpu->env; switch (n) { case 0 ... 15: return gdb_get_regl(mem_buf, env->regs[n]); case 16: return gdb_get_regl(mem_buf, (env->psw_u) ? env->regs[0] : env->usp); case 17: return gdb_get_regl(mem_buf, (!env->psw_u) ? env->regs[0] : env->isp); case 18: return gdb_get_regl(mem_buf, rx_cpu_pack_psw(env)); case 19: return gdb_get_regl(mem_buf, env->pc); case 20: return gdb_get_regl(mem_buf, env->intb); case 21: return gdb_get_regl(mem_buf, env->bpsw); case 22: return gdb_get_regl(mem_buf, env->bpc); case 23: return gdb_get_regl(mem_buf, env->fintv); case 24: return gdb_get_regl(mem_buf, env->fpsw); case 25: return 0; } return 0; } int rx_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) { RXCPU *cpu = RX_CPU(cs); CPURXState *env = &cpu->env; uint32_t psw; switch (n) { case 0 ... 15: env->regs[n] = ldl_p(mem_buf); if (n == 0) { if (env->psw_u) { env->usp = env->regs[0]; } else { env->isp = env->regs[0]; } } break; case 16: env->usp = ldl_p(mem_buf); if (env->psw_u) { env->regs[0] = ldl_p(mem_buf); } break; case 17: env->isp = ldl_p(mem_buf); if (!env->psw_u) { env->regs[0] = ldl_p(mem_buf); } break; case 18: psw = ldl_p(mem_buf); rx_cpu_unpack_psw(env, psw, 1); break; case 19: env->pc = ldl_p(mem_buf); break; case 20: env->intb = ldl_p(mem_buf); break; case 21: env->bpsw = ldl_p(mem_buf); break; case 22: env->bpc = ldl_p(mem_buf); break; case 23: env->fintv = ldl_p(mem_buf); break; case 24: env->fpsw = ldl_p(mem_buf); break; case 25: return 8; default: return 0; } return 4; }