Statistics
| Branch: | Revision:

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
}