From nobody Tue Feb 10 20:14:16 2026 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508247233225465.0165659362251; Tue, 17 Oct 2017 06:33:53 -0700 (PDT) Received: from localhost ([::1]:39280 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rzw-0006AN-BL for importer@patchew.org; Tue, 17 Oct 2017 09:33:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34111) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReZ-0004Z9-Va for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4ReT-00067z-Tp for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:27 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57016) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReT-00066z-GX for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:21 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id BD78D54006B; Tue, 17 Oct 2017 16:11:20 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:18 +0300 Message-ID: <150824587818.6816.15425368718818424541.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 26/43] windbg: implemented windbg_read_context X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: sw@weilnetz.de, lprosek@redhat.com, dovgaluk@ispras.ru, rkagan@virtuozzo.com, pbonzini@redhat.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- target/i386/windbgstub.c | 96 ++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 96 insertions(+) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 3e238525da..a3ec5c1c6a 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -274,6 +274,102 @@ typedef struct _CPU_KPROCESSOR_STATE { static int windbg_read_context(CPUState *cpu, uint8_t *buf, int buf_size, int offset, int len) { + CPUArchState *env =3D cpu->env_ptr; + CPU_CONTEXT *cc; + bool new_mem; + + if (len < 0 || len > buf_size) { + WINDBG_ERROR("windbg_read_context: incorrect length %d", len); + return 1; + } + + if (offset < 0 || offset + len > sizeof(CPU_CONTEXT)) { + WINDBG_ERROR("windbg_read_context: incorrect offset %d", offset); + return 2; + } + + new_mem =3D len !=3D sizeof(CPU_CONTEXT) || offset !=3D 0; + if (new_mem) { + cc =3D g_new0(CPU_CONTEXT, 1); + } else { + cc =3D (CPU_CONTEXT *) buf; + memset(cc, 0, sizeof(CPU_CONTEXT)); + } + + cc->ContextFlags =3D CPU_CONTEXT_ALL; + + if (cc->ContextFlags & CPU_CONTEXT_SEGMENTS) { + stw_p(&cc->SegCs, env->segs[R_CS].selector); + stw_p(&cc->SegDs, env->segs[R_DS].selector); + stw_p(&cc->SegEs, env->segs[R_ES].selector); + stw_p(&cc->SegFs, env->segs[R_FS].selector); + stw_p(&cc->SegGs, env->segs[R_GS].selector); + stw_p(&cc->SegSs, env->segs[R_SS].selector); + } + + if (cc->ContextFlags & CPU_CONTEXT_DEBUG_REGISTERS) { + sttul_p(&cc->Dr0, env->dr[0]); + sttul_p(&cc->Dr1, env->dr[1]); + sttul_p(&cc->Dr2, env->dr[2]); + sttul_p(&cc->Dr3, env->dr[3]); + sttul_p(&cc->Dr6, env->dr[6]); + sttul_p(&cc->Dr7, env->dr[7]); + } + + if (cc->ContextFlags & CPU_CONTEXT_INTEGER) { + stl_p(&cc->Edi, env->regs[R_EDI]); + stl_p(&cc->Esi, env->regs[R_ESI]); + stl_p(&cc->Ebx, env->regs[R_EBX]); + stl_p(&cc->Edx, env->regs[R_EDX]); + stl_p(&cc->Ecx, env->regs[R_ECX]); + stl_p(&cc->Eax, env->regs[R_EAX]); + stl_p(&cc->Ebp, env->regs[R_EBP]); + stl_p(&cc->Esp, env->regs[R_ESP]); + stl_p(&cc->Eip, env->eip); + stl_p(&cc->EFlags, env->eflags); + } + + if (cc->ContextFlags & CPU_CONTEXT_FLOATING_POINT) { + uint32_t swd =3D 0, twd =3D 0; + swd =3D env->fpus & ~(7 << 11); + swd |=3D (env->fpstt & 7) << 11; + int i; + for (i =3D 0; i < 8; ++i) { + twd |=3D (!env->fptags[i]) << i; + } + + stl_p(&cc->FloatSave.ControlWord, env->fpuc); + stl_p(&cc->FloatSave.StatusWord, swd); + stl_p(&cc->FloatSave.TagWord, twd); + stl_p(&cc->FloatSave.ErrorOffset, UINT32_P(&env->fpip)[0]); + stl_p(&cc->FloatSave.ErrorSelector, UINT32_P(&env->fpip)[1]); + stl_p(&cc->FloatSave.DataOffset, UINT32_P(&env->fpdp)[0]); + stl_p(&cc->FloatSave.DataSelector, UINT32_P(&env->fpdp)[1]); + stl_p(&cc->FloatSave.Cr0NpxState, env->xcr0); + + for (i =3D 0; i < 8; ++i) { + memcpy(PTR(cc->FloatSave.RegisterArea[i * 10]), + PTR(env->fpregs[i]), 10); + } + } + + if (cc->ContextFlags & CPU_CONTEXT_EXTENDED_REGISTERS) { + uint8_t *ptr =3D cc->ExtendedRegisters + 160; + int i; + for (i =3D 0; i < 8; ++i, ptr +=3D 16) { + stq_p(ptr, env->xmm_regs[i].ZMM_Q(0)); + stq_p(ptr + 8, env->xmm_regs[i].ZMM_Q(1)); + } + + stl_p(cc->ExtendedRegisters + 24, env->mxcsr); + } + + stl_p(&cc->ContextFlags, cc->ContextFlags); + + if (new_mem) { + memcpy(buf, (uint8_t *) cc + offset, len); + g_free(cc); + } return 0; } =20