Statistics
| Branch: | Revision:

root / target-sh4 / gdbstub.c @ feature-archipelago

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
}