1*27a4a30eSYoshinori Sato /* 2*27a4a30eSYoshinori Sato * RX gdb server stub 3*27a4a30eSYoshinori Sato * 4*27a4a30eSYoshinori Sato * Copyright (c) 2019 Yoshinori Sato 5*27a4a30eSYoshinori Sato * 6*27a4a30eSYoshinori Sato * This program is free software; you can redistribute it and/or modify it 7*27a4a30eSYoshinori Sato * under the terms and conditions of the GNU General Public License, 8*27a4a30eSYoshinori Sato * version 2 or later, as published by the Free Software Foundation. 9*27a4a30eSYoshinori Sato * 10*27a4a30eSYoshinori Sato * This program is distributed in the hope it will be useful, but WITHOUT 11*27a4a30eSYoshinori Sato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12*27a4a30eSYoshinori Sato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13*27a4a30eSYoshinori Sato * more details. 14*27a4a30eSYoshinori Sato * 15*27a4a30eSYoshinori Sato * You should have received a copy of the GNU General Public License along with 16*27a4a30eSYoshinori Sato * this program. If not, see <http://www.gnu.org/licenses/>. 17*27a4a30eSYoshinori Sato */ 18*27a4a30eSYoshinori Sato #include "qemu/osdep.h" 19*27a4a30eSYoshinori Sato #include "qemu-common.h" 20*27a4a30eSYoshinori Sato #include "cpu.h" 21*27a4a30eSYoshinori Sato #include "exec/gdbstub.h" 22*27a4a30eSYoshinori Sato 23*27a4a30eSYoshinori Sato int rx_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) 24*27a4a30eSYoshinori Sato { 25*27a4a30eSYoshinori Sato RXCPU *cpu = RXCPU(cs); 26*27a4a30eSYoshinori Sato CPURXState *env = &cpu->env; 27*27a4a30eSYoshinori Sato 28*27a4a30eSYoshinori Sato switch (n) { 29*27a4a30eSYoshinori Sato case 0 ... 15: 30*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->regs[n]); 31*27a4a30eSYoshinori Sato case 16: 32*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, (env->psw_u) ? env->regs[0] : env->usp); 33*27a4a30eSYoshinori Sato case 17: 34*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, (!env->psw_u) ? env->regs[0] : env->isp); 35*27a4a30eSYoshinori Sato case 18: 36*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, rx_cpu_pack_psw(env)); 37*27a4a30eSYoshinori Sato case 19: 38*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->pc); 39*27a4a30eSYoshinori Sato case 20: 40*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->intb); 41*27a4a30eSYoshinori Sato case 21: 42*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->bpsw); 43*27a4a30eSYoshinori Sato case 22: 44*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->bpc); 45*27a4a30eSYoshinori Sato case 23: 46*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->fintv); 47*27a4a30eSYoshinori Sato case 24: 48*27a4a30eSYoshinori Sato return gdb_get_regl(mem_buf, env->fpsw); 49*27a4a30eSYoshinori Sato case 25: 50*27a4a30eSYoshinori Sato return 0; 51*27a4a30eSYoshinori Sato } 52*27a4a30eSYoshinori Sato return 0; 53*27a4a30eSYoshinori Sato } 54*27a4a30eSYoshinori Sato 55*27a4a30eSYoshinori Sato int rx_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 56*27a4a30eSYoshinori Sato { 57*27a4a30eSYoshinori Sato RXCPU *cpu = RXCPU(cs); 58*27a4a30eSYoshinori Sato CPURXState *env = &cpu->env; 59*27a4a30eSYoshinori Sato uint32_t psw; 60*27a4a30eSYoshinori Sato switch (n) { 61*27a4a30eSYoshinori Sato case 0 ... 15: 62*27a4a30eSYoshinori Sato env->regs[n] = ldl_p(mem_buf); 63*27a4a30eSYoshinori Sato if (n == 0) { 64*27a4a30eSYoshinori Sato if (env->psw_u) { 65*27a4a30eSYoshinori Sato env->usp = env->regs[0]; 66*27a4a30eSYoshinori Sato } else { 67*27a4a30eSYoshinori Sato env->isp = env->regs[0]; 68*27a4a30eSYoshinori Sato } 69*27a4a30eSYoshinori Sato } 70*27a4a30eSYoshinori Sato break; 71*27a4a30eSYoshinori Sato case 16: 72*27a4a30eSYoshinori Sato env->usp = ldl_p(mem_buf); 73*27a4a30eSYoshinori Sato if (env->psw_u) { 74*27a4a30eSYoshinori Sato env->regs[0] = ldl_p(mem_buf); 75*27a4a30eSYoshinori Sato } 76*27a4a30eSYoshinori Sato break; 77*27a4a30eSYoshinori Sato case 17: 78*27a4a30eSYoshinori Sato env->isp = ldl_p(mem_buf); 79*27a4a30eSYoshinori Sato if (!env->psw_u) { 80*27a4a30eSYoshinori Sato env->regs[0] = ldl_p(mem_buf); 81*27a4a30eSYoshinori Sato } 82*27a4a30eSYoshinori Sato break; 83*27a4a30eSYoshinori Sato case 18: 84*27a4a30eSYoshinori Sato psw = ldl_p(mem_buf); 85*27a4a30eSYoshinori Sato rx_cpu_unpack_psw(env, psw, 1); 86*27a4a30eSYoshinori Sato break; 87*27a4a30eSYoshinori Sato case 19: 88*27a4a30eSYoshinori Sato env->pc = ldl_p(mem_buf); 89*27a4a30eSYoshinori Sato break; 90*27a4a30eSYoshinori Sato case 20: 91*27a4a30eSYoshinori Sato env->intb = ldl_p(mem_buf); 92*27a4a30eSYoshinori Sato break; 93*27a4a30eSYoshinori Sato case 21: 94*27a4a30eSYoshinori Sato env->bpsw = ldl_p(mem_buf); 95*27a4a30eSYoshinori Sato break; 96*27a4a30eSYoshinori Sato case 22: 97*27a4a30eSYoshinori Sato env->bpc = ldl_p(mem_buf); 98*27a4a30eSYoshinori Sato break; 99*27a4a30eSYoshinori Sato case 23: 100*27a4a30eSYoshinori Sato env->fintv = ldl_p(mem_buf); 101*27a4a30eSYoshinori Sato break; 102*27a4a30eSYoshinori Sato case 24: 103*27a4a30eSYoshinori Sato env->fpsw = ldl_p(mem_buf); 104*27a4a30eSYoshinori Sato break; 105*27a4a30eSYoshinori Sato case 25: 106*27a4a30eSYoshinori Sato return 8; 107*27a4a30eSYoshinori Sato default: 108*27a4a30eSYoshinori Sato return 0; 109*27a4a30eSYoshinori Sato } 110*27a4a30eSYoshinori Sato 111*27a4a30eSYoshinori Sato return 4; 112*27a4a30eSYoshinori Sato } 113