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
105650b549SChetan Pant * version 2.1 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 */
20db5ebe5fSPeter Maydell #include "qemu/osdep.h"
2133c11879SPaolo Bonzini #include "cpu.h"
224ea5fe99SAlex Bennée #include "gdbstub/helpers.h"
23d19c87f4SAndreas Färber
24d19c87f4SAndreas Färber #ifdef TARGET_ABI32
25986a2998SAndreas Färber #define gdb_get_rega(buf, val) gdb_get_reg32(buf, val)
26d19c87f4SAndreas Färber #else
27986a2998SAndreas Färber #define gdb_get_rega(buf, val) gdb_get_regl(buf, val)
28d19c87f4SAndreas Färber #endif
29d19c87f4SAndreas Färber
sparc_cpu_gdb_read_register(CPUState * cs,GByteArray * mem_buf,int n)30a010bdbeSAlex Bennée int sparc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
31d19c87f4SAndreas Färber {
3277976769SPhilippe Mathieu-Daudé CPUSPARCState *env = cpu_env(cs);
335b50e790SAndreas Färber
34d19c87f4SAndreas Färber if (n < 8) {
35d19c87f4SAndreas Färber /* g0..g7 */
36986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->gregs[n]);
37d19c87f4SAndreas Färber }
38d19c87f4SAndreas Färber if (n < 32) {
39d19c87f4SAndreas Färber /* register window */
40986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->regwptr[n - 8]);
41d19c87f4SAndreas Färber }
42d19c87f4SAndreas Färber #if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
43d19c87f4SAndreas Färber if (n < 64) {
44d19c87f4SAndreas Färber /* fprs */
45d19c87f4SAndreas Färber if (n & 1) {
46986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.lower);
47d19c87f4SAndreas Färber } else {
48986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.upper);
49d19c87f4SAndreas Färber }
50d19c87f4SAndreas Färber }
51d19c87f4SAndreas Färber /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
52d19c87f4SAndreas Färber switch (n) {
53d19c87f4SAndreas Färber case 64:
54986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->y);
55d19c87f4SAndreas Färber case 65:
56986a2998SAndreas Färber return gdb_get_rega(mem_buf, cpu_get_psr(env));
57d19c87f4SAndreas Färber case 66:
58986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->wim);
59d19c87f4SAndreas Färber case 67:
60986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->tbr);
61d19c87f4SAndreas Färber case 68:
62986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->pc);
63d19c87f4SAndreas Färber case 69:
64986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->npc);
65d19c87f4SAndreas Färber case 70:
661ccd6e13SRichard Henderson return gdb_get_rega(mem_buf, cpu_get_fsr(env));
67d19c87f4SAndreas Färber case 71:
68986a2998SAndreas Färber return gdb_get_rega(mem_buf, 0); /* csr */
69d19c87f4SAndreas Färber default:
70986a2998SAndreas Färber return gdb_get_rega(mem_buf, 0);
71d19c87f4SAndreas Färber }
72d19c87f4SAndreas Färber #else
73d19c87f4SAndreas Färber if (n < 64) {
74d19c87f4SAndreas Färber /* f0-f31 */
75d19c87f4SAndreas Färber if (n & 1) {
76986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.lower);
77d19c87f4SAndreas Färber } else {
78986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.upper);
79d19c87f4SAndreas Färber }
80d19c87f4SAndreas Färber }
81d19c87f4SAndreas Färber if (n < 80) {
82*7a74e468SMikael Szreder /* f32-f62 (16 double width registers, even register numbers only)
83*7a74e468SMikael Szreder * n == 64: f32 : env->fpr[16]
84*7a74e468SMikael Szreder * n == 65: f34 : env->fpr[17]
85*7a74e468SMikael Szreder * etc...
86*7a74e468SMikael Szreder * n == 79: f62 : env->fpr[31]
87*7a74e468SMikael Szreder */
88*7a74e468SMikael Szreder return gdb_get_reg64(mem_buf, env->fpr[(n - 64) + 16].ll);
89d19c87f4SAndreas Färber }
90d19c87f4SAndreas Färber switch (n) {
91d19c87f4SAndreas Färber case 80:
92986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->pc);
93d19c87f4SAndreas Färber case 81:
94986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->npc);
95d19c87f4SAndreas Färber case 82:
96986a2998SAndreas Färber return gdb_get_regl(mem_buf, (cpu_get_ccr(env) << 32) |
97d19c87f4SAndreas Färber ((env->asi & 0xff) << 24) |
98d19c87f4SAndreas Färber ((env->pstate & 0xfff) << 8) |
99d19c87f4SAndreas Färber cpu_get_cwp64(env));
100d19c87f4SAndreas Färber case 83:
1011ccd6e13SRichard Henderson return gdb_get_regl(mem_buf, cpu_get_fsr(env));
102d19c87f4SAndreas Färber case 84:
103986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->fprs);
104d19c87f4SAndreas Färber case 85:
105986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->y);
106d19c87f4SAndreas Färber }
107d19c87f4SAndreas Färber #endif
108d19c87f4SAndreas Färber return 0;
109d19c87f4SAndreas Färber }
110d19c87f4SAndreas Färber
sparc_cpu_gdb_write_register(CPUState * cs,uint8_t * mem_buf,int n)1115b50e790SAndreas Färber int sparc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
112d19c87f4SAndreas Färber {
1135b50e790SAndreas Färber SPARCCPU *cpu = SPARC_CPU(cs);
1145b50e790SAndreas Färber CPUSPARCState *env = &cpu->env;
115d19c87f4SAndreas Färber #if defined(TARGET_ABI32)
1169b21d29aSPhilippe Mathieu-Daudé uint32_t tmp;
117d19c87f4SAndreas Färber
118d19c87f4SAndreas Färber tmp = ldl_p(mem_buf);
119d19c87f4SAndreas Färber #else
120d19c87f4SAndreas Färber target_ulong tmp;
121d19c87f4SAndreas Färber
122d19c87f4SAndreas Färber tmp = ldtul_p(mem_buf);
123d19c87f4SAndreas Färber #endif
124d19c87f4SAndreas Färber
125d19c87f4SAndreas Färber if (n < 8) {
126d19c87f4SAndreas Färber /* g0..g7 */
127d19c87f4SAndreas Färber env->gregs[n] = tmp;
128d19c87f4SAndreas Färber } else if (n < 32) {
129d19c87f4SAndreas Färber /* register window */
130d19c87f4SAndreas Färber env->regwptr[n - 8] = tmp;
131d19c87f4SAndreas Färber }
132d19c87f4SAndreas Färber #if defined(TARGET_ABI32) || !defined(TARGET_SPARC64)
133d19c87f4SAndreas Färber else if (n < 64) {
134d19c87f4SAndreas Färber /* fprs */
135d19c87f4SAndreas Färber /* f0-f31 */
136d19c87f4SAndreas Färber if (n & 1) {
137d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.lower = tmp;
138d19c87f4SAndreas Färber } else {
139d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.upper = tmp;
140d19c87f4SAndreas Färber }
141d19c87f4SAndreas Färber } else {
142d19c87f4SAndreas Färber /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
143d19c87f4SAndreas Färber switch (n) {
144d19c87f4SAndreas Färber case 64:
145d19c87f4SAndreas Färber env->y = tmp;
146d19c87f4SAndreas Färber break;
147d19c87f4SAndreas Färber case 65:
148d19c87f4SAndreas Färber cpu_put_psr(env, tmp);
149d19c87f4SAndreas Färber break;
150d19c87f4SAndreas Färber case 66:
151d19c87f4SAndreas Färber env->wim = tmp;
152d19c87f4SAndreas Färber break;
153d19c87f4SAndreas Färber case 67:
154d19c87f4SAndreas Färber env->tbr = tmp;
155d19c87f4SAndreas Färber break;
156d19c87f4SAndreas Färber case 68:
157d19c87f4SAndreas Färber env->pc = tmp;
158d19c87f4SAndreas Färber break;
159d19c87f4SAndreas Färber case 69:
160d19c87f4SAndreas Färber env->npc = tmp;
161d19c87f4SAndreas Färber break;
162d19c87f4SAndreas Färber case 70:
1631ccd6e13SRichard Henderson cpu_put_fsr(env, tmp);
164d19c87f4SAndreas Färber break;
165d19c87f4SAndreas Färber default:
166d19c87f4SAndreas Färber return 0;
167d19c87f4SAndreas Färber }
168d19c87f4SAndreas Färber }
169d19c87f4SAndreas Färber return 4;
170d19c87f4SAndreas Färber #else
171d19c87f4SAndreas Färber else if (n < 64) {
172d19c87f4SAndreas Färber /* f0-f31 */
173d19c87f4SAndreas Färber tmp = ldl_p(mem_buf);
174d19c87f4SAndreas Färber if (n & 1) {
175d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.lower = tmp;
176d19c87f4SAndreas Färber } else {
177d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.upper = tmp;
178d19c87f4SAndreas Färber }
179d19c87f4SAndreas Färber return 4;
180d19c87f4SAndreas Färber } else if (n < 80) {
181*7a74e468SMikael Szreder /* f32-f62 (16 double width registers, even register numbers only)
182*7a74e468SMikael Szreder * n == 64: f32 : env->fpr[16]
183*7a74e468SMikael Szreder * n == 65: f34 : env->fpr[17]
184*7a74e468SMikael Szreder * etc...
185*7a74e468SMikael Szreder * n == 79: f62 : env->fpr[31]
186*7a74e468SMikael Szreder */
187*7a74e468SMikael Szreder env->fpr[(n - 64) + 16].ll = tmp;
188d19c87f4SAndreas Färber } else {
189d19c87f4SAndreas Färber switch (n) {
190d19c87f4SAndreas Färber case 80:
191d19c87f4SAndreas Färber env->pc = tmp;
192d19c87f4SAndreas Färber break;
193d19c87f4SAndreas Färber case 81:
194d19c87f4SAndreas Färber env->npc = tmp;
195d19c87f4SAndreas Färber break;
196d19c87f4SAndreas Färber case 82:
197d19c87f4SAndreas Färber cpu_put_ccr(env, tmp >> 32);
198d19c87f4SAndreas Färber env->asi = (tmp >> 24) & 0xff;
199d19c87f4SAndreas Färber env->pstate = (tmp >> 8) & 0xfff;
200d19c87f4SAndreas Färber cpu_put_cwp64(env, tmp & 0xff);
201d19c87f4SAndreas Färber break;
202d19c87f4SAndreas Färber case 83:
2031ccd6e13SRichard Henderson cpu_put_fsr(env, tmp);
204d19c87f4SAndreas Färber break;
205d19c87f4SAndreas Färber case 84:
206d19c87f4SAndreas Färber env->fprs = tmp;
207d19c87f4SAndreas Färber break;
208d19c87f4SAndreas Färber case 85:
209d19c87f4SAndreas Färber env->y = tmp;
210d19c87f4SAndreas Färber break;
211d19c87f4SAndreas Färber default:
212d19c87f4SAndreas Färber return 0;
213d19c87f4SAndreas Färber }
214d19c87f4SAndreas Färber }
215d19c87f4SAndreas Färber return 8;
216d19c87f4SAndreas Färber #endif
217d19c87f4SAndreas Färber }
218