Statistics
| Branch: | Revision:

root / target-ppc / gdbstub.c @ 5b50e790

History | View | Annotate | Download (3.8 kB)

1 0980bfab Andreas Färber
/*
2 0980bfab Andreas Färber
 * PowerPC gdb server stub
3 0980bfab Andreas Färber
 *
4 0980bfab Andreas Färber
 * Copyright (c) 2003-2005 Fabrice Bellard
5 0980bfab Andreas Färber
 * Copyright (c) 2013 SUSE LINUX Products GmbH
6 0980bfab Andreas Färber
 *
7 0980bfab Andreas Färber
 * This library is free software; you can redistribute it and/or
8 0980bfab Andreas Färber
 * modify it under the terms of the GNU Lesser General Public
9 0980bfab Andreas Färber
 * License as published by the Free Software Foundation; either
10 0980bfab Andreas Färber
 * version 2 of the License, or (at your option) any later version.
11 0980bfab Andreas Färber
 *
12 0980bfab Andreas Färber
 * This library is distributed in the hope that it will be useful,
13 0980bfab Andreas Färber
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 0980bfab Andreas Färber
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 0980bfab Andreas Färber
 * Lesser General Public License for more details.
16 0980bfab Andreas Färber
 *
17 0980bfab Andreas Färber
 * You should have received a copy of the GNU Lesser General Public
18 0980bfab Andreas Färber
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 0980bfab 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 0980bfab Andreas Färber
24 0980bfab Andreas Färber
/* Old gdb always expects FP registers.  Newer (xml-aware) gdb only
25 0980bfab Andreas Färber
 * expects whatever the target description contains.  Due to a
26 0980bfab Andreas Färber
 * historical mishap the FP registers appear in between core integer
27 0980bfab Andreas Färber
 * regs and PC, MSR, CR, and so forth.  We hack round this by giving the
28 0980bfab Andreas Färber
 * FP regs zero size when talking to a newer gdb.
29 0980bfab Andreas Färber
 */
30 0980bfab Andreas Färber
31 5b50e790 Andreas Färber
int ppc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
32 0980bfab Andreas Färber
{
33 5b50e790 Andreas Färber
    PowerPCCPU *cpu = POWERPC_CPU(cs);
34 5b50e790 Andreas Färber
    CPUPPCState *env = &cpu->env;
35 5b50e790 Andreas Färber
36 0980bfab Andreas Färber
    if (n < 32) {
37 0980bfab Andreas Färber
        /* gprs */
38 986a2998 Andreas Färber
        return gdb_get_regl(mem_buf, env->gpr[n]);
39 0980bfab Andreas Färber
    } else if (n < 64) {
40 0980bfab Andreas Färber
        /* fprs */
41 0980bfab Andreas Färber
        if (gdb_has_xml) {
42 0980bfab Andreas Färber
            return 0;
43 0980bfab Andreas Färber
        }
44 0980bfab Andreas Färber
        stfq_p(mem_buf, env->fpr[n-32]);
45 0980bfab Andreas Färber
        return 8;
46 0980bfab Andreas Färber
    } else {
47 0980bfab Andreas Färber
        switch (n) {
48 0980bfab Andreas Färber
        case 64:
49 986a2998 Andreas Färber
            return gdb_get_regl(mem_buf, env->nip);
50 0980bfab Andreas Färber
        case 65:
51 986a2998 Andreas Färber
            return gdb_get_regl(mem_buf, env->msr);
52 0980bfab Andreas Färber
        case 66:
53 0980bfab Andreas Färber
            {
54 0980bfab Andreas Färber
                uint32_t cr = 0;
55 0980bfab Andreas Färber
                int i;
56 0980bfab Andreas Färber
                for (i = 0; i < 8; i++) {
57 0980bfab Andreas Färber
                    cr |= env->crf[i] << (32 - ((i + 1) * 4));
58 0980bfab Andreas Färber
                }
59 986a2998 Andreas Färber
                return gdb_get_reg32(mem_buf, cr);
60 0980bfab Andreas Färber
            }
61 0980bfab Andreas Färber
        case 67:
62 986a2998 Andreas Färber
            return gdb_get_regl(mem_buf, env->lr);
63 0980bfab Andreas Färber
        case 68:
64 986a2998 Andreas Färber
            return gdb_get_regl(mem_buf, env->ctr);
65 0980bfab Andreas Färber
        case 69:
66 986a2998 Andreas Färber
            return gdb_get_regl(mem_buf, env->xer);
67 0980bfab Andreas Färber
        case 70:
68 0980bfab Andreas Färber
            {
69 0980bfab Andreas Färber
                if (gdb_has_xml) {
70 0980bfab Andreas Färber
                    return 0;
71 0980bfab Andreas Färber
                }
72 986a2998 Andreas Färber
                return gdb_get_reg32(mem_buf, env->fpscr);
73 0980bfab Andreas Färber
            }
74 0980bfab Andreas Färber
        }
75 0980bfab Andreas Färber
    }
76 0980bfab Andreas Färber
    return 0;
77 0980bfab Andreas Färber
}
78 0980bfab Andreas Färber
79 5b50e790 Andreas Färber
int ppc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
80 0980bfab Andreas Färber
{
81 5b50e790 Andreas Färber
    PowerPCCPU *cpu = POWERPC_CPU(cs);
82 5b50e790 Andreas Färber
    CPUPPCState *env = &cpu->env;
83 5b50e790 Andreas Färber
84 0980bfab Andreas Färber
    if (n < 32) {
85 0980bfab Andreas Färber
        /* gprs */
86 0980bfab Andreas Färber
        env->gpr[n] = ldtul_p(mem_buf);
87 0980bfab Andreas Färber
        return sizeof(target_ulong);
88 0980bfab Andreas Färber
    } else if (n < 64) {
89 0980bfab Andreas Färber
        /* fprs */
90 0980bfab Andreas Färber
        if (gdb_has_xml) {
91 0980bfab Andreas Färber
            return 0;
92 0980bfab Andreas Färber
        }
93 0980bfab Andreas Färber
        env->fpr[n-32] = ldfq_p(mem_buf);
94 0980bfab Andreas Färber
        return 8;
95 0980bfab Andreas Färber
    } else {
96 0980bfab Andreas Färber
        switch (n) {
97 0980bfab Andreas Färber
        case 64:
98 0980bfab Andreas Färber
            env->nip = ldtul_p(mem_buf);
99 0980bfab Andreas Färber
            return sizeof(target_ulong);
100 0980bfab Andreas Färber
        case 65:
101 0980bfab Andreas Färber
            ppc_store_msr(env, ldtul_p(mem_buf));
102 0980bfab Andreas Färber
            return sizeof(target_ulong);
103 0980bfab Andreas Färber
        case 66:
104 0980bfab Andreas Färber
            {
105 0980bfab Andreas Färber
                uint32_t cr = ldl_p(mem_buf);
106 0980bfab Andreas Färber
                int i;
107 0980bfab Andreas Färber
                for (i = 0; i < 8; i++) {
108 0980bfab Andreas Färber
                    env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
109 0980bfab Andreas Färber
                }
110 0980bfab Andreas Färber
                return 4;
111 0980bfab Andreas Färber
            }
112 0980bfab Andreas Färber
        case 67:
113 0980bfab Andreas Färber
            env->lr = ldtul_p(mem_buf);
114 0980bfab Andreas Färber
            return sizeof(target_ulong);
115 0980bfab Andreas Färber
        case 68:
116 0980bfab Andreas Färber
            env->ctr = ldtul_p(mem_buf);
117 0980bfab Andreas Färber
            return sizeof(target_ulong);
118 0980bfab Andreas Färber
        case 69:
119 0980bfab Andreas Färber
            env->xer = ldtul_p(mem_buf);
120 0980bfab Andreas Färber
            return sizeof(target_ulong);
121 0980bfab Andreas Färber
        case 70:
122 0980bfab Andreas Färber
            /* fpscr */
123 0980bfab Andreas Färber
            if (gdb_has_xml) {
124 0980bfab Andreas Färber
                return 0;
125 0980bfab Andreas Färber
            }
126 0980bfab Andreas Färber
            store_fpscr(env, ldtul_p(mem_buf), 0xffffffff);
127 0980bfab Andreas Färber
            return sizeof(target_ulong);
128 0980bfab Andreas Färber
        }
129 0980bfab Andreas Färber
    }
130 0980bfab Andreas Färber
    return 0;
131 0980bfab Andreas Färber
}