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(a)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)); -- 2.25.0