xref: /qemu/target/hppa/gdbstub.c (revision a010bdbe719c52c8959ca058000d7ac7d559abb8)
161766fe9SRichard Henderson /*
261766fe9SRichard Henderson  * HPPA gdb server stub
361766fe9SRichard Henderson  *
461766fe9SRichard Henderson  * Copyright (c) 2016 Richard Henderson <rth@twiddle.net>
561766fe9SRichard Henderson  *
661766fe9SRichard Henderson  * This library is free software; you can redistribute it and/or
761766fe9SRichard Henderson  * modify it under the terms of the GNU Lesser General Public
861766fe9SRichard Henderson  * License as published by the Free Software Foundation; either
961766fe9SRichard Henderson  * version 2 of the License, or (at your option) any later version.
1061766fe9SRichard Henderson  *
1161766fe9SRichard Henderson  * This library is distributed in the hope that it will be useful,
1261766fe9SRichard Henderson  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1361766fe9SRichard Henderson  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1461766fe9SRichard Henderson  * Lesser General Public License for more details.
1561766fe9SRichard Henderson  *
1661766fe9SRichard Henderson  * You should have received a copy of the GNU Lesser General Public
1761766fe9SRichard Henderson  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
1861766fe9SRichard Henderson  */
1961766fe9SRichard Henderson 
2061766fe9SRichard Henderson #include "qemu/osdep.h"
2161766fe9SRichard Henderson #include "cpu.h"
2261766fe9SRichard Henderson #include "exec/gdbstub.h"
2361766fe9SRichard Henderson 
24*a010bdbeSAlex Bennée int hppa_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
2561766fe9SRichard Henderson {
2661766fe9SRichard Henderson     HPPACPU *cpu = HPPA_CPU(cs);
2761766fe9SRichard Henderson     CPUHPPAState *env = &cpu->env;
28eaa3783bSRichard Henderson     target_ureg val;
2961766fe9SRichard Henderson 
3061766fe9SRichard Henderson     switch (n) {
3161766fe9SRichard Henderson     case 0:
3261766fe9SRichard Henderson         val = cpu_hppa_get_psw(env);
3361766fe9SRichard Henderson         break;
3461766fe9SRichard Henderson     case 1 ... 31:
3561766fe9SRichard Henderson         val = env->gr[n];
3661766fe9SRichard Henderson         break;
3761766fe9SRichard Henderson     case 32:
3835136a77SRichard Henderson         val = env->cr[CR_SAR];
3961766fe9SRichard Henderson         break;
4061766fe9SRichard Henderson     case 33:
4161766fe9SRichard Henderson         val = env->iaoq_f;
4261766fe9SRichard Henderson         break;
43e33348a6SRichard Henderson     case 34:
44e33348a6SRichard Henderson         val = env->iasq_f >> 32;
45e33348a6SRichard Henderson         break;
4661766fe9SRichard Henderson     case 35:
4761766fe9SRichard Henderson         val = env->iaoq_b;
4861766fe9SRichard Henderson         break;
49e33348a6SRichard Henderson     case 36:
50e33348a6SRichard Henderson         val = env->iasq_b >> 32;
51e33348a6SRichard Henderson         break;
52e33348a6SRichard Henderson     case 37:
53e33348a6SRichard Henderson         val = env->cr[CR_EIEM];
54e33348a6SRichard Henderson         break;
55e33348a6SRichard Henderson     case 38:
56e33348a6SRichard Henderson         val = env->cr[CR_IIR];
57e33348a6SRichard Henderson         break;
58e33348a6SRichard Henderson     case 39:
59e33348a6SRichard Henderson         val = env->cr[CR_ISR];
60e33348a6SRichard Henderson         break;
61e33348a6SRichard Henderson     case 40:
62e33348a6SRichard Henderson         val = env->cr[CR_IOR];
63e33348a6SRichard Henderson         break;
64e33348a6SRichard Henderson     case 41:
65e33348a6SRichard Henderson         val = env->cr[CR_IPSW];
66e33348a6SRichard Henderson         break;
67e33348a6SRichard Henderson     case 43:
68e33348a6SRichard Henderson         val = env->sr[4] >> 32;
69e33348a6SRichard Henderson         break;
70e33348a6SRichard Henderson     case 44:
71e33348a6SRichard Henderson         val = env->sr[0] >> 32;
72e33348a6SRichard Henderson         break;
73e33348a6SRichard Henderson     case 45:
74e33348a6SRichard Henderson         val = env->sr[1] >> 32;
75e33348a6SRichard Henderson         break;
76e33348a6SRichard Henderson     case 46:
77e33348a6SRichard Henderson         val = env->sr[2] >> 32;
78e33348a6SRichard Henderson         break;
79e33348a6SRichard Henderson     case 47:
80e33348a6SRichard Henderson         val = env->sr[3] >> 32;
81e33348a6SRichard Henderson         break;
82e33348a6SRichard Henderson     case 48:
83e33348a6SRichard Henderson         val = env->sr[5] >> 32;
84e33348a6SRichard Henderson         break;
85e33348a6SRichard Henderson     case 49:
86e33348a6SRichard Henderson         val = env->sr[6] >> 32;
87e33348a6SRichard Henderson         break;
88e33348a6SRichard Henderson     case 50:
89e33348a6SRichard Henderson         val = env->sr[7] >> 32;
90e33348a6SRichard Henderson         break;
91e33348a6SRichard Henderson     case 51:
92e33348a6SRichard Henderson         val = env->cr[CR_RC];
93e33348a6SRichard Henderson         break;
94e33348a6SRichard Henderson     case 52:
95d5de20bdSSven Schnelle         val = env->cr[CR_PID1];
96e33348a6SRichard Henderson         break;
97e33348a6SRichard Henderson     case 53:
98d5de20bdSSven Schnelle         val = env->cr[CR_PID2];
99e33348a6SRichard Henderson         break;
100e33348a6SRichard Henderson     case 54:
101e33348a6SRichard Henderson         val = env->cr[CR_SCRCCR];
102e33348a6SRichard Henderson         break;
103e33348a6SRichard Henderson     case 55:
104d5de20bdSSven Schnelle         val = env->cr[CR_PID3];
105e33348a6SRichard Henderson         break;
106e33348a6SRichard Henderson     case 56:
107d5de20bdSSven Schnelle         val = env->cr[CR_PID4];
108e33348a6SRichard Henderson         break;
109e33348a6SRichard Henderson     case 57:
110e33348a6SRichard Henderson         val = env->cr[24];
111e33348a6SRichard Henderson         break;
112e33348a6SRichard Henderson     case 58:
113e33348a6SRichard Henderson         val = env->cr[25];
114e33348a6SRichard Henderson         break;
11561766fe9SRichard Henderson     case 59:
11635136a77SRichard Henderson         val = env->cr[26];
11761766fe9SRichard Henderson         break;
11861766fe9SRichard Henderson     case 60:
11935136a77SRichard Henderson         val = env->cr[27];
12061766fe9SRichard Henderson         break;
121e33348a6SRichard Henderson     case 61:
122e33348a6SRichard Henderson         val = env->cr[28];
123e33348a6SRichard Henderson         break;
124e33348a6SRichard Henderson     case 62:
125e33348a6SRichard Henderson         val = env->cr[29];
126e33348a6SRichard Henderson         break;
127e33348a6SRichard Henderson     case 63:
128e33348a6SRichard Henderson         val = env->cr[30];
129e33348a6SRichard Henderson         break;
13061766fe9SRichard Henderson     case 64 ... 127:
13161766fe9SRichard Henderson         val = extract64(env->fr[(n - 64) / 2], (n & 1 ? 0 : 32), 32);
13261766fe9SRichard Henderson         break;
13361766fe9SRichard Henderson     default:
13461766fe9SRichard Henderson         if (n < 128) {
13561766fe9SRichard Henderson             val = 0;
13661766fe9SRichard Henderson         } else {
13761766fe9SRichard Henderson             return 0;
13861766fe9SRichard Henderson         }
13961766fe9SRichard Henderson         break;
14061766fe9SRichard Henderson     }
141eaa3783bSRichard Henderson 
142eaa3783bSRichard Henderson     if (TARGET_REGISTER_BITS == 64) {
143eaa3783bSRichard Henderson         return gdb_get_reg64(mem_buf, val);
144eaa3783bSRichard Henderson     } else {
145eaa3783bSRichard Henderson         return gdb_get_reg32(mem_buf, val);
146eaa3783bSRichard Henderson     }
14761766fe9SRichard Henderson }
14861766fe9SRichard Henderson 
14961766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
15061766fe9SRichard Henderson {
15161766fe9SRichard Henderson     HPPACPU *cpu = HPPA_CPU(cs);
15261766fe9SRichard Henderson     CPUHPPAState *env = &cpu->env;
153eaa3783bSRichard Henderson     target_ureg val;
154eaa3783bSRichard Henderson 
155eaa3783bSRichard Henderson     if (TARGET_REGISTER_BITS == 64) {
156eaa3783bSRichard Henderson         val = ldq_p(mem_buf);
157eaa3783bSRichard Henderson     } else {
158eaa3783bSRichard Henderson         val = ldl_p(mem_buf);
159eaa3783bSRichard Henderson     }
16061766fe9SRichard Henderson 
16161766fe9SRichard Henderson     switch (n) {
16261766fe9SRichard Henderson     case 0:
16361766fe9SRichard Henderson         cpu_hppa_put_psw(env, val);
16461766fe9SRichard Henderson         break;
16561766fe9SRichard Henderson     case 1 ... 31:
16661766fe9SRichard Henderson         env->gr[n] = val;
16761766fe9SRichard Henderson         break;
16861766fe9SRichard Henderson     case 32:
16935136a77SRichard Henderson         env->cr[CR_SAR] = val;
17061766fe9SRichard Henderson         break;
17161766fe9SRichard Henderson     case 33:
17261766fe9SRichard Henderson         env->iaoq_f = val;
17361766fe9SRichard Henderson         break;
174e33348a6SRichard Henderson     case 34:
175e33348a6SRichard Henderson         env->iasq_f = (uint64_t)val << 32;
176e33348a6SRichard Henderson         break;
17761766fe9SRichard Henderson     case 35:
17861766fe9SRichard Henderson         env->iaoq_b = val;
1796836a8fbSRichard Henderson         break;
180e33348a6SRichard Henderson     case 36:
181e33348a6SRichard Henderson         env->iasq_b = (uint64_t)val << 32;
182e33348a6SRichard Henderson         break;
183e33348a6SRichard Henderson     case 37:
184e33348a6SRichard Henderson         env->cr[CR_EIEM] = val;
185e33348a6SRichard Henderson         break;
186e33348a6SRichard Henderson     case 38:
187e33348a6SRichard Henderson         env->cr[CR_IIR] = val;
188e33348a6SRichard Henderson         break;
189e33348a6SRichard Henderson     case 39:
190e33348a6SRichard Henderson         env->cr[CR_ISR] = val;
191e33348a6SRichard Henderson         break;
192e33348a6SRichard Henderson     case 40:
193e33348a6SRichard Henderson         env->cr[CR_IOR] = val;
194e33348a6SRichard Henderson         break;
195e33348a6SRichard Henderson     case 41:
196e33348a6SRichard Henderson         env->cr[CR_IPSW] = val;
197e33348a6SRichard Henderson         break;
198e33348a6SRichard Henderson     case 43:
199e33348a6SRichard Henderson         env->sr[4] = (uint64_t)val << 32;
200e33348a6SRichard Henderson         break;
201e33348a6SRichard Henderson     case 44:
202e33348a6SRichard Henderson         env->sr[0] = (uint64_t)val << 32;
203e33348a6SRichard Henderson         break;
204e33348a6SRichard Henderson     case 45:
205e33348a6SRichard Henderson         env->sr[1] = (uint64_t)val << 32;
206e33348a6SRichard Henderson         break;
207e33348a6SRichard Henderson     case 46:
208e33348a6SRichard Henderson         env->sr[2] = (uint64_t)val << 32;
209e33348a6SRichard Henderson         break;
210e33348a6SRichard Henderson     case 47:
211e33348a6SRichard Henderson         env->sr[3] = (uint64_t)val << 32;
212e33348a6SRichard Henderson         break;
213e33348a6SRichard Henderson     case 48:
214e33348a6SRichard Henderson         env->sr[5] = (uint64_t)val << 32;
215e33348a6SRichard Henderson         break;
216e33348a6SRichard Henderson     case 49:
217e33348a6SRichard Henderson         env->sr[6] = (uint64_t)val << 32;
218e33348a6SRichard Henderson         break;
219e33348a6SRichard Henderson     case 50:
220e33348a6SRichard Henderson         env->sr[7] = (uint64_t)val << 32;
221e33348a6SRichard Henderson         break;
222e33348a6SRichard Henderson     case 51:
223e33348a6SRichard Henderson         env->cr[CR_RC] = val;
224e33348a6SRichard Henderson         break;
225e33348a6SRichard Henderson     case 52:
226d5de20bdSSven Schnelle         env->cr[CR_PID1] = val;
227d5de20bdSSven Schnelle         cpu_hppa_change_prot_id(env);
228e33348a6SRichard Henderson         break;
229e33348a6SRichard Henderson     case 53:
230d5de20bdSSven Schnelle         env->cr[CR_PID2] = val;
231d5de20bdSSven Schnelle         cpu_hppa_change_prot_id(env);
232e33348a6SRichard Henderson         break;
233e33348a6SRichard Henderson     case 54:
234e33348a6SRichard Henderson         env->cr[CR_SCRCCR] = val;
235e33348a6SRichard Henderson         break;
236e33348a6SRichard Henderson     case 55:
237d5de20bdSSven Schnelle         env->cr[CR_PID3] = val;
238d5de20bdSSven Schnelle         cpu_hppa_change_prot_id(env);
239e33348a6SRichard Henderson         break;
240e33348a6SRichard Henderson     case 56:
241d5de20bdSSven Schnelle         env->cr[CR_PID4] = val;
242d5de20bdSSven Schnelle         cpu_hppa_change_prot_id(env);
243e33348a6SRichard Henderson         break;
244e33348a6SRichard Henderson     case 57:
245e33348a6SRichard Henderson         env->cr[24] = val;
246e33348a6SRichard Henderson         break;
247e33348a6SRichard Henderson     case 58:
248e33348a6SRichard Henderson         env->cr[25] = val;
249e33348a6SRichard Henderson         break;
25061766fe9SRichard Henderson     case 59:
25135136a77SRichard Henderson         env->cr[26] = val;
25261766fe9SRichard Henderson         break;
25361766fe9SRichard Henderson     case 60:
25435136a77SRichard Henderson         env->cr[27] = val;
25561766fe9SRichard Henderson         break;
256e33348a6SRichard Henderson     case 61:
257e33348a6SRichard Henderson         env->cr[28] = val;
258e33348a6SRichard Henderson         break;
259e33348a6SRichard Henderson     case 62:
260e33348a6SRichard Henderson         env->cr[29] = val;
261e33348a6SRichard Henderson         break;
262e33348a6SRichard Henderson     case 63:
263e33348a6SRichard Henderson         env->cr[30] = val;
264e33348a6SRichard Henderson         break;
26561766fe9SRichard Henderson     case 64:
26661766fe9SRichard Henderson         env->fr[0] = deposit64(env->fr[0], 32, 32, val);
26761766fe9SRichard Henderson         cpu_hppa_loaded_fr0(env);
26861766fe9SRichard Henderson         break;
26961766fe9SRichard Henderson     case 65 ... 127:
27061766fe9SRichard Henderson         {
27161766fe9SRichard Henderson             uint64_t *fr = &env->fr[(n - 64) / 2];
2725c41496dSSven Schnelle             *fr = deposit64(*fr, (n & 1 ? 0 : 32), 32, val);
27361766fe9SRichard Henderson         }
27461766fe9SRichard Henderson         break;
27561766fe9SRichard Henderson     default:
27661766fe9SRichard Henderson         if (n >= 128) {
27761766fe9SRichard Henderson             return 0;
27861766fe9SRichard Henderson         }
27961766fe9SRichard Henderson         break;
28061766fe9SRichard Henderson     }
281eaa3783bSRichard Henderson     return sizeof(target_ureg);
28261766fe9SRichard Henderson }
283