root / target-xtensa / gdbstub.c @ 5d12aa63
History | View | Annotate | Download (3 kB)
1 | 25d8ac0e | Andreas Färber | /*
|
---|---|---|---|
2 | 25d8ac0e | Andreas Färber | * Xtensa gdb server stub
|
3 | 25d8ac0e | Andreas Färber | *
|
4 | 25d8ac0e | Andreas Färber | * Copyright (c) 2003-2005 Fabrice Bellard
|
5 | 25d8ac0e | Andreas Färber | * Copyright (c) 2013 SUSE LINUX Products GmbH
|
6 | 25d8ac0e | Andreas Färber | *
|
7 | 25d8ac0e | Andreas Färber | * This library is free software; you can redistribute it and/or
|
8 | 25d8ac0e | Andreas Färber | * modify it under the terms of the GNU Lesser General Public
|
9 | 25d8ac0e | Andreas Färber | * License as published by the Free Software Foundation; either
|
10 | 25d8ac0e | Andreas Färber | * version 2 of the License, or (at your option) any later version.
|
11 | 25d8ac0e | Andreas Färber | *
|
12 | 25d8ac0e | Andreas Färber | * This library is distributed in the hope that it will be useful,
|
13 | 25d8ac0e | Andreas Färber | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 | 25d8ac0e | Andreas Färber | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 | 25d8ac0e | Andreas Färber | * Lesser General Public License for more details.
|
16 | 25d8ac0e | Andreas Färber | *
|
17 | 25d8ac0e | Andreas Färber | * You should have received a copy of the GNU Lesser General Public
|
18 | 25d8ac0e | Andreas Färber | * License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
19 | 25d8ac0e | 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 | 25d8ac0e | Andreas Färber | |
24 | 5b50e790 | Andreas Färber | int xtensa_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) |
25 | 25d8ac0e | Andreas Färber | { |
26 | 5b50e790 | Andreas Färber | XtensaCPU *cpu = XTENSA_CPU(cs); |
27 | 5b50e790 | Andreas Färber | CPUXtensaState *env = &cpu->env; |
28 | 25d8ac0e | Andreas Färber | const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
|
29 | 25d8ac0e | Andreas Färber | |
30 | 25d8ac0e | Andreas Färber | if (n < 0 || n >= env->config->gdb_regmap.num_regs) { |
31 | 25d8ac0e | Andreas Färber | return 0; |
32 | 25d8ac0e | Andreas Färber | } |
33 | 25d8ac0e | Andreas Färber | |
34 | 25d8ac0e | Andreas Färber | switch (reg->type) {
|
35 | 25d8ac0e | Andreas Färber | case 9: /*pc*/ |
36 | 986a2998 | Andreas Färber | return gdb_get_reg32(mem_buf, env->pc);
|
37 | 25d8ac0e | Andreas Färber | |
38 | 25d8ac0e | Andreas Färber | case 1: /*ar*/ |
39 | 25d8ac0e | Andreas Färber | xtensa_sync_phys_from_window(env); |
40 | 986a2998 | Andreas Färber | return gdb_get_reg32(mem_buf, env->phys_regs[(reg->targno & 0xff) |
41 | 986a2998 | Andreas Färber | % env->config->nareg]); |
42 | 25d8ac0e | Andreas Färber | |
43 | 25d8ac0e | Andreas Färber | case 2: /*SR*/ |
44 | 986a2998 | Andreas Färber | return gdb_get_reg32(mem_buf, env->sregs[reg->targno & 0xff]); |
45 | 25d8ac0e | Andreas Färber | |
46 | 25d8ac0e | Andreas Färber | case 3: /*UR*/ |
47 | 986a2998 | Andreas Färber | return gdb_get_reg32(mem_buf, env->uregs[reg->targno & 0xff]); |
48 | 25d8ac0e | Andreas Färber | |
49 | 25d8ac0e | Andreas Färber | case 4: /*f*/ |
50 | 986a2998 | Andreas Färber | return gdb_get_reg32(mem_buf, float32_val(env->fregs[reg->targno
|
51 | 986a2998 | Andreas Färber | & 0x0f]));
|
52 | 25d8ac0e | Andreas Färber | |
53 | 25d8ac0e | Andreas Färber | case 8: /*a*/ |
54 | 986a2998 | Andreas Färber | return gdb_get_reg32(mem_buf, env->regs[reg->targno & 0x0f]); |
55 | 25d8ac0e | Andreas Färber | |
56 | 25d8ac0e | Andreas Färber | default:
|
57 | 25d8ac0e | Andreas Färber | qemu_log("%s from reg %d of unsupported type %d\n",
|
58 | 25d8ac0e | Andreas Färber | __func__, n, reg->type); |
59 | 25d8ac0e | Andreas Färber | return 0; |
60 | 25d8ac0e | Andreas Färber | } |
61 | 25d8ac0e | Andreas Färber | } |
62 | 25d8ac0e | Andreas Färber | |
63 | 5b50e790 | Andreas Färber | int xtensa_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) |
64 | 25d8ac0e | Andreas Färber | { |
65 | 5b50e790 | Andreas Färber | XtensaCPU *cpu = XTENSA_CPU(cs); |
66 | 5b50e790 | Andreas Färber | CPUXtensaState *env = &cpu->env; |
67 | 25d8ac0e | Andreas Färber | uint32_t tmp; |
68 | 25d8ac0e | Andreas Färber | const XtensaGdbReg *reg = env->config->gdb_regmap.reg + n;
|
69 | 25d8ac0e | Andreas Färber | |
70 | 25d8ac0e | Andreas Färber | if (n < 0 || n >= env->config->gdb_regmap.num_regs) { |
71 | 25d8ac0e | Andreas Färber | return 0; |
72 | 25d8ac0e | Andreas Färber | } |
73 | 25d8ac0e | Andreas Färber | |
74 | 25d8ac0e | Andreas Färber | tmp = ldl_p(mem_buf); |
75 | 25d8ac0e | Andreas Färber | |
76 | 25d8ac0e | Andreas Färber | switch (reg->type) {
|
77 | 25d8ac0e | Andreas Färber | case 9: /*pc*/ |
78 | 25d8ac0e | Andreas Färber | env->pc = tmp; |
79 | 25d8ac0e | Andreas Färber | break;
|
80 | 25d8ac0e | Andreas Färber | |
81 | 25d8ac0e | Andreas Färber | case 1: /*ar*/ |
82 | 25d8ac0e | Andreas Färber | env->phys_regs[(reg->targno & 0xff) % env->config->nareg] = tmp;
|
83 | 25d8ac0e | Andreas Färber | xtensa_sync_window_from_phys(env); |
84 | 25d8ac0e | Andreas Färber | break;
|
85 | 25d8ac0e | Andreas Färber | |
86 | 25d8ac0e | Andreas Färber | case 2: /*SR*/ |
87 | 25d8ac0e | Andreas Färber | env->sregs[reg->targno & 0xff] = tmp;
|
88 | 25d8ac0e | Andreas Färber | break;
|
89 | 25d8ac0e | Andreas Färber | |
90 | 25d8ac0e | Andreas Färber | case 3: /*UR*/ |
91 | 25d8ac0e | Andreas Färber | env->uregs[reg->targno & 0xff] = tmp;
|
92 | 25d8ac0e | Andreas Färber | break;
|
93 | 25d8ac0e | Andreas Färber | |
94 | 25d8ac0e | Andreas Färber | case 4: /*f*/ |
95 | 25d8ac0e | Andreas Färber | env->fregs[reg->targno & 0x0f] = make_float32(tmp);
|
96 | 25d8ac0e | Andreas Färber | break;
|
97 | 25d8ac0e | Andreas Färber | |
98 | 25d8ac0e | Andreas Färber | case 8: /*a*/ |
99 | 25d8ac0e | Andreas Färber | env->regs[reg->targno & 0x0f] = tmp;
|
100 | 25d8ac0e | Andreas Färber | break;
|
101 | 25d8ac0e | Andreas Färber | |
102 | 25d8ac0e | Andreas Färber | default:
|
103 | 25d8ac0e | Andreas Färber | qemu_log("%s to reg %d of unsupported type %d\n",
|
104 | 25d8ac0e | Andreas Färber | __func__, n, reg->type); |
105 | 25d8ac0e | Andreas Färber | return 0; |
106 | 25d8ac0e | Andreas Färber | } |
107 | 25d8ac0e | Andreas Färber | |
108 | 25d8ac0e | Andreas Färber | return 4; |
109 | 25d8ac0e | Andreas Färber | } |