xref: /qemu/target/sparc/gdbstub.c (revision d19c87f44d8d7bac48d4b35863ae825f872ed54a)
1d19c87f4SAndreas Färber /*
2d19c87f4SAndreas Färber  * SPARC gdb server stub
3d19c87f4SAndreas Färber  *
4d19c87f4SAndreas Färber  * Copyright (c) 2003-2005 Fabrice Bellard
5d19c87f4SAndreas Färber  * Copyright (c) 2013 SUSE LINUX Products GmbH
6d19c87f4SAndreas Färber  *
7d19c87f4SAndreas Färber  * This library is free software; you can redistribute it and/or
8d19c87f4SAndreas Färber  * modify it under the terms of the GNU Lesser General Public
9d19c87f4SAndreas Färber  * License as published by the Free Software Foundation; either
10d19c87f4SAndreas Färber  * version 2 of the License, or (at your option) any later version.
11d19c87f4SAndreas Färber  *
12d19c87f4SAndreas Färber  * This library is distributed in the hope that it will be useful,
13d19c87f4SAndreas Färber  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14d19c87f4SAndreas Färber  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15d19c87f4SAndreas Färber  * Lesser General Public License for more details.
16d19c87f4SAndreas Färber  *
17d19c87f4SAndreas Färber  * You should have received a copy of the GNU Lesser General Public
18d19c87f4SAndreas Färber  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19d19c87f4SAndreas Färber  */
20d19c87f4SAndreas Färber 
21d19c87f4SAndreas Färber #ifdef TARGET_ABI32
22d19c87f4SAndreas Färber #define GET_REGA(val) GET_REG32(val)
23d19c87f4SAndreas Färber #else
24d19c87f4SAndreas Färber #define GET_REGA(val) GET_REGL(val)
25d19c87f4SAndreas Färber #endif
26d19c87f4SAndreas Färber 
27d19c87f4SAndreas Färber static int cpu_gdb_read_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
28d19c87f4SAndreas Färber {
29d19c87f4SAndreas Färber     if (n < 8) {
30d19c87f4SAndreas Färber         /* g0..g7 */
31d19c87f4SAndreas Färber         GET_REGA(env->gregs[n]);
32d19c87f4SAndreas Färber     }
33d19c87f4SAndreas Färber     if (n < 32) {
34d19c87f4SAndreas Färber         /* register window */
35d19c87f4SAndreas Färber         GET_REGA(env->regwptr[n - 8]);
36d19c87f4SAndreas Färber     }
37d19c87f4SAndreas Färber #if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
38d19c87f4SAndreas Färber     if (n < 64) {
39d19c87f4SAndreas Färber         /* fprs */
40d19c87f4SAndreas Färber         if (n & 1) {
41d19c87f4SAndreas Färber             GET_REG32(env->fpr[(n - 32) / 2].l.lower);
42d19c87f4SAndreas Färber         } else {
43d19c87f4SAndreas Färber             GET_REG32(env->fpr[(n - 32) / 2].l.upper);
44d19c87f4SAndreas Färber         }
45d19c87f4SAndreas Färber     }
46d19c87f4SAndreas Färber     /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
47d19c87f4SAndreas Färber     switch (n) {
48d19c87f4SAndreas Färber     case 64:
49d19c87f4SAndreas Färber         GET_REGA(env->y);
50d19c87f4SAndreas Färber     case 65:
51d19c87f4SAndreas Färber         GET_REGA(cpu_get_psr(env));
52d19c87f4SAndreas Färber     case 66:
53d19c87f4SAndreas Färber         GET_REGA(env->wim);
54d19c87f4SAndreas Färber     case 67:
55d19c87f4SAndreas Färber         GET_REGA(env->tbr);
56d19c87f4SAndreas Färber     case 68:
57d19c87f4SAndreas Färber         GET_REGA(env->pc);
58d19c87f4SAndreas Färber     case 69:
59d19c87f4SAndreas Färber         GET_REGA(env->npc);
60d19c87f4SAndreas Färber     case 70:
61d19c87f4SAndreas Färber         GET_REGA(env->fsr);
62d19c87f4SAndreas Färber     case 71:
63d19c87f4SAndreas Färber         GET_REGA(0); /* csr */
64d19c87f4SAndreas Färber     default:
65d19c87f4SAndreas Färber         GET_REGA(0);
66d19c87f4SAndreas Färber     }
67d19c87f4SAndreas Färber #else
68d19c87f4SAndreas Färber     if (n < 64) {
69d19c87f4SAndreas Färber         /* f0-f31 */
70d19c87f4SAndreas Färber         if (n & 1) {
71d19c87f4SAndreas Färber             GET_REG32(env->fpr[(n - 32) / 2].l.lower);
72d19c87f4SAndreas Färber         } else {
73d19c87f4SAndreas Färber             GET_REG32(env->fpr[(n - 32) / 2].l.upper);
74d19c87f4SAndreas Färber         }
75d19c87f4SAndreas Färber     }
76d19c87f4SAndreas Färber     if (n < 80) {
77d19c87f4SAndreas Färber         /* f32-f62 (double width, even numbers only) */
78d19c87f4SAndreas Färber         GET_REG64(env->fpr[(n - 32) / 2].ll);
79d19c87f4SAndreas Färber     }
80d19c87f4SAndreas Färber     switch (n) {
81d19c87f4SAndreas Färber     case 80:
82d19c87f4SAndreas Färber         GET_REGL(env->pc);
83d19c87f4SAndreas Färber     case 81:
84d19c87f4SAndreas Färber         GET_REGL(env->npc);
85d19c87f4SAndreas Färber     case 82:
86d19c87f4SAndreas Färber         GET_REGL((cpu_get_ccr(env) << 32) |
87d19c87f4SAndreas Färber                  ((env->asi & 0xff) << 24) |
88d19c87f4SAndreas Färber                  ((env->pstate & 0xfff) << 8) |
89d19c87f4SAndreas Färber                  cpu_get_cwp64(env));
90d19c87f4SAndreas Färber     case 83:
91d19c87f4SAndreas Färber         GET_REGL(env->fsr);
92d19c87f4SAndreas Färber     case 84:
93d19c87f4SAndreas Färber         GET_REGL(env->fprs);
94d19c87f4SAndreas Färber     case 85:
95d19c87f4SAndreas Färber         GET_REGL(env->y);
96d19c87f4SAndreas Färber     }
97d19c87f4SAndreas Färber #endif
98d19c87f4SAndreas Färber     return 0;
99d19c87f4SAndreas Färber }
100d19c87f4SAndreas Färber 
101d19c87f4SAndreas Färber static int cpu_gdb_write_register(CPUSPARCState *env, uint8_t *mem_buf, int n)
102d19c87f4SAndreas Färber {
103d19c87f4SAndreas Färber #if defined(TARGET_ABI32)
104d19c87f4SAndreas Färber     abi_ulong tmp;
105d19c87f4SAndreas Färber 
106d19c87f4SAndreas Färber     tmp = ldl_p(mem_buf);
107d19c87f4SAndreas Färber #else
108d19c87f4SAndreas Färber     target_ulong tmp;
109d19c87f4SAndreas Färber 
110d19c87f4SAndreas Färber     tmp = ldtul_p(mem_buf);
111d19c87f4SAndreas Färber #endif
112d19c87f4SAndreas Färber 
113d19c87f4SAndreas Färber     if (n < 8) {
114d19c87f4SAndreas Färber         /* g0..g7 */
115d19c87f4SAndreas Färber         env->gregs[n] = tmp;
116d19c87f4SAndreas Färber     } else if (n < 32) {
117d19c87f4SAndreas Färber         /* register window */
118d19c87f4SAndreas Färber         env->regwptr[n - 8] = tmp;
119d19c87f4SAndreas Färber     }
120d19c87f4SAndreas Färber #if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
121d19c87f4SAndreas Färber     else if (n < 64) {
122d19c87f4SAndreas Färber         /* fprs */
123d19c87f4SAndreas Färber         /* f0-f31 */
124d19c87f4SAndreas Färber         if (n & 1) {
125d19c87f4SAndreas Färber             env->fpr[(n - 32) / 2].l.lower = tmp;
126d19c87f4SAndreas Färber         } else {
127d19c87f4SAndreas Färber             env->fpr[(n - 32) / 2].l.upper = tmp;
128d19c87f4SAndreas Färber         }
129d19c87f4SAndreas Färber     } else {
130d19c87f4SAndreas Färber         /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
131d19c87f4SAndreas Färber         switch (n) {
132d19c87f4SAndreas Färber         case 64:
133d19c87f4SAndreas Färber             env->y = tmp;
134d19c87f4SAndreas Färber             break;
135d19c87f4SAndreas Färber         case 65:
136d19c87f4SAndreas Färber             cpu_put_psr(env, tmp);
137d19c87f4SAndreas Färber             break;
138d19c87f4SAndreas Färber         case 66:
139d19c87f4SAndreas Färber             env->wim = tmp;
140d19c87f4SAndreas Färber             break;
141d19c87f4SAndreas Färber         case 67:
142d19c87f4SAndreas Färber             env->tbr = tmp;
143d19c87f4SAndreas Färber             break;
144d19c87f4SAndreas Färber         case 68:
145d19c87f4SAndreas Färber             env->pc = tmp;
146d19c87f4SAndreas Färber             break;
147d19c87f4SAndreas Färber         case 69:
148d19c87f4SAndreas Färber             env->npc = tmp;
149d19c87f4SAndreas Färber             break;
150d19c87f4SAndreas Färber         case 70:
151d19c87f4SAndreas Färber             env->fsr = tmp;
152d19c87f4SAndreas Färber             break;
153d19c87f4SAndreas Färber         default:
154d19c87f4SAndreas Färber             return 0;
155d19c87f4SAndreas Färber         }
156d19c87f4SAndreas Färber     }
157d19c87f4SAndreas Färber     return 4;
158d19c87f4SAndreas Färber #else
159d19c87f4SAndreas Färber     else if (n < 64) {
160d19c87f4SAndreas Färber         /* f0-f31 */
161d19c87f4SAndreas Färber         tmp = ldl_p(mem_buf);
162d19c87f4SAndreas Färber         if (n & 1) {
163d19c87f4SAndreas Färber             env->fpr[(n - 32) / 2].l.lower = tmp;
164d19c87f4SAndreas Färber         } else {
165d19c87f4SAndreas Färber             env->fpr[(n - 32) / 2].l.upper = tmp;
166d19c87f4SAndreas Färber         }
167d19c87f4SAndreas Färber         return 4;
168d19c87f4SAndreas Färber     } else if (n < 80) {
169d19c87f4SAndreas Färber         /* f32-f62 (double width, even numbers only) */
170d19c87f4SAndreas Färber         env->fpr[(n - 32) / 2].ll = tmp;
171d19c87f4SAndreas Färber     } else {
172d19c87f4SAndreas Färber         switch (n) {
173d19c87f4SAndreas Färber         case 80:
174d19c87f4SAndreas Färber             env->pc = tmp;
175d19c87f4SAndreas Färber             break;
176d19c87f4SAndreas Färber         case 81:
177d19c87f4SAndreas Färber             env->npc = tmp;
178d19c87f4SAndreas Färber             break;
179d19c87f4SAndreas Färber         case 82:
180d19c87f4SAndreas Färber             cpu_put_ccr(env, tmp >> 32);
181d19c87f4SAndreas Färber             env->asi = (tmp >> 24) & 0xff;
182d19c87f4SAndreas Färber             env->pstate = (tmp >> 8) & 0xfff;
183d19c87f4SAndreas Färber             cpu_put_cwp64(env, tmp & 0xff);
184d19c87f4SAndreas Färber             break;
185d19c87f4SAndreas Färber         case 83:
186d19c87f4SAndreas Färber             env->fsr = tmp;
187d19c87f4SAndreas Färber             break;
188d19c87f4SAndreas Färber         case 84:
189d19c87f4SAndreas Färber             env->fprs = tmp;
190d19c87f4SAndreas Färber             break;
191d19c87f4SAndreas Färber         case 85:
192d19c87f4SAndreas Färber             env->y = tmp;
193d19c87f4SAndreas Färber             break;
194d19c87f4SAndreas Färber         default:
195d19c87f4SAndreas Färber             return 0;
196d19c87f4SAndreas Färber         }
197d19c87f4SAndreas Färber     }
198d19c87f4SAndreas Färber     return 8;
199d19c87f4SAndreas Färber #endif
200d19c87f4SAndreas Färber }
201