From nobody Tue Feb 10 20:14:11 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) 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=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) 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 1511274259977560.2777924458347; Tue, 21 Nov 2017 06:24:19 -0800 (PST) Received: from localhost ([::1]:34701 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9TE-00064Z-5j for importer@patchew.org; Tue, 21 Nov 2017 09:24:16 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39866) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FD-0001fs-2y for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9FB-0002vp-Qv for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:47 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38284) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FB-0002vY-Cd for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:45 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id ABC6A54006E; Tue, 21 Nov 2017 17:09:44 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:42 +0300 Message-ID: <151127338245.6888.12222392757436059555.stgit@Misha-PC.lan02.inno> In-Reply-To: <151127322955.6888.16198535123422076171.stgit@Misha-PC.lan02.inno> References: <151127322955.6888.16198535123422076171.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 v3 26/45] 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_0 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 bf1afab1f8..1fccd8eee7 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -276,6 +276,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