xref: /qemu/target/hppa/gdbstub.c (revision e33348a635462d33d6383b532100bbe2e1fa4097)
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;
44*e33348a6SRichard Henderson     case 34:
45*e33348a6SRichard Henderson         val = env->iasq_f >> 32;
46*e33348a6SRichard Henderson         break;
4761766fe9SRichard Henderson     case 35:
4861766fe9SRichard Henderson         val = env->iaoq_b;
4961766fe9SRichard Henderson         break;
50*e33348a6SRichard Henderson     case 36:
51*e33348a6SRichard Henderson         val = env->iasq_b >> 32;
52*e33348a6SRichard Henderson         break;
53*e33348a6SRichard Henderson     case 37:
54*e33348a6SRichard Henderson         val = env->cr[CR_EIEM];
55*e33348a6SRichard Henderson         break;
56*e33348a6SRichard Henderson     case 38:
57*e33348a6SRichard Henderson         val = env->cr[CR_IIR];
58*e33348a6SRichard Henderson         break;
59*e33348a6SRichard Henderson     case 39:
60*e33348a6SRichard Henderson         val = env->cr[CR_ISR];
61*e33348a6SRichard Henderson         break;
62*e33348a6SRichard Henderson     case 40:
63*e33348a6SRichard Henderson         val = env->cr[CR_IOR];
64*e33348a6SRichard Henderson         break;
65*e33348a6SRichard Henderson     case 41:
66*e33348a6SRichard Henderson         val = env->cr[CR_IPSW];
67*e33348a6SRichard Henderson         break;
68*e33348a6SRichard Henderson     case 43:
69*e33348a6SRichard Henderson         val = env->sr[4] >> 32;
70*e33348a6SRichard Henderson         break;
71*e33348a6SRichard Henderson     case 44:
72*e33348a6SRichard Henderson         val = env->sr[0] >> 32;
73*e33348a6SRichard Henderson         break;
74*e33348a6SRichard Henderson     case 45:
75*e33348a6SRichard Henderson         val = env->sr[1] >> 32;
76*e33348a6SRichard Henderson         break;
77*e33348a6SRichard Henderson     case 46:
78*e33348a6SRichard Henderson         val = env->sr[2] >> 32;
79*e33348a6SRichard Henderson         break;
80*e33348a6SRichard Henderson     case 47:
81*e33348a6SRichard Henderson         val = env->sr[3] >> 32;
82*e33348a6SRichard Henderson         break;
83*e33348a6SRichard Henderson     case 48:
84*e33348a6SRichard Henderson         val = env->sr[5] >> 32;
85*e33348a6SRichard Henderson         break;
86*e33348a6SRichard Henderson     case 49:
87*e33348a6SRichard Henderson         val = env->sr[6] >> 32;
88*e33348a6SRichard Henderson         break;
89*e33348a6SRichard Henderson     case 50:
90*e33348a6SRichard Henderson         val = env->sr[7] >> 32;
91*e33348a6SRichard Henderson         break;
92*e33348a6SRichard Henderson     case 51:
93*e33348a6SRichard Henderson         val = env->cr[CR_RC];
94*e33348a6SRichard Henderson         break;
95*e33348a6SRichard Henderson     case 52:
96*e33348a6SRichard Henderson         val = env->cr[8];
97*e33348a6SRichard Henderson         break;
98*e33348a6SRichard Henderson     case 53:
99*e33348a6SRichard Henderson         val = env->cr[9];
100*e33348a6SRichard Henderson         break;
101*e33348a6SRichard Henderson     case 54:
102*e33348a6SRichard Henderson         val = env->cr[CR_SCRCCR];
103*e33348a6SRichard Henderson         break;
104*e33348a6SRichard Henderson     case 55:
105*e33348a6SRichard Henderson         val = env->cr[12];
106*e33348a6SRichard Henderson         break;
107*e33348a6SRichard Henderson     case 56:
108*e33348a6SRichard Henderson         val = env->cr[13];
109*e33348a6SRichard Henderson         break;
110*e33348a6SRichard Henderson     case 57:
111*e33348a6SRichard Henderson         val = env->cr[24];
112*e33348a6SRichard Henderson         break;
113*e33348a6SRichard Henderson     case 58:
114*e33348a6SRichard Henderson         val = env->cr[25];
115*e33348a6SRichard 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;
122*e33348a6SRichard Henderson     case 61:
123*e33348a6SRichard Henderson         val = env->cr[28];
124*e33348a6SRichard Henderson         break;
125*e33348a6SRichard Henderson     case 62:
126*e33348a6SRichard Henderson         val = env->cr[29];
127*e33348a6SRichard Henderson         break;
128*e33348a6SRichard Henderson     case 63:
129*e33348a6SRichard Henderson         val = env->cr[30];
130*e33348a6SRichard 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;
175*e33348a6SRichard Henderson     case 34:
176*e33348a6SRichard Henderson         env->iasq_f = (uint64_t)val << 32;
177*e33348a6SRichard Henderson         break;
17861766fe9SRichard Henderson     case 35:
17961766fe9SRichard Henderson         env->iaoq_b = val;
1806836a8fbSRichard Henderson         break;
181*e33348a6SRichard Henderson     case 36:
182*e33348a6SRichard Henderson         env->iasq_b = (uint64_t)val << 32;
183*e33348a6SRichard Henderson         break;
184*e33348a6SRichard Henderson     case 37:
185*e33348a6SRichard Henderson         env->cr[CR_EIEM] = val;
186*e33348a6SRichard Henderson         break;
187*e33348a6SRichard Henderson     case 38:
188*e33348a6SRichard Henderson         env->cr[CR_IIR] = val;
189*e33348a6SRichard Henderson         break;
190*e33348a6SRichard Henderson     case 39:
191*e33348a6SRichard Henderson         env->cr[CR_ISR] = val;
192*e33348a6SRichard Henderson         break;
193*e33348a6SRichard Henderson     case 40:
194*e33348a6SRichard Henderson         env->cr[CR_IOR] = val;
195*e33348a6SRichard Henderson         break;
196*e33348a6SRichard Henderson     case 41:
197*e33348a6SRichard Henderson         env->cr[CR_IPSW] = val;
198*e33348a6SRichard Henderson         break;
199*e33348a6SRichard Henderson     case 43:
200*e33348a6SRichard Henderson         env->sr[4] = (uint64_t)val << 32;
201*e33348a6SRichard Henderson         break;
202*e33348a6SRichard Henderson     case 44:
203*e33348a6SRichard Henderson         env->sr[0] = (uint64_t)val << 32;
204*e33348a6SRichard Henderson         break;
205*e33348a6SRichard Henderson     case 45:
206*e33348a6SRichard Henderson         env->sr[1] = (uint64_t)val << 32;
207*e33348a6SRichard Henderson         break;
208*e33348a6SRichard Henderson     case 46:
209*e33348a6SRichard Henderson         env->sr[2] = (uint64_t)val << 32;
210*e33348a6SRichard Henderson         break;
211*e33348a6SRichard Henderson     case 47:
212*e33348a6SRichard Henderson         env->sr[3] = (uint64_t)val << 32;
213*e33348a6SRichard Henderson         break;
214*e33348a6SRichard Henderson     case 48:
215*e33348a6SRichard Henderson         env->sr[5] = (uint64_t)val << 32;
216*e33348a6SRichard Henderson         break;
217*e33348a6SRichard Henderson     case 49:
218*e33348a6SRichard Henderson         env->sr[6] = (uint64_t)val << 32;
219*e33348a6SRichard Henderson         break;
220*e33348a6SRichard Henderson     case 50:
221*e33348a6SRichard Henderson         env->sr[7] = (uint64_t)val << 32;
222*e33348a6SRichard Henderson         break;
223*e33348a6SRichard Henderson     case 51:
224*e33348a6SRichard Henderson         env->cr[CR_RC] = val;
225*e33348a6SRichard Henderson         break;
226*e33348a6SRichard Henderson     case 52:
227*e33348a6SRichard Henderson         env->cr[8] = val;
228*e33348a6SRichard Henderson         break;
229*e33348a6SRichard Henderson     case 53:
230*e33348a6SRichard Henderson         env->cr[9] = val;
231*e33348a6SRichard Henderson         break;
232*e33348a6SRichard Henderson     case 54:
233*e33348a6SRichard Henderson         env->cr[CR_SCRCCR] = val;
234*e33348a6SRichard Henderson         break;
235*e33348a6SRichard Henderson     case 55:
236*e33348a6SRichard Henderson         env->cr[12] = val;
237*e33348a6SRichard Henderson         break;
238*e33348a6SRichard Henderson     case 56:
239*e33348a6SRichard Henderson         env->cr[13] = val;
240*e33348a6SRichard Henderson         break;
241*e33348a6SRichard Henderson     case 57:
242*e33348a6SRichard Henderson         env->cr[24] = val;
243*e33348a6SRichard Henderson         break;
244*e33348a6SRichard Henderson     case 58:
245*e33348a6SRichard Henderson         env->cr[25] = val;
246*e33348a6SRichard Henderson         break;
24761766fe9SRichard Henderson     case 59:
24835136a77SRichard Henderson         env->cr[26] = val;
24961766fe9SRichard Henderson         break;
25061766fe9SRichard Henderson     case 60:
25135136a77SRichard Henderson         env->cr[27] = val;
25261766fe9SRichard Henderson         break;
253*e33348a6SRichard Henderson     case 61:
254*e33348a6SRichard Henderson         env->cr[28] = val;
255*e33348a6SRichard Henderson         break;
256*e33348a6SRichard Henderson     case 62:
257*e33348a6SRichard Henderson         env->cr[29] = val;
258*e33348a6SRichard Henderson         break;
259*e33348a6SRichard Henderson     case 63:
260*e33348a6SRichard Henderson         env->cr[30] = val;
261*e33348a6SRichard Henderson         break;
26261766fe9SRichard Henderson     case 64:
26361766fe9SRichard Henderson         env->fr[0] = deposit64(env->fr[0], 32, 32, val);
26461766fe9SRichard Henderson         cpu_hppa_loaded_fr0(env);
26561766fe9SRichard Henderson         break;
26661766fe9SRichard Henderson     case 65 ... 127:
26761766fe9SRichard Henderson         {
26861766fe9SRichard Henderson             uint64_t *fr = &env->fr[(n - 64) / 2];
26961766fe9SRichard Henderson             *fr = deposit64(*fr, val, (n & 1 ? 0 : 32), 32);
27061766fe9SRichard Henderson         }
27161766fe9SRichard Henderson         break;
27261766fe9SRichard Henderson     default:
27361766fe9SRichard Henderson         if (n >= 128) {
27461766fe9SRichard Henderson             return 0;
27561766fe9SRichard Henderson         }
27661766fe9SRichard Henderson         break;
27761766fe9SRichard Henderson     }
278eaa3783bSRichard Henderson     return sizeof(target_ureg);
27961766fe9SRichard Henderson }
280