1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include "qemu/osdep.h"
21#include "qemu-common.h"
22#include "cpu.h"
23#include "exec/gdbstub.h"
24
25int openrisc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
26{
27 OpenRISCCPU *cpu = OPENRISC_CPU(cs);
28 CPUOpenRISCState *env = &cpu->env;
29
30 if (n < 32) {
31 return gdb_get_reg32(mem_buf, cpu_get_gpr(env, n));
32 } else {
33 switch (n) {
34 case 32:
35 return gdb_get_reg32(mem_buf, env->ppc);
36
37 case 33:
38 return gdb_get_reg32(mem_buf, env->pc);
39
40 case 34:
41 return gdb_get_reg32(mem_buf, cpu_get_sr(env));
42
43 default:
44 break;
45 }
46 }
47 return 0;
48}
49
50int openrisc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
51{
52 OpenRISCCPU *cpu = OPENRISC_CPU(cs);
53 CPUClass *cc = CPU_GET_CLASS(cs);
54 CPUOpenRISCState *env = &cpu->env;
55 uint32_t tmp;
56
57 if (n > cc->gdb_num_core_regs) {
58 return 0;
59 }
60
61 tmp = ldl_p(mem_buf);
62
63 if (n < 32) {
64 cpu_set_gpr(env, n, tmp);
65 } else {
66 switch (n) {
67 case 32:
68 env->ppc = tmp;
69 break;
70
71 case 33:
72
73
74 if (env->pc != tmp) {
75 env->pc = tmp;
76 env->dflag = 0;
77 }
78 break;
79
80 case 34:
81 cpu_set_sr(env, tmp);
82 break;
83
84 default:
85 break;
86 }
87 }
88 return 4;
89}
90