Statistics
| Branch: | Revision:

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

History | View | Annotate | Download (2.4 kB)

1
/*
2
 * Alpha gdb server stub
3
 *
4
 * Copyright (c) 2003-2005 Fabrice Bellard
5
 * Copyright (c) 2013 SUSE LINUX Products GmbH
6
 *
7
 * This library is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2 of the License, or (at your option) any later version.
11
 *
12
 * This library is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19
 */
20
#include "config.h"
21
#include "qemu-common.h"
22
#include "exec/gdbstub.h"
23

    
24
int alpha_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
25
{
26
    AlphaCPU *cpu = ALPHA_CPU(cs);
27
    CPUAlphaState *env = &cpu->env;
28
    uint64_t val;
29
    CPU_DoubleU d;
30

    
31
    switch (n) {
32
    case 0 ... 30:
33
        val = env->ir[n];
34
        break;
35
    case 32 ... 62:
36
        d.d = env->fir[n - 32];
37
        val = d.ll;
38
        break;
39
    case 63:
40
        val = cpu_alpha_load_fpcr(env);
41
        break;
42
    case 64:
43
        val = env->pc;
44
        break;
45
    case 66:
46
        val = env->unique;
47
        break;
48
    case 31:
49
    case 65:
50
        /* 31 really is the zero register; 65 is unassigned in the
51
           gdb protocol, but is still required to occupy 8 bytes. */
52
        val = 0;
53
        break;
54
    default:
55
        return 0;
56
    }
57
    return gdb_get_regl(mem_buf, val);
58
}
59

    
60
int alpha_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
61
{
62
    AlphaCPU *cpu = ALPHA_CPU(cs);
63
    CPUAlphaState *env = &cpu->env;
64
    target_ulong tmp = ldtul_p(mem_buf);
65
    CPU_DoubleU d;
66

    
67
    switch (n) {
68
    case 0 ... 30:
69
        env->ir[n] = tmp;
70
        break;
71
    case 32 ... 62:
72
        d.ll = tmp;
73
        env->fir[n - 32] = d.d;
74
        break;
75
    case 63:
76
        cpu_alpha_store_fpcr(env, tmp);
77
        break;
78
    case 64:
79
        env->pc = tmp;
80
        break;
81
    case 66:
82
        env->unique = tmp;
83
        break;
84
    case 31:
85
    case 65:
86
        /* 31 really is the zero register; 65 is unassigned in the
87
           gdb protocol, but is still required to occupy 8 bytes. */
88
        break;
89
    default:
90
        return 0;
91
    }
92
    return 8;
93
}