From: Jan Kiszka <jan.kiszka@web.de>
To: Paul Brook <paul@codesourcery.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Re: [PATCH] x86_64 debug registers for gdb
Date: Mon, 23 Apr 2007 17:47:08 +0200 [thread overview]
Message-ID: <462CD4FC.4080102@web.de> (raw)
In-Reply-To: <462C78B1.2070201@web.de>
[-- Attachment #1: Type: text/plain, Size: 5230 bytes --]
Hi again,
here is now a version that I tested a bit longer than 5 minutes (it
actually helped to nail down a Xenomai kernel bug).
The general purpose register mapping for x86_64 was still wrong. I'm now
directing the indices through a mapping table because I didn't dare to
redefine R_EBX&friends on x86_64. The latter would be the simplest way
if nothing else depends on the current values - which I can't tell.
My other questions are still valid as well.
Jan
---
gdbstub.c | 116 +++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 71 insertions(+), 45 deletions(-)
Index: qemu-0.9.0/gdbstub.c
===================================================================
--- qemu-0.9.0.orig/gdbstub.c
+++ qemu-0.9.0/gdbstub.c
@@ -222,64 +222,90 @@ static int put_packet(GDBState *s, char
}
#if defined(TARGET_I386)
+struct x86_gdb_regs {
+ target_ulong gp[CPU_NB_REGS];
+ target_ulong ip;
+ uint32_t flags;
+ uint32_t segm[6];
+ uint8_t fpreg[8][10];
+ uint32_t fpctrl[8];
+ uint64_t xmm[CPU_NB_REGS][2];
+ uint32_t mxcsr;
+} __attribute__((packed));
+
+#if defined(TARGET_X86_64)
+static int gpreg_map[] = {
+ R_EAX, R_EBX, R_ECX, R_EDX, R_ESI, R_EDI, R_EBP, R_ESP,
+ 8, 9, 10, 11, 12, 13, 14, 15
+};
+#define MAP_GPREG(n) gpreg_map[n]
+#else
+#define MAP_GPREG(n) (n)
+#endif
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
{
- uint32_t *registers = (uint32_t *)mem_buf;
+ struct x86_gdb_regs *regs = (struct x86_gdb_regs *)mem_buf;
int i, fpus;
- for(i = 0; i < 8; i++) {
- registers[i] = env->regs[i];
- }
- registers[8] = env->eip;
- registers[9] = env->eflags;
- registers[10] = env->segs[R_CS].selector;
- registers[11] = env->segs[R_SS].selector;
- registers[12] = env->segs[R_DS].selector;
- registers[13] = env->segs[R_ES].selector;
- registers[14] = env->segs[R_FS].selector;
- registers[15] = env->segs[R_GS].selector;
- /* XXX: convert floats */
- for(i = 0; i < 8; i++) {
- memcpy(mem_buf + 16 * 4 + i * 10, &env->fpregs[i], 10);
- }
- registers[36] = env->fpuc;
+ for (i = 0; i < CPU_NB_REGS; i++)
+ regs->gp[i] = tswapl(env->regs[MAP_GPREG(i)]);
+
+ regs->ip = tswapl(env->eip);
+ regs->flags = tswap32(env->eflags);
+
+ regs->segm[0] = tswap32(env->segs[R_CS].selector);
+ regs->segm[1] = tswap32(env->segs[R_SS].selector);
+ regs->segm[2] = tswap32(env->segs[R_DS].selector);
+ regs->segm[3] = tswap32(env->segs[R_ES].selector);
+ regs->segm[4] = tswap32(env->segs[R_FS].selector);
+ regs->segm[5] = tswap32(env->segs[R_GS].selector);
+
+ for (i = 0; i < 8; i++)
+ memcpy(regs->fpreg[i], &env->fpregs[i], 10);
+
+ regs->fpctrl[0] = tswap32(env->fpuc);
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
- registers[37] = fpus;
- registers[38] = 0; /* XXX: convert tags */
- registers[39] = 0; /* fiseg */
- registers[40] = 0; /* fioff */
- registers[41] = 0; /* foseg */
- registers[42] = 0; /* fooff */
- registers[43] = 0; /* fop */
-
- for(i = 0; i < 16; i++)
- tswapls(®isters[i]);
- for(i = 36; i < 44; i++)
- tswapls(®isters[i]);
- return 44 * 4;
+ regs->fpctrl[1] = tswap32(fpus);
+ regs->fpctrl[2] = 0; /* XXX: convert tags */
+ regs->fpctrl[3] = 0; /* fiseg */
+ regs->fpctrl[4] = 0; /* fioff */
+ regs->fpctrl[5] = 0; /* foseg */
+ regs->fpctrl[6] = 0; /* fooff */
+ regs->fpctrl[7] = 0; /* fop */
+
+ for (i = 0; i < CPU_NB_REGS; i++) {
+ regs->xmm[i][0] = tswap64(env->xmm_regs[i].XMM_Q(0));
+ regs->xmm[i][1] = tswap64(env->xmm_regs[i].XMM_Q(1));
+ }
+
+ regs->mxcsr = tswap32(env->mxcsr);
+
+ return sizeof(struct x86_gdb_regs);
}
static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
{
- uint32_t *registers = (uint32_t *)mem_buf;
+ struct x86_gdb_regs *regs = (struct x86_gdb_regs *)mem_buf;
int i;
- for(i = 0; i < 8; i++) {
- env->regs[i] = tswapl(registers[i]);
- }
- env->eip = tswapl(registers[8]);
- env->eflags = tswapl(registers[9]);
+ for (i = 0; i < CPU_NB_REGS; i++)
+ env->regs[MAP_GPREG(i)] = tswapl(regs->gp[i]);
+
+ env->eip = tswapl(regs->ip);
+ env->eflags = tswap32(regs->flags);
+
#if defined(CONFIG_USER_ONLY)
-#define LOAD_SEG(index, sreg)\
- if (tswapl(registers[index]) != env->segs[sreg].selector)\
- cpu_x86_load_seg(env, sreg, tswapl(registers[index]));
- LOAD_SEG(10, R_CS);
- LOAD_SEG(11, R_SS);
- LOAD_SEG(12, R_DS);
- LOAD_SEG(13, R_ES);
- LOAD_SEG(14, R_FS);
- LOAD_SEG(15, R_GS);
+#define LOAD_SEG(index, sreg) \
+ if (tswap32(regs->segm[index]) != env->segs[sreg].selector) \
+ cpu_x86_load_seg(env, sreg, tswap32(regs->segm[index]));
+
+ LOAD_SEG(0, R_CS);
+ LOAD_SEG(1, R_SS);
+ LOAD_SEG(2, R_DS);
+ LOAD_SEG(3, R_ES);
+ LOAD_SEG(4, R_FS);
+ LOAD_SEG(5, R_GS);
#endif
}
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]
prev parent reply other threads:[~2007-04-23 15:53 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-09-19 20:51 [Qemu-devel] [PATCH] x86_64 debug registers for gdb Jason Wessel
2007-04-18 20:53 ` [Qemu-devel] " Jan Kiszka
2007-04-19 15:11 ` Paul Brook
2007-04-19 21:30 ` Jan Kiszka
2007-04-20 12:55 ` Paul Brook
2007-04-20 22:15 ` Jan Kiszka
2007-04-20 23:13 ` Paul Brook
2007-04-21 17:45 ` Jan Kiszka
2007-04-23 9:13 ` Jan Kiszka
2007-04-23 15:47 ` Jan Kiszka [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=462CD4FC.4080102@web.de \
--to=jan.kiszka@web.de \
--cc=paul@codesourcery.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.