From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JuODy-0000r3-KH for qemu-devel@nongnu.org; Fri, 09 May 2008 04:45:07 -0400 Received: from [199.232.76.173] (port=60965 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JuODy-0000qh-1A for qemu-devel@nongnu.org; Fri, 09 May 2008 04:45:06 -0400 Received: from mx1.polytechnique.org ([129.104.30.34]:59083) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1JuODx-0001RE-GJ for qemu-devel@nongnu.org; Fri, 09 May 2008 04:45:05 -0400 Received: from fbe1.dev.netgem.com (gw.netgem.com [195.68.2.34]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTP id 0E60833177 for ; Fri, 9 May 2008 10:45:00 +0200 (CEST) Message-ID: <48240F0B.4000705@bellard.org> Date: Fri, 09 May 2008 10:44:59 +0200 From: Fabrice Bellard 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; format=flowed 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 This patch is not correct as it breaks 32 bit support for x86_64. The correct solution is to add 64 bit support in the i386 case. Moreover, it would be better not to use macros when inline functions could do the same. Regards, Fabrice. 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; > > > > >