root / target-sh4 / gdbstub.c @ f53f81e0
History | View | Annotate | Download (4 kB)
1 | 2f937732 | Andreas Färber | /*
|
---|---|---|---|
2 | 2f937732 | Andreas Färber | * SuperH gdb server stub
|
3 | 2f937732 | Andreas Färber | *
|
4 | 2f937732 | Andreas Färber | * Copyright (c) 2003-2005 Fabrice Bellard
|
5 | 2f937732 | Andreas Färber | * Copyright (c) 2013 SUSE LINUX Products GmbH
|
6 | 2f937732 | Andreas Färber | *
|
7 | 2f937732 | Andreas Färber | * This library is free software; you can redistribute it and/or
|
8 | 2f937732 | Andreas Färber | * modify it under the terms of the GNU Lesser General Public
|
9 | 2f937732 | Andreas Färber | * License as published by the Free Software Foundation; either
|
10 | 2f937732 | Andreas Färber | * version 2 of the License, or (at your option) any later version.
|
11 | 2f937732 | Andreas Färber | *
|
12 | 2f937732 | Andreas Färber | * This library is distributed in the hope that it will be useful,
|
13 | 2f937732 | Andreas Färber | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 | 2f937732 | Andreas Färber | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 | 2f937732 | Andreas Färber | * Lesser General Public License for more details.
|
16 | 2f937732 | Andreas Färber | *
|
17 | 2f937732 | Andreas Färber | * You should have received a copy of the GNU Lesser General Public
|
18 | 2f937732 | Andreas Färber | * License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
19 | 2f937732 | Andreas Färber | */
|
20 | 5b50e790 | Andreas Färber | #include "config.h" |
21 | 5b50e790 | Andreas Färber | #include "qemu-common.h" |
22 | 5b50e790 | Andreas Färber | #include "exec/gdbstub.h" |
23 | 2f937732 | Andreas Färber | |
24 | 2f937732 | Andreas Färber | /* Hint: Use "set architecture sh4" in GDB to see fpu registers */
|
25 | 2f937732 | Andreas Färber | /* FIXME: We should use XML for this. */
|
26 | 2f937732 | Andreas Färber | |
27 | 5b50e790 | Andreas Färber | int superh_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) |
28 | 2f937732 | Andreas Färber | { |
29 | 5b50e790 | Andreas Färber | SuperHCPU *cpu = SUPERH_CPU(cs); |
30 | 5b50e790 | Andreas Färber | CPUSH4State *env = &cpu->env; |
31 | 5b50e790 | Andreas Färber | |
32 | 2f937732 | Andreas Färber | switch (n) {
|
33 | 2f937732 | Andreas Färber | case 0 ... 7: |
34 | 2f937732 | Andreas Färber | if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
|
35 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->gregs[n + 16]); |
36 | 2f937732 | Andreas Färber | } else {
|
37 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->gregs[n]);
|
38 | 2f937732 | Andreas Färber | } |
39 | 2f937732 | Andreas Färber | case 8 ... 15: |
40 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->gregs[n]);
|
41 | 2f937732 | Andreas Färber | case 16: |
42 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->pc);
|
43 | 2f937732 | Andreas Färber | case 17: |
44 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->pr);
|
45 | 2f937732 | Andreas Färber | case 18: |
46 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->gbr);
|
47 | 2f937732 | Andreas Färber | case 19: |
48 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->vbr);
|
49 | 2f937732 | Andreas Färber | case 20: |
50 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->mach);
|
51 | 2f937732 | Andreas Färber | case 21: |
52 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->macl);
|
53 | 2f937732 | Andreas Färber | case 22: |
54 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->sr);
|
55 | 2f937732 | Andreas Färber | case 23: |
56 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->fpul);
|
57 | 2f937732 | Andreas Färber | case 24: |
58 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->fpscr);
|
59 | 2f937732 | Andreas Färber | case 25 ... 40: |
60 | 2f937732 | Andreas Färber | if (env->fpscr & FPSCR_FR) {
|
61 | 2f937732 | Andreas Färber | stfl_p(mem_buf, env->fregs[n - 9]);
|
62 | 2f937732 | Andreas Färber | } else {
|
63 | 2f937732 | Andreas Färber | stfl_p(mem_buf, env->fregs[n - 25]);
|
64 | 2f937732 | Andreas Färber | } |
65 | 2f937732 | Andreas Färber | return 4; |
66 | 2f937732 | Andreas Färber | case 41: |
67 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->ssr);
|
68 | 2f937732 | Andreas Färber | case 42: |
69 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->spc);
|
70 | 2f937732 | Andreas Färber | case 43 ... 50: |
71 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->gregs[n - 43]); |
72 | 2f937732 | Andreas Färber | case 51 ... 58: |
73 | 986a2998 | Andreas Färber | return gdb_get_regl(mem_buf, env->gregs[n - (51 - 16)]); |
74 | 2f937732 | Andreas Färber | } |
75 | 2f937732 | Andreas Färber | |
76 | 2f937732 | Andreas Färber | return 0; |
77 | 2f937732 | Andreas Färber | } |
78 | 2f937732 | Andreas Färber | |
79 | 5b50e790 | Andreas Färber | int superh_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) |
80 | 2f937732 | Andreas Färber | { |
81 | 5b50e790 | Andreas Färber | SuperHCPU *cpu = SUPERH_CPU(cs); |
82 | 5b50e790 | Andreas Färber | CPUSH4State *env = &cpu->env; |
83 | 5b50e790 | Andreas Färber | |
84 | 2f937732 | Andreas Färber | switch (n) {
|
85 | 2f937732 | Andreas Färber | case 0 ... 7: |
86 | 2f937732 | Andreas Färber | if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) {
|
87 | 2f937732 | Andreas Färber | env->gregs[n + 16] = ldl_p(mem_buf);
|
88 | 2f937732 | Andreas Färber | } else {
|
89 | 2f937732 | Andreas Färber | env->gregs[n] = ldl_p(mem_buf); |
90 | 2f937732 | Andreas Färber | } |
91 | 2f937732 | Andreas Färber | break;
|
92 | 2f937732 | Andreas Färber | case 8 ... 15: |
93 | 2f937732 | Andreas Färber | env->gregs[n] = ldl_p(mem_buf); |
94 | 2f937732 | Andreas Färber | break;
|
95 | 2f937732 | Andreas Färber | case 16: |
96 | 2f937732 | Andreas Färber | env->pc = ldl_p(mem_buf); |
97 | 2f937732 | Andreas Färber | break;
|
98 | 2f937732 | Andreas Färber | case 17: |
99 | 2f937732 | Andreas Färber | env->pr = ldl_p(mem_buf); |
100 | 2f937732 | Andreas Färber | break;
|
101 | 2f937732 | Andreas Färber | case 18: |
102 | 2f937732 | Andreas Färber | env->gbr = ldl_p(mem_buf); |
103 | 2f937732 | Andreas Färber | break;
|
104 | 2f937732 | Andreas Färber | case 19: |
105 | 2f937732 | Andreas Färber | env->vbr = ldl_p(mem_buf); |
106 | 2f937732 | Andreas Färber | break;
|
107 | 2f937732 | Andreas Färber | case 20: |
108 | 2f937732 | Andreas Färber | env->mach = ldl_p(mem_buf); |
109 | 2f937732 | Andreas Färber | break;
|
110 | 2f937732 | Andreas Färber | case 21: |
111 | 2f937732 | Andreas Färber | env->macl = ldl_p(mem_buf); |
112 | 2f937732 | Andreas Färber | break;
|
113 | 2f937732 | Andreas Färber | case 22: |
114 | 2f937732 | Andreas Färber | env->sr = ldl_p(mem_buf); |
115 | 2f937732 | Andreas Färber | break;
|
116 | 2f937732 | Andreas Färber | case 23: |
117 | 2f937732 | Andreas Färber | env->fpul = ldl_p(mem_buf); |
118 | 2f937732 | Andreas Färber | break;
|
119 | 2f937732 | Andreas Färber | case 24: |
120 | 2f937732 | Andreas Färber | env->fpscr = ldl_p(mem_buf); |
121 | 2f937732 | Andreas Färber | break;
|
122 | 2f937732 | Andreas Färber | case 25 ... 40: |
123 | 2f937732 | Andreas Färber | if (env->fpscr & FPSCR_FR) {
|
124 | 2f937732 | Andreas Färber | env->fregs[n - 9] = ldfl_p(mem_buf);
|
125 | 2f937732 | Andreas Färber | } else {
|
126 | 2f937732 | Andreas Färber | env->fregs[n - 25] = ldfl_p(mem_buf);
|
127 | 2f937732 | Andreas Färber | } |
128 | 2f937732 | Andreas Färber | break;
|
129 | 2f937732 | Andreas Färber | case 41: |
130 | 2f937732 | Andreas Färber | env->ssr = ldl_p(mem_buf); |
131 | 2f937732 | Andreas Färber | break;
|
132 | 2f937732 | Andreas Färber | case 42: |
133 | 2f937732 | Andreas Färber | env->spc = ldl_p(mem_buf); |
134 | 2f937732 | Andreas Färber | break;
|
135 | 2f937732 | Andreas Färber | case 43 ... 50: |
136 | 2f937732 | Andreas Färber | env->gregs[n - 43] = ldl_p(mem_buf);
|
137 | 2f937732 | Andreas Färber | break;
|
138 | 2f937732 | Andreas Färber | case 51 ... 58: |
139 | 2f937732 | Andreas Färber | env->gregs[n - (51 - 16)] = ldl_p(mem_buf); |
140 | 2f937732 | Andreas Färber | break;
|
141 | 2f937732 | Andreas Färber | default:
|
142 | 2f937732 | Andreas Färber | return 0; |
143 | 2f937732 | Andreas Färber | } |
144 | 2f937732 | Andreas Färber | |
145 | 2f937732 | Andreas Färber | return 4; |
146 | 2f937732 | Andreas Färber | } |