>From 35967080206ecfe9970314b9072d9f3369a25411 Mon Sep 17 00:00:00 2001 From: Hu Tao Date: Mon, 25 Oct 2010 14:19:02 +0800 Subject: [PATCH] Guess we're reading 32- or 64-bit GPRs by a zero sp --- qemu-load.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/qemu-load.c b/qemu-load.c index 303ed94..148ebc7 100644 --- a/qemu-load.c +++ b/qemu-load.c @@ -439,14 +439,18 @@ cpu_load (struct qemu_device *d, FILE *fp, int size) { struct qemu_device_x86 *dx86 = (struct qemu_device_x86 *)d; uint32_t qemu_hflags = 0, qemu_hflags2 = 0; - int nregs = size == 32 ? 8 : 16; + int nregs; uint32_t version_id = dx86->dev_base.version_id; uint32_t rhel5_version_id; int i; + long start; struct qemu_device *drhel5; struct qemu_device_cpu_common *dcpu; + start = ftell(fp); +retry: + nregs = size == 32 ? 8 : 16; drhel5 = device_find_instance (d->list, "__rhel5", 0); if (drhel5 || (version_id >= 7 && version_id <= 9)) { rhel5_version_id = version_id; @@ -470,6 +474,12 @@ cpu_load (struct qemu_device *d, FILE *fp, int size) for (i = 0; i < nregs; i++) dx86->regs[i] = get_be_long (fp, size); + if (dx86->regs[R_ESP] == 0 && size == 32) { + size = 64; + fseek(fp, start, SEEK_SET); + goto retry; + } + dx86->eip = get_be_long (fp, size); dx86->eflags = get_be_long (fp, size); qemu_hflags = get_be32 (fp); -- 1.7.3