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"
16 uint64_t read_fcc(CPULoongArchState
*env
)
20 for (int i
= 0; i
< 8; ++i
) {
21 ret
|= (uint64_t)env
->cf
[i
] << (i
* 8);
27 void write_fcc(CPULoongArchState
*env
, uint64_t val
)
29 for (int i
= 0; i
< 8; ++i
) {
30 env
->cf
[i
] = (val
>> (i
* 8)) & 1;
34 int loongarch_cpu_gdb_read_register(CPUState
*cs
, GByteArray
*mem_buf
, int n
)
36 LoongArchCPU
*cpu
= LOONGARCH_CPU(cs
);
37 CPULoongArchState
*env
= &cpu
->env
;
40 if (0 <= n
&& n
< 32) {
51 if (0 <= n
&& n
<= 34) {
53 return gdb_get_reg64(mem_buf
, val
);
55 return gdb_get_reg32(mem_buf
, val
);
61 int loongarch_cpu_gdb_write_register(CPUState
*cs
, uint8_t *mem_buf
, int n
)
63 LoongArchCPU
*cpu
= LOONGARCH_CPU(cs
);
64 CPULoongArchState
*env
= &cpu
->env
;
77 if (0 <= n
&& n
< 32) {
87 static int loongarch_gdb_get_fpu(CPULoongArchState
*env
,
88 GByteArray
*mem_buf
, int n
)
90 if (0 <= n
&& n
< 32) {
91 return gdb_get_reg64(mem_buf
, env
->fpr
[n
].vreg
.D(0));
92 } else if (32 <= n
&& n
< 40) {
93 return gdb_get_reg8(mem_buf
, env
->cf
[n
- 32]);
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 (32 <= n
&& n
< 40) {
109 env
->cf
[n
- 32] = ldub_p(mem_buf
);
111 } else if (n
== 40) {
112 env
->fcsr0
= ldl_p(mem_buf
);
118 void loongarch_cpu_register_gdb_regs_for_features(CPUState
*cs
)
120 gdb_register_coprocessor(cs
, loongarch_gdb_get_fpu
, loongarch_gdb_set_fpu
,
121 41, "loongarch-fpu.xml", 0);