From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1HeHEa-0007jc-JU for qemu-devel@nongnu.org; Wed, 18 Apr 2007 16:58:36 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1HeHEY-0007j9-TV for qemu-devel@nongnu.org; Wed, 18 Apr 2007 16:58:36 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1HeHEY-0007j6-OB for qemu-devel@nongnu.org; Wed, 18 Apr 2007 16:58:34 -0400 Received: from fmmailgate02.web.de ([217.72.192.227]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1HeH9f-00029W-S9 for qemu-devel@nongnu.org; Wed, 18 Apr 2007 16:53:32 -0400 Received: from smtp08.web.de (fmsmtp08.dlan.cinetic.de [172.20.5.216]) by fmmailgate02.web.de (Postfix) with ESMTP id D00367559F1C for ; Wed, 18 Apr 2007 22:53:30 +0200 (CEST) Received: from [88.70.19.19] (helo=[192.168.1.2]) by smtp08.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.108 #197) id 1HeH9e-00005P-00 for qemu-devel@nongnu.org; Wed, 18 Apr 2007 22:53:30 +0200 Message-ID: <4626853D.1070708@web.de> Date: Wed, 18 Apr 2007 22:53:17 +0200 From: Jan Kiszka MIME-Version: 1.0 References: <45105864.9090902@windriver.com> In-Reply-To: <45105864.9090902@windriver.com> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigABDA66A99C42C027C22F1DE7" Sender: jan.kiszka@web.de Subject: [Qemu-devel] Re: [PATCH] x86_64 debug registers for gdb 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 is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigABDA66A99C42C027C22F1DE7 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Jason Wessel wrote: > This patch fixes the registers for the 'g' and 'G' packets for the > qemu-system-x86_64 target. It allows gdb 6.5 to debug a linux kernel > and get a stack back trace. Here comes a corrected (RBX and RDX were mixed) and slightly enhanced (segment register reading, don't know how writing should look like) version of this patch. Tested successfully with qemu-0.9.0 and gdb-6.6. Would be nice to see this support in the next qemu release. Jan Index: qemu-0.9.0/gdbstub.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- qemu-0.9.0.orig/gdbstub.c +++ qemu-0.9.0/gdbstub.c @@ -220,9 +220,78 @@ static int put_packet(GDBState *s, char=20 } return 0; } +#if defined(TARGET_X86_64) +/* Defines from GDB register struct numbers */ +#define _RAX 0 +#define _RBX 1 +#define _RCX 2 +#define _RDX 3 +#define _RSI 4 +#define _RDI 5 +#define _RBP 6 +#define _RSP 7 +#define _R8 8 +#define _R15 15 +#define _PC 16 +#define _PS 17 +#define _CS 18 +#define _SS 19 +#define _DS 20 +#define _ES 21 +#define _FS 22 +#define _GS 23 +#define _NREGS 24 =20 -#if defined(TARGET_I386) +static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) +{ + uint64_t *registers =3D (uint64_t *)mem_buf; + int i; + + registers[_RAX] =3D env->regs[R_EAX]; + registers[_RBX] =3D env->regs[R_EBX]; + registers[_RCX] =3D env->regs[R_ECX]; + registers[_RDX] =3D env->regs[R_EDX]; + registers[_RSI] =3D env->regs[R_ESI]; + registers[_RDI] =3D env->regs[R_EDI]; + registers[_RBP] =3D env->regs[R_EBP]; + registers[_RSP] =3D env->regs[R_ESP]; + for (i =3D 8; i < 16; i++) + registers[i] =3D env->regs[i]; + registers[_PC] =3D env->eip; + registers[_PS] =3D env->eflags; + registers[_CS] =3D env->segs[R_CS].selector; + registers[_SS] =3D env->segs[R_SS].selector; + registers[_DS] =3D env->segs[R_DS].selector; + registers[_ES] =3D env->segs[R_ES].selector; + registers[_FS] =3D env->segs[R_FS].selector; + registers[_GS] =3D env->segs[R_GS].selector; + + for(i =3D 0; i < _NREGS; i++) + tswapl(registers[i]); + + return _NREGS * 8; +} + +static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int= size) +{ + uint32_t *registers =3D (uint32_t *)mem_buf; + int i; + + env->regs[R_EAX] =3D tswapl(registers[_RAX]); + env->regs[R_EBX] =3D tswapl(registers[_RBX]); + env->regs[R_ECX] =3D tswapl(registers[_RCX]); + env->regs[R_EDX] =3D tswapl(registers[_RDX]); + env->regs[R_ESI] =3D tswapl(registers[_RSI]); + env->regs[R_EDI] =3D tswapl(registers[_RDI]); + env->regs[R_EBP] =3D tswapl(registers[_RBP]); + env->regs[R_ESP] =3D tswapl(registers[_RSP]); + for (i =3D 8; i < 16; i++) + env->regs[i] =3D tswapl(registers[i]); + env->eip =3D tswapl(registers[_PC]); + env->eflags =3D tswapl(registers[_PS]); +} =20 +#elif defined(TARGET_I386) static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) { uint32_t *registers =3D (uint32_t *)mem_buf; --------------enigABDA66A99C42C027C22F1DE7 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (MingW32) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFGJoU9niDOoMHTA+kRApr3AJwOEfvdxUL+CuEIUrvAqSCAb0P+MQCdGUGM GxNG8OIyHwxRZCFKaMfxU8E= =0Ib3 -----END PGP SIGNATURE----- --------------enigABDA66A99C42C027C22F1DE7--