Skip to content

Commit b647652

Browse files
taylorsimpsonandrom3daquic-mathbern
committed
Hexagon (gdbstub): add HVX support
Signed-off-by: Taylor Simpson <[email protected]> Co-authored-by: Brian Cain <[email protected]> Signed-off-by: Brian Cain <[email protected]> Co-authored-by: Matheus Tavares Bernardino <[email protected]> Signed-off-by: Matheus Tavares Bernardino <[email protected]> Reviewed-by: Brian Cain <[email protected]> Message-Id: <17cb32f34d469f705c3cc066a3583935352ee048.1683214375.git.quic_mathbern@quicinc.com>
1 parent b0bd9d8 commit b647652

File tree

5 files changed

+173
-1
lines changed

5 files changed

+173
-1
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
TARGET_ARCH=hexagon
2-
TARGET_XML_FILES=gdb-xml/hexagon-core.xml
2+
TARGET_XML_FILES=gdb-xml/hexagon-core.xml gdb-xml/hexagon-hvx.xml

gdb-xml/hexagon-hvx.xml

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
Copyright(c) 2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
4+
5+
This work is licensed under the terms of the GNU GPL, version 2 or
6+
(at your option) any later version. See the COPYING file in the
7+
top-level directory.
8+
9+
Note: this file is intended to be use with LLDB, so it contains fields
10+
that may be unknown to GDB. For more information on such fields, please
11+
see:
12+
https://github.com/llvm/llvm-project/blob/287aa6c4536408413b860e61fca0318a27214cf3/lldb/docs/lldb-gdb-remote.txt#L738-L860
13+
https://github.com/llvm/llvm-project/blob/287aa6c4536408413b860e61fca0318a27214cf3/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp#L4275-L4335
14+
-->
15+
16+
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
17+
<feature name="org.gnu.gdb.hexagon.hvx">
18+
19+
<vector id="vud" type="uint64" count="16"/>
20+
<vector id="vd" type="int64" count="16"/>
21+
<vector id="vuw" type="uint32" count="32"/>
22+
<vector id="vw" type="int32" count="32"/>
23+
<vector id="vuh" type="uint16" count="64"/>
24+
<vector id="vh" type="int16" count="64"/>
25+
<vector id="vub" type="uint8" count="128"/>
26+
<vector id="vb" type="int8" count="128"/>
27+
<union id="hex_vec">
28+
<field name="ud" type="vud"/>
29+
<field name="d" type="vd"/>
30+
<field name="uw" type="vuw"/>
31+
<field name="w" type="vw"/>
32+
<field name="uh" type="vuh"/>
33+
<field name="h" type="vh"/>
34+
<field name="ub" type="vub"/>
35+
<field name="b" type="vb"/>
36+
</union>
37+
38+
<flags id="ui2" size="1">
39+
<field name="0" start="0" end="0"/>
40+
<field name="1" start="1" end="1"/>
41+
</flags>
42+
<flags id="ui4" size="1">
43+
<field name="0" start="0" end="0"/>
44+
<field name="1" start="1" end="1"/>
45+
<field name="2" start="2" end="2"/>
46+
<field name="3" start="3" end="3"/>
47+
</flags>
48+
<vector id="vpd" type="uint8" count="16"/>
49+
<vector id="vpw" type="ui4" count="32"/>
50+
<vector id="vph" type="ui2" count="64"/>
51+
<vector id="vpb" type="bool" count="128"/>
52+
<union id="hex_vec_pred">
53+
<field name="d" type="vpd"/>
54+
<field name="w" type="vpw"/>
55+
<field name="h" type="vph"/>
56+
<field name="b" type="vpb"/>
57+
</union>
58+
59+
<reg name="v0" bitsize="1024" offset="256" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="88"/>
60+
<reg name="v1" bitsize="1024" offset="384" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="89"/>
61+
<reg name="v2" bitsize="1024" offset="512" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="90"/>
62+
<reg name="v3" bitsize="1024" offset="640" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="91"/>
63+
<reg name="v4" bitsize="1024" offset="768" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="92"/>
64+
<reg name="v5" bitsize="1024" offset="896" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="93"/>
65+
<reg name="v6" bitsize="1024" offset="1024" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="94"/>
66+
<reg name="v7" bitsize="1024" offset="1152" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="95"/>
67+
<reg name="v8" bitsize="1024" offset="1280" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="96"/>
68+
<reg name="v9" bitsize="1024" offset="1408" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="97"/>
69+
<reg name="v10" bitsize="1024" offset="1536" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="98"/>
70+
<reg name="v11" bitsize="1024" offset="1664" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="99"/>
71+
<reg name="v12" bitsize="1024" offset="1792" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="100"/>
72+
<reg name="v13" bitsize="1024" offset="1920" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="101"/>
73+
<reg name="v14" bitsize="1024" offset="2048" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="102"/>
74+
<reg name="v15" bitsize="1024" offset="2176" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="103"/>
75+
<reg name="v16" bitsize="1024" offset="2304" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="104"/>
76+
<reg name="v17" bitsize="1024" offset="2432" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="105"/>
77+
<reg name="v18" bitsize="1024" offset="2560" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="106"/>
78+
<reg name="v19" bitsize="1024" offset="2688" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="107"/>
79+
<reg name="v20" bitsize="1024" offset="2816" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="108"/>
80+
<reg name="v21" bitsize="1024" offset="2944" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="109"/>
81+
<reg name="v22" bitsize="1024" offset="3072" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="110"/>
82+
<reg name="v23" bitsize="1024" offset="3200" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="111"/>
83+
<reg name="v24" bitsize="1024" offset="3328" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="112"/>
84+
<reg name="v25" bitsize="1024" offset="3456" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="113"/>
85+
<reg name="v26" bitsize="1024" offset="3584" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="114"/>
86+
<reg name="v27" bitsize="1024" offset="3712" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="115"/>
87+
<reg name="v28" bitsize="1024" offset="3840" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="116"/>
88+
<reg name="v29" bitsize="1024" offset="3968" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="117"/>
89+
<reg name="v30" bitsize="1024" offset="4096" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="118"/>
90+
<reg name="v31" bitsize="1024" offset="4224" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="119"/>
91+
<reg name="q0" bitsize="128" offset="4352" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="120"/>
92+
<reg name="q1" bitsize="128" offset="4368" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="121"/>
93+
<reg name="q2" bitsize="128" offset="4384" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="122"/>
94+
<reg name="q3" bitsize="128" offset="4400" encoding="vector" format="hex" group="HVX Vector Registers" dwarf_regnum="123"/>
95+
96+
</feature>

target/hexagon/cpu.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "hw/qdev-properties.h"
2525
#include "fpu/softfloat-helpers.h"
2626
#include "tcg/tcg.h"
27+
#include "exec/gdbstub.h"
2728

2829
static void hexagon_v67_cpu_init(Object *obj) { }
2930
static void hexagon_v68_cpu_init(Object *obj) { }
@@ -339,6 +340,11 @@ static void hexagon_cpu_realize(DeviceState *dev, Error **errp)
339340
return;
340341
}
341342

343+
gdb_register_coprocessor(cs, hexagon_hvx_gdb_read_register,
344+
hexagon_hvx_gdb_write_register,
345+
NUM_VREGS + NUM_QREGS,
346+
"hexagon-hvx.xml", 0);
347+
342348
qemu_init_vcpu(cs);
343349
cpu_reset(cs);
344350

target/hexagon/gdbstub.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,71 @@ int hexagon_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
6060

6161
g_assert_not_reached();
6262
}
63+
64+
static int gdb_get_vreg(CPUHexagonState *env, GByteArray *mem_buf, int n)
65+
{
66+
int total = 0;
67+
int i;
68+
for (i = 0; i < ARRAY_SIZE(env->VRegs[n].uw); i++) {
69+
total += gdb_get_regl(mem_buf, env->VRegs[n].uw[i]);
70+
}
71+
return total;
72+
}
73+
74+
static int gdb_get_qreg(CPUHexagonState *env, GByteArray *mem_buf, int n)
75+
{
76+
int total = 0;
77+
int i;
78+
for (i = 0; i < ARRAY_SIZE(env->QRegs[n].uw); i++) {
79+
total += gdb_get_regl(mem_buf, env->QRegs[n].uw[i]);
80+
}
81+
return total;
82+
}
83+
84+
int hexagon_hvx_gdb_read_register(CPUHexagonState *env, GByteArray *mem_buf, int n)
85+
{
86+
if (n < NUM_VREGS) {
87+
return gdb_get_vreg(env, mem_buf, n);
88+
}
89+
n -= NUM_VREGS;
90+
91+
if (n < NUM_QREGS) {
92+
return gdb_get_qreg(env, mem_buf, n);
93+
}
94+
95+
g_assert_not_reached();
96+
}
97+
98+
static int gdb_put_vreg(CPUHexagonState *env, uint8_t *mem_buf, int n)
99+
{
100+
int i;
101+
for (i = 0; i < ARRAY_SIZE(env->VRegs[n].uw); i++) {
102+
env->VRegs[n].uw[i] = ldtul_p(mem_buf);
103+
mem_buf += 4;
104+
}
105+
return MAX_VEC_SIZE_BYTES;
106+
}
107+
108+
static int gdb_put_qreg(CPUHexagonState *env, uint8_t *mem_buf, int n)
109+
{
110+
int i;
111+
for (i = 0; i < ARRAY_SIZE(env->QRegs[n].uw); i++) {
112+
env->QRegs[n].uw[i] = ldtul_p(mem_buf);
113+
mem_buf += 4;
114+
}
115+
return MAX_VEC_SIZE_BYTES / 8;
116+
}
117+
118+
int hexagon_hvx_gdb_write_register(CPUHexagonState *env, uint8_t *mem_buf, int n)
119+
{
120+
if (n < NUM_VREGS) {
121+
return gdb_put_vreg(env, mem_buf, n);
122+
}
123+
n -= NUM_VREGS;
124+
125+
if (n < NUM_QREGS) {
126+
return gdb_put_qreg(env, mem_buf, n);
127+
}
128+
129+
g_assert_not_reached();
130+
}

target/hexagon/internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333

3434
int hexagon_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
3535
int hexagon_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
36+
int hexagon_hvx_gdb_read_register(CPUHexagonState *env, GByteArray *mem_buf, int n);
37+
int hexagon_hvx_gdb_write_register(CPUHexagonState *env, uint8_t *mem_buf, int n);
3638

3739
void hexagon_debug_vreg(CPUHexagonState *env, int regnum);
3840
void hexagon_debug_qreg(CPUHexagonState *env, int regnum);

0 commit comments

Comments
 (0)