Skip to content

Commit ebda303

Browse files
jiegecgaosong-loongson
authored andcommitted
target/loongarch: Add GDB support for loongarch32 mode
GPRs and PC are 32-bit wide in loongarch32 mode. Signed-off-by: Jiajie Chen <[email protected]> Reviewed-by: Richard Henderson <[email protected]> Signed-off-by: Song Gao <[email protected]> Message-ID: <[email protected]> [PMD: Rebased, set gdb_num_core_regs] Signed-off-by: Philippe Mathieu-Daudé <[email protected]> Message-Id: <[email protected]>
1 parent 6cbba3e commit ebda303

File tree

4 files changed

+81
-8
lines changed

4 files changed

+81
-8
lines changed
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
TARGET_ARCH=loongarch64
22
TARGET_BASE_ARCH=loongarch
33
TARGET_SUPPORTS_MTTCG=y
4-
TARGET_XML_FILES= gdb-xml/loongarch-base64.xml gdb-xml/loongarch-fpu.xml
4+
TARGET_XML_FILES= gdb-xml/loongarch-base32.xml gdb-xml/loongarch-base64.xml gdb-xml/loongarch-fpu.xml
55
TARGET_NEED_FDT=y

gdb-xml/loongarch-base32.xml

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?xml version="1.0"?>
2+
<!-- Copyright (C) 2022 Free Software Foundation, Inc.
3+
4+
Copying and distribution of this file, with or without modification,
5+
are permitted in any medium without royalty provided the copyright
6+
notice and this notice are preserved. -->
7+
8+
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
9+
<feature name="org.gnu.gdb.loongarch.base">
10+
<reg name="r0" bitsize="32" type="uint32" group="general"/>
11+
<reg name="r1" bitsize="32" type="code_ptr" group="general"/>
12+
<reg name="r2" bitsize="32" type="data_ptr" group="general"/>
13+
<reg name="r3" bitsize="32" type="data_ptr" group="general"/>
14+
<reg name="r4" bitsize="32" type="uint32" group="general"/>
15+
<reg name="r5" bitsize="32" type="uint32" group="general"/>
16+
<reg name="r6" bitsize="32" type="uint32" group="general"/>
17+
<reg name="r7" bitsize="32" type="uint32" group="general"/>
18+
<reg name="r8" bitsize="32" type="uint32" group="general"/>
19+
<reg name="r9" bitsize="32" type="uint32" group="general"/>
20+
<reg name="r10" bitsize="32" type="uint32" group="general"/>
21+
<reg name="r11" bitsize="32" type="uint32" group="general"/>
22+
<reg name="r12" bitsize="32" type="uint32" group="general"/>
23+
<reg name="r13" bitsize="32" type="uint32" group="general"/>
24+
<reg name="r14" bitsize="32" type="uint32" group="general"/>
25+
<reg name="r15" bitsize="32" type="uint32" group="general"/>
26+
<reg name="r16" bitsize="32" type="uint32" group="general"/>
27+
<reg name="r17" bitsize="32" type="uint32" group="general"/>
28+
<reg name="r18" bitsize="32" type="uint32" group="general"/>
29+
<reg name="r19" bitsize="32" type="uint32" group="general"/>
30+
<reg name="r20" bitsize="32" type="uint32" group="general"/>
31+
<reg name="r21" bitsize="32" type="uint32" group="general"/>
32+
<reg name="r22" bitsize="32" type="data_ptr" group="general"/>
33+
<reg name="r23" bitsize="32" type="uint32" group="general"/>
34+
<reg name="r24" bitsize="32" type="uint32" group="general"/>
35+
<reg name="r25" bitsize="32" type="uint32" group="general"/>
36+
<reg name="r26" bitsize="32" type="uint32" group="general"/>
37+
<reg name="r27" bitsize="32" type="uint32" group="general"/>
38+
<reg name="r28" bitsize="32" type="uint32" group="general"/>
39+
<reg name="r29" bitsize="32" type="uint32" group="general"/>
40+
<reg name="r30" bitsize="32" type="uint32" group="general"/>
41+
<reg name="r31" bitsize="32" type="uint32" group="general"/>
42+
<reg name="orig_a0" bitsize="32" type="uint32" group="general"/>
43+
<reg name="pc" bitsize="32" type="code_ptr" group="general"/>
44+
<reg name="badv" bitsize="32" type="code_ptr" group="general"/>
45+
</feature>

target/loongarch/cpu.c

+10
Original file line numberDiff line numberDiff line change
@@ -726,8 +726,18 @@ static void loongarch_cpu_class_init(ObjectClass *c, void *data)
726726
#endif
727727
}
728728

729+
static gchar *loongarch32_gdb_arch_name(CPUState *cs)
730+
{
731+
return g_strdup("loongarch32");
732+
}
733+
729734
static void loongarch32_cpu_class_init(ObjectClass *c, void *data)
730735
{
736+
CPUClass *cc = CPU_CLASS(c);
737+
738+
cc->gdb_num_core_regs = 35;
739+
cc->gdb_core_xml_file = "loongarch-base32.xml";
740+
cc->gdb_arch_name = loongarch32_gdb_arch_name;
731741
}
732742

733743
static gchar *loongarch64_gdb_arch_name(CPUState *cs)

target/loongarch/gdbstub.c

+25-7
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,25 @@ int loongarch_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
3434
{
3535
LoongArchCPU *cpu = LOONGARCH_CPU(cs);
3636
CPULoongArchState *env = &cpu->env;
37+
uint64_t val;
3738

3839
if (0 <= n && n < 32) {
39-
return gdb_get_regl(mem_buf, env->gpr[n]);
40+
val = env->gpr[n];
4041
} else if (n == 32) {
4142
/* orig_a0 */
42-
return gdb_get_regl(mem_buf, 0);
43+
val = 0;
4344
} else if (n == 33) {
44-
return gdb_get_regl(mem_buf, env->pc);
45+
val = env->pc;
4546
} else if (n == 34) {
46-
return gdb_get_regl(mem_buf, env->CSR_BADV);
47+
val = env->CSR_BADV;
48+
}
49+
50+
if (0 <= n && n <= 34) {
51+
if (is_la64(env)) {
52+
return gdb_get_reg64(mem_buf, val);
53+
} else {
54+
return gdb_get_reg32(mem_buf, val);
55+
}
4756
}
4857
return 0;
4958
}
@@ -52,15 +61,24 @@ int loongarch_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
5261
{
5362
LoongArchCPU *cpu = LOONGARCH_CPU(cs);
5463
CPULoongArchState *env = &cpu->env;
55-
target_ulong tmp = ldtul_p(mem_buf);
64+
target_ulong tmp;
65+
int read_length;
5666
int length = 0;
5767

68+
if (is_la64(env)) {
69+
tmp = ldq_p(mem_buf);
70+
read_length = 8;
71+
} else {
72+
tmp = ldl_p(mem_buf);
73+
read_length = 4;
74+
}
75+
5876
if (0 <= n && n < 32) {
5977
env->gpr[n] = tmp;
60-
length = sizeof(target_ulong);
78+
length = read_length;
6179
} else if (n == 33) {
6280
env->pc = tmp;
63-
length = sizeof(target_ulong);
81+
length = read_length;
6482
}
6583
return length;
6684
}

0 commit comments

Comments
 (0)