qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

target/i386: Add GDB XML register description support

This patch implements XML target description support for X86 and X86-64
architectures in the GDB stub, as the way with ARM and PowerPC:
- gdb-xml/32bit-core.xml & gdb-xml/64bit-core.xml: Adding the XML target
description files, these files are picked from GDB source code.
- configure: Define gdb_xml_files for X86 targets.
- target/i386/cpu.c: Define gdb_core_xml_file and gdb_arch_name to add
XML awareness for this architecture, modify the gdb_num_core_regs to
fit the registers number defined in each XML file.

Signed-off-by: Abdallah Bouassida <abdallah.bouassida@lauterbach.com>
Message-Id: <2b3c8119-1602-28c7-eab4-296593877103@lauterbach.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by

Abdallah Bouassida and committed by
Paolo Bonzini
00fcd100 b19456dd

+157 -4
+2
configure
··· 6023 6023 6024 6024 case "$target_name" in 6025 6025 i386) 6026 + gdb_xml_files="i386-32bit-core.xml" 6026 6027 ;; 6027 6028 x86_64) 6028 6029 TARGET_BASE_ARCH=i386 6030 + gdb_xml_files="i386-64bit-core.xml" 6029 6031 ;; 6030 6032 alpha) 6031 6033 mttcg="yes"
+65
gdb-xml/i386-32bit-core.xml
··· 1 + <?xml version="1.0"?> 2 + <!-- Copyright (C) 2010-2015 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.i386.core"> 10 + <flags id="i386_eflags" size="4"> 11 + <field name="CF" start="0" end="0"/> 12 + <field name="" start="1" end="1"/> 13 + <field name="PF" start="2" end="2"/> 14 + <field name="AF" start="4" end="4"/> 15 + <field name="ZF" start="6" end="6"/> 16 + <field name="SF" start="7" end="7"/> 17 + <field name="TF" start="8" end="8"/> 18 + <field name="IF" start="9" end="9"/> 19 + <field name="DF" start="10" end="10"/> 20 + <field name="OF" start="11" end="11"/> 21 + <field name="NT" start="14" end="14"/> 22 + <field name="RF" start="16" end="16"/> 23 + <field name="VM" start="17" end="17"/> 24 + <field name="AC" start="18" end="18"/> 25 + <field name="VIF" start="19" end="19"/> 26 + <field name="VIP" start="20" end="20"/> 27 + <field name="ID" start="21" end="21"/> 28 + </flags> 29 + 30 + <reg name="eax" bitsize="32" type="int32"/> 31 + <reg name="ecx" bitsize="32" type="int32"/> 32 + <reg name="edx" bitsize="32" type="int32"/> 33 + <reg name="ebx" bitsize="32" type="int32"/> 34 + <reg name="esp" bitsize="32" type="data_ptr"/> 35 + <reg name="ebp" bitsize="32" type="data_ptr"/> 36 + <reg name="esi" bitsize="32" type="int32"/> 37 + <reg name="edi" bitsize="32" type="int32"/> 38 + 39 + <reg name="eip" bitsize="32" type="code_ptr"/> 40 + <reg name="eflags" bitsize="32" type="i386_eflags"/> 41 + <reg name="cs" bitsize="32" type="int32"/> 42 + <reg name="ss" bitsize="32" type="int32"/> 43 + <reg name="ds" bitsize="32" type="int32"/> 44 + <reg name="es" bitsize="32" type="int32"/> 45 + <reg name="fs" bitsize="32" type="int32"/> 46 + <reg name="gs" bitsize="32" type="int32"/> 47 + 48 + <reg name="st0" bitsize="80" type="i387_ext"/> 49 + <reg name="st1" bitsize="80" type="i387_ext"/> 50 + <reg name="st2" bitsize="80" type="i387_ext"/> 51 + <reg name="st3" bitsize="80" type="i387_ext"/> 52 + <reg name="st4" bitsize="80" type="i387_ext"/> 53 + <reg name="st5" bitsize="80" type="i387_ext"/> 54 + <reg name="st6" bitsize="80" type="i387_ext"/> 55 + <reg name="st7" bitsize="80" type="i387_ext"/> 56 + 57 + <reg name="fctrl" bitsize="32" type="int" group="float"/> 58 + <reg name="fstat" bitsize="32" type="int" group="float"/> 59 + <reg name="ftag" bitsize="32" type="int" group="float"/> 60 + <reg name="fiseg" bitsize="32" type="int" group="float"/> 61 + <reg name="fioff" bitsize="32" type="int" group="float"/> 62 + <reg name="foseg" bitsize="32" type="int" group="float"/> 63 + <reg name="fooff" bitsize="32" type="int" group="float"/> 64 + <reg name="fop" bitsize="32" type="int" group="float"/> 65 + </feature>
+73
gdb-xml/i386-64bit-core.xml
··· 1 + <?xml version="1.0"?> 2 + <!-- Copyright (C) 2010-2015 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.i386.core"> 10 + <flags id="i386_eflags" size="4"> 11 + <field name="CF" start="0" end="0"/> 12 + <field name="" start="1" end="1"/> 13 + <field name="PF" start="2" end="2"/> 14 + <field name="AF" start="4" end="4"/> 15 + <field name="ZF" start="6" end="6"/> 16 + <field name="SF" start="7" end="7"/> 17 + <field name="TF" start="8" end="8"/> 18 + <field name="IF" start="9" end="9"/> 19 + <field name="DF" start="10" end="10"/> 20 + <field name="OF" start="11" end="11"/> 21 + <field name="NT" start="14" end="14"/> 22 + <field name="RF" start="16" end="16"/> 23 + <field name="VM" start="17" end="17"/> 24 + <field name="AC" start="18" end="18"/> 25 + <field name="VIF" start="19" end="19"/> 26 + <field name="VIP" start="20" end="20"/> 27 + <field name="ID" start="21" end="21"/> 28 + </flags> 29 + 30 + <reg name="rax" bitsize="64" type="int64"/> 31 + <reg name="rbx" bitsize="64" type="int64"/> 32 + <reg name="rcx" bitsize="64" type="int64"/> 33 + <reg name="rdx" bitsize="64" type="int64"/> 34 + <reg name="rsi" bitsize="64" type="int64"/> 35 + <reg name="rdi" bitsize="64" type="int64"/> 36 + <reg name="rbp" bitsize="64" type="data_ptr"/> 37 + <reg name="rsp" bitsize="64" type="data_ptr"/> 38 + <reg name="r8" bitsize="64" type="int64"/> 39 + <reg name="r9" bitsize="64" type="int64"/> 40 + <reg name="r10" bitsize="64" type="int64"/> 41 + <reg name="r11" bitsize="64" type="int64"/> 42 + <reg name="r12" bitsize="64" type="int64"/> 43 + <reg name="r13" bitsize="64" type="int64"/> 44 + <reg name="r14" bitsize="64" type="int64"/> 45 + <reg name="r15" bitsize="64" type="int64"/> 46 + 47 + <reg name="rip" bitsize="64" type="code_ptr"/> 48 + <reg name="eflags" bitsize="32" type="i386_eflags"/> 49 + <reg name="cs" bitsize="32" type="int32"/> 50 + <reg name="ss" bitsize="32" type="int32"/> 51 + <reg name="ds" bitsize="32" type="int32"/> 52 + <reg name="es" bitsize="32" type="int32"/> 53 + <reg name="fs" bitsize="32" type="int32"/> 54 + <reg name="gs" bitsize="32" type="int32"/> 55 + 56 + <reg name="st0" bitsize="80" type="i387_ext"/> 57 + <reg name="st1" bitsize="80" type="i387_ext"/> 58 + <reg name="st2" bitsize="80" type="i387_ext"/> 59 + <reg name="st3" bitsize="80" type="i387_ext"/> 60 + <reg name="st4" bitsize="80" type="i387_ext"/> 61 + <reg name="st5" bitsize="80" type="i387_ext"/> 62 + <reg name="st6" bitsize="80" type="i387_ext"/> 63 + <reg name="st7" bitsize="80" type="i387_ext"/> 64 + 65 + <reg name="fctrl" bitsize="32" type="int" group="float"/> 66 + <reg name="fstat" bitsize="32" type="int" group="float"/> 67 + <reg name="ftag" bitsize="32" type="int" group="float"/> 68 + <reg name="fiseg" bitsize="32" type="int" group="float"/> 69 + <reg name="fioff" bitsize="32" type="int" group="float"/> 70 + <reg name="foseg" bitsize="32" type="int" group="float"/> 71 + <reg name="fooff" bitsize="32" type="int" group="float"/> 72 + <reg name="fop" bitsize="32" type="int" group="float"/> 73 + </feature>
+17 -4
target/i386/cpu.c
··· 2577 2577 return ret; 2578 2578 } 2579 2579 2580 + static gchar *x86_gdb_arch_name(CPUState *cs) 2581 + { 2582 + #ifdef TARGET_X86_64 2583 + return g_strdup("i386:x86-64"); 2584 + #else 2585 + return g_strdup("i386"); 2586 + #endif 2587 + } 2588 + 2580 2589 X86CPU *cpu_x86_init(const char *cpu_model) 2581 2590 { 2582 2591 return X86_CPU(cpu_generic_init(TYPE_X86_CPU, cpu_model)); ··· 4056 4065 cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote; 4057 4066 cc->vmsd = &vmstate_x86_cpu; 4058 4067 #endif 4059 - /* CPU_NB_REGS * 2 = general regs + xmm regs 4060 - * 25 = eip, eflags, 6 seg regs, st[0-7], fctrl,...,fop, mxcsr. 4061 - */ 4062 - cc->gdb_num_core_regs = CPU_NB_REGS * 2 + 25; 4068 + cc->gdb_arch_name = x86_gdb_arch_name; 4069 + #ifdef TARGET_X86_64 4070 + cc->gdb_core_xml_file = "i386-64bit-core.xml"; 4071 + cc->gdb_num_core_regs = 40; 4072 + #else 4073 + cc->gdb_core_xml_file = "i386-32bit-core.xml"; 4074 + cc->gdb_num_core_regs = 32; 4075 + #endif 4063 4076 #ifndef CONFIG_USER_ONLY 4064 4077 cc->debug_excp_handler = breakpoint_handler; 4065 4078 #endif