1d127de3bSBastian Koppelmann /*
2d127de3bSBastian Koppelmann * TriCore gdb server stub
3d127de3bSBastian Koppelmann *
4d127de3bSBastian Koppelmann * Copyright (c) 2019 Bastian Koppelmann, Paderborn University
5d127de3bSBastian Koppelmann *
6d127de3bSBastian Koppelmann * This library is free software; you can redistribute it and/or
7d127de3bSBastian Koppelmann * modify it under the terms of the GNU Lesser General Public
8d127de3bSBastian Koppelmann * License as published by the Free Software Foundation; either
9eb85394fSChetan Pant * version 2.1 of the License, or (at your option) any later version.
10d127de3bSBastian Koppelmann *
11d127de3bSBastian Koppelmann * This library is distributed in the hope that it will be useful,
12d127de3bSBastian Koppelmann * but WITHOUT ANY WARRANTY; without even the implied warranty of
13d127de3bSBastian Koppelmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14d127de3bSBastian Koppelmann * Lesser General Public License for more details.
15d127de3bSBastian Koppelmann *
16d127de3bSBastian Koppelmann * You should have received a copy of the GNU Lesser General Public
17d127de3bSBastian Koppelmann * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18d127de3bSBastian Koppelmann */
19d127de3bSBastian Koppelmann
20d127de3bSBastian Koppelmann #include "qemu/osdep.h"
214ea5fe99SAlex Bennée #include "gdbstub/helpers.h"
220654c794SPhilippe Mathieu-Daudé #include "cpu.h"
23d127de3bSBastian Koppelmann
24d127de3bSBastian Koppelmann
25d127de3bSBastian Koppelmann #define LCX_REGNUM 32
26d127de3bSBastian Koppelmann #define FCX_REGNUM 33
27d127de3bSBastian Koppelmann #define PCXI_REGNUM 34
28d127de3bSBastian Koppelmann #define TRICORE_PSW_REGNUM 35
29d127de3bSBastian Koppelmann #define TRICORE_PC_REGNUM 36
30d127de3bSBastian Koppelmann #define ICR_REGNUM 37
31d127de3bSBastian Koppelmann #define ISP_REGNUM 38
32d127de3bSBastian Koppelmann #define BTV_REGNUM 39
33d127de3bSBastian Koppelmann #define BIV_REGNUM 40
34d127de3bSBastian Koppelmann #define SYSCON_REGNUM 41
35d127de3bSBastian Koppelmann #define PMUCON0_REGNUM 42
36d127de3bSBastian Koppelmann #define DMUCON_REGNUM 43
37d127de3bSBastian Koppelmann
tricore_cpu_gdb_read_csfr(CPUTriCoreState * env,int n)38d127de3bSBastian Koppelmann static uint32_t tricore_cpu_gdb_read_csfr(CPUTriCoreState *env, int n)
39d127de3bSBastian Koppelmann {
40d127de3bSBastian Koppelmann switch (n) {
41d127de3bSBastian Koppelmann case LCX_REGNUM:
42d127de3bSBastian Koppelmann return env->LCX;
43d127de3bSBastian Koppelmann case FCX_REGNUM:
44d127de3bSBastian Koppelmann return env->FCX;
45d127de3bSBastian Koppelmann case PCXI_REGNUM:
46d127de3bSBastian Koppelmann return env->PCXI;
47d127de3bSBastian Koppelmann case TRICORE_PSW_REGNUM:
48d127de3bSBastian Koppelmann return psw_read(env);
49d127de3bSBastian Koppelmann case TRICORE_PC_REGNUM:
50d127de3bSBastian Koppelmann return env->PC;
51d127de3bSBastian Koppelmann case ICR_REGNUM:
52d127de3bSBastian Koppelmann return env->ICR;
53d127de3bSBastian Koppelmann case ISP_REGNUM:
54d127de3bSBastian Koppelmann return env->ISP;
55d127de3bSBastian Koppelmann case BTV_REGNUM:
56d127de3bSBastian Koppelmann return env->BTV;
57d127de3bSBastian Koppelmann case BIV_REGNUM:
58d127de3bSBastian Koppelmann return env->BIV;
59d127de3bSBastian Koppelmann case SYSCON_REGNUM:
60d127de3bSBastian Koppelmann return env->SYSCON;
61d127de3bSBastian Koppelmann case PMUCON0_REGNUM:
62d127de3bSBastian Koppelmann return 0; /* PMUCON0 */
63d127de3bSBastian Koppelmann case DMUCON_REGNUM:
64d127de3bSBastian Koppelmann return 0; /* DMUCON0 */
65d127de3bSBastian Koppelmann default:
66d127de3bSBastian Koppelmann return 0;
67d127de3bSBastian Koppelmann }
68d127de3bSBastian Koppelmann }
69d127de3bSBastian Koppelmann
tricore_cpu_gdb_write_csfr(CPUTriCoreState * env,int n,uint32_t val)70d127de3bSBastian Koppelmann static void tricore_cpu_gdb_write_csfr(CPUTriCoreState *env, int n,
71d127de3bSBastian Koppelmann uint32_t val)
72d127de3bSBastian Koppelmann {
73d127de3bSBastian Koppelmann switch (n) {
74d127de3bSBastian Koppelmann case LCX_REGNUM:
75d127de3bSBastian Koppelmann env->LCX = val;
76d127de3bSBastian Koppelmann break;
77d127de3bSBastian Koppelmann case FCX_REGNUM:
78d127de3bSBastian Koppelmann env->FCX = val;
79d127de3bSBastian Koppelmann break;
80d127de3bSBastian Koppelmann case PCXI_REGNUM:
81d127de3bSBastian Koppelmann env->PCXI = val;
82d127de3bSBastian Koppelmann break;
83d127de3bSBastian Koppelmann case TRICORE_PSW_REGNUM:
84d127de3bSBastian Koppelmann psw_write(env, val);
85d127de3bSBastian Koppelmann break;
86d127de3bSBastian Koppelmann case TRICORE_PC_REGNUM:
87d127de3bSBastian Koppelmann env->PC = val;
88d127de3bSBastian Koppelmann break;
89d127de3bSBastian Koppelmann case ICR_REGNUM:
90d127de3bSBastian Koppelmann env->ICR = val;
91d127de3bSBastian Koppelmann break;
92d127de3bSBastian Koppelmann case ISP_REGNUM:
93d127de3bSBastian Koppelmann env->ISP = val;
94d127de3bSBastian Koppelmann break;
95d127de3bSBastian Koppelmann case BTV_REGNUM:
96d127de3bSBastian Koppelmann env->BTV = val;
97d127de3bSBastian Koppelmann break;
98d127de3bSBastian Koppelmann case BIV_REGNUM:
99d127de3bSBastian Koppelmann env->BIV = val;
100d127de3bSBastian Koppelmann break;
101d127de3bSBastian Koppelmann case SYSCON_REGNUM:
102d127de3bSBastian Koppelmann env->SYSCON = val;
103d127de3bSBastian Koppelmann break;
104d127de3bSBastian Koppelmann }
105d127de3bSBastian Koppelmann }
106d127de3bSBastian Koppelmann
107d127de3bSBastian Koppelmann
tricore_cpu_gdb_read_register(CPUState * cs,GByteArray * mem_buf,int n)108d127de3bSBastian Koppelmann int tricore_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
109d127de3bSBastian Koppelmann {
11039ac0bacSPhilippe Mathieu-Daudé CPUTriCoreState *env = cpu_env(cs);
111d127de3bSBastian Koppelmann
112d127de3bSBastian Koppelmann if (n < 16) { /* data registers */
113d127de3bSBastian Koppelmann return gdb_get_reg32(mem_buf, env->gpr_d[n]);
114d127de3bSBastian Koppelmann } else if (n < 32) { /* address registers */
115d127de3bSBastian Koppelmann return gdb_get_reg32(mem_buf, env->gpr_a[n - 16]);
116d127de3bSBastian Koppelmann } else { /* csfr */
117d127de3bSBastian Koppelmann return gdb_get_reg32(mem_buf, tricore_cpu_gdb_read_csfr(env, n));
118d127de3bSBastian Koppelmann }
119d127de3bSBastian Koppelmann return 0;
120d127de3bSBastian Koppelmann }
121d127de3bSBastian Koppelmann
tricore_cpu_gdb_write_register(CPUState * cs,uint8_t * mem_buf,int n)122d127de3bSBastian Koppelmann int tricore_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
123d127de3bSBastian Koppelmann {
12439ac0bacSPhilippe Mathieu-Daudé CPUTriCoreState *env = cpu_env(cs);
125d127de3bSBastian Koppelmann uint32_t tmp;
126d127de3bSBastian Koppelmann
127*e01e1c7eSPhilippe Mathieu-Daudé tmp = ldl_le_p(mem_buf);
128d127de3bSBastian Koppelmann
129d127de3bSBastian Koppelmann if (n < 16) { /* data registers */
130d127de3bSBastian Koppelmann env->gpr_d[n] = tmp;
131d127de3bSBastian Koppelmann } else if (n < 32) { /* address registers */
1323b137115SRichard Henderson env->gpr_a[n - 16] = tmp;
133d127de3bSBastian Koppelmann } else {
134d127de3bSBastian Koppelmann tricore_cpu_gdb_write_csfr(env, n, tmp);
135d127de3bSBastian Koppelmann }
136d127de3bSBastian Koppelmann return 4;
137d127de3bSBastian Koppelmann }
138