xref: /openbmc/qemu/target/hppa/gdbstub.c (revision 922582ace2df59572a671f5c0c5c6c5c706995e5)
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
9d6ea4236SChetan Pant  * version 2.1 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"
224ea5fe99SAlex Bennée #include "gdbstub/helpers.h"
2361766fe9SRichard Henderson 
24e207b4aaSRichard Henderson /*
25e207b4aaSRichard Henderson  * GDB 15 only supports PA1.0 via the remote protocol, and ignores
26e207b4aaSRichard Henderson  * any provided xml.  Which means that any attempt to provide more
27e207b4aaSRichard Henderson  * data results in "Remote 'g' packet reply is too long".
28e207b4aaSRichard Henderson  */
29e207b4aaSRichard Henderson 
hppa_cpu_gdb_read_register(CPUState * cs,GByteArray * mem_buf,int n)30a010bdbeSAlex Bennée int hppa_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
3161766fe9SRichard Henderson {
32e207b4aaSRichard Henderson     CPUHPPAState *env = cpu_env(cs);
33e207b4aaSRichard Henderson     uint32_t val;
3461766fe9SRichard Henderson 
3561766fe9SRichard Henderson     switch (n) {
3661766fe9SRichard Henderson     case 0:
3761766fe9SRichard Henderson         val = cpu_hppa_get_psw(env);
3861766fe9SRichard Henderson         break;
3961766fe9SRichard Henderson     case 1 ... 31:
4061766fe9SRichard Henderson         val = env->gr[n];
4161766fe9SRichard Henderson         break;
4261766fe9SRichard Henderson     case 32:
4335136a77SRichard Henderson         val = env->cr[CR_SAR];
4461766fe9SRichard Henderson         break;
4561766fe9SRichard Henderson     case 33:
4661766fe9SRichard Henderson         val = env->iaoq_f;
4761766fe9SRichard Henderson         break;
48e33348a6SRichard Henderson     case 34:
49e33348a6SRichard Henderson         val = env->iasq_f >> 32;
50e33348a6SRichard Henderson         break;
5161766fe9SRichard Henderson     case 35:
5261766fe9SRichard Henderson         val = env->iaoq_b;
5361766fe9SRichard Henderson         break;
54e33348a6SRichard Henderson     case 36:
55e33348a6SRichard Henderson         val = env->iasq_b >> 32;
56e33348a6SRichard Henderson         break;
57e33348a6SRichard Henderson     case 37:
58e33348a6SRichard Henderson         val = env->cr[CR_EIEM];
59e33348a6SRichard Henderson         break;
60e33348a6SRichard Henderson     case 38:
61e33348a6SRichard Henderson         val = env->cr[CR_IIR];
62e33348a6SRichard Henderson         break;
63e33348a6SRichard Henderson     case 39:
64e33348a6SRichard Henderson         val = env->cr[CR_ISR];
65e33348a6SRichard Henderson         break;
66e33348a6SRichard Henderson     case 40:
67e33348a6SRichard Henderson         val = env->cr[CR_IOR];
68e33348a6SRichard Henderson         break;
69e33348a6SRichard Henderson     case 41:
70e33348a6SRichard Henderson         val = env->cr[CR_IPSW];
71e33348a6SRichard Henderson         break;
72e33348a6SRichard Henderson     case 43:
73e33348a6SRichard Henderson         val = env->sr[4] >> 32;
74e33348a6SRichard Henderson         break;
75e33348a6SRichard Henderson     case 44:
76e33348a6SRichard Henderson         val = env->sr[0] >> 32;
77e33348a6SRichard Henderson         break;
78e33348a6SRichard Henderson     case 45:
79e33348a6SRichard Henderson         val = env->sr[1] >> 32;
80e33348a6SRichard Henderson         break;
81e33348a6SRichard Henderson     case 46:
82e33348a6SRichard Henderson         val = env->sr[2] >> 32;
83e33348a6SRichard Henderson         break;
84e33348a6SRichard Henderson     case 47:
85e33348a6SRichard Henderson         val = env->sr[3] >> 32;
86e33348a6SRichard Henderson         break;
87e33348a6SRichard Henderson     case 48:
88e33348a6SRichard Henderson         val = env->sr[5] >> 32;
89e33348a6SRichard Henderson         break;
90e33348a6SRichard Henderson     case 49:
91e33348a6SRichard Henderson         val = env->sr[6] >> 32;
92e33348a6SRichard Henderson         break;
93e33348a6SRichard Henderson     case 50:
94e33348a6SRichard Henderson         val = env->sr[7] >> 32;
95e33348a6SRichard Henderson         break;
96e33348a6SRichard Henderson     case 51:
97e33348a6SRichard Henderson         val = env->cr[CR_RC];
98e33348a6SRichard Henderson         break;
99e33348a6SRichard Henderson     case 52:
100d5de20bdSSven Schnelle         val = env->cr[CR_PID1];
101e33348a6SRichard Henderson         break;
102e33348a6SRichard Henderson     case 53:
103d5de20bdSSven Schnelle         val = env->cr[CR_PID2];
104e33348a6SRichard Henderson         break;
105e33348a6SRichard Henderson     case 54:
106e33348a6SRichard Henderson         val = env->cr[CR_SCRCCR];
107e33348a6SRichard Henderson         break;
108e33348a6SRichard Henderson     case 55:
109d5de20bdSSven Schnelle         val = env->cr[CR_PID3];
110e33348a6SRichard Henderson         break;
111e33348a6SRichard Henderson     case 56:
112d5de20bdSSven Schnelle         val = env->cr[CR_PID4];
113e33348a6SRichard Henderson         break;
114e33348a6SRichard Henderson     case 57:
115e33348a6SRichard Henderson         val = env->cr[24];
116e33348a6SRichard Henderson         break;
117e33348a6SRichard Henderson     case 58:
118e33348a6SRichard Henderson         val = env->cr[25];
119e33348a6SRichard Henderson         break;
12061766fe9SRichard Henderson     case 59:
12135136a77SRichard Henderson         val = env->cr[26];
12261766fe9SRichard Henderson         break;
12361766fe9SRichard Henderson     case 60:
12435136a77SRichard Henderson         val = env->cr[27];
12561766fe9SRichard Henderson         break;
126e33348a6SRichard Henderson     case 61:
127e33348a6SRichard Henderson         val = env->cr[28];
128e33348a6SRichard Henderson         break;
129e33348a6SRichard Henderson     case 62:
130e33348a6SRichard Henderson         val = env->cr[29];
131e33348a6SRichard Henderson         break;
132e33348a6SRichard Henderson     case 63:
133e33348a6SRichard Henderson         val = env->cr[30];
134e33348a6SRichard Henderson         break;
13561766fe9SRichard Henderson     case 64 ... 127:
13661766fe9SRichard Henderson         val = extract64(env->fr[(n - 64) / 2], (n & 1 ? 0 : 32), 32);
13761766fe9SRichard Henderson         break;
13861766fe9SRichard Henderson     default:
13961766fe9SRichard Henderson         if (n < 128) {
14061766fe9SRichard Henderson             val = 0;
14161766fe9SRichard Henderson         } else {
14261766fe9SRichard Henderson             return 0;
14361766fe9SRichard Henderson         }
14461766fe9SRichard Henderson         break;
14561766fe9SRichard Henderson     }
146eaa3783bSRichard Henderson 
147eaa3783bSRichard Henderson     return gdb_get_reg32(mem_buf, val);
148eaa3783bSRichard Henderson }
14961766fe9SRichard Henderson 
hppa_cpu_gdb_write_register(CPUState * cs,uint8_t * mem_buf,int n)15061766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
15161766fe9SRichard Henderson {
152e207b4aaSRichard Henderson     CPUHPPAState *env = cpu_env(cs);
153e207b4aaSRichard Henderson     uint32_t val = ldl_p(mem_buf);
15461766fe9SRichard Henderson 
15561766fe9SRichard Henderson     switch (n) {
15661766fe9SRichard Henderson     case 0:
15761766fe9SRichard Henderson         cpu_hppa_put_psw(env, val);
15861766fe9SRichard Henderson         break;
15961766fe9SRichard Henderson     case 1 ... 31:
16061766fe9SRichard Henderson         env->gr[n] = val;
16161766fe9SRichard Henderson         break;
16261766fe9SRichard Henderson     case 32:
163e207b4aaSRichard Henderson         env->cr[CR_SAR] = val & (hppa_is_pa20(env) ? 63 : 31);
16461766fe9SRichard Henderson         break;
16561766fe9SRichard Henderson     case 33:
166*3c13b0ffSRichard Henderson #ifdef CONFIG_USER_ONLY
167*3c13b0ffSRichard Henderson         val |= PRIV_USER;
168*3c13b0ffSRichard Henderson #endif
16961766fe9SRichard Henderson         env->iaoq_f = val;
17061766fe9SRichard Henderson         break;
171e33348a6SRichard Henderson     case 34:
172e33348a6SRichard Henderson         env->iasq_f = (uint64_t)val << 32;
173e33348a6SRichard Henderson         break;
17461766fe9SRichard Henderson     case 35:
175*3c13b0ffSRichard Henderson #ifdef CONFIG_USER_ONLY
176*3c13b0ffSRichard Henderson         val |= PRIV_USER;
177*3c13b0ffSRichard Henderson #endif
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     }
281e207b4aaSRichard Henderson     return 4;
28261766fe9SRichard Henderson }
283