xref: /qemu/target/hppa/gdbstub.c (revision d5de20bd84ae3a6f6c194f0088cfcb4d4f6af602)
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 "qemu-common.h"
2261766fe9SRichard Henderson #include "cpu.h"
2361766fe9SRichard Henderson #include "exec/gdbstub.h"
2461766fe9SRichard Henderson 
2561766fe9SRichard Henderson int hppa_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
2661766fe9SRichard Henderson {
2761766fe9SRichard Henderson     HPPACPU *cpu = HPPA_CPU(cs);
2861766fe9SRichard Henderson     CPUHPPAState *env = &cpu->env;
29eaa3783bSRichard Henderson     target_ureg val;
3061766fe9SRichard Henderson 
3161766fe9SRichard Henderson     switch (n) {
3261766fe9SRichard Henderson     case 0:
3361766fe9SRichard Henderson         val = cpu_hppa_get_psw(env);
3461766fe9SRichard Henderson         break;
3561766fe9SRichard Henderson     case 1 ... 31:
3661766fe9SRichard Henderson         val = env->gr[n];
3761766fe9SRichard Henderson         break;
3861766fe9SRichard Henderson     case 32:
3935136a77SRichard Henderson         val = env->cr[CR_SAR];
4061766fe9SRichard Henderson         break;
4161766fe9SRichard Henderson     case 33:
4261766fe9SRichard Henderson         val = env->iaoq_f;
4361766fe9SRichard Henderson         break;
44e33348a6SRichard Henderson     case 34:
45e33348a6SRichard Henderson         val = env->iasq_f >> 32;
46e33348a6SRichard Henderson         break;
4761766fe9SRichard Henderson     case 35:
4861766fe9SRichard Henderson         val = env->iaoq_b;
4961766fe9SRichard Henderson         break;
50e33348a6SRichard Henderson     case 36:
51e33348a6SRichard Henderson         val = env->iasq_b >> 32;
52e33348a6SRichard Henderson         break;
53e33348a6SRichard Henderson     case 37:
54e33348a6SRichard Henderson         val = env->cr[CR_EIEM];
55e33348a6SRichard Henderson         break;
56e33348a6SRichard Henderson     case 38:
57e33348a6SRichard Henderson         val = env->cr[CR_IIR];
58e33348a6SRichard Henderson         break;
59e33348a6SRichard Henderson     case 39:
60e33348a6SRichard Henderson         val = env->cr[CR_ISR];
61e33348a6SRichard Henderson         break;
62e33348a6SRichard Henderson     case 40:
63e33348a6SRichard Henderson         val = env->cr[CR_IOR];
64e33348a6SRichard Henderson         break;
65e33348a6SRichard Henderson     case 41:
66e33348a6SRichard Henderson         val = env->cr[CR_IPSW];
67e33348a6SRichard Henderson         break;
68e33348a6SRichard Henderson     case 43:
69e33348a6SRichard Henderson         val = env->sr[4] >> 32;
70e33348a6SRichard Henderson         break;
71e33348a6SRichard Henderson     case 44:
72e33348a6SRichard Henderson         val = env->sr[0] >> 32;
73e33348a6SRichard Henderson         break;
74e33348a6SRichard Henderson     case 45:
75e33348a6SRichard Henderson         val = env->sr[1] >> 32;
76e33348a6SRichard Henderson         break;
77e33348a6SRichard Henderson     case 46:
78e33348a6SRichard Henderson         val = env->sr[2] >> 32;
79e33348a6SRichard Henderson         break;
80e33348a6SRichard Henderson     case 47:
81e33348a6SRichard Henderson         val = env->sr[3] >> 32;
82e33348a6SRichard Henderson         break;
83e33348a6SRichard Henderson     case 48:
84e33348a6SRichard Henderson         val = env->sr[5] >> 32;
85e33348a6SRichard Henderson         break;
86e33348a6SRichard Henderson     case 49:
87e33348a6SRichard Henderson         val = env->sr[6] >> 32;
88e33348a6SRichard Henderson         break;
89e33348a6SRichard Henderson     case 50:
90e33348a6SRichard Henderson         val = env->sr[7] >> 32;
91e33348a6SRichard Henderson         break;
92e33348a6SRichard Henderson     case 51:
93e33348a6SRichard Henderson         val = env->cr[CR_RC];
94e33348a6SRichard Henderson         break;
95e33348a6SRichard Henderson     case 52:
96*d5de20bdSSven Schnelle         val = env->cr[CR_PID1];
97e33348a6SRichard Henderson         break;
98e33348a6SRichard Henderson     case 53:
99*d5de20bdSSven Schnelle         val = env->cr[CR_PID2];
100e33348a6SRichard Henderson         break;
101e33348a6SRichard Henderson     case 54:
102e33348a6SRichard Henderson         val = env->cr[CR_SCRCCR];
103e33348a6SRichard Henderson         break;
104e33348a6SRichard Henderson     case 55:
105*d5de20bdSSven Schnelle         val = env->cr[CR_PID3];
106e33348a6SRichard Henderson         break;
107e33348a6SRichard Henderson     case 56:
108*d5de20bdSSven Schnelle         val = env->cr[CR_PID4];
109e33348a6SRichard Henderson         break;
110e33348a6SRichard Henderson     case 57:
111e33348a6SRichard Henderson         val = env->cr[24];
112e33348a6SRichard Henderson         break;
113e33348a6SRichard Henderson     case 58:
114e33348a6SRichard Henderson         val = env->cr[25];
115e33348a6SRichard Henderson         break;
11661766fe9SRichard Henderson     case 59:
11735136a77SRichard Henderson         val = env->cr[26];
11861766fe9SRichard Henderson         break;
11961766fe9SRichard Henderson     case 60:
12035136a77SRichard Henderson         val = env->cr[27];
12161766fe9SRichard Henderson         break;
122e33348a6SRichard Henderson     case 61:
123e33348a6SRichard Henderson         val = env->cr[28];
124e33348a6SRichard Henderson         break;
125e33348a6SRichard Henderson     case 62:
126e33348a6SRichard Henderson         val = env->cr[29];
127e33348a6SRichard Henderson         break;
128e33348a6SRichard Henderson     case 63:
129e33348a6SRichard Henderson         val = env->cr[30];
130e33348a6SRichard Henderson         break;
13161766fe9SRichard Henderson     case 64 ... 127:
13261766fe9SRichard Henderson         val = extract64(env->fr[(n - 64) / 2], (n & 1 ? 0 : 32), 32);
13361766fe9SRichard Henderson         break;
13461766fe9SRichard Henderson     default:
13561766fe9SRichard Henderson         if (n < 128) {
13661766fe9SRichard Henderson             val = 0;
13761766fe9SRichard Henderson         } else {
13861766fe9SRichard Henderson             return 0;
13961766fe9SRichard Henderson         }
14061766fe9SRichard Henderson         break;
14161766fe9SRichard Henderson     }
142eaa3783bSRichard Henderson 
143eaa3783bSRichard Henderson     if (TARGET_REGISTER_BITS == 64) {
144eaa3783bSRichard Henderson         return gdb_get_reg64(mem_buf, val);
145eaa3783bSRichard Henderson     } else {
146eaa3783bSRichard Henderson         return gdb_get_reg32(mem_buf, val);
147eaa3783bSRichard Henderson     }
14861766fe9SRichard Henderson }
14961766fe9SRichard Henderson 
15061766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
15161766fe9SRichard Henderson {
15261766fe9SRichard Henderson     HPPACPU *cpu = HPPA_CPU(cs);
15361766fe9SRichard Henderson     CPUHPPAState *env = &cpu->env;
154eaa3783bSRichard Henderson     target_ureg val;
155eaa3783bSRichard Henderson 
156eaa3783bSRichard Henderson     if (TARGET_REGISTER_BITS == 64) {
157eaa3783bSRichard Henderson         val = ldq_p(mem_buf);
158eaa3783bSRichard Henderson     } else {
159eaa3783bSRichard Henderson         val = ldl_p(mem_buf);
160eaa3783bSRichard Henderson     }
16161766fe9SRichard Henderson 
16261766fe9SRichard Henderson     switch (n) {
16361766fe9SRichard Henderson     case 0:
16461766fe9SRichard Henderson         cpu_hppa_put_psw(env, val);
16561766fe9SRichard Henderson         break;
16661766fe9SRichard Henderson     case 1 ... 31:
16761766fe9SRichard Henderson         env->gr[n] = val;
16861766fe9SRichard Henderson         break;
16961766fe9SRichard Henderson     case 32:
17035136a77SRichard Henderson         env->cr[CR_SAR] = val;
17161766fe9SRichard Henderson         break;
17261766fe9SRichard Henderson     case 33:
17361766fe9SRichard Henderson         env->iaoq_f = val;
17461766fe9SRichard Henderson         break;
175e33348a6SRichard Henderson     case 34:
176e33348a6SRichard Henderson         env->iasq_f = (uint64_t)val << 32;
177e33348a6SRichard Henderson         break;
17861766fe9SRichard Henderson     case 35:
17961766fe9SRichard Henderson         env->iaoq_b = val;
1806836a8fbSRichard Henderson         break;
181e33348a6SRichard Henderson     case 36:
182e33348a6SRichard Henderson         env->iasq_b = (uint64_t)val << 32;
183e33348a6SRichard Henderson         break;
184e33348a6SRichard Henderson     case 37:
185e33348a6SRichard Henderson         env->cr[CR_EIEM] = val;
186e33348a6SRichard Henderson         break;
187e33348a6SRichard Henderson     case 38:
188e33348a6SRichard Henderson         env->cr[CR_IIR] = val;
189e33348a6SRichard Henderson         break;
190e33348a6SRichard Henderson     case 39:
191e33348a6SRichard Henderson         env->cr[CR_ISR] = val;
192e33348a6SRichard Henderson         break;
193e33348a6SRichard Henderson     case 40:
194e33348a6SRichard Henderson         env->cr[CR_IOR] = val;
195e33348a6SRichard Henderson         break;
196e33348a6SRichard Henderson     case 41:
197e33348a6SRichard Henderson         env->cr[CR_IPSW] = val;
198e33348a6SRichard Henderson         break;
199e33348a6SRichard Henderson     case 43:
200e33348a6SRichard Henderson         env->sr[4] = (uint64_t)val << 32;
201e33348a6SRichard Henderson         break;
202e33348a6SRichard Henderson     case 44:
203e33348a6SRichard Henderson         env->sr[0] = (uint64_t)val << 32;
204e33348a6SRichard Henderson         break;
205e33348a6SRichard Henderson     case 45:
206e33348a6SRichard Henderson         env->sr[1] = (uint64_t)val << 32;
207e33348a6SRichard Henderson         break;
208e33348a6SRichard Henderson     case 46:
209e33348a6SRichard Henderson         env->sr[2] = (uint64_t)val << 32;
210e33348a6SRichard Henderson         break;
211e33348a6SRichard Henderson     case 47:
212e33348a6SRichard Henderson         env->sr[3] = (uint64_t)val << 32;
213e33348a6SRichard Henderson         break;
214e33348a6SRichard Henderson     case 48:
215e33348a6SRichard Henderson         env->sr[5] = (uint64_t)val << 32;
216e33348a6SRichard Henderson         break;
217e33348a6SRichard Henderson     case 49:
218e33348a6SRichard Henderson         env->sr[6] = (uint64_t)val << 32;
219e33348a6SRichard Henderson         break;
220e33348a6SRichard Henderson     case 50:
221e33348a6SRichard Henderson         env->sr[7] = (uint64_t)val << 32;
222e33348a6SRichard Henderson         break;
223e33348a6SRichard Henderson     case 51:
224e33348a6SRichard Henderson         env->cr[CR_RC] = val;
225e33348a6SRichard Henderson         break;
226e33348a6SRichard Henderson     case 52:
227*d5de20bdSSven Schnelle         env->cr[CR_PID1] = val;
228*d5de20bdSSven Schnelle         cpu_hppa_change_prot_id(env);
229e33348a6SRichard Henderson         break;
230e33348a6SRichard Henderson     case 53:
231*d5de20bdSSven Schnelle         env->cr[CR_PID2] = val;
232*d5de20bdSSven Schnelle         cpu_hppa_change_prot_id(env);
233e33348a6SRichard Henderson         break;
234e33348a6SRichard Henderson     case 54:
235e33348a6SRichard Henderson         env->cr[CR_SCRCCR] = val;
236e33348a6SRichard Henderson         break;
237e33348a6SRichard Henderson     case 55:
238*d5de20bdSSven Schnelle         env->cr[CR_PID3] = val;
239*d5de20bdSSven Schnelle         cpu_hppa_change_prot_id(env);
240e33348a6SRichard Henderson         break;
241e33348a6SRichard Henderson     case 56:
242*d5de20bdSSven Schnelle         env->cr[CR_PID4] = val;
243*d5de20bdSSven Schnelle         cpu_hppa_change_prot_id(env);
244e33348a6SRichard Henderson         break;
245e33348a6SRichard Henderson     case 57:
246e33348a6SRichard Henderson         env->cr[24] = val;
247e33348a6SRichard Henderson         break;
248e33348a6SRichard Henderson     case 58:
249e33348a6SRichard Henderson         env->cr[25] = val;
250e33348a6SRichard Henderson         break;
25161766fe9SRichard Henderson     case 59:
25235136a77SRichard Henderson         env->cr[26] = val;
25361766fe9SRichard Henderson         break;
25461766fe9SRichard Henderson     case 60:
25535136a77SRichard Henderson         env->cr[27] = val;
25661766fe9SRichard Henderson         break;
257e33348a6SRichard Henderson     case 61:
258e33348a6SRichard Henderson         env->cr[28] = val;
259e33348a6SRichard Henderson         break;
260e33348a6SRichard Henderson     case 62:
261e33348a6SRichard Henderson         env->cr[29] = val;
262e33348a6SRichard Henderson         break;
263e33348a6SRichard Henderson     case 63:
264e33348a6SRichard Henderson         env->cr[30] = val;
265e33348a6SRichard Henderson         break;
26661766fe9SRichard Henderson     case 64:
26761766fe9SRichard Henderson         env->fr[0] = deposit64(env->fr[0], 32, 32, val);
26861766fe9SRichard Henderson         cpu_hppa_loaded_fr0(env);
26961766fe9SRichard Henderson         break;
27061766fe9SRichard Henderson     case 65 ... 127:
27161766fe9SRichard Henderson         {
27261766fe9SRichard Henderson             uint64_t *fr = &env->fr[(n - 64) / 2];
2735c41496dSSven Schnelle             *fr = deposit64(*fr, (n & 1 ? 0 : 32), 32, val);
27461766fe9SRichard Henderson         }
27561766fe9SRichard Henderson         break;
27661766fe9SRichard Henderson     default:
27761766fe9SRichard Henderson         if (n >= 128) {
27861766fe9SRichard Henderson             return 0;
27961766fe9SRichard Henderson         }
28061766fe9SRichard Henderson         break;
28161766fe9SRichard Henderson     }
282eaa3783bSRichard Henderson     return sizeof(target_ureg);
28361766fe9SRichard Henderson }
284