xref: /openbmc/qemu/target/rx/gdbstub.c (revision 4ea5fe99)
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"
20*4ea5fe99SAlex Bennée #include "gdbstub/helpers.h"
2127a4a30eSYoshinori Sato 
rx_cpu_gdb_read_register(CPUState * cs,GByteArray * mem_buf,int n)2227a4a30eSYoshinori Sato int rx_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
2327a4a30eSYoshinori Sato {
2438688fdbSEduardo Habkost     RXCPU *cpu = RX_CPU(cs);
2527a4a30eSYoshinori Sato     CPURXState *env = &cpu->env;
2627a4a30eSYoshinori Sato 
2727a4a30eSYoshinori Sato     switch (n) {
2827a4a30eSYoshinori Sato     case 0 ... 15:
2927a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, env->regs[n]);
3027a4a30eSYoshinori Sato     case 16:
3127a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, (env->psw_u) ? env->regs[0] : env->usp);
3227a4a30eSYoshinori Sato     case 17:
3327a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, (!env->psw_u) ? env->regs[0] : env->isp);
3427a4a30eSYoshinori Sato     case 18:
3527a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, rx_cpu_pack_psw(env));
3627a4a30eSYoshinori Sato     case 19:
3727a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, env->pc);
3827a4a30eSYoshinori Sato     case 20:
3927a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, env->intb);
4027a4a30eSYoshinori Sato     case 21:
4127a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, env->bpsw);
4227a4a30eSYoshinori Sato     case 22:
4327a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, env->bpc);
4427a4a30eSYoshinori Sato     case 23:
4527a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, env->fintv);
4627a4a30eSYoshinori Sato     case 24:
4727a4a30eSYoshinori Sato         return gdb_get_regl(mem_buf, env->fpsw);
4827a4a30eSYoshinori Sato     case 25:
4927a4a30eSYoshinori Sato         return 0;
5027a4a30eSYoshinori Sato     }
5127a4a30eSYoshinori Sato     return 0;
5227a4a30eSYoshinori Sato }
5327a4a30eSYoshinori Sato 
rx_cpu_gdb_write_register(CPUState * cs,uint8_t * mem_buf,int n)5427a4a30eSYoshinori Sato int rx_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
5527a4a30eSYoshinori Sato {
5638688fdbSEduardo Habkost     RXCPU *cpu = RX_CPU(cs);
5727a4a30eSYoshinori Sato     CPURXState *env = &cpu->env;
5827a4a30eSYoshinori Sato     uint32_t psw;
5927a4a30eSYoshinori Sato     switch (n) {
6027a4a30eSYoshinori Sato     case 0 ... 15:
6127a4a30eSYoshinori Sato         env->regs[n] = ldl_p(mem_buf);
6227a4a30eSYoshinori Sato         if (n == 0) {
6327a4a30eSYoshinori Sato             if (env->psw_u) {
6427a4a30eSYoshinori Sato                 env->usp = env->regs[0];
6527a4a30eSYoshinori Sato             } else {
6627a4a30eSYoshinori Sato                 env->isp = env->regs[0];
6727a4a30eSYoshinori Sato             }
6827a4a30eSYoshinori Sato         }
6927a4a30eSYoshinori Sato         break;
7027a4a30eSYoshinori Sato     case 16:
7127a4a30eSYoshinori Sato         env->usp = ldl_p(mem_buf);
7227a4a30eSYoshinori Sato         if (env->psw_u) {
7327a4a30eSYoshinori Sato             env->regs[0] = ldl_p(mem_buf);
7427a4a30eSYoshinori Sato         }
7527a4a30eSYoshinori Sato         break;
7627a4a30eSYoshinori Sato     case 17:
7727a4a30eSYoshinori Sato         env->isp = ldl_p(mem_buf);
7827a4a30eSYoshinori Sato         if (!env->psw_u) {
7927a4a30eSYoshinori Sato             env->regs[0] = ldl_p(mem_buf);
8027a4a30eSYoshinori Sato         }
8127a4a30eSYoshinori Sato         break;
8227a4a30eSYoshinori Sato     case 18:
8327a4a30eSYoshinori Sato         psw = ldl_p(mem_buf);
8427a4a30eSYoshinori Sato         rx_cpu_unpack_psw(env, psw, 1);
8527a4a30eSYoshinori Sato         break;
8627a4a30eSYoshinori Sato     case 19:
8727a4a30eSYoshinori Sato         env->pc = ldl_p(mem_buf);
8827a4a30eSYoshinori Sato         break;
8927a4a30eSYoshinori Sato     case 20:
9027a4a30eSYoshinori Sato         env->intb = ldl_p(mem_buf);
9127a4a30eSYoshinori Sato         break;
9227a4a30eSYoshinori Sato     case 21:
9327a4a30eSYoshinori Sato         env->bpsw = ldl_p(mem_buf);
9427a4a30eSYoshinori Sato         break;
9527a4a30eSYoshinori Sato     case 22:
9627a4a30eSYoshinori Sato         env->bpc = ldl_p(mem_buf);
9727a4a30eSYoshinori Sato         break;
9827a4a30eSYoshinori Sato     case 23:
9927a4a30eSYoshinori Sato         env->fintv = ldl_p(mem_buf);
10027a4a30eSYoshinori Sato         break;
10127a4a30eSYoshinori Sato     case 24:
10227a4a30eSYoshinori Sato         env->fpsw = ldl_p(mem_buf);
10327a4a30eSYoshinori Sato         break;
10427a4a30eSYoshinori Sato     case 25:
10527a4a30eSYoshinori Sato         return 8;
10627a4a30eSYoshinori Sato     default:
10727a4a30eSYoshinori Sato         return 0;
10827a4a30eSYoshinori Sato     }
10927a4a30eSYoshinori Sato 
11027a4a30eSYoshinori Sato     return 4;
11127a4a30eSYoshinori Sato }
112