127a4a30eSYoshinori Sato /* 227a4a30eSYoshinori Sato * RX gdb server stub 327a4a30eSYoshinori Sato * 427a4a30eSYoshinori Sato * Copyright (c) 2019 Yoshinori Sato 527a4a30eSYoshinori Sato * 627a4a30eSYoshinori Sato * This program is free software; you can redistribute it and/or modify it 727a4a30eSYoshinori Sato * under the terms and conditions of the GNU General Public License, 827a4a30eSYoshinori Sato * version 2 or later, as published by the Free Software Foundation. 927a4a30eSYoshinori Sato * 1027a4a30eSYoshinori Sato * This program is distributed in the hope it will be useful, but WITHOUT 1127a4a30eSYoshinori Sato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1227a4a30eSYoshinori Sato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 1327a4a30eSYoshinori Sato * more details. 1427a4a30eSYoshinori Sato * 1527a4a30eSYoshinori Sato * You should have received a copy of the GNU General Public License along with 1627a4a30eSYoshinori Sato * this program. If not, see <http://www.gnu.org/licenses/>. 1727a4a30eSYoshinori Sato */ 1827a4a30eSYoshinori Sato #include "qemu/osdep.h" 1927a4a30eSYoshinori Sato #include "cpu.h" 204ea5fe99SAlex Bennée #include "gdbstub/helpers.h" 2127a4a30eSYoshinori Sato 2227a4a30eSYoshinori Sato int rx_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) 2327a4a30eSYoshinori Sato { 24*f2a4459dSPhilippe Mathieu-Daudé CPURXState *env = cpu_env(cs); 2527a4a30eSYoshinori Sato 2627a4a30eSYoshinori Sato switch (n) { 2727a4a30eSYoshinori Sato case 0 ... 15: 2827a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->regs[n]); 2927a4a30eSYoshinori Sato case 16: 3027a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, (env->psw_u) ? env->regs[0] : env->usp); 3127a4a30eSYoshinori Sato case 17: 3227a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, (!env->psw_u) ? env->regs[0] : env->isp); 3327a4a30eSYoshinori Sato case 18: 3427a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, rx_cpu_pack_psw(env)); 3527a4a30eSYoshinori Sato case 19: 3627a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->pc); 3727a4a30eSYoshinori Sato case 20: 3827a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->intb); 3927a4a30eSYoshinori Sato case 21: 4027a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->bpsw); 4127a4a30eSYoshinori Sato case 22: 4227a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->bpc); 4327a4a30eSYoshinori Sato case 23: 4427a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->fintv); 4527a4a30eSYoshinori Sato case 24: 4627a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->fpsw); 4727a4a30eSYoshinori Sato case 25: 4827a4a30eSYoshinori Sato return 0; 4927a4a30eSYoshinori Sato } 5027a4a30eSYoshinori Sato return 0; 5127a4a30eSYoshinori Sato } 5227a4a30eSYoshinori Sato 5327a4a30eSYoshinori Sato int rx_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 5427a4a30eSYoshinori Sato { 55*f2a4459dSPhilippe Mathieu-Daudé CPURXState *env = cpu_env(cs); 5627a4a30eSYoshinori Sato uint32_t psw; 5727a4a30eSYoshinori Sato switch (n) { 5827a4a30eSYoshinori Sato case 0 ... 15: 5927a4a30eSYoshinori Sato env->regs[n] = ldl_p(mem_buf); 6027a4a30eSYoshinori Sato if (n == 0) { 6127a4a30eSYoshinori Sato if (env->psw_u) { 6227a4a30eSYoshinori Sato env->usp = env->regs[0]; 6327a4a30eSYoshinori Sato } else { 6427a4a30eSYoshinori Sato env->isp = env->regs[0]; 6527a4a30eSYoshinori Sato } 6627a4a30eSYoshinori Sato } 6727a4a30eSYoshinori Sato break; 6827a4a30eSYoshinori Sato case 16: 6927a4a30eSYoshinori Sato env->usp = ldl_p(mem_buf); 7027a4a30eSYoshinori Sato if (env->psw_u) { 7127a4a30eSYoshinori Sato env->regs[0] = ldl_p(mem_buf); 7227a4a30eSYoshinori Sato } 7327a4a30eSYoshinori Sato break; 7427a4a30eSYoshinori Sato case 17: 7527a4a30eSYoshinori Sato env->isp = ldl_p(mem_buf); 7627a4a30eSYoshinori Sato if (!env->psw_u) { 7727a4a30eSYoshinori Sato env->regs[0] = ldl_p(mem_buf); 7827a4a30eSYoshinori Sato } 7927a4a30eSYoshinori Sato break; 8027a4a30eSYoshinori Sato case 18: 8127a4a30eSYoshinori Sato psw = ldl_p(mem_buf); 8227a4a30eSYoshinori Sato rx_cpu_unpack_psw(env, psw, 1); 8327a4a30eSYoshinori Sato break; 8427a4a30eSYoshinori Sato case 19: 8527a4a30eSYoshinori Sato env->pc = ldl_p(mem_buf); 8627a4a30eSYoshinori Sato break; 8727a4a30eSYoshinori Sato case 20: 8827a4a30eSYoshinori Sato env->intb = ldl_p(mem_buf); 8927a4a30eSYoshinori Sato break; 9027a4a30eSYoshinori Sato case 21: 9127a4a30eSYoshinori Sato env->bpsw = ldl_p(mem_buf); 9227a4a30eSYoshinori Sato break; 9327a4a30eSYoshinori Sato case 22: 9427a4a30eSYoshinori Sato env->bpc = ldl_p(mem_buf); 9527a4a30eSYoshinori Sato break; 9627a4a30eSYoshinori Sato case 23: 9727a4a30eSYoshinori Sato env->fintv = ldl_p(mem_buf); 9827a4a30eSYoshinori Sato break; 9927a4a30eSYoshinori Sato case 24: 10027a4a30eSYoshinori Sato env->fpsw = ldl_p(mem_buf); 10127a4a30eSYoshinori Sato break; 10227a4a30eSYoshinori Sato case 25: 10327a4a30eSYoshinori Sato return 8; 10427a4a30eSYoshinori Sato default: 10527a4a30eSYoshinori Sato return 0; 10627a4a30eSYoshinori Sato } 10727a4a30eSYoshinori Sato 10827a4a30eSYoshinori Sato return 4; 10927a4a30eSYoshinori Sato } 110