The most important thing here is to report another osabi, so that gdb does not assume the target is GNU/Linux.
The register list is not strictly required for the gdb frontend but lldb can use it. Also it makes things more consistent.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- programs/winedbg/gdbproxy.c | 185 +++++++++++++++++++++++++++++------- 1 file changed, 149 insertions(+), 36 deletions(-)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c index fdab2a9755f..ca605259ec6 100644 --- a/programs/winedbg/gdbproxy.c +++ b/programs/winedbg/gdbproxy.c @@ -192,39 +192,150 @@ static unsigned char checksum(const char* ptr, int len) return cksum; }
+static const char target_xml[] = + "<target>" + "<osabi>Cygwin</osabi>" #ifdef __i386__ -static const char target_xml[] = ""; + "<architecture>i386</architecture>" + "<feature name="org.gnu.gdb.i386.core">" + "<reg name="eax" bitsize="32" type="uint32"/>" + "<reg name="ecx" bitsize="32" type="uint32"/>" + "<reg name="edx" bitsize="32" type="uint32"/>" + "<reg name="ebx" bitsize="32" type="uint32"/>" + "<reg name="esp" bitsize="32" type="uint32"/>" + "<reg name="ebp" bitsize="32" type="uint32"/>" + "<reg name="esi" bitsize="32" type="uint32"/>" + "<reg name="edi" bitsize="32" type="uint32"/>" + "<reg name="eip" bitsize="32" type="uint32"/>" + "<reg name="eflags" bitsize="32" type="uint32"/>" + "<reg name="cs" bitsize="32" type="uint32"/>" + "<reg name="ss" bitsize="32" type="uint32"/>" + "<reg name="ds" bitsize="32" type="uint32"/>" + "<reg name="es" bitsize="32" type="uint32"/>" + "<reg name="fs" bitsize="32" type="uint32"/>" + "<reg name="gs" bitsize="32" type="uint32"/>" + "<reg name="st0" bitsize="80" type="i387_ext"/>" + "<reg name="st1" bitsize="80" type="i387_ext"/>" + "<reg name="st2" bitsize="80" type="i387_ext"/>" + "<reg name="st3" bitsize="80" type="i387_ext"/>" + "<reg name="st4" bitsize="80" type="i387_ext"/>" + "<reg name="st5" bitsize="80" type="i387_ext"/>" + "<reg name="st6" bitsize="80" type="i387_ext"/>" + "<reg name="st7" bitsize="80" type="i387_ext"/>" + "<reg name="fctrl" bitsize="16" type="uint16"/>" + "<reg name="fstat" bitsize="16" type="uint16"/>" + "<reg name="ftag" bitsize="16" type="uint16"/>" + "<reg name="fiseg" bitsize="16" type="uint16"/>" + "<reg name="fioff" bitsize="32" type="uint32"/>" + "<reg name="foseg" bitsize="16" type="uint16"/>" + "<reg name="fooff" bitsize="32" type="uint32"/>" + "<reg name="fop" bitsize="16" type="uint16"/>" + "</feature>" + + "<feature name="org.gnu.gdb.i386.sse">" + "<reg name="xmm0" bitsize="128" type="uint128"/>" + "<reg name="xmm1" bitsize="128" type="uint128"/>" + "<reg name="xmm2" bitsize="128" type="uint128"/>" + "<reg name="xmm3" bitsize="128" type="uint128"/>" + "<reg name="xmm4" bitsize="128" type="uint128"/>" + "<reg name="xmm5" bitsize="128" type="uint128"/>" + "<reg name="xmm6" bitsize="128" type="uint128"/>" + "<reg name="xmm7" bitsize="128" type="uint128"/>" + "<reg name="mxcsr" bitsize="32" type="uint32"/>" + "</feature>" #elif defined(__powerpc__) -static const char target_xml[] = ""; + "<architecture>powerpc:common</architecture>" #elif defined(__x86_64__) -static const char target_xml[] = ""; + "<architecture>i386:x86-64</architecture>" + "<feature name="org.gnu.gdb.i386.core">" + "<reg name="rax" bitsize="64" type="uint64"/>" + "<reg name="rbx" bitsize="64" type="uint64"/>" + "<reg name="rcx" bitsize="64" type="uint64"/>" + "<reg name="rdx" bitsize="64" type="uint64"/>" + "<reg name="rsi" bitsize="64" type="uint64"/>" + "<reg name="rdi" bitsize="64" type="uint64"/>" + "<reg name="rbp" bitsize="64" type="uint64"/>" + "<reg name="rsp" bitsize="64" type="uint64"/>" + "<reg name="r8" bitsize="64" type="uint64"/>" + "<reg name="r9" bitsize="64" type="uint64"/>" + "<reg name="r10" bitsize="64" type="uint64"/>" + "<reg name="r11" bitsize="64" type="uint64"/>" + "<reg name="r12" bitsize="64" type="uint64"/>" + "<reg name="r13" bitsize="64" type="uint64"/>" + "<reg name="r14" bitsize="64" type="uint64"/>" + "<reg name="r15" bitsize="64" type="uint64"/>" + "<reg name="rip" bitsize="64" type="uint64"/>" + "<reg name="eflags" bitsize="32" type="uint32"/>" + "<reg name="cs" bitsize="32" type="uint32"/>" + "<reg name="ss" bitsize="32" type="uint32"/>" + "<reg name="ds" bitsize="32" type="uint32"/>" + "<reg name="es" bitsize="32" type="uint32"/>" + "<reg name="fs" bitsize="32" type="uint32"/>" + "<reg name="gs" bitsize="32" type="uint32"/>" + "<reg name="st0" bitsize="80" type="i387_ext"/>" + "<reg name="st1" bitsize="80" type="i387_ext"/>" + "<reg name="st2" bitsize="80" type="i387_ext"/>" + "<reg name="st3" bitsize="80" type="i387_ext"/>" + "<reg name="st4" bitsize="80" type="i387_ext"/>" + "<reg name="st5" bitsize="80" type="i387_ext"/>" + "<reg name="st6" bitsize="80" type="i387_ext"/>" + "<reg name="st7" bitsize="80" type="i387_ext"/>" + "<reg name="fctrl" bitsize="32" type="uint32"/>" + "<reg name="fstat" bitsize="32" type="uint32"/>" + "<reg name="ftag" bitsize="32" type="uint32"/>" + "<reg name="fiseg" bitsize="32" type="uint32"/>" + "<reg name="fioff" bitsize="32" type="uint32"/>" + "<reg name="foseg" bitsize="32" type="uint32"/>" + "<reg name="fooff" bitsize="32" type="uint32"/>" + "<reg name="fop" bitsize="32" type="uint32"/>" + "</feature>" + + "<feature name="org.gnu.gdb.i386.sse">" + "<reg name="xmm0" bitsize="128" type="uint128"/>" + "<reg name="xmm1" bitsize="128" type="uint128"/>" + "<reg name="xmm2" bitsize="128" type="uint128"/>" + "<reg name="xmm3" bitsize="128" type="uint128"/>" + "<reg name="xmm4" bitsize="128" type="uint128"/>" + "<reg name="xmm5" bitsize="128" type="uint128"/>" + "<reg name="xmm6" bitsize="128" type="uint128"/>" + "<reg name="xmm7" bitsize="128" type="uint128"/>" + "<reg name="xmm8" bitsize="128" type="uint128"/>" + "<reg name="xmm9" bitsize="128" type="uint128"/>" + "<reg name="xmm10" bitsize="128" type="uint128"/>" + "<reg name="xmm11" bitsize="128" type="uint128"/>" + "<reg name="xmm12" bitsize="128" type="uint128"/>" + "<reg name="xmm13" bitsize="128" type="uint128"/>" + "<reg name="xmm14" bitsize="128" type="uint128"/>" + "<reg name="xmm15" bitsize="128" type="uint128"/>" + "<reg name="mxcsr" bitsize="32" type="uint32"/>" + "</feature>" #elif defined(__arm__) -static const char target_xml[] = - "l <target><architecture>arm</architecture>\n" - "<feature name="org.gnu.gdb.arm.core">\n" - " <reg name="r0" bitsize="32" type="uint32"/>\n" - " <reg name="r1" bitsize="32" type="uint32"/>\n" - " <reg name="r2" bitsize="32" type="uint32"/>\n" - " <reg name="r3" bitsize="32" type="uint32"/>\n" - " <reg name="r4" bitsize="32" type="uint32"/>\n" - " <reg name="r5" bitsize="32" type="uint32"/>\n" - " <reg name="r6" bitsize="32" type="uint32"/>\n" - " <reg name="r7" bitsize="32" type="uint32"/>\n" - " <reg name="r8" bitsize="32" type="uint32"/>\n" - " <reg name="r9" bitsize="32" type="uint32"/>\n" - " <reg name="r10" bitsize="32" type="uint32"/>\n" - " <reg name="r11" bitsize="32" type="uint32"/>\n" - " <reg name="r12" bitsize="32" type="uint32"/>\n" - " <reg name="sp" bitsize="32" type="data_ptr"/>\n" - " <reg name="lr" bitsize="32"/>\n" - " <reg name="pc" bitsize="32" type="code_ptr"/>\n" - " <reg name="cpsr" bitsize="32"/>\n" - "</feature></target>\n"; + "<architecture>arm</architecture>" + "<feature name="org.gnu.gdb.arm.core">" + "<reg name="r0" bitsize="32" type="uint32"/>" + "<reg name="r1" bitsize="32" type="uint32"/>" + "<reg name="r2" bitsize="32" type="uint32"/>" + "<reg name="r3" bitsize="32" type="uint32"/>" + "<reg name="r4" bitsize="32" type="uint32"/>" + "<reg name="r5" bitsize="32" type="uint32"/>" + "<reg name="r6" bitsize="32" type="uint32"/>" + "<reg name="r7" bitsize="32" type="uint32"/>" + "<reg name="r8" bitsize="32" type="uint32"/>" + "<reg name="r9" bitsize="32" type="uint32"/>" + "<reg name="r10" bitsize="32" type="uint32"/>" + "<reg name="r11" bitsize="32" type="uint32"/>" + "<reg name="r12" bitsize="32" type="uint32"/>" + "<reg name="sp" bitsize="32" type="data_ptr"/>" + "<reg name="lr" bitsize="32"/>" + "<reg name="pc" bitsize="32" type="code_ptr"/>" + "<reg name="cpsr" bitsize="32"/>" + "</feature>" #elif defined(__aarch64__) -static const char target_xml[] = ""; + "<architecture>aarch64</architecture>" #else # error Define the registers map for your CPU #endif + "</target>";
static inline void* cpu_register_ptr(struct gdb_context *gdbctx, dbg_ctx_t *ctx, unsigned idx) @@ -1564,6 +1675,8 @@ static enum packet_return packet_query_remote_command(struct gdb_context* gdbctx
static enum packet_return packet_query(struct gdb_context* gdbctx) { + int off, len; + switch (gdbctx->in_packet[0]) { case 'f': @@ -1649,15 +1762,10 @@ static enum packet_return packet_query(struct gdb_context* gdbctx) return packet_ok; if (strncmp(gdbctx->in_packet, "Supported", 9) == 0) { - if (*target_xml) - return packet_reply(gdbctx, "PacketSize=400;qXfer:features:read+"); - else - { - /* no features supported */ - packet_reply_open(gdbctx); - packet_reply_close(gdbctx); - return packet_done; - } + packet_reply_open(gdbctx); + packet_reply_add(gdbctx, "qXfer:features:read+;"); + packet_reply_close(gdbctx); + return packet_done; } break; case 'T': @@ -1686,8 +1794,13 @@ static enum packet_return packet_query(struct gdb_context* gdbctx) } break; case 'X': - if (*target_xml && strncmp(gdbctx->in_packet, "Xfer:features:read:target.xml", 29) == 0) - return packet_reply(gdbctx, target_xml); + if (snscanf(gdbctx->in_packet, gdbctx->in_packet_len, "Xfer:features:read:target.xml:%x,%x", &off, &len) == 2) + { + packet_reply_open_xfer(gdbctx); + packet_reply_add(gdbctx, target_xml); + packet_reply_close_xfer(gdbctx, off, len); + return packet_done; + } break; } ERR("Unhandled query %s\n", debugstr_an(gdbctx->in_packet, gdbctx->in_packet_len));