root / target-arm / gdbstub.c @ 5b50e790
History | View | Annotate | Download (2.8 kB)
1 | 58850dad | Andreas Färber | /*
|
---|---|---|---|
2 | 58850dad | Andreas Färber | * ARM gdb server stub
|
3 | 58850dad | Andreas Färber | *
|
4 | 58850dad | Andreas Färber | * Copyright (c) 2003-2005 Fabrice Bellard
|
5 | 58850dad | Andreas Färber | * Copyright (c) 2013 SUSE LINUX Products GmbH
|
6 | 58850dad | Andreas Färber | *
|
7 | 58850dad | Andreas Färber | * This library is free software; you can redistribute it and/or
|
8 | 58850dad | Andreas Färber | * modify it under the terms of the GNU Lesser General Public
|
9 | 58850dad | Andreas Färber | * License as published by the Free Software Foundation; either
|
10 | 58850dad | Andreas Färber | * version 2 of the License, or (at your option) any later version.
|
11 | 58850dad | Andreas Färber | *
|
12 | 58850dad | Andreas Färber | * This library is distributed in the hope that it will be useful,
|
13 | 58850dad | Andreas Färber | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 | 58850dad | Andreas Färber | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 | 58850dad | Andreas Färber | * Lesser General Public License for more details.
|
16 | 58850dad | Andreas Färber | *
|
17 | 58850dad | Andreas Färber | * You should have received a copy of the GNU Lesser General Public
|
18 | 58850dad | Andreas Färber | * License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
19 | 58850dad | 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 | 58850dad | Andreas Färber | |
24 | 58850dad | Andreas Färber | /* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
|
25 | 58850dad | Andreas Färber | whatever the target description contains. Due to a historical mishap
|
26 | 58850dad | Andreas Färber | the FPA registers appear in between core integer regs and the CPSR.
|
27 | 58850dad | Andreas Färber | We hack round this by giving the FPA regs zero size when talking to a
|
28 | 58850dad | Andreas Färber | newer gdb. */
|
29 | 58850dad | Andreas Färber | |
30 | 5b50e790 | Andreas Färber | int arm_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) |
31 | 58850dad | Andreas Färber | { |
32 | 5b50e790 | Andreas Färber | ARMCPU *cpu = ARM_CPU(cs); |
33 | 5b50e790 | Andreas Färber | CPUARMState *env = &cpu->env; |
34 | 5b50e790 | Andreas Färber | |
35 | 58850dad | Andreas Färber | if (n < 16) { |
36 | 58850dad | Andreas Färber | /* Core integer register. */
|
37 | 986a2998 | Andreas Färber | return gdb_get_reg32(mem_buf, env->regs[n]);
|
38 | 58850dad | Andreas Färber | } |
39 | 58850dad | Andreas Färber | if (n < 24) { |
40 | 58850dad | Andreas Färber | /* FPA registers. */
|
41 | 58850dad | Andreas Färber | if (gdb_has_xml) {
|
42 | 58850dad | Andreas Färber | return 0; |
43 | 58850dad | Andreas Färber | } |
44 | 58850dad | Andreas Färber | memset(mem_buf, 0, 12); |
45 | 58850dad | Andreas Färber | return 12; |
46 | 58850dad | Andreas Färber | } |
47 | 58850dad | Andreas Färber | switch (n) {
|
48 | 58850dad | Andreas Färber | case 24: |
49 | 58850dad | Andreas Färber | /* FPA status register. */
|
50 | 58850dad | Andreas Färber | if (gdb_has_xml) {
|
51 | 58850dad | Andreas Färber | return 0; |
52 | 58850dad | Andreas Färber | } |
53 | 986a2998 | Andreas Färber | return gdb_get_reg32(mem_buf, 0); |
54 | 58850dad | Andreas Färber | case 25: |
55 | 58850dad | Andreas Färber | /* CPSR */
|
56 | 986a2998 | Andreas Färber | return gdb_get_reg32(mem_buf, cpsr_read(env));
|
57 | 58850dad | Andreas Färber | } |
58 | 58850dad | Andreas Färber | /* Unknown register. */
|
59 | 58850dad | Andreas Färber | return 0; |
60 | 58850dad | Andreas Färber | } |
61 | 58850dad | Andreas Färber | |
62 | 5b50e790 | Andreas Färber | int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) |
63 | 58850dad | Andreas Färber | { |
64 | 5b50e790 | Andreas Färber | ARMCPU *cpu = ARM_CPU(cs); |
65 | 5b50e790 | Andreas Färber | CPUARMState *env = &cpu->env; |
66 | 58850dad | Andreas Färber | uint32_t tmp; |
67 | 58850dad | Andreas Färber | |
68 | 58850dad | Andreas Färber | tmp = ldl_p(mem_buf); |
69 | 58850dad | Andreas Färber | |
70 | 58850dad | Andreas Färber | /* Mask out low bit of PC to workaround gdb bugs. This will probably
|
71 | 58850dad | Andreas Färber | cause problems if we ever implement the Jazelle DBX extensions. */
|
72 | 58850dad | Andreas Färber | if (n == 15) { |
73 | 58850dad | Andreas Färber | tmp &= ~1;
|
74 | 58850dad | Andreas Färber | } |
75 | 58850dad | Andreas Färber | |
76 | 58850dad | Andreas Färber | if (n < 16) { |
77 | 58850dad | Andreas Färber | /* Core integer register. */
|
78 | 58850dad | Andreas Färber | env->regs[n] = tmp; |
79 | 58850dad | Andreas Färber | return 4; |
80 | 58850dad | Andreas Färber | } |
81 | 58850dad | Andreas Färber | if (n < 24) { /* 16-23 */ |
82 | 58850dad | Andreas Färber | /* FPA registers (ignored). */
|
83 | 58850dad | Andreas Färber | if (gdb_has_xml) {
|
84 | 58850dad | Andreas Färber | return 0; |
85 | 58850dad | Andreas Färber | } |
86 | 58850dad | Andreas Färber | return 12; |
87 | 58850dad | Andreas Färber | } |
88 | 58850dad | Andreas Färber | switch (n) {
|
89 | 58850dad | Andreas Färber | case 24: |
90 | 58850dad | Andreas Färber | /* FPA status register (ignored). */
|
91 | 58850dad | Andreas Färber | if (gdb_has_xml) {
|
92 | 58850dad | Andreas Färber | return 0; |
93 | 58850dad | Andreas Färber | } |
94 | 58850dad | Andreas Färber | return 4; |
95 | 58850dad | Andreas Färber | case 25: |
96 | 58850dad | Andreas Färber | /* CPSR */
|
97 | 58850dad | Andreas Färber | cpsr_write(env, tmp, 0xffffffff);
|
98 | 58850dad | Andreas Färber | return 4; |
99 | 58850dad | Andreas Färber | } |
100 | 58850dad | Andreas Färber | /* Unknown register. */
|
101 | 58850dad | Andreas Färber | return 0; |
102 | 58850dad | Andreas Färber | } |