From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JuNsz-0005eD-O8 for qemu-devel@nongnu.org; Fri, 09 May 2008 04:23:25 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JuNsx-0005dh-KY for qemu-devel@nongnu.org; Fri, 09 May 2008 04:23:24 -0400 Received: from [199.232.76.173] (port=34434 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JuNsx-0005de-Eg for qemu-devel@nongnu.org; Fri, 09 May 2008 04:23:23 -0400 Received: from savannah.gnu.org ([199.232.41.3]:39570 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1JuNsx-0005n3-1P for qemu-devel@nongnu.org; Fri, 09 May 2008 04:23:23 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1JuNsv-00036N-HI for qemu-devel@nongnu.org; Fri, 09 May 2008 08:23:21 +0000 Received: from edgar_igl by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1JuNsu-00036D-RR for qemu-devel@nongnu.org; Fri, 09 May 2008 08:23:21 +0000 MIME-Version: 1.0 Errors-To: edgar_igl Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: "Edgar E. Iglesias" Message-Id: Date: Fri, 09 May 2008 08:23:20 +0000 Subject: [Qemu-devel] [4390] Add x86_64 gdb stub for qemu (Jason Wessel). Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 4390 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4390 Author: edgar_igl Date: 2008-05-09 08:23:19 +0000 (Fri, 09 May 2008) Log Message: ----------- Add x86_64 gdb stub for qemu (Jason Wessel). Modified Paths: -------------- trunk/gdbstub.c Modified: trunk/gdbstub.c =================================================================== --- trunk/gdbstub.c 2008-05-09 08:14:05 UTC (rev 4389) +++ trunk/gdbstub.c 2008-05-09 08:23:19 UTC (rev 4390) @@ -233,9 +233,141 @@ } return 0; } +#if defined(TARGET_X86_64) -#if defined(TARGET_I386) +static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) +{ + uint8_t *p = mem_buf; + int i, fpus; +#define PUTREG(x) do { \ + target_ulong reg = tswapl(x); \ + memcpy(p, ®, sizeof reg); \ + p += sizeof reg; \ + } while (0) +#define PUTREG32(x) do { \ + uint32_t reg = tswap32(x); \ + memcpy(p, ®, sizeof reg); \ + p += sizeof reg; \ + } while (0) +#define PUTREGF(x) do { \ + memcpy(p, &(x), 10); \ + p += sizeof (x); \ + } while (0) + + PUTREG(env->regs[R_EAX]); + PUTREG(env->regs[R_EBX]); + PUTREG(env->regs[R_ECX]); + PUTREG(env->regs[R_EDX]); + PUTREG(env->regs[R_ESI]); + PUTREG(env->regs[R_EDI]); + PUTREG(env->regs[R_EBP]); + PUTREG(env->regs[R_ESP]); + PUTREG(env->regs[8]); + PUTREG(env->regs[9]); + PUTREG(env->regs[10]); + PUTREG(env->regs[11]); + PUTREG(env->regs[12]); + PUTREG(env->regs[13]); + PUTREG(env->regs[14]); + PUTREG(env->regs[15]); + + PUTREG(env->eip); + PUTREG32(env->eflags); + PUTREG32(env->segs[R_CS].selector); + PUTREG32(env->segs[R_SS].selector); + PUTREG32(env->segs[R_DS].selector); + PUTREG32(env->segs[R_ES].selector); + PUTREG32(env->segs[R_FS].selector); + PUTREG32(env->segs[R_GS].selector); + /* XXX: convert floats */ + for(i = 0; i < 8; i++) { + PUTREGF(env->fpregs[i]); + } + PUTREG32(env->fpuc); + fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; + PUTREG32(fpus); + PUTREG32(0); /* XXX: convert tags */ + PUTREG32(0); /* fiseg */ + PUTREG32(0); /* fioff */ + PUTREG32(0); /* foseg */ + PUTREG32(0); /* fooff */ + PUTREG32(0); /* fop */ + +#undef PUTREG +#undef PUTREG32 +#undef PUTREGF + + return p - mem_buf; +} + +static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) +{ + uint8_t *p = mem_buf; + uint32_t junk; + int i, fpus; + +#define GETREG(x) do { \ + target_ulong reg; \ + memcpy(®, p, sizeof reg); \ + x = tswapl(reg); \ + p += sizeof reg; \ + } while (0) +#define GETREG32(x) do { \ + uint32_t reg; \ + memcpy(®, p, sizeof reg); \ + x = tswap32(reg); \ + p += sizeof reg; \ + } while (0) +#define GETREGF(x) do { \ + memcpy(&(x), p, 10); \ + p += 10; \ + } while (0) + + GETREG(env->regs[R_EAX]); + GETREG(env->regs[R_EBX]); + GETREG(env->regs[R_ECX]); + GETREG(env->regs[R_EDX]); + GETREG(env->regs[R_ESI]); + GETREG(env->regs[R_EDI]); + GETREG(env->regs[R_EBP]); + GETREG(env->regs[R_ESP]); + GETREG(env->regs[8]); + GETREG(env->regs[9]); + GETREG(env->regs[10]); + GETREG(env->regs[11]); + GETREG(env->regs[12]); + GETREG(env->regs[13]); + GETREG(env->regs[14]); + GETREG(env->regs[15]); + + GETREG(env->eip); + GETREG32(env->eflags); + GETREG32(env->segs[R_CS].selector); + GETREG32(env->segs[R_SS].selector); + GETREG32(env->segs[R_DS].selector); + GETREG32(env->segs[R_ES].selector); + GETREG32(env->segs[R_FS].selector); + GETREG32(env->segs[R_GS].selector); + /* XXX: convert floats */ + for(i = 0; i < 8; i++) { + GETREGF(env->fpregs[i]); + } + GETREG32(env->fpuc); + GETREG32(fpus); /* XXX: convert fpus */ + GETREG32(junk); /* XXX: convert tags */ + GETREG32(junk); /* fiseg */ + GETREG32(junk); /* fioff */ + GETREG32(junk); /* foseg */ + GETREG32(junk); /* fooff */ + GETREG32(junk); /* fop */ + +#undef GETREG +#undef GETREG32 +#undef GETREGF +} + +#elif defined(TARGET_I386) static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) { int i, fpus;