qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v1] target/m68k: fix gdb for m68xxx


From: KONRAD Frederic
Subject: Re: [PATCH v1] target/m68k: fix gdb for m68xxx
Date: Mon, 20 Apr 2020 20:54:30 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0



Le 4/20/20 à 6:13 PM, Alex Bennée a écrit :

address@hidden writes:

From: KONRAD Frederic <address@hidden>

Currently "cf-core.xml" is sent to GDB when using any m68k flavor.  Thing is
it uses the "org.gnu.gdb.coldfire.core" feature name and gdb 8.3 then expects
a coldfire FPU instead of the default m68881 FPU.

This is not OK because the m68881 floats registers are 96 bits wide so it
crashes GDB with the following error message:

(gdb) target remote localhost:7960
Remote debugging using localhost:7960
warning: Register "fp0" has an unsupported size (96 bits)
warning: Register "fp1" has an unsupported size (96 bits)
...
Remote 'g' packet reply is too long (expected 148 bytes, got 180 bytes):    \
   00000000000[...]0000

With this patch: qemu-system-m68k -M none -cpu m68020 -s -S

(gdb) tar rem :1234
Remote debugging using :1234
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.
0x00000000 in ?? ()
(gdb) p $fp0
$1 = nan(0xffffffffffffffff)

Signed-off-by: KONRAD Frederic <address@hidden>

Well it solves the connection issue - but the FP values are still
hopelessly broken, from float_convs:

   from single: f32(-0x1.1874b200000000000000p+103:0xf30c3a59)

in gdb

   fp0            <invalid float value> (raw 0x8c3a5900000000004066)

Hi Alex, do you have a reproducer?

With this simple example:
=========================

.global _start
.text
_start:
        lea val, %a0
        fmoves (%a0),%fp0
        fmoves 4(%a0), %fp1
end:
        bra end

.align 0x4
val:
        .float 0.12345678
        .float 3.141592653589793

$ m68k-linux-gnu-gcc -g -Wl,-Ttext=0 main.S -mcpu=68020 -nostdlib -o main.elf
$ m68k-linux-gnu-objdump -d main.elf

main.elf:     file format elf32-m68k

Disassembly of section .text:

00000000 <_start>:
   0:   41fa 0012       lea %pc@(14 <val>),%a0
   4:   f210 4400       fmoves %a0@,%fp0
   8:   f228 4480 0004  fmoves %a0@(4),%fp1

0000000e <end>:
   e:   6000 fffe       braw e <end>
        ...

00000014 <val>:
  14:   3dfc            .short 0x3dfc
  16:   d6e9 4049       addaw %a1@(16457),%a3
  1a:   0fdb            bset %d7,%a3@+

I can run the executable in 5.0-rc3 + the patch:
================================================

$ xxx/qemu-for-upstream.git/m68k-softmmu/qemu-system-m68k --kernel main.elf \
    -cpu m68020 -s -S -nographic

And a GDB 8.3 I just built:
===========================

$ xxx/bin/m68k-elf-gdb main.elf
GNU gdb (GDB) 8.3
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=m68k-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main.elf...
(gdb) tar rem :1234
Remote debugging using :1234
_start () at main.S:5
5               lea val, %a0
(gdb) b end
Breakpoint 1 at 0xe: file main.S, line 9.
(gdb) c
Continuing.

Breakpoint 1, end () at main.S:9
9               bra end
(gdb) info registers all
d0             0x0                 0
d1             0x0                 0
d2             0x0                 0
d3             0x0                 0
d4             0x0                 0
d5             0x0                 0
d6             0x0                 0
d7             0x0                 0
a0             0x14                0x14 <val>
a1             0x0                 0x0 <_start>
a2             0x0                 0x0 <_start>
a3             0x0                 0x0 <_start>
a4             0x0                 0x0 <_start>
a5             0x0                 0x0 <_start>
fp             0x0                 0x0 <_start>
sp             0x0                 0x0 <_start>
ps             0x2700              9984
pc             0xe                 0xe <end>
fp0            0.123456783592700958252 (raw 0x3ffb0000fcd6e90000000000)
fp1            3.14159274101257324219 (raw 0x40000000c90fdb0000000000)
fp2            nan(0xffffffffffffffff) (raw 0x7fff0000ffffffffffffffff)
fp3            nan(0xffffffffffffffff) (raw 0x7fff0000ffffffffffffffff)
fp4            nan(0xffffffffffffffff) (raw 0x7fff0000ffffffffffffffff)
fp5            nan(0xffffffffffffffff) (raw 0x7fff0000ffffffffffffffff)
fp6            nan(0xffffffffffffffff) (raw 0x7fff0000ffffffffffffffff)
fp7            nan(0xffffffffffffffff) (raw 0x7fff0000ffffffffffffffff)
fpcontrol      0x0                 0
fpstatus       0x0                 0
fpiaddr        0x0                 0x0 <_start>

The value doesn't seems to much broken, the monitor gives me:

(qemu) info registers
D0 = 00000000   A0 = 00000014   F0 = 3ffb fcd6e90000000000  (    0.123457)
D1 = 00000000   A1 = 00000000   F1 = 4000 c90fdb0000000000  (     3.14159)
D2 = 00000000   A2 = 00000000   F2 = 7fff ffffffffffffffff  (         nan)
D3 = 00000000   A3 = 00000000   F3 = 7fff ffffffffffffffff  (         nan)
D4 = 00000000   A4 = 00000000   F4 = 7fff ffffffffffffffff  (         nan)
D5 = 00000000   A5 = 00000000   F5 = 7fff ffffffffffffffff  (         nan)
D6 = 00000000   A6 = 00000000   F6 = 7fff ffffffffffffffff  (         nan)
D7 = 00000000   A7 = 00000000   F7 = 7fff ffffffffffffffff  (         nan)

Did I miss anything?

Cheers,
Fred


---
  configure             |  2 +-
  gdb-xml/m68k-core.xml | 29 +++++++++++++++++++++++++++++
  target/m68k/cpu.c     | 30 +++++++++++++++++++++++++-----
  3 files changed, 55 insertions(+), 6 deletions(-)
  create mode 100644 gdb-xml/m68k-core.xml

diff --git a/configure b/configure
index 23b5e93..2b07b85 100755
--- a/configure
+++ b/configure
@@ -7825,7 +7825,7 @@ case "$target_name" in
    ;;
    m68k)
      bflt="yes"
-    gdb_xml_files="cf-core.xml cf-fp.xml m68k-fp.xml"
+    gdb_xml_files="cf-core.xml cf-fp.xml m68k-core.xml m68k-fp.xml"
      TARGET_SYSTBL_ABI=common
    ;;
    microblaze|microblazeel)
diff --git a/gdb-xml/m68k-core.xml b/gdb-xml/m68k-core.xml
new file mode 100644
index 0000000..5b092d2
--- /dev/null
+++ b/gdb-xml/m68k-core.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2008 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.m68k.core">
+  <reg name="d0" bitsize="32"/>
+  <reg name="d1" bitsize="32"/>
+  <reg name="d2" bitsize="32"/>
+  <reg name="d3" bitsize="32"/>
+  <reg name="d4" bitsize="32"/>
+  <reg name="d5" bitsize="32"/>
+  <reg name="d6" bitsize="32"/>
+  <reg name="d7" bitsize="32"/>
+  <reg name="a0" bitsize="32" type="data_ptr"/>
+  <reg name="a1" bitsize="32" type="data_ptr"/>
+  <reg name="a2" bitsize="32" type="data_ptr"/>
+  <reg name="a3" bitsize="32" type="data_ptr"/>
+  <reg name="a4" bitsize="32" type="data_ptr"/>
+  <reg name="a5" bitsize="32" type="data_ptr"/>
+  <reg name="fp" bitsize="32" type="data_ptr"/>
+  <reg name="sp" bitsize="32" type="data_ptr"/>
+
+  <reg name="ps" bitsize="32"/>
+  <reg name="pc" bitsize="32" type="code_ptr"/>
+
+</feature>
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
index 9445fcd..976e624 100644
--- a/target/m68k/cpu.c
+++ b/target/m68k/cpu.c
@@ -297,6 +297,21 @@ static void m68k_cpu_class_init(ObjectClass *c, void *data)
      dc->vmsd = &vmstate_m68k_cpu;
  }
+static void m68k_cpu_class_init_m68k_core(ObjectClass *c, void *data)
+{
+    CPUClass *cc = CPU_CLASS(c);
+
+    cc->gdb_core_xml_file = "m68k-core.xml";
+}
+
+#define DEFINE_M68K_CPU_TYPE_WITH_CLASS(cpu_model, initfn, classinit)      \
+    {                                                                      \
+        .name = M68K_CPU_TYPE_NAME(cpu_model),                             \
+        .instance_init = initfn,                                           \
+        .parent = TYPE_M68K_CPU,                                           \
+        .class_init = classinit,                                           \
+    }
+
  #define DEFINE_M68K_CPU_TYPE(cpu_model, initfn) \
      {                                           \
          .name = M68K_CPU_TYPE_NAME(cpu_model),  \
@@ -314,11 +329,16 @@ static const TypeInfo m68k_cpus_type_infos[] = {
          .class_size = sizeof(M68kCPUClass),
          .class_init = m68k_cpu_class_init,
      },
-    DEFINE_M68K_CPU_TYPE("m68000", m68000_cpu_initfn),
-    DEFINE_M68K_CPU_TYPE("m68020", m68020_cpu_initfn),
-    DEFINE_M68K_CPU_TYPE("m68030", m68030_cpu_initfn),
-    DEFINE_M68K_CPU_TYPE("m68040", m68040_cpu_initfn),
-    DEFINE_M68K_CPU_TYPE("m68060", m68060_cpu_initfn),
+    DEFINE_M68K_CPU_TYPE_WITH_CLASS("m68000", m68000_cpu_initfn,
+                                    m68k_cpu_class_init_m68k_core),
+    DEFINE_M68K_CPU_TYPE_WITH_CLASS("m68020", m68020_cpu_initfn,
+                                    m68k_cpu_class_init_m68k_core),
+    DEFINE_M68K_CPU_TYPE_WITH_CLASS("m68030", m68030_cpu_initfn,
+                                    m68k_cpu_class_init_m68k_core),
+    DEFINE_M68K_CPU_TYPE_WITH_CLASS("m68040", m68040_cpu_initfn,
+                                    m68k_cpu_class_init_m68k_core),
+    DEFINE_M68K_CPU_TYPE_WITH_CLASS("m68060", m68060_cpu_initfn,
+                                    m68k_cpu_class_init_m68k_core),
      DEFINE_M68K_CPU_TYPE("m5206", m5206_cpu_initfn),
      DEFINE_M68K_CPU_TYPE("m5208", m5208_cpu_initfn),
      DEFINE_M68K_CPU_TYPE("cfv4e", cfv4e_cpu_initfn),





reply via email to

[Prev in Thread] Current Thread [Next in Thread]