From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JuRD5-0000Eh-64 for qemu-devel@nongnu.org; Fri, 09 May 2008 07:56:23 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JuRD4-0000E5-AC for qemu-devel@nongnu.org; Fri, 09 May 2008 07:56:22 -0400 Received: from [199.232.76.173] (port=40278 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JuRD4-0000Do-1s for qemu-devel@nongnu.org; Fri, 09 May 2008 07:56:22 -0400 Received: from mail.windriver.com ([147.11.1.11]:52876 helo=mail.wrs.com) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JuRD3-00031s-Mr for qemu-devel@nongnu.org; Fri, 09 May 2008 07:56:21 -0400 Received: from ALA-MAIL03.corp.ad.wrs.com (ala-mail03 [147.11.57.144]) by mail.wrs.com (8.13.6/8.13.6) with ESMTP id m49BuJFn023799 for ; Fri, 9 May 2008 04:56:19 -0700 (PDT) Message-ID: <48243BE6.9070408@windriver.com> Date: Fri, 09 May 2008 06:56:22 -0500 From: Jason Wessel MIME-Version: 1.0 Subject: Re: [Qemu-devel] [4390] Add x86_64 gdb stub for qemu (Jason Wessel). References: In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit 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 I see this is already reverted :-) It was not my intention when I followed up to the original post to have this one committed, it is from an older branch in the 0.9.0 era. The single stepping patch however would have been fine as it was "carry forward work" against the SVN HEAD. Thanks, Jason. Edgar E. Iglesias wrote: > 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; > > > > >