Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn> Signed-off-by: Song Gao <gaosong@loongson.cn> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220606124333.2060567-42-yangxiaojuan@loongson.cn> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>master
parent
9e6602d657
commit
ca61e75071
@ -1,3 +1,4 @@ |
||||
TARGET_ARCH=loongarch64
|
||||
TARGET_BASE_ARCH=loongarch
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/loongarch-base64.xml gdb-xml/loongarch-fpu64.xml
|
||||
|
@ -0,0 +1,44 @@ |
||||
<?xml version="1.0"?> |
||||
<!-- Copyright (C) 2021 Free Software Foundation, Inc. |
||||
|
||||
Copying and distribution of this file, with or without modification, |
||||
are permitted in any medium without royalty provided the copyright |
||||
notice and this notice are preserved. --> |
||||
|
||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd"> |
||||
<feature name="org.gnu.gdb.loongarch.base"> |
||||
<reg name="r0" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r1" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r2" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r3" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r4" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r5" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r6" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r7" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r8" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r9" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r10" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r11" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r12" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r13" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r14" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r15" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r16" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r17" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r18" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r19" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r20" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r21" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r22" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r23" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r24" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r25" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r26" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r27" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r28" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r29" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r30" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="r31" bitsize="64" type="uint64" group="general"/> |
||||
<reg name="pc" bitsize="64" type="code_ptr" group="general"/> |
||||
<reg name="badvaddr" bitsize="64" type="code_ptr" group="general"/> |
||||
</feature> |
@ -0,0 +1,57 @@ |
||||
<?xml version="1.0"?> |
||||
<!-- Copyright (C) 2021 Free Software Foundation, Inc. |
||||
|
||||
Copying and distribution of this file, with or without modification, |
||||
are permitted in any medium without royalty provided the copyright |
||||
notice and this notice are preserved. --> |
||||
|
||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd"> |
||||
<feature name="org.gnu.gdb.loongarch.fpu"> |
||||
|
||||
<union id="fpu64type"> |
||||
<field name="f" type="ieee_single"/> |
||||
<field name="d" type="ieee_double"/> |
||||
</union> |
||||
|
||||
<reg name="f0" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f1" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f2" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f3" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f4" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f5" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f6" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f7" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f8" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f9" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f10" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f11" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f12" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f13" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f14" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f15" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f16" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f17" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f18" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f19" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f20" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f21" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f22" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f23" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f24" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f25" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f26" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f27" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f28" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f29" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f30" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="f31" bitsize="64" type="fpu64type" group="float"/> |
||||
<reg name="fcc0" bitsize="8" type="uint8" group="float"/> |
||||
<reg name="fcc1" bitsize="8" type="uint8" group="float"/> |
||||
<reg name="fcc2" bitsize="8" type="uint8" group="float"/> |
||||
<reg name="fcc3" bitsize="8" type="uint8" group="float"/> |
||||
<reg name="fcc4" bitsize="8" type="uint8" group="float"/> |
||||
<reg name="fcc5" bitsize="8" type="uint8" group="float"/> |
||||
<reg name="fcc6" bitsize="8" type="uint8" group="float"/> |
||||
<reg name="fcc7" bitsize="8" type="uint8" group="float"/> |
||||
<reg name="fcsr" bitsize="32" type="uint32" group="float"/> |
||||
</feature> |
@ -0,0 +1,81 @@ |
||||
/*
|
||||
* LOONGARCH gdb server stub |
||||
* |
||||
* Copyright (c) 2021 Loongson Technology Corporation Limited |
||||
* |
||||
* SPDX-License-Identifier: LGPL-2.1+ |
||||
*/ |
||||
|
||||
#include "qemu/osdep.h" |
||||
#include "cpu.h" |
||||
#include "internals.h" |
||||
#include "exec/gdbstub.h" |
||||
|
||||
int loongarch_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) |
||||
{ |
||||
LoongArchCPU *cpu = LOONGARCH_CPU(cs); |
||||
CPULoongArchState *env = &cpu->env; |
||||
|
||||
if (0 <= n && n < 32) { |
||||
return gdb_get_regl(mem_buf, env->gpr[n]); |
||||
} else if (n == 32) { |
||||
return gdb_get_regl(mem_buf, env->pc); |
||||
} else if (n == 33) { |
||||
return gdb_get_regl(mem_buf, env->badaddr); |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
int loongarch_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) |
||||
{ |
||||
LoongArchCPU *cpu = LOONGARCH_CPU(cs); |
||||
CPULoongArchState *env = &cpu->env; |
||||
target_ulong tmp = ldtul_p(mem_buf); |
||||
int length = 0; |
||||
|
||||
if (0 <= n && n < 32) { |
||||
env->gpr[n] = tmp; |
||||
length = sizeof(target_ulong); |
||||
} else if (n == 32) { |
||||
env->pc = tmp; |
||||
length = sizeof(target_ulong); |
||||
} |
||||
return length; |
||||
} |
||||
|
||||
static int loongarch_gdb_get_fpu(CPULoongArchState *env, |
||||
GByteArray *mem_buf, int n) |
||||
{ |
||||
if (0 <= n && n < 32) { |
||||
return gdb_get_reg64(mem_buf, env->fpr[n]); |
||||
} else if (32 <= n && n < 40) { |
||||
return gdb_get_reg8(mem_buf, env->cf[n - 32]); |
||||
} else if (n == 40) { |
||||
return gdb_get_reg32(mem_buf, env->fcsr0); |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
static int loongarch_gdb_set_fpu(CPULoongArchState *env, |
||||
uint8_t *mem_buf, int n) |
||||
{ |
||||
int length = 0; |
||||
|
||||
if (0 <= n && n < 32) { |
||||
env->fpr[n] = ldq_p(mem_buf); |
||||
length = 8; |
||||
} else if (32 <= n && n < 40) { |
||||
env->cf[n - 32] = ldub_p(mem_buf); |
||||
length = 1; |
||||
} else if (n == 40) { |
||||
env->fcsr0 = ldl_p(mem_buf); |
||||
length = 4; |
||||
} |
||||
return length; |
||||
} |
||||
|
||||
void loongarch_cpu_register_gdb_regs_for_features(CPUState *cs) |
||||
{ |
||||
gdb_register_coprocessor(cs, loongarch_gdb_get_fpu, loongarch_gdb_set_fpu, |
||||
41, "loongarch-fpu64.xml", 0); |
||||
} |
Loading…
Reference in new issue