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