From nobody Mon Feb 9 23:40:22 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 (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 154350336820819.785282191025544; Thu, 29 Nov 2018 06:56:08 -0800 (PST) Received: from localhost ([::1]:54600 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gSNjb-00065w-1s for importer@patchew.org; Thu, 29 Nov 2018 09:56:07 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52897) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gSNJ9-0004iy-9b for qemu-devel@nongnu.org; Thu, 29 Nov 2018 09:28:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gSNJ3-00062O-Dx for qemu-devel@nongnu.org; Thu, 29 Nov 2018 09:28:47 -0500 Received: from mail.ispras.ru ([83.149.199.45]:39416) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gSNJ3-00061x-3A for qemu-devel@nongnu.org; Thu, 29 Nov 2018 09:28:41 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 5F3E15400E3; Thu, 29 Nov 2018 17:28:40 +0300 (MSK) From: Mikhail Abakumov To: qemu-devel@nongnu.org Date: Thu, 29 Nov 2018 17:28:38 +0300 Message-ID: <154350171788.8036.5183649366734579675.stgit@Misha-PC.lan02.inno> In-Reply-To: <154350164526.8036.12623669071583857903.stgit@Misha-PC.lan02.inno> References: <154350164526.8036.12623669071583857903.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 12/39] windbg: implement find_kdDebuggerDataBlock 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" It is necessary to find address on the structure kdDebuggerDataBlock, which is located somewhere at kernel .data section. We can find it in structure defined in kernel: typedef struct _DBGKD_DEBUG_DATA_HEADER { LIST_ENTRY64 List; ULONG OwnerTag; ULONG Size; } DBGKD_DEBUG_DATA_HEADER, *PDBGKD_DEBUG_DATA_HEEADER; where OwnerTag =3D=3D 'KDBG', then List =3D=3D kdDebuggerDataBlock. Signed-off-by: Mikhail Abakumov Signed-off-by: Pavel Dovgalyuk --- target/i386/windbgstub.c | 47 ++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 47 insertions(+) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index dc58f5a8cc..f1bab10b10 100644 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -14,6 +14,7 @@ =20 #ifdef TARGET_X86_64 #define OFFSET_KPCR_SELF 0x18 +#define OFFSET_KPCR_LOCK_ARRAY 0x28 #else /* TARGET_I386 */ #define OFFSET_KPCR_SELF 0x1C #define OFFSET_KPCR_VERSION 0x34 @@ -60,6 +61,52 @@ static bool find_KPCR(CPUState *cs) #ifdef TARGET_X86_64 static bool find_kdDebuggerDataBlock(CPUState *cs) { + target_ulong lockArray; + target_ulong dDataList; + const uint8_t tag[] =3D { 'K', 'D', 'B', 'G' }; + target_ulong start =3D 0xfffff80000000000LL; + target_ulong finish =3D 0xfffff81000000000LL; + InitedAddr find; + + /* kdDebuggerDataBlock is located in + - range of [0xfffff80000000000 ... 0xfffff81000000000] + - at offset of ('KDBG') - 0x10 */ + + if (!kdDebuggerDataBlock.is_init && KPCR.is_init) { + /* At first, find lockArray. If it is NULL, + then kdDebuggerDataBlock is also NULL (empirically). */ + lockArray =3D VMEM_ADDR(cs, KPCR.addr + OFFSET_KPCR_LOCK_ARRAY); + if (!lockArray) { + return false; + } + DPRINTF("find LockArray " FMT_ADDR "\n", lockArray); + + while (true) { + find =3D windbg_search_vmaddr(cs, start, finish, tag, + ARRAY_SIZE(tag)); + if (!find.is_init) { + return false; + } + + /* Valid address to 'KDBG ' is always aligned */ + if (!(find.addr & 0xf)) { + dDataList =3D VMEM_ADDR(cs, find.addr - 0x10); + + /* Valid address to 'dDataList ' is always + in range [0xfffff80000000000 ... 0xfffff8ffffffffff] */ + if ((dDataList >> 40) =3D=3D 0xfffff8) { + kdDebuggerDataBlock.addr =3D find.addr - 0x10; + kdDebuggerDataBlock.is_init =3D true; + DPRINTF("find kdDebuggerDataBlock " FMT_ADDR "\n", + kdDebuggerDataBlock.addr); + break; + } + } + + start =3D find.addr + 0x8; /* next addr */ + } + } + return kdDebuggerDataBlock.is_init; } #else /* TARGET_I386 */