]>
git.proxmox.com Git - mirror_qemu.git/blob - target/loongarch/gdbstub.c
e20b20f99bad918d2d7d907dbf08b8586ba1493d
2 * LOONGARCH gdb server stub
4 * Copyright (c) 2021 Loongson Technology Corporation Limited
6 * SPDX-License-Identifier: LGPL-2.1+
9 #include "qemu/osdep.h"
11 #include "internals.h"
12 #include "exec/gdbstub.h"
13 #include "gdbstub/helpers.h"
15 uint64_t read_fcc(CPULoongArchState
*env
)
19 for (int i
= 0; i
< 8; ++i
) {
20 ret
|= (uint64_t)env
->cf
[i
] << (i
* 8);
26 void write_fcc(CPULoongArchState
*env
, uint64_t val
)
28 for (int i
= 0; i
< 8; ++i
) {
29 env
->cf
[i
] = (val
>> (i
* 8)) & 1;
33 int loongarch_cpu_gdb_read_register(CPUState
*cs
, GByteArray
*mem_buf
, int n
)
35 LoongArchCPU
*cpu
= LOONGARCH_CPU(cs
);
36 CPULoongArchState
*env
= &cpu
->env
;
39 if (0 <= n
&& n
< 32) {
50 if (0 <= n
&& n
<= 34) {
52 return gdb_get_reg64(mem_buf
, val
);
54 return gdb_get_reg32(mem_buf
, val
);
60 int loongarch_cpu_gdb_write_register(CPUState
*cs
, uint8_t *mem_buf
, int n
)
62 LoongArchCPU
*cpu
= LOONGARCH_CPU(cs
);
63 CPULoongArchState
*env
= &cpu
->env
;
76 if (0 <= n
&& n
< 32) {
86 static int loongarch_gdb_get_fpu(CPULoongArchState
*env
,
87 GByteArray
*mem_buf
, int n
)
89 if (0 <= n
&& n
< 32) {
90 return gdb_get_reg64(mem_buf
, env
->fpr
[n
].vreg
.D(0));
92 uint64_t val
= read_fcc(env
);
93 return gdb_get_reg64(mem_buf
, val
);
95 return gdb_get_reg32(mem_buf
, env
->fcsr0
);
100 static int loongarch_gdb_set_fpu(CPULoongArchState
*env
,
101 uint8_t *mem_buf
, int n
)
105 if (0 <= n
&& n
< 32) {
106 env
->fpr
[n
].vreg
.D(0) = ldq_p(mem_buf
);
108 } else if (n
== 32) {
109 uint64_t val
= ldq_p(mem_buf
);
112 } else if (n
== 33) {
113 env
->fcsr0
= ldl_p(mem_buf
);
119 void loongarch_cpu_register_gdb_regs_for_features(CPUState
*cs
)
121 gdb_register_coprocessor(cs
, loongarch_gdb_get_fpu
, loongarch_gdb_set_fpu
,
122 41, "loongarch-fpu.xml", 0);