From nobody Sun Apr 28 23:53:21 2024 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 (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1511273400050254.37340449069484; Tue, 21 Nov 2017 06:10:00 -0800 (PST) Received: from localhost ([::1]:34616 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FA-0001D3-LA for importer@patchew.org; Tue, 21 Nov 2017 09:09:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38874) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9D6-000846-Eu for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Cu-0001td-SR for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:30 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37620) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Cu-0001s3-GI for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:24 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id C885B54006E; Tue, 21 Nov 2017 17:07:23 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:07:21 +0300 Message-ID: <151127324158.6888.17818677336117525693.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 01/45] windbg: added empty windbgstub files 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 --- Makefile.target | 7 +++++++ include/exec/windbgstub-utils.h | 18 ++++++++++++++++++ include/exec/windbgstub.h | 17 +++++++++++++++++ stubs/Makefile.objs | 1 + stubs/windbgstub.c | 18 ++++++++++++++++++ target/i386/Makefile.objs | 2 +- target/i386/windbgstub.c | 12 ++++++++++++ windbgstub-utils.c | 12 ++++++++++++ windbgstub.c | 19 +++++++++++++++++++ 9 files changed, 105 insertions(+), 1 deletion(-) create mode 100755 include/exec/windbgstub-utils.h create mode 100755 include/exec/windbgstub.h create mode 100755 stubs/windbgstub.c create mode 100755 target/i386/windbgstub.c create mode 100755 windbgstub-utils.c create mode 100755 windbgstub.c diff --git a/Makefile.target b/Makefile.target index 7f42c45db8..6df0836509 100644 --- a/Makefile.target +++ b/Makefile.target @@ -148,6 +148,13 @@ obj-y +=3D dump.o obj-y +=3D migration/ram.o LIBS :=3D $(libs_softmmu) $(LIBS) =20 +# WinDbg support +ifeq ($(TARGET_NAME), i386) +ifneq ($(TARGET_NAME), x86_64) +obj-y +=3D windbgstub.o windbgstub-utils.o +endif +endif + # Hardware support ifeq ($(TARGET_NAME), sparc64) obj-y +=3D hw/sparc64/ diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h new file mode 100755 index 0000000000..67d190bf6c --- /dev/null +++ b/include/exec/windbgstub-utils.h @@ -0,0 +1,18 @@ +/* + * windbgstub-utils.h + * + * Copyright (c) 2010-2017 Institute for System Programming + * of the Russian Academy of Sciences. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef WINDBGSTUB_UTILS_H +#define WINDBGSTUB_UTILS_H + +#include "qemu/osdep.h" +#include "exec/windbgstub.h" + +#endif diff --git a/include/exec/windbgstub.h b/include/exec/windbgstub.h new file mode 100755 index 0000000000..1a6e1cc6e5 --- /dev/null +++ b/include/exec/windbgstub.h @@ -0,0 +1,17 @@ +/* + * windbgstub.h + * + * Copyright (c) 2010-2017 Institute for System Programming + * of the Russian Academy of Sciences. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef WINDBGSTUB_H +#define WINDBGSTUB_H + +int windbg_server_start(const char *device); + +#endif diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs index e69c217aff..5c25a53c15 100644 --- a/stubs/Makefile.objs +++ b/stubs/Makefile.objs @@ -12,6 +12,7 @@ stub-obj-y +=3D dump.o stub-obj-y +=3D error-printf.o stub-obj-y +=3D fdset.o stub-obj-y +=3D gdbstub.o +stub-obj-y +=3D windbgstub.o stub-obj-y +=3D get-vm-name.o stub-obj-y +=3D iothread.o stub-obj-y +=3D iothread-lock.o diff --git a/stubs/windbgstub.c b/stubs/windbgstub.c new file mode 100755 index 0000000000..4951f59203 --- /dev/null +++ b/stubs/windbgstub.c @@ -0,0 +1,18 @@ +/* + * windbgstub.c + * + * Copyright (c) 2010-2017 Institute for System Programming + * of the Russian Academy of Sciences. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "exec/windbgstub.h" + +int windbg_server_start(const char *device) +{ + return 0; +} diff --git a/target/i386/Makefile.objs b/target/i386/Makefile.objs index 6a26e9d9f0..730ee04e27 100644 --- a/target/i386/Makefile.objs +++ b/target/i386/Makefile.objs @@ -1,4 +1,4 @@ -obj-y +=3D helper.o cpu.o gdbstub.o xsave_helper.o +obj-y +=3D helper.o cpu.o gdbstub.o windbgstub.o xsave_helper.o obj-$(CONFIG_TCG) +=3D translate.o obj-$(CONFIG_TCG) +=3D bpt_helper.o cc_helper.o excp_helper.o fpu_helper.o obj-$(CONFIG_TCG) +=3D int_helper.o mem_helper.o misc_helper.o mpx_helper.o diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c new file mode 100755 index 0000000000..df89e1edd8 --- /dev/null +++ b/target/i386/windbgstub.c @@ -0,0 +1,12 @@ +/* + * windbgstub.c + * + * Copyright (c) 2010-2017 Institute for System Programming + * of the Russian Academy of Sciences. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#include "qemu/osdep.h" diff --git a/windbgstub-utils.c b/windbgstub-utils.c new file mode 100755 index 0000000000..dc5e505c63 --- /dev/null +++ b/windbgstub-utils.c @@ -0,0 +1,12 @@ +/* + * windbgstub-utils.c + * + * Copyright (c) 2010-2017 Institute for System Programming + * of the Russian Academy of Sciences. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#include "exec/windbgstub-utils.h" diff --git a/windbgstub.c b/windbgstub.c new file mode 100755 index 0000000000..3830446988 --- /dev/null +++ b/windbgstub.c @@ -0,0 +1,19 @@ +/* + * windbgstub.c + * + * Copyright (c) 2010-2017 Institute for System Programming + * of the Russian Academy of Sciences. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "exec/windbgstub.h" +#include "exec/windbgstub-utils.h" + +int windbg_server_start(const char *device) +{ + return 0; +} From nobody Sun Apr 28 23:53:21 2024 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 1511273402181648.3020821766622; Tue, 21 Nov 2017 06:10:02 -0800 (PST) Received: from localhost ([::1]:34617 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FI-0001IM-5h for importer@patchew.org; Tue, 21 Nov 2017 09:09:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38925) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9D8-0008B4-NH for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9D3-00024c-5a for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:38 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37646) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9D2-000208-FB for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:33 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 6D6DD54006E; Tue, 21 Nov 2017 17:07:29 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:07:27 +0300 Message-ID: <151127324719.6888.12650412709091155533.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 02/45] windbg: added windbg's KD header file 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 Header file from windbg's source code describing the main structures. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgkd.h | 873 +++++++++++++++++++++++++++++++++++= ++++ include/exec/windbgstub-utils.h | 1=20 2 files changed, 874 insertions(+) create mode 100755 include/exec/windbgkd.h diff --git a/include/exec/windbgkd.h b/include/exec/windbgkd.h new file mode 100755 index 0000000000..b8f98925e7 --- /dev/null +++ b/include/exec/windbgkd.h @@ -0,0 +1,873 @@ +/* + * windbgkd.h + * + * Copyright (c) 2010-2017 Institute for System Programming + * of the Russian Academy of Sciences. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef WINDBGKD_H +#define WINDBGKD_H + +/* + * Packet Size and Control Stream Size + */ +#define PACKET_MAX_SIZE 4096 +#define DBGKD_MAXSTREAM 16 + +/* + * Magic Packet IDs + */ +#define INITIAL_PACKET_ID 0x80800000 +#define SYNC_PACKET_ID 0x00000800 +#define RESET_PACKET_ID 0x0018359b + +/* + * Magic Packet bytes + */ +#define BREAKIN_PACKET 0x62626262 +#define BREAKIN_PACKET_BYTE 0x62 +#define PACKET_LEADER 0x30303030 +#define PACKET_LEADER_BYTE 0x30 +#define CONTROL_PACKET_LEADER 0x69696969 +#define CONTROL_PACKET_LEADER_BYTE 0x69 +#define PACKET_TRAILING_BYTE 0xaa + +/* + * Packet Types + */ +#define PACKET_TYPE_UNUSED 0 +#define PACKET_TYPE_KD_STATE_CHANGE32 1 +#define PACKET_TYPE_KD_STATE_MANIPULATE 2 +#define PACKET_TYPE_KD_DEBUG_IO 3 +#define PACKET_TYPE_KD_ACKNOWLEDGE 4 +#define PACKET_TYPE_KD_RESEND 5 +#define PACKET_TYPE_KD_RESET 6 +#define PACKET_TYPE_KD_STATE_CHANGE64 7 +#define PACKET_TYPE_KD_POLL_BREAKIN 8 +#define PACKET_TYPE_KD_TRACE_IO 9 +#define PACKET_TYPE_KD_CONTROL_REQUEST 10 +#define PACKET_TYPE_KD_FILE_IO 11 +#define PACKET_TYPE_MAX 12 + +/* + * Wait State Change Types + */ +#define DbgKdMinimumStateChange 0x00003030 +#define DbgKdExceptionStateChange 0x00003030 +#define DbgKdLoadSymbolsStateChange 0x00003031 +#define DbgKdCommandStringStateChange 0x00003032 +#define DbgKdMaximumStateChange 0x00003033 + +/* + * This is combined with the basic state change code + * if the state is from an alternate source + */ +#define DbgKdAlternateStateChange 0x00010000 + +/* + * Manipulate Types + */ +#define DbgKdMinimumManipulate 0x00003130 +#define DbgKdReadVirtualMemoryApi 0x00003130 +#define DbgKdWriteVirtualMemoryApi 0x00003131 +#define DbgKdGetContextApi 0x00003132 +#define DbgKdSetContextApi 0x00003133 +#define DbgKdWriteBreakPointApi 0x00003134 +#define DbgKdRestoreBreakPointApi 0x00003135 +#define DbgKdContinueApi 0x00003136 +#define DbgKdReadControlSpaceApi 0x00003137 +#define DbgKdWriteControlSpaceApi 0x00003138 +#define DbgKdReadIoSpaceApi 0x00003139 +#define DbgKdWriteIoSpaceApi 0x0000313a +#define DbgKdRebootApi 0x0000313b +#define DbgKdContinueApi2 0x0000313c +#define DbgKdReadPhysicalMemoryApi 0x0000313d +#define DbgKdWritePhysicalMemoryApi 0x0000313e +#define DbgKdQuerySpecialCallsApi 0x0000313f +#define DbgKdSetSpecialCallApi 0x00003140 +#define DbgKdClearSpecialCallsApi 0x00003141 +#define DbgKdSetInternalBreakPointApi 0x00003142 +#define DbgKdGetInternalBreakPointApi 0x00003143 +#define DbgKdReadIoSpaceExtendedApi 0x00003144 +#define DbgKdWriteIoSpaceExtendedApi 0x00003145 +#define DbgKdGetVersionApi 0x00003146 +#define DbgKdWriteBreakPointExApi 0x00003147 +#define DbgKdRestoreBreakPointExApi 0x00003148 +#define DbgKdCauseBugCheckApi 0x00003149 +#define DbgKdSwitchProcessor 0x00003150 +#define DbgKdPageInApi 0x00003151 +#define DbgKdReadMachineSpecificRegister 0x00003152 +#define DbgKdWriteMachineSpecificRegister 0x00003153 +#define OldVlm1 0x00003154 +#define OldVlm2 0x00003155 +#define DbgKdSearchMemoryApi 0x00003156 +#define DbgKdGetBusDataApi 0x00003157 +#define DbgKdSetBusDataApi 0x00003158 +#define DbgKdCheckLowMemoryApi 0x00003159 +#define DbgKdClearAllInternalBreakpointsApi 0x0000315a +#define DbgKdFillMemoryApi 0x0000315b +#define DbgKdQueryMemoryApi 0x0000315c +#define DbgKdSwitchPartition 0x0000315d +#define DbgKdMaximumManipulate 0x0000315e + +/* + * Debug I/O Types + */ +#define DbgKdPrintStringApi 0x00003230 +#define DbgKdGetStringApi 0x00003231 + +/* + * Trace I/O Types + */ +#define DbgKdPrintTraceApi 0x00003330 + +/* + * Control Request Types + */ +#define DbgKdRequestHardwareBp 0x00004300 +#define DbgKdReleaseHardwareBp 0x00004301 + +/* + * File I/O Types + */ +#define DbgKdCreateFileApi 0x00003430 +#define DbgKdReadFileApi 0x00003431 +#define DbgKdWriteFileApi 0x00003432 +#define DbgKdCloseFileApi 0x00003433 + +/* + * Control Report Flags + */ +#define REPORT_INCLUDES_SEGS 0x0001 +#define REPORT_STANDARD_CS 0x0002 + +/* + * Protocol Versions + */ +#define DBGKD_64BIT_PROTOCOL_VERSION1 5 +#define DBGKD_64BIT_PROTOCOL_VERSION2 6 + +/* + * Query Memory Address Spaces + */ +#define DBGKD_QUERY_MEMORY_VIRTUAL 0 +#define DBGKD_QUERY_MEMORY_PROCESS 0 +#define DBGKD_QUERY_MEMORY_SESSION 1 +#define DBGKD_QUERY_MEMORY_KERNEL 2 + +/* + * Query Memory Flags + */ +#define DBGKD_QUERY_MEMORY_READ 0x01 +#define DBGKD_QUERY_MEMORY_WRITE 0x02 +#define DBGKD_QUERY_MEMORY_EXECUTE 0x04 +#define DBGKD_QUERY_MEMORY_FIXED 0x08 + +/* + * Internal Breakpoint Flags + */ +#define DBGKD_INTERNAL_BP_FLAG_COUNTONLY 0x01 +#define DBGKD_INTERNAL_BP_FLAG_INVALID 0x02 +#define DBGKD_INTERNAL_BP_FLAG_SUSPENDED 0x04 +#define DBGKD_INTERNAL_BP_FLAG_DYING 0x08 + +/* + * Fill Memory Flags + */ +#define DBGKD_FILL_MEMORY_VIRTUAL 0x01 +#define DBGKD_FILL_MEMORY_PHYSICAL 0x02 + +/* + * Physical Memory Caching Flags + */ +#define DBGKD_CACHING_DEFAULT 0 +#define DBGKD_CACHING_CACHED 1 +#define DBGKD_CACHING_UNCACHED 2 +#define DBGKD_CACHING_WRITE_COMBINED 3 + +/* + * Partition Switch Flags + */ +#define DBGKD_PARTITION_DEFAULT 0x00 +#define DBGKD_PARTITION_ALTERNATE 0x01 + +/* + * AMD64 Control Space types + */ +#define AMD64_DEBUG_CONTROL_SPACE_KPCR 0 +#define AMD64_DEBUG_CONTROL_SPACE_KPRCB 1 +#define AMD64_DEBUG_CONTROL_SPACE_KSPECIAL 2 +#define AMD64_DEBUG_CONTROL_SPACE_KTHREAD 3 + +/* + * Maximum supported number of breakpoints + */ +#define KD_BREAKPOINT_MAX 32 + +typedef uint8_t boolean_t; +typedef int32_t ntstatus_t; + +/* + * NTSTATUS + */ +#define NT_SUCCESS(status) ((ntstatus_t) (status) >=3D 0) +#ifndef STATUS_SUCCESS +#define STATUS_SUCCESS ((ntstatus_t) 0x00000000) +#endif +#ifndef DBG_CONTINUE +#define DBG_CONTINUE ((ntstatus_t) 0x00010002) +#endif +#ifndef STATUS_NO_MORE_ENTRIES +#define STATUS_NO_MORE_ENTRIES ((ntstatus_t) 0x8000001A) +#endif +#ifndef STATUS_UNSUCCESSFUL +#define STATUS_UNSUCCESSFUL ((ntstatus_t) 0xC0000001) +#endif +#ifndef STATUS_INVALID_PARAMETER +#define STATUS_INVALID_PARAMETER ((ntstatus_t) 0xC000000D) +#endif + +/* + * KD Packet Structure + */ +typedef struct _KD_PACKET { + uint32_t PacketLeader; + uint16_t PacketType; + uint16_t ByteCount; + uint32_t PacketId; + uint32_t Checksum; +} KD_PACKET, *PKD_PACKET; + +/* + * KD Context + */ +typedef struct _KD_CONTEXT { + uint32_t KdpDefaultRetries; + boolean_t KdpControlCPending; +} KD_CONTEXT, *PKD_CONTEXT; + +/* + * Control Sets for Supported Architectures + */ +typedef struct _X86_DBGKD_CONTROL_SET { + uint32_t TraceFlag; + uint32_t Dr7; + uint32_t CurrentSymbolStart; + uint32_t CurrentSymbolEnd; +} X86_DBGKD_CONTROL_SET, *PX86_DBGKD_CONTROL_SET; + +typedef struct _ALPHA_DBGKD_CONTROL_SET { + uint32_t __padding; +} ALPHA_DBGKD_CONTROL_SET, *PALPHA_DBGKD_CONTROL_SET; + +typedef struct _IA64_DBGKD_CONTROL_SET { + uint32_t Continue; + uint64_t CurrentSymbolStart; + uint64_t CurrentSymbolEnd; +} IA64_DBGKD_CONTROL_SET, *PIA64_DBGKD_CONTROL_SET; + +typedef struct _AMD64_DBGKD_CONTROL_SET { + uint32_t TraceFlag; + uint64_t Dr7; + uint64_t CurrentSymbolStart; + uint64_t CurrentSymbolEnd; +} AMD64_DBGKD_CONTROL_SET, *PAMD64_DBGKD_CONTROL_SET; + +typedef struct _ARM_DBGKD_CONTROL_SET { + uint32_t Continue; + uint32_t CurrentSymbolStart; + uint32_t CurrentSymbolEnd; +} ARM_DBGKD_CONTROL_SET, *PARM_DBGKD_CONTROL_SET; + +typedef struct _DBGKD_ANY_CONTROL_SET { + union { + X86_DBGKD_CONTROL_SET X86ControlSet; + ALPHA_DBGKD_CONTROL_SET AlphaControlSet; + IA64_DBGKD_CONTROL_SET IA64ControlSet; + AMD64_DBGKD_CONTROL_SET Amd64ControlSet; + ARM_DBGKD_CONTROL_SET ARMControlSet; + }; +} DBGKD_ANY_CONTROL_SET, *PDBGKD_ANY_CONTROL_SET; + +#if defined(TARGET_I386) +typedef X86_DBGKD_CONTROL_SET DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET; +#elif defined(TARGET_X86_64) +typedef AMD64_DBGKD_CONTROL_SET DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET; +#elif defined(TARGET_ARM) +typedef ARM_DBGKD_CONTROL_SET DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET; +#else +#error Unsupported Architecture +#endif + +/* + * EXCEPTION_RECORD Structures + */ +typedef struct _DBGKM_EXCEPTION_RECORD32 { + int32_t ExceptionCode; + uint32_t ExceptionFlags; + uint32_t ExceptionRecord; + uint32_t ExceptionAddress; + uint32_t NumberParameters; + uint32_t ExceptionInformation[15]; +} DBGKM_EXCEPTION_RECORD32, *PDBGKM_EXCEPTION_RECORD32; + +typedef struct _DBGKM_EXCEPTION_RECORD64 { + int32_t ExceptionCode; + uint32_t ExceptionFlags; + uint64_t ExceptionRecord; + uint64_t ExceptionAddress; + uint32_t NumberParameters; + uint32_t __unusedAligment; + uint64_t ExceptionInformation[15]; +} DBGKM_EXCEPTION_RECORD64, *PDBGKM_EXCEPTION_RECORD64; + +/* + * DBGKM Structure for Exceptions + */ +typedef struct _DBGKM_EXCEPTION32 { + DBGKM_EXCEPTION_RECORD32 ExceptionRecord; + uint32_t FirstChance; +} DBGKM_EXCEPTION32, *PDBGKM_EXCEPTION32; + +typedef struct _DBGKM_EXCEPTION64 { + DBGKM_EXCEPTION_RECORD64 ExceptionRecord; + uint32_t FirstChance; +} DBGKM_EXCEPTION64, *PDBGKM_EXCEPTION64; + +/* + * DBGKD Structure for State Change + */ +typedef struct _X86_DBGKD_CONTROL_REPORT { + uint32_t Dr6; + uint32_t Dr7; + uint16_t InstructionCount; + uint16_t ReportFlags; + uint8_t InstructionStream[DBGKD_MAXSTREAM]; + uint16_t SegCs; + uint16_t SegDs; + uint16_t SegEs; + uint16_t SegFs; + uint32_t EFlags; +} X86_DBGKD_CONTROL_REPORT, *PX86_DBGKD_CONTROL_REPORT; + +typedef struct _ALPHA_DBGKD_CONTROL_REPORT { + uint32_t InstructionCount; + uint8_t InstructionStream[DBGKD_MAXSTREAM]; +} ALPHA_DBGKD_CONTROL_REPORT, *PALPHA_DBGKD_CONTROL_REPORT; + +typedef struct _IA64_DBGKD_CONTROL_REPORT { + uint32_t InstructionCount; + uint8_t InstructionStream[DBGKD_MAXSTREAM]; +} IA64_DBGKD_CONTROL_REPORT, *PIA64_DBGKD_CONTROL_REPORT; + +typedef struct _AMD64_DBGKD_CONTROL_REPORT { + uint64_t Dr6; + uint64_t Dr7; + uint32_t EFlags; + uint16_t InstructionCount; + uint16_t ReportFlags; + uint8_t InstructionStream[DBGKD_MAXSTREAM]; + uint16_t SegCs; + uint16_t SegDs; + uint16_t SegEs; + uint16_t SegFs; +} AMD64_DBGKD_CONTROL_REPORT, *PAMD64_DBGKD_CONTROL_REPORT; + +typedef struct _ARM_DBGKD_CONTROL_REPORT { + uint32_t Cpsr; + uint32_t InstructionCount; + uint8_t InstructionStream[DBGKD_MAXSTREAM]; +} ARM_DBGKD_CONTROL_REPORT, *PARM_DBGKD_CONTROL_REPORT; + +typedef struct _DBGKD_ANY_CONTROL_REPORT { + union { + X86_DBGKD_CONTROL_REPORT X86ControlReport; + ALPHA_DBGKD_CONTROL_REPORT AlphaControlReport; + IA64_DBGKD_CONTROL_REPORT IA64ControlReport; + AMD64_DBGKD_CONTROL_REPORT Amd64ControlReport; + ARM_DBGKD_CONTROL_REPORT ARMControlReport; + }; +} DBGKD_ANY_CONTROL_REPORT, *PDBGKD_ANY_CONTROL_REPORT; + +#if defined(TARGET_I386) +typedef X86_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REP= ORT; +#elif defined(TARGET_X86_64) +typedef AMD64_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_R= EPORT; +#elif defined(TARGET_ARM) +typedef ARM_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REP= ORT; +#else +#error Unsupported Architecture +#endif + +/* + * DBGKD Structure for Debug I/O Type Print String + */ +typedef struct _DBGKD_PRINT_STRING { + uint32_t LengthOfString; +} DBGKD_PRINT_STRING, *PDBGKD_PRINT_STRING; + +/* + * DBGKD Structure for Debug I/O Type Get String + */ +typedef struct _DBGKD_GET_STRING { + uint32_t LengthOfPromptString; + uint32_t LengthOfStringRead; +} DBGKD_GET_STRING, *PDBGKD_GET_STRING; + +/* + * DBGKD Structure for Debug I/O + */ +typedef struct _DBGKD_DEBUG_IO { + uint32_t ApiNumber; + uint16_t ProcessorLevel; + uint16_t Processor; + union { + DBGKD_PRINT_STRING PrintString; + DBGKD_GET_STRING GetString; + } u; +} DBGKD_DEBUG_IO, *PDBGKD_DEBUG_IO; + +/* + * DBGkD Structure for Command String + */ +typedef struct _DBGKD_COMMAND_STRING { + uint32_t Flags; + uint32_t Reserved1; + uint64_t Reserved2[7]; +} DBGKD_COMMAND_STRING, *PDBGKD_COMMAND_STRING; + +/* + * DBGKD Structure for Load Symbols + */ +typedef struct _DBGKD_LOAD_SYMBOLS32 { + uint32_t PathNameLength; + uint32_t BaseOfDll; + uint32_t ProcessId; + uint32_t CheckSum; + uint32_t SizeOfImage; + boolean_t UnloadSymbols; +} DBGKD_LOAD_SYMBOLS32, *PDBGKD_LOAD_SYMBOLS32; + +typedef struct _DBGKD_LOAD_SYMBOLS64 { + uint32_t PathNameLength; + uint64_t BaseOfDll; + uint64_t ProcessId; + uint32_t CheckSum; + uint32_t SizeOfImage; + boolean_t UnloadSymbols; +} DBGKD_LOAD_SYMBOLS64, *PDBGKD_LOAD_SYMBOLS64; + +/* + * DBGKD Structure for Wait State Change + */ +typedef struct _DBGKD_WAIT_STATE_CHANGE32 { + uint32_t NewState; + uint16_t ProcessorLevel; + uint16_t Processor; + uint32_t NumberProcessors; + uint32_t Thread; + uint32_t ProgramCounter; + union { + DBGKM_EXCEPTION32 Exception; + DBGKD_LOAD_SYMBOLS32 LoadSymbols; + } u; +} DBGKD_WAIT_STATE_CHANGE32, *PDBGKD_WAIT_STATE_CHANGE32; + +typedef struct _DBGKD_WAIT_STATE_CHANGE64 { + uint32_t NewState; + uint16_t ProcessorLevel; + uint16_t Processor; + uint32_t NumberProcessors; + uint64_t Thread; + uint64_t ProgramCounter; + union { + DBGKM_EXCEPTION64 Exception; + DBGKD_LOAD_SYMBOLS64 LoadSymbols; + } u; +} DBGKD_WAIT_STATE_CHANGE64, *PDBGKD_WAIT_STATE_CHANGE64; + +typedef struct _DBGKD_ANY_WAIT_STATE_CHANGE { + uint32_t NewState; + uint16_t ProcessorLevel; + uint16_t Processor; + uint32_t NumberProcessors; + uint64_t Thread; + uint64_t ProgramCounter; + union { + DBGKM_EXCEPTION64 Exception; + DBGKD_LOAD_SYMBOLS64 LoadSymbols; + DBGKD_COMMAND_STRING CommandString; + } u; + union { + DBGKD_CONTROL_REPORT ControlReport; + DBGKD_ANY_CONTROL_REPORT AnyControlReport; + }; +} DBGKD_ANY_WAIT_STATE_CHANGE, *PDBGKD_ANY_WAIT_STATE_CHANGE; + +/* + * DBGKD Manipulate Structures + */ +typedef struct _DBGKD_READ_MEMORY32 { + uint32_t TargetBaseAddress; + uint32_t TransferCount; + uint32_t ActualBytesRead; +} DBGKD_READ_MEMORY32, *PDBGKD_READ_MEMORY32; + +typedef struct _DBGKD_READ_MEMORY64 { + uint64_t TargetBaseAddress; + uint32_t TransferCount; + uint32_t ActualBytesRead; +} DBGKD_READ_MEMORY64, *PDBGKD_READ_MEMORY64; + +typedef struct _DBGKD_WRITE_MEMORY32 { + uint32_t TargetBaseAddress; + uint32_t TransferCount; + uint32_t ActualBytesWritten; +} DBGKD_WRITE_MEMORY32, *PDBGKD_WRITE_MEMORY32; + +typedef struct _DBGKD_WRITE_MEMORY64 { + uint64_t TargetBaseAddress; + uint32_t TransferCount; + uint32_t ActualBytesWritten; +} DBGKD_WRITE_MEMORY64, *PDBGKD_WRITE_MEMORY64; + +typedef struct _DBGKD_GET_CONTEXT { + uint32_t Unused; +} DBGKD_GET_CONTEXT, *PDBGKD_GET_CONTEXT; + +typedef struct _DBGKD_SET_CONTEXT { + uint32_t ContextFlags; +} DBGKD_SET_CONTEXT, *PDBGKD_SET_CONTEXT; + +typedef struct _DBGKD_WRITE_BREAKPOINT32 { + uint32_t BreakPointAddress; + uint32_t BreakPointHandle; +} DBGKD_WRITE_BREAKPOINT32, *PDBGKD_WRITE_BREAKPOINT32; + +typedef struct _DBGKD_WRITE_BREAKPOINT64 { + uint64_t BreakPointAddress; + uint32_t BreakPointHandle; +} DBGKD_WRITE_BREAKPOINT64, *PDBGKD_WRITE_BREAKPOINT64; + +typedef struct _DBGKD_RESTORE_BREAKPOINT { + uint32_t BreakPointHandle; +} DBGKD_RESTORE_BREAKPOINT, *PDBGKD_RESTORE_BREAKPOINT; + +typedef struct _DBGKD_CONTINUE { + ntstatus_t ContinueStatus; +} DBGKD_CONTINUE, *PDBGKD_CONTINUE; + +#pragma pack(push, 4) +typedef struct _DBGKD_CONTINUE2 { + ntstatus_t ContinueStatus; + union { + DBGKD_CONTROL_SET ControlSet; + DBGKD_ANY_CONTROL_SET AnyControlSet; + }; +} DBGKD_CONTINUE2, *PDBGKD_CONTINUE2; +#pragma pack(pop) + +typedef struct _DBGKD_READ_WRITE_IO32 { + uint32_t IoAddress; + uint32_t DataSize; + uint32_t DataValue; +} DBGKD_READ_WRITE_IO32, *PDBGKD_READ_WRITE_IO32; + +typedef struct _DBGKD_READ_WRITE_IO64 { + uint64_t IoAddress; + uint32_t DataSize; + uint32_t DataValue; +} DBGKD_READ_WRITE_IO64, *PDBGKD_READ_WRITE_IO64; + +typedef struct _DBGKD_READ_WRITE_IO_EXTENDED32 { + uint32_t DataSize; + uint32_t InterfaceType; + uint32_t BusNumber; + uint32_t AddressSpace; + uint32_t IoAddress; + uint32_t DataValue; +} DBGKD_READ_WRITE_IO_EXTENDED32, *PDBGKD_READ_WRITE_IO_EXTENDED32; + +typedef struct _DBGKD_READ_WRITE_IO_EXTENDED64 { + uint32_t DataSize; + uint32_t InterfaceType; + uint32_t BusNumber; + uint32_t AddressSpace; + uint64_t IoAddress; + uint32_t DataValue; +} DBGKD_READ_WRITE_IO_EXTENDED64, *PDBGKD_READ_WRITE_IO_EXTENDED64; + +typedef struct _DBGKD_READ_WRITE_MSR { + uint32_t Msr; + uint32_t DataValueLow; + uint32_t DataValueHigh; +} DBGKD_READ_WRITE_MSR, *PDBGKD_READ_WRITE_MSR; + +typedef struct _DBGKD_QUERY_SPECIAL_CALLS { + uint32_t NumberOfSpecialCalls; +} DBGKD_QUERY_SPECIAL_CALLS, *PDBGKD_QUERY_SPECIAL_CALLS; + +typedef struct _DBGKD_SET_SPECIAL_CALL32 { + uint32_t SpecialCall; +} DBGKD_SET_SPECIAL_CALL32, *PDBGKD_SET_SPECIAL_CALL32; + +typedef struct _DBGKD_SET_SPECIAL_CALL64 { + uint64_t SpecialCall; +} DBGKD_SET_SPECIAL_CALL64, *PDBGKD_SET_SPECIAL_CALL64; + +typedef struct _DBGKD_SET_INTERNAL_BREAKPOINT32 { + uint32_t BreakpointAddress; + uint32_t Flags; +} DBGKD_SET_INTERNAL_BREAKPOINT32, *PDBGKD_SET_INTERNAL_BREAKPOINT32; + +typedef struct _DBGKD_SET_INTERNAL_BREAKPOINT64 { + uint64_t BreakpointAddress; + uint32_t Flags; +} DBGKD_SET_INTERNAL_BREAKPOINT64, *PDBGKD_SET_INTERNAL_BREAKPOINT64; + +typedef struct _DBGKD_GET_INTERNAL_BREAKPOINT32 { + uint32_t BreakpointAddress; + uint32_t Flags; + uint32_t Calls; + uint32_t MaxCallsPerPeriod; + uint32_t MinInstructions; + uint32_t MaxInstructions; + uint32_t TotalInstructions; +} DBGKD_GET_INTERNAL_BREAKPOINT32, *PDBGKD_GET_INTERNAL_BREAKPOINT32; + +typedef struct _DBGKD_GET_INTERNAL_BREAKPOINT64 { + uint64_t BreakpointAddress; + uint32_t Flags; + uint32_t Calls; + uint32_t MaxCallsPerPeriod; + uint32_t MinInstructions; + uint32_t MaxInstructions; + uint32_t TotalInstructions; +} DBGKD_GET_INTERNAL_BREAKPOINT64, *PDBGKD_GET_INTERNAL_BREAKPOINT64; + +typedef struct _DBGKD_GET_VERSION32 { + uint16_t MajorVersion; + uint16_t MinorVersion; + uint16_t ProtocolVersion; + uint16_t Flags; + uint32_t KernBase; + uint32_t PsLoadedModuleList; + uint16_t MachineType; + uint16_t ThCallbackStack; + uint16_t NextCallback; + uint16_t FramePointer; + uint32_t KiCallUserMode; + uint32_t KeUserCallbackDispatcher; + uint32_t BreakpointWithStatus; + uint32_t DebuggerDataList; +} DBGKD_GET_VERSION32, *PDBGKD_GET_VERSION32; + +typedef struct _DBGKD_GET_VERSION64 { + uint16_t MajorVersion; + uint16_t MinorVersion; + uint8_t ProtocolVersion; + uint8_t KdSecondaryVersion; + uint16_t Flags; + uint16_t MachineType; + uint8_t MaxPacketType; + uint8_t MaxStateChange; + uint8_t MaxManipulate; + uint8_t Simulation; + uint16_t Unused[1]; + uint64_t KernBase; + uint64_t PsLoadedModuleList; + uint64_t DebuggerDataList; +} DBGKD_GET_VERSION64, *PDBGKD_GET_VERSION64; + +typedef struct _DBGKD_BREAKPOINTEX { + uint32_t BreakPointCount; + ntstatus_t ContinueStatus; +} DBGKD_BREAKPOINTEX, *PDBGKD_BREAKPOINTEX; + +typedef struct _DBGKD_SEARCH_MEMORY { + union { + uint64_t SearchAddress; + uint64_t FoundAddress; + }; + uint64_t SearchLength; + uint32_t PatternLength; +} DBGKD_SEARCH_MEMORY, *PDBGKD_SEARCH_MEMORY; + +typedef struct _DBGKD_GET_SET_BUS_DATA { + uint32_t BusDataType; + uint32_t BusNumber; + uint32_t SlotNumber; + uint32_t Offset; + uint32_t Length; +} DBGKD_GET_SET_BUS_DATA, *PDBGKD_GET_SET_BUS_DATA; + +typedef struct _DBGKD_FILL_MEMORY { + uint64_t Address; + uint32_t Length; + uint16_t Flags; + uint16_t PatternLength; +} DBGKD_FILL_MEMORY, *PDBGKD_FILL_MEMORY; + +typedef struct _DBGKD_QUERY_MEMORY { + uint64_t Address; + uint64_t Reserved; + uint32_t AddressSpace; + uint32_t Flags; +} DBGKD_QUERY_MEMORY, *PDBGKD_QUERY_MEMORY; + +typedef struct _DBGKD_SWITCH_PARTITION { + uint32_t Partition; +} DBGKD_SWITCH_PARTITION; + +/* + * DBGKD Structure for Manipulate + */ +typedef struct _DBGKD_MANIPULATE_STATE32 { + uint32_t ApiNumber; + uint16_t ProcessorLevel; + uint16_t Processor; + ntstatus_t ReturnStatus; + union { + DBGKD_READ_MEMORY32 ReadMemory; + DBGKD_WRITE_MEMORY32 WriteMemory; + DBGKD_READ_MEMORY64 ReadMemory64; + DBGKD_WRITE_MEMORY64 WriteMemory64; + DBGKD_GET_CONTEXT GetContext; + DBGKD_SET_CONTEXT SetContext; + DBGKD_WRITE_BREAKPOINT32 WriteBreakPoint; + DBGKD_RESTORE_BREAKPOINT RestoreBreakPoint; + DBGKD_CONTINUE Continue; + DBGKD_CONTINUE2 Continue2; + DBGKD_READ_WRITE_IO32 ReadWriteIo; + DBGKD_READ_WRITE_IO_EXTENDED32 ReadWriteIoExtended; + DBGKD_QUERY_SPECIAL_CALLS QuerySpecialCalls; + DBGKD_SET_SPECIAL_CALL32 SetSpecialCall; + DBGKD_SET_INTERNAL_BREAKPOINT32 SetInternalBreakpoint; + DBGKD_GET_INTERNAL_BREAKPOINT32 GetInternalBreakpoint; + DBGKD_GET_VERSION32 GetVersion32; + DBGKD_BREAKPOINTEX BreakPointEx; + DBGKD_READ_WRITE_MSR ReadWriteMsr; + DBGKD_SEARCH_MEMORY SearchMemory; + DBGKD_GET_SET_BUS_DATA GetSetBusData; + DBGKD_FILL_MEMORY FillMemory; + DBGKD_QUERY_MEMORY QueryMemory; + DBGKD_SWITCH_PARTITION SwitchPartition; + } u; +} DBGKD_MANIPULATE_STATE32, *PDBGKD_MANIPULATE_STATE32; + +typedef struct _DBGKD_MANIPULATE_STATE64 { + uint32_t ApiNumber; + uint16_t ProcessorLevel; + uint16_t Processor; + ntstatus_t ReturnStatus; + union { + DBGKD_READ_MEMORY64 ReadMemory; + DBGKD_WRITE_MEMORY64 WriteMemory; + DBGKD_GET_CONTEXT GetContext; + DBGKD_SET_CONTEXT SetContext; + DBGKD_WRITE_BREAKPOINT64 WriteBreakPoint; + DBGKD_RESTORE_BREAKPOINT RestoreBreakPoint; + DBGKD_CONTINUE Continue; + DBGKD_CONTINUE2 Continue2; + DBGKD_READ_WRITE_IO64 ReadWriteIo; + DBGKD_READ_WRITE_IO_EXTENDED64 ReadWriteIoExtended; + DBGKD_QUERY_SPECIAL_CALLS QuerySpecialCalls; + DBGKD_SET_SPECIAL_CALL64 SetSpecialCall; + DBGKD_SET_INTERNAL_BREAKPOINT64 SetInternalBreakpoint; + DBGKD_GET_INTERNAL_BREAKPOINT64 GetInternalBreakpoint; + DBGKD_GET_VERSION64 GetVersion64; + DBGKD_BREAKPOINTEX BreakPointEx; + DBGKD_READ_WRITE_MSR ReadWriteMsr; + DBGKD_SEARCH_MEMORY SearchMemory; + DBGKD_GET_SET_BUS_DATA GetSetBusData; + DBGKD_FILL_MEMORY FillMemory; + DBGKD_QUERY_MEMORY QueryMemory; + DBGKD_SWITCH_PARTITION SwitchPartition; + } u; +} DBGKD_MANIPULATE_STATE64, *PDBGKD_MANIPULATE_STATE64; + +/* + * File I/O Structure + */ +typedef struct _DBGKD_CREATE_FILE { + uint32_t DesiredAccess; + uint32_t FileAttributes; + uint32_t ShareAccess; + uint32_t CreateDisposition; + uint32_t CreateOptions; + uint64_t Handle; + uint64_t Length; +} DBGKD_CREATE_FILE, *PDBGKD_CREATE_FILE; + +typedef struct _DBGKD_READ_FILE { + uint64_t Handle; + uint64_t Offset; + uint32_t Length; +} DBGKD_READ_FILE, *PDBGKD_READ_FILE; + +typedef struct _DBGKD_WRITE_FILE { + uint64_t Handle; + uint64_t Offset; + uint32_t Length; +} DBGKD_WRITE_FILE, *PDBGKD_WRITE_FILE; + +typedef struct _DBGKD_CLOSE_FILE { + uint64_t Handle; +} DBGKD_CLOSE_FILE, *PDBGKD_CLOSE_FILE; + +typedef struct _DBGKD_FILE_IO { + uint32_t ApiNumber; + uint32_t Status; + union { + uint64_t ReserveSpace[7]; + DBGKD_CREATE_FILE CreateFile; + DBGKD_READ_FILE ReadFile; + DBGKD_WRITE_FILE WriteFile; + DBGKD_CLOSE_FILE CloseFile; + } u; +} DBGKD_FILE_IO, *PDBGKD_FILE_IO; + + +/* + * Control Request Structure + */ +typedef struct _DBGKD_REQUEST_BREAKPOINT { + uint32_t HardwareBreakPointNumber; + uint32_t Available; +} DBGKD_REQUEST_BREAKPOINT, *PDBGKD_REQUEST_BREAKPOINT; + +typedef struct _DBGKD_RELEASE_BREAKPOINT { + uint32_t HardwareBreakPointNumber; + uint32_t Released; +} DBGKD_RELEASE_BREAKPOINT, *PDBGKD_RELEASE_BREAKPOINT; + +typedef struct _DBGKD_CONTROL_REQUEST { + uint32_t ApiNumber; + union { + DBGKD_REQUEST_BREAKPOINT RequestBreakpoint; + DBGKD_RELEASE_BREAKPOINT ReleaseBreakpoint; + } u; +} DBGKD_CONTROL_REQUEST, *PDBGKD_CONTROL_REQUEST; + +/* + * Trace I/O Structure + */ +typedef struct _DBGKD_PRINT_TRACE { + uint32_t LengthOfData; +} DBGKD_PRINT_TRACE, *PDBGKD_PRINT_TRACE; + +typedef struct _DBGKD_TRACE_IO { + uint32_t ApiNumber; + uint16_t ProcessorLevel; + uint16_t Processor; + union { + uint64_t ReserveSpace[7]; + DBGKD_PRINT_TRACE PrintTrace; + } u; +} DBGKD_TRACE_IO, *PDBGKD_TRACE_IO; + +#endif diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 67d190bf6c..2390597f1f 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -14,5 +14,6 @@ =20 #include "qemu/osdep.h" #include "exec/windbgstub.h" +#include "exec/windbgkd.h" =20 #endif From nobody Sun Apr 28 23:53:21 2024 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 1511273565684998.2243154179795; Tue, 21 Nov 2017 06:12:45 -0800 (PST) Received: from localhost ([::1]:34635 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Hz-00048j-TD for importer@patchew.org; Tue, 21 Nov 2017 09:12:39 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38910) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9D7-0008As-KP for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9D6-0002Af-KY for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:37 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37672) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9D6-00028k-Bc for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:36 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 089AB54006E; Tue, 21 Nov 2017 17:07:35 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:07:33 +0300 Message-ID: <151127325284.6888.645379954526299685.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 03/45] windbg: modified windbgkd.h 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 Added useful name arrays of some defines. Not used yet. Needs for the futur= e. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgkd.h | 75 +++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 75 insertions(+) diff --git a/include/exec/windbgkd.h b/include/exec/windbgkd.h index b8f98925e7..40a23f8cd0 100755 --- a/include/exec/windbgkd.h +++ b/include/exec/windbgkd.h @@ -870,4 +870,79 @@ typedef struct _DBGKD_TRACE_IO { } u; } DBGKD_TRACE_IO, *PDBGKD_TRACE_IO; =20 +__attribute__ ((unused)) /* maybe unused */ +static const char *kd_api_names[] =3D { + "DbgKdReadVirtualMemoryApi", + "DbgKdWriteVirtualMemoryApi", + "DbgKdGetContextApi", + "DbgKdSetContextApi", + "DbgKdWriteBreakPointApi", + "DbgKdRestoreBreakPointApi", + "DbgKdContinueApi", + "DbgKdReadControlSpaceApi", + "DbgKdWriteControlSpaceApi", + "DbgKdReadIoSpaceApi", + "DbgKdWriteIoSpaceApi", + "DbgKdRebootApi", + "DbgKdContinueApi2", + "DbgKdReadPhysicalMemoryApi", + "DbgKdWritePhysicalMemoryApi", + "DbgKdQuerySpecialCallsApi", + "DbgKdSetSpecialCallApi", + "DbgKdClearSpecialCallsApi", + "DbgKdSetInternalBreakPointApi", + "DbgKdGetInternalBreakPointApi", + "DbgKdReadIoSpaceExtendedApi", + "DbgKdWriteIoSpaceExtendedApi", + "DbgKdGetVersionApi", + "DbgKdWriteBreakPointExApi", + "DbgKdRestoreBreakPointExApi", + "DbgKdCauseBugCheckApi", + "", + "", + "", + "", + "", + "", + "DbgKdSwitchProcessor", + "DbgKdPageInApi", + "DbgKdReadMachineSpecificRegister", + "DbgKdWriteMachineSpecificRegister", + "OldVlm1", + "OldVlm2", + "DbgKdSearchMemoryApi", + "DbgKdGetBusDataApi", + "DbgKdSetBusDataApi", + "DbgKdCheckLowMemoryApi", + "DbgKdClearAllInternalBreakpointsApi", + "DbgKdFillMemoryApi", + "DbgKdQueryMemoryApi", + "DbgKdSwitchPartition", + "DbgKdUnknownApi" +}; + +__attribute__ ((unused)) /* maybe unused */ +static const char *kd_packet_type_names[] =3D { + "PACKET_TYPE_UNUSED", + "PACKET_TYPE_KD_STATE_CHANGE32", + "PACKET_TYPE_KD_STATE_MANIPULATE", + "PACKET_TYPE_KD_DEBUG_IO", + "PACKET_TYPE_KD_ACKNOWLEDGE", + "PACKET_TYPE_KD_RESEND", + "PACKET_TYPE_KD_RESET", + "PACKET_TYPE_KD_STATE_CHANGE64", + "PACKET_TYPE_KD_POLL_BREAKIN", + "PACKET_TYPE_KD_TRACE_IO", + "PACKET_TYPE_KD_CONTROL_REQUEST", + "PACKET_TYPE_KD_FILE_IO", + "PACKET_TYPE_MAX" +}; + +#define KD_API_NAME(id) \ + (id >=3D DbgKdMinimumManipulate && id < DbgKdMaximumManipulate) ? \ + kd_api_names[id - DbgKdMinimumManipulate] : \ + kd_api_names[DbgKdMaximumManipulate - DbgKdMinimumManipulate] \ + +#define KD_PKT_TYPE_NAME(id) kd_packet_type_names[id] + #endif From nobody Sun Apr 28 23:53:21 2024 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 1511273409560766.9267792677684; Tue, 21 Nov 2017 06:10:09 -0800 (PST) Received: from localhost ([::1]:34620 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FK-0001NF-H9 for importer@patchew.org; Tue, 21 Nov 2017 09:09:54 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38963) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9DC-0008Dv-OT for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9DB-0002Dh-La for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:42 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37700) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9DB-0002DM-Ch for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:41 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id A684C54006E; Tue, 21 Nov 2017 17:07:40 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:07:38 +0300 Message-ID: <151127325841.6888.4039843361196679687.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 04/45] windbg: added '-windbg' option 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 This option starts windbg server. Signed-off-by: Mihail Abakumov Acked-by: Alistair Francis Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- qemu-options.hx | 8 ++++++++ vl.c | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/qemu-options.hx b/qemu-options.hx index 9f6e2adfff..1c84eb56d9 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -3544,6 +3544,14 @@ Shorthand for -gdb tcp::1234, i.e. open a gdbserver = on TCP port 1234 (@pxref{gdb_usage}). ETEXI =20 +DEF("windbg", HAS_ARG, QEMU_OPTION_windbg, \ + "-windbg wait for windbg connection\n", QEMU_ARCH_I386) +STEXI +@item -windbg +@findex -windbg +Wait for windbg connection. +ETEXI + DEF("d", HAS_ARG, QEMU_OPTION_d, \ "-d item1,... enable logging of specified items (use '-d help' for = a list of log items)\n", QEMU_ARCH_ALL) diff --git a/vl.c b/vl.c index 8e247cc2a2..d6378cf03f 100644 --- a/vl.c +++ b/vl.c @@ -80,6 +80,7 @@ int main(int argc, char **argv) #include "sysemu/sysemu.h" #include "sysemu/numa.h" #include "exec/gdbstub.h" +#include "exec/windbgstub.h" #include "qemu/timer.h" #include "chardev/char.h" #include "qemu/bitmap.h" @@ -2436,6 +2437,7 @@ struct device_config { DEV_VIRTCON, /* -virtioconsole */ DEV_DEBUGCON, /* -debugcon */ DEV_GDB, /* -gdb, -s */ + DEV_WINDBG, /* -windbg */ DEV_SCLP, /* s390 sclp */ } type; const char *cmdline; @@ -3445,6 +3447,9 @@ int main(int argc, char **argv, char **envp) case QEMU_OPTION_gdb: add_device_config(DEV_GDB, optarg); break; + case QEMU_OPTION_windbg: + add_device_config(DEV_WINDBG, optarg); + break; case QEMU_OPTION_L: if (is_help_option(optarg)) { list_data_dirs =3D true; @@ -4586,6 +4591,9 @@ int main(int argc, char **argv, char **envp) exit(1); } =20 + if (foreach_device_config(DEV_WINDBG, windbg_server_start) < 0) { + exit(1); + } if (foreach_device_config(DEV_SERIAL, serial_parse) < 0) exit(1); if (foreach_device_config(DEV_PARALLEL, parallel_parse) < 0) From nobody Sun Apr 28 23:53:21 2024 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 1511273585090997.8350928156909; Tue, 21 Nov 2017 06:13:05 -0800 (PST) Received: from localhost ([::1]:34636 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9I5-0004DI-PG for importer@patchew.org; Tue, 21 Nov 2017 09:12:45 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39058) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9DL-0008On-GX for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9DH-0002H3-CQ for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:51 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37720) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9DH-0002GS-46 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:47 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 5B4AA54006E; Tue, 21 Nov 2017 17:07:46 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:07:44 +0300 Message-ID: <151127326409.6888.9209413226035587910.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 05/45] windbg: added helper features 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 Added some helper features for windbgstub. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 27 +++++++++++++++++++++++++++ include/exec/windbgstub.h | 6 ++++++ 2 files changed, 33 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 2390597f1f..e9f5223e94 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -13,7 +13,34 @@ #define WINDBGSTUB_UTILS_H =20 #include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "log.h" +#include "cpu.h" #include "exec/windbgstub.h" #include "exec/windbgkd.h" =20 +#define WINDBG_DEBUG(...) do { \ + if (WINDBG_DEBUG_ON) { \ + qemu_log(WINDBG ": " __VA_ARGS__); \ + qemu_log("\n"); \ + } \ +} while (false) + +#define WINDBG_ERROR(...) error_report(WINDBG ": " __VA_ARGS__) + +#define FMT_ADDR "addr:0x" TARGET_FMT_lx +#define FMT_ERR "Error:%d" + +#define UINT8_P(ptr) ((uint8_t *) (ptr)) +#define UINT32_P(ptr) ((uint32_t *) (ptr)) +#define PTR(var) UINT8_P(&var) + +#define sizeof_field(type, field) sizeof(((type *) NULL)->field) + +#define READ_VMEM(cpu, addr, type) ({ \ + type _t; \ + cpu_memory_rw_debug(cpu, addr, PTR(_t), sizeof(type), 0); \ + _t; \ +}) + #endif diff --git a/include/exec/windbgstub.h b/include/exec/windbgstub.h index 1a6e1cc6e5..21bc552e58 100755 --- a/include/exec/windbgstub.h +++ b/include/exec/windbgstub.h @@ -12,6 +12,12 @@ #ifndef WINDBGSTUB_H #define WINDBGSTUB_H =20 +#define WINDBG "windbg" + +#ifndef WINDBG_DEBUG_ON +#define WINDBG_DEBUG_ON false +#endif + int windbg_server_start(const char *device); =20 #endif From nobody Sun Apr 28 23:53:21 2024 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 1511273732735556.1650602651284; Tue, 21 Nov 2017 06:15:32 -0800 (PST) Received: from localhost ([::1]:34649 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Kh-0006Oq-1T for importer@patchew.org; Tue, 21 Nov 2017 09:15:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39074) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9DN-0008R6-R2 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9DM-0002KY-SM for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:53 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37746) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9DM-0002KP-Ka for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:52 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id F162A54006F; Tue, 21 Nov 2017 17:07:51 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:07:50 +0300 Message-ID: <151127326975.6888.7412598949426946227.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 06/45] windbg: added WindbgState 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 Added definition of the WindbgState struct and its initialization. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- windbgstub.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/windbgstub.c b/windbgstub.c index 3830446988..0863da73fd 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -10,10 +10,38 @@ */ =20 #include "qemu/osdep.h" +#include "qapi/error.h" +#include "chardev/char.h" +#include "chardev/char-fe.h" +#include "qemu/cutils.h" #include "exec/windbgstub.h" #include "exec/windbgstub-utils.h" =20 +typedef struct WindbgState { + bool is_loaded; + + uint32_t ctrl_packet_id; + uint32_t data_packet_id; +} WindbgState; + +static WindbgState *windbg_state; + +static void windbg_exit(void) +{ + g_free(windbg_state); +} + int windbg_server_start(const char *device) { + if (windbg_state) { + WINDBG_ERROR("Multiple instances of windbg are not supported."); + exit(1); + } + + windbg_state =3D g_new0(WindbgState, 1); + windbg_state->ctrl_packet_id =3D RESET_PACKET_ID; + windbg_state->data_packet_id =3D INITIAL_PACKET_ID; + + atexit(windbg_exit); return 0; } From nobody Sun Apr 28 23:53:21 2024 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 1511273902689182.01515228146286; Tue, 21 Nov 2017 06:18:22 -0800 (PST) Received: from localhost ([::1]:34666 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9NU-0000jC-Uc for importer@patchew.org; Tue, 21 Nov 2017 09:18:20 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39134) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9DW-0000Dk-L3 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9DS-0002Mq-Hy for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:02 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37764) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9DS-0002Mb-9h for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:07:58 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 92EF254006E; Tue, 21 Nov 2017 17:07:57 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:07:55 +0300 Message-ID: <151127327535.6888.327046308949031767.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 07/45] windbg: added chardev 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 Added chardev for listening to windbg. Target device is a parameter in the = '-windbg' option. Signed-off-by: Mihail Abakumov Acked-by: Alistair Francis Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- windbgstub.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/windbgstub.c b/windbgstub.c index 0863da73fd..e30b8500e0 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -20,12 +20,26 @@ typedef struct WindbgState { bool is_loaded; =20 + CharBackend chr; + uint32_t ctrl_packet_id; uint32_t data_packet_id; } WindbgState; =20 static WindbgState *windbg_state; =20 +static int windbg_chr_can_receive(void *opaque) +{ + return PACKET_MAX_SIZE; +} + +static void windbg_chr_receive(void *opaque, const uint8_t *buf, int size) +{ + if (windbg_state->is_loaded) { + /* T0D0: parse data */ + } +} + static void windbg_exit(void) { g_free(windbg_state); @@ -33,15 +47,31 @@ static void windbg_exit(void) =20 int windbg_server_start(const char *device) { + Chardev *chr =3D NULL; + if (windbg_state) { WINDBG_ERROR("Multiple instances of windbg are not supported."); exit(1); } =20 + if (!strstart(device, "pipe:", NULL)) { + WINDBG_ERROR("Unsupported device. Supported only pipe."); + exit(1); + } + windbg_state =3D g_new0(WindbgState, 1); windbg_state->ctrl_packet_id =3D RESET_PACKET_ID; windbg_state->data_packet_id =3D INITIAL_PACKET_ID; =20 + chr =3D qemu_chr_new_noreplay(WINDBG, device); + if (!chr) { + return -1; + } + + qemu_chr_fe_init(&windbg_state->chr, chr, &error_abort); + qemu_chr_fe_set_handlers(&windbg_state->chr, windbg_chr_can_receive, + windbg_chr_receive, NULL, NULL, NULL, NULL, t= rue); + atexit(windbg_exit); return 0; } From nobody Sun Apr 28 23:53:21 2024 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 1511273561546803.4873227172474; Tue, 21 Nov 2017 06:12:41 -0800 (PST) Received: from localhost ([::1]:34634 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Hq-00040X-MD for importer@patchew.org; Tue, 21 Nov 2017 09:12:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39215) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Di-0000S1-6c for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9DY-0002PX-B9 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:14 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37792) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9DX-0002PM-VJ for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:04 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 4983854006E; Tue, 21 Nov 2017 17:08:03 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:01 +0300 Message-ID: <151127328100.6888.1314154510098298370.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 08/45] windbg: hook to wrmsr operation 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 Inserted hook to wrmsr operation. Windows Kernel put address on KPCR struct= to fs/gs (x32/x64) register. Needs catch this moment and allow windbg serv= er handle packets. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 2 ++ include/exec/windbgstub.h | 1 + stubs/windbgstub.c | 3 +++ target/i386/misc_helper.c | 3 +++ target/i386/windbgstub.c | 10 ++++++++++ windbgstub.c | 13 +++++++++++++ 6 files changed, 32 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index e9f5223e94..4232aeb59d 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -43,4 +43,6 @@ _t; \ }) =20 +bool windbg_on_load(void); + #endif diff --git a/include/exec/windbgstub.h b/include/exec/windbgstub.h index 21bc552e58..309f692383 100755 --- a/include/exec/windbgstub.h +++ b/include/exec/windbgstub.h @@ -18,6 +18,7 @@ #define WINDBG_DEBUG_ON false #endif =20 +void windbg_try_load(void); int windbg_server_start(const char *device); =20 #endif diff --git a/stubs/windbgstub.c b/stubs/windbgstub.c index 4951f59203..bd7e2dccd1 100755 --- a/stubs/windbgstub.c +++ b/stubs/windbgstub.c @@ -12,6 +12,9 @@ #include "qemu/osdep.h" #include "exec/windbgstub.h" =20 +void windbg_try_load(void) +{} + int windbg_server_start(const char *device) { return 0; diff --git a/target/i386/misc_helper.c b/target/i386/misc_helper.c index 628f64aad5..ec1fcd2899 100644 --- a/target/i386/misc_helper.c +++ b/target/i386/misc_helper.c @@ -24,6 +24,7 @@ #include "exec/exec-all.h" #include "exec/cpu_ldst.h" #include "exec/address-spaces.h" +#include "exec/windbgstub.h" =20 void helper_outb(CPUX86State *env, uint32_t port, uint32_t data) { @@ -385,6 +386,8 @@ void helper_wrmsr(CPUX86State *env) /* XXX: exception? */ break; } + + windbg_try_load(); } =20 void helper_rdmsr(CPUX86State *env) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index df89e1edd8..0938f738e6 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -10,3 +10,13 @@ */ =20 #include "qemu/osdep.h" + +#ifndef TARGET_X86_64 +#include "exec/windbgstub-utils.h" + +bool windbg_on_load(void) +{ + return false; +} + +#endif diff --git a/windbgstub.c b/windbgstub.c index e30b8500e0..a2a6eb81b4 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -16,6 +16,7 @@ #include "qemu/cutils.h" #include "exec/windbgstub.h" #include "exec/windbgstub-utils.h" +#include "sysemu/kvm.h" =20 typedef struct WindbgState { bool is_loaded; @@ -45,6 +46,13 @@ static void windbg_exit(void) g_free(windbg_state); } =20 +void windbg_try_load(void) +{ + if (windbg_state && !windbg_state->is_loaded) { + windbg_state->is_loaded =3D windbg_on_load(); + } +} + int windbg_server_start(const char *device) { Chardev *chr =3D NULL; @@ -54,6 +62,11 @@ int windbg_server_start(const char *device) exit(1); } =20 + if (kvm_enabled()) { + WINDBG_ERROR("KVM is not supported."); + exit(1); + } + if (!strstart(device, "pipe:", NULL)) { WINDBG_ERROR("Unsupported device. Supported only pipe."); exit(1); From nobody Sun Apr 28 23:53:21 2024 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 1511274256256729.4002333324642; Tue, 21 Nov 2017 06:24:16 -0800 (PST) Received: from localhost ([::1]:34700 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9TD-000647-FY for importer@patchew.org; Tue, 21 Nov 2017 09:24:15 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39213) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Di-0000Rv-49 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9De-0002Qz-1j for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:14 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37816) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Dd-0002Qt-LD for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:09 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id E2A9854006E; Tue, 21 Nov 2017 17:08:08 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:06 +0300 Message-ID: <151127328668.6888.9294226422584847751.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 09/45] windbg: handler of fs/gs register 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 Added handler of fs/gs register. It tries to find and check KPCR and versio= n address. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 8 ++++++ target/i386/windbgstub.c | 49 +++++++++++++++++++++++++++++++++++= +++- windbgstub-utils.c | 13 ++++++++++ windbgstub.c | 10 ++++++++ 4 files changed, 79 insertions(+), 1 deletion(-) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 4232aeb59d..42dbca1e22 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -43,6 +43,14 @@ _t; \ }) =20 +typedef struct InitedAddr { + target_ulong addr; + bool is_init; +} InitedAddr; + +InitedAddr *windbg_get_KPCR(void); +InitedAddr *windbg_get_version(void); + bool windbg_on_load(void); =20 #endif diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 0938f738e6..47ee5840ef 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -14,9 +14,56 @@ #ifndef TARGET_X86_64 #include "exec/windbgstub-utils.h" =20 +#ifdef TARGET_X86_64 +# define OFFSET_SELF_PCR 0x18 +# define OFFSET_VERS 0x108 +#else +# define OFFSET_SELF_PCR 0x1C +# define OFFSET_VERS 0x34 +#endif + bool windbg_on_load(void) { - return false; + CPUState *cpu =3D qemu_get_cpu(0); + CPUArchState *env =3D cpu->env_ptr; + InitedAddr *KPCR =3D windbg_get_KPCR(); + InitedAddr *version =3D windbg_get_version(); + + if (!KPCR->is_init) { + + #ifdef TARGET_X86_64 + KPCR->addr =3D env->segs[R_GS].base; + #else + KPCR->addr =3D env->segs[R_FS].base; + #endif + + static target_ulong prev_KPCR; + if (!KPCR->addr || prev_KPCR =3D=3D KPCR->addr) { + return false; + } + prev_KPCR =3D KPCR->addr; + + if (KPCR->addr !=3D READ_VMEM(cpu, KPCR->addr + OFFSET_SELF_PCR, + target_ulong)) { + return false; + } + + KPCR->is_init =3D true; + } + + if (!version->is_init && KPCR->is_init) { + version->addr =3D READ_VMEM(cpu, KPCR->addr + OFFSET_VERS, + target_ulong); + if (!version->addr) { + return false; + } + version->is_init =3D true; + } + + WINDBG_DEBUG("windbg_on_load: KPCR " FMT_ADDR, KPCR->addr); + WINDBG_DEBUG("windbg_on_load: version " FMT_ADDR, version->addr); + + return true; } =20 #endif diff --git a/windbgstub-utils.c b/windbgstub-utils.c index dc5e505c63..347c61553a 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -10,3 +10,16 @@ */ =20 #include "exec/windbgstub-utils.h" + +static InitedAddr KPCR; +static InitedAddr version; + +InitedAddr *windbg_get_KPCR(void) +{ + return &KPCR; +} + +InitedAddr *windbg_get_version(void) +{ + return &version; +} diff --git a/windbgstub.c b/windbgstub.c index a2a6eb81b4..e9aabd807b 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -17,6 +17,7 @@ #include "exec/windbgstub.h" #include "exec/windbgstub-utils.h" #include "sysemu/kvm.h" +#include "sysemu/reset.h" =20 typedef struct WindbgState { bool is_loaded; @@ -46,6 +47,13 @@ static void windbg_exit(void) g_free(windbg_state); } =20 +static void windbg_handle_reset(void *opaque) +{ + windbg_state->is_loaded =3D false; + windbg_get_KPCR()->is_init =3D false; + windbg_get_version()->is_init =3D false; +} + void windbg_try_load(void) { if (windbg_state && !windbg_state->is_loaded) { @@ -85,6 +93,8 @@ int windbg_server_start(const char *device) qemu_chr_fe_set_handlers(&windbg_state->chr, windbg_chr_can_receive, windbg_chr_receive, NULL, NULL, NULL, NULL, t= rue); =20 + qemu_register_reset(windbg_handle_reset, NULL); + atexit(windbg_exit); return 0; } From nobody Sun Apr 28 23:53:21 2024 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 1511274086091889.2245231458313; Tue, 21 Nov 2017 06:21:26 -0800 (PST) Received: from localhost ([::1]:34684 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9QP-00037h-BF for importer@patchew.org; Tue, 21 Nov 2017 09:21:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39232) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Dk-0000TO-BG for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Dj-0002Sb-GR for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:16 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37838) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Dj-0002ST-8W for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:15 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 94E7C54006E; Tue, 21 Nov 2017 17:08:14 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:12 +0300 Message-ID: <151127329238.6888.17213631612102603209.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 10/45] windbg: structures for parsing data stream 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 Added structures for parsing data stream from windbg to packet. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 11 +++++++++++ windbgstub.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 42dbca1e22..2d74fb847a 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -48,6 +48,17 @@ typedef struct InitedAddr { bool is_init; } InitedAddr; =20 +typedef struct PacketData { + union { + struct { + DBGKD_MANIPULATE_STATE64 m64; + uint8_t extra[PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE6= 4)]; + }; + uint8_t buf[PACKET_MAX_SIZE]; + }; + uint16_t extra_size; +} PacketData; + InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); =20 diff --git a/windbgstub.c b/windbgstub.c index e9aabd807b..395f244d4f 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -19,6 +19,36 @@ #include "sysemu/kvm.h" #include "sysemu/reset.h" =20 +typedef enum ParsingState { + STATE_LEADER, + STATE_PACKET_TYPE, + STATE_PACKET_BYTE_COUNT, + STATE_PACKET_ID, + STATE_PACKET_CHECKSUM, + STATE_PACKET_DATA, + STATE_TRAILING_BYTE, +} ParsingState; + +typedef enum ParsingResult { + RESULT_NONE, + RESULT_BREAKIN_BYTE, + RESULT_UNKNOWN_PACKET, + RESULT_CONTROL_PACKET, + RESULT_DATA_PACKET, + RESULT_ERROR, +} ParsingResult; + +typedef struct ParsingContext { + /* index in the current buffer, + which depends on the current state */ + int index; + ParsingState state; + ParsingResult result; + KD_PACKET packet; + PacketData data; + const char *name; +} ParsingContext; + typedef struct WindbgState { bool is_loaded; =20 From nobody Sun Apr 28 23:53:21 2024 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 (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1511273571200619.5573754069321; Tue, 21 Nov 2017 06:12:51 -0800 (PST) Received: from localhost ([::1]:34637 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9I7-0004Dc-Ax for importer@patchew.org; Tue, 21 Nov 2017 09:12:47 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39275) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Dt-0000a3-Ar for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Dp-0002UB-7V for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:25 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37856) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Do-0002Tu-SF for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:21 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 2D6B554006E; Tue, 21 Nov 2017 17:08:20 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:18 +0300 Message-ID: <151127329797.6888.2001141534114518453.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 11/45] windbg: parsing data stream 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 Added function of parsing data stream from windbg to packet. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- windbgstub.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/windbgstub.c b/windbgstub.c index 395f244d4f..ace992e2cb 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -60,6 +60,105 @@ typedef struct WindbgState { =20 static WindbgState *windbg_state; =20 +static void windbg_ctx_handler(ParsingContext *ctx) +{} + +static void windbg_read_byte(ParsingContext *ctx, uint8_t byte) +{ + switch (ctx->state) { + case STATE_LEADER: + ctx->result =3D RESULT_NONE; + if (byte =3D=3D PACKET_LEADER_BYTE || byte =3D=3D CONTROL_PACKET_L= EADER_BYTE) { + if (ctx->index > 0 && byte !=3D PTR(ctx->packet.PacketLeader)[= 0]) { + ctx->index =3D 0; + } + PTR(ctx->packet.PacketLeader)[ctx->index] =3D byte; + ++ctx->index; + if (ctx->index =3D=3D sizeof(ctx->packet.PacketLeader)) { + ctx->state =3D STATE_PACKET_TYPE; + ctx->index =3D 0; + } + } else if (byte =3D=3D BREAKIN_PACKET_BYTE) { + ctx->result =3D RESULT_BREAKIN_BYTE; + ctx->index =3D 0; + } else { + ctx->index =3D 0; + } + break; + + case STATE_PACKET_TYPE: + PTR(ctx->packet.PacketType)[ctx->index] =3D byte; + ++ctx->index; + if (ctx->index =3D=3D sizeof(ctx->packet.PacketType)) { + ctx->packet.PacketType =3D lduw_p(&ctx->packet.PacketType); + if (ctx->packet.PacketType >=3D PACKET_TYPE_MAX) { + ctx->state =3D STATE_LEADER; + ctx->result =3D RESULT_UNKNOWN_PACKET; + } else { + ctx->state =3D STATE_PACKET_BYTE_COUNT; + } + ctx->index =3D 0; + } + break; + + case STATE_PACKET_BYTE_COUNT: + PTR(ctx->packet.ByteCount)[ctx->index] =3D byte; + ++ctx->index; + if (ctx->index =3D=3D sizeof(ctx->packet.ByteCount)) { + ctx->packet.ByteCount =3D lduw_p(&ctx->packet.ByteCount); + ctx->state =3D STATE_PACKET_ID; + ctx->index =3D 0; + } + break; + + case STATE_PACKET_ID: + PTR(ctx->packet.PacketId)[ctx->index] =3D byte; + ++ctx->index; + if (ctx->index =3D=3D sizeof(ctx->packet.PacketId)) { + ctx->packet.PacketId =3D ldl_p(&ctx->packet.PacketId); + ctx->state =3D STATE_PACKET_CHECKSUM; + ctx->index =3D 0; + } + break; + + case STATE_PACKET_CHECKSUM: + PTR(ctx->packet.Checksum)[ctx->index] =3D byte; + ++ctx->index; + if (ctx->index =3D=3D sizeof(ctx->packet.Checksum)) { + ctx->packet.Checksum =3D ldl_p(&ctx->packet.Checksum); + if (ctx->packet.PacketLeader =3D=3D CONTROL_PACKET_LEADER) { + ctx->state =3D STATE_LEADER; + ctx->result =3D RESULT_CONTROL_PACKET; + } else if (ctx->packet.ByteCount > PACKET_MAX_SIZE) { + ctx->state =3D STATE_LEADER; + ctx->result =3D RESULT_ERROR; + } else { + ctx->state =3D STATE_PACKET_DATA; + } + ctx->index =3D 0; + } + break; + + case STATE_PACKET_DATA: + ctx->data.buf[ctx->index] =3D byte; + ++ctx->index; + if (ctx->index =3D=3D ctx->packet.ByteCount) { + ctx->state =3D STATE_TRAILING_BYTE; + ctx->index =3D 0; + } + break; + + case STATE_TRAILING_BYTE: + if (byte =3D=3D PACKET_TRAILING_BYTE) { + ctx->result =3D RESULT_DATA_PACKET; + } else { + ctx->result =3D RESULT_ERROR; + } + ctx->state =3D STATE_LEADER; + break; + } +} + static int windbg_chr_can_receive(void *opaque) { return PACKET_MAX_SIZE; @@ -67,8 +166,18 @@ static int windbg_chr_can_receive(void *opaque) =20 static void windbg_chr_receive(void *opaque, const uint8_t *buf, int size) { + static ParsingContext ctx =3D { + .state =3D STATE_LEADER, + .result =3D RESULT_NONE, + .name =3D "" + }; + if (windbg_state->is_loaded) { - /* T0D0: parse data */ + int i; + for (i =3D 0; i < size; i++) { + windbg_read_byte(&ctx, buf[i]); + windbg_ctx_handler(&ctx); + } } } =20 From nobody Sun Apr 28 23:53:21 2024 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 1511273728623608.1658985885163; Tue, 21 Nov 2017 06:15:28 -0800 (PST) Received: from localhost ([::1]:34648 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Ka-0006L3-Qy for importer@patchew.org; Tue, 21 Nov 2017 09:15:20 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39288) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Dv-0000cL-Mj for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Du-0002VO-OR for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:27 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37886) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Du-0002V7-G4 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:26 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id CB2D954006E; Tue, 21 Nov 2017 17:08:25 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:23 +0300 Message-ID: <151127330358.6888.9789211608464050166.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 12/45] windbg: send data and control packets 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 Added functions for send data and control packets to windbg. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- windbgstub.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++= ++ 1 file changed, 56 insertions(+) diff --git a/windbgstub.c b/windbgstub.c index ace992e2cb..8c33e0de0a 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -60,6 +60,62 @@ typedef struct WindbgState { =20 static WindbgState *windbg_state; =20 +static uint32_t compute_checksum(uint8_t *data, uint16_t len) +{ + uint32_t checksum =3D 0; + while (len) { + --len; + checksum +=3D *data++; + } + return checksum; +} + +__attribute__ ((unused)) /* unused yet */ +static void windbg_send_data_packet(uint8_t *data, uint16_t byte_count, + uint16_t type) +{ + uint8_t trailing_byte =3D PACKET_TRAILING_BYTE; + + KD_PACKET packet =3D { + .PacketLeader =3D PACKET_LEADER, + .PacketType =3D type, + .ByteCount =3D byte_count, + .PacketId =3D windbg_state->data_packet_id, + .Checksum =3D compute_checksum(data, byte_count) + }; + + stw_p(&packet.PacketType, packet.PacketType); + stw_p(&packet.ByteCount, packet.ByteCount); + stl_p(&packet.PacketId, packet.PacketId); + stl_p(&packet.Checksum, packet.Checksum); + + qemu_chr_fe_write(&windbg_state->chr, PTR(packet), sizeof(packet)); + qemu_chr_fe_write(&windbg_state->chr, data, byte_count); + qemu_chr_fe_write(&windbg_state->chr, &trailing_byte, + sizeof(trailing_byte)); + + windbg_state->data_packet_id ^=3D 1; +} + +__attribute__ ((unused)) /* unused yet */ +static void windbg_send_control_packet(uint16_t type) +{ + KD_PACKET packet =3D { + .PacketLeader =3D CONTROL_PACKET_LEADER, + .PacketType =3D type, + .ByteCount =3D 0, + .PacketId =3D windbg_state->ctrl_packet_id, + .Checksum =3D 0 + }; + + stw_p(&packet.PacketType, packet.PacketType); + stl_p(&packet.PacketId, packet.PacketId); + + qemu_chr_fe_write(&windbg_state->chr, PTR(packet), sizeof(packet)); + + windbg_state->ctrl_packet_id ^=3D 1; +} + static void windbg_ctx_handler(ParsingContext *ctx) {} =20 From nobody Sun Apr 28 23:53:21 2024 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 1511273729586675.0685767649861; Tue, 21 Nov 2017 06:15:29 -0800 (PST) Received: from localhost ([::1]:34650 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Kh-0006Ps-P4 for importer@patchew.org; Tue, 21 Nov 2017 09:15:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39373) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9E9-0000pC-V8 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9E0-0002Wj-BS for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:41 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37918) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9E0-0002WX-3S for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:32 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 6788B54006E; Tue, 21 Nov 2017 17:08:31 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:29 +0300 Message-ID: <151127330919.6888.6952320772457934021.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 13/45] windbg: handler of parsing 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 Implemented handler of parsing context. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- windbgstub.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/windbgstub.c b/windbgstub.c index 8c33e0de0a..b71449e369 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -11,6 +11,7 @@ =20 #include "qemu/osdep.h" #include "qapi/error.h" +#include "sysemu/sysemu.h" #include "chardev/char.h" #include "chardev/char-fe.h" #include "qemu/cutils.h" @@ -97,7 +98,6 @@ static void windbg_send_data_packet(uint8_t *data, uint16= _t byte_count, windbg_state->data_packet_id ^=3D 1; } =20 -__attribute__ ((unused)) /* unused yet */ static void windbg_send_control_packet(uint16_t type) { KD_PACKET packet =3D { @@ -116,9 +116,41 @@ static void windbg_send_control_packet(uint16_t type) windbg_state->ctrl_packet_id ^=3D 1; } =20 -static void windbg_ctx_handler(ParsingContext *ctx) +static void windbg_process_data_packet(ParsingContext *ctx) {} =20 +static void windbg_process_control_packet(ParsingContext *ctx) +{} + +static void windbg_ctx_handler(ParsingContext *ctx) +{ + switch (ctx->result) { + case RESULT_NONE: + break; + + case RESULT_BREAKIN_BYTE: + vm_stop(RUN_STATE_PAUSED); + break; + + case RESULT_CONTROL_PACKET: + windbg_process_control_packet(ctx); + break; + + case RESULT_DATA_PACKET: + windbg_process_data_packet(ctx); + break; + + case RESULT_UNKNOWN_PACKET: + case RESULT_ERROR: + windbg_state->ctrl_packet_id =3D 0; + windbg_send_control_packet(PACKET_TYPE_KD_RESEND); + break; + + default: + break; + } +} + static void windbg_read_byte(ParsingContext *ctx, uint8_t byte) { switch (ctx->state) { From nobody Sun Apr 28 23:53:21 2024 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 1511274443555345.7359174826496; Tue, 21 Nov 2017 06:27:23 -0800 (PST) Received: from localhost ([::1]:34719 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Vz-0008NO-M5 for importer@patchew.org; Tue, 21 Nov 2017 09:27:07 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39384) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9EB-0000pt-K0 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9E5-0002aI-St for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:43 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37942) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9E5-0002aC-LH for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:37 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 048C054006E; Tue, 21 Nov 2017 17:08:37 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:35 +0300 Message-ID: <151127331479.6888.2059069002163826691.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 14/45] windbg: init DBGKD_ANY_WAIT_STATE_CHANGE 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 Added function for init DBGKD_ANY_WAIT_STATE_CHANGE. It is a header of 'sta= te change' packets. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 8 ++++++ target/i386/windbgstub.c | 49 +++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 57 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 2d74fb847a..6ce870beb1 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -43,6 +43,14 @@ _t; \ }) =20 +#if TARGET_LONG_BITS =3D=3D 64 +# define sttul_p(p, v) stq_p(p, v) +# define ldtul_p(p) ldq_p(p) +#else +# define sttul_p(p, v) stl_p(p, v) +# define ldtul_p(p) ldl_p(p) +#endif + typedef struct InitedAddr { target_ulong addr; bool is_init; diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 47ee5840ef..a3c433f756 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -17,9 +17,13 @@ #ifdef TARGET_X86_64 # define OFFSET_SELF_PCR 0x18 # define OFFSET_VERS 0x108 +# define OFFSET_KPRCB 0x20 +# define OFFSET_KPRCB_CURRTHREAD 0x8 #else # define OFFSET_SELF_PCR 0x1C # define OFFSET_VERS 0x34 +# define OFFSET_KPRCB 0x20 +# define OFFSET_KPRCB_CURRTHREAD 0x4 #endif =20 bool windbg_on_load(void) @@ -66,4 +70,49 @@ bool windbg_on_load(void) return true; } =20 +__attribute__ ((unused)) /* unused yet */ +static void kd_init_state_change(CPUState *cpu, + DBGKD_ANY_WAIT_STATE_CHANGE *sc) +{ + CPUArchState *env =3D cpu->env_ptr; + DBGKD_CONTROL_REPORT *cr =3D &sc->ControlReport; + InitedAddr *KPCR =3D windbg_get_KPCR(); + target_ulong KPRCB; + int err =3D 0; + + /* T0D0: HEADER */ + + sc->Processor =3D 0; + + sc->NumberProcessors =3D 0; + CPUState *cpu_tmp; + CPU_FOREACH(cpu_tmp) { + sc->NumberProcessors++; + } + stl_p(&sc->NumberProcessors, sc->NumberProcessors); + + KPRCB =3D READ_VMEM(cpu, KPCR->addr + OFFSET_KPRCB, target_ulong); + sc->Thread =3D READ_VMEM(cpu, KPRCB + OFFSET_KPRCB_CURRTHREAD, target_= ulong); + sttul_p(&sc->Thread, sc->Thread); + sttul_p(&sc->ProgramCounter, env->eip); + + /* T0D0: CONTROL REPORT */ + + sttul_p(&cr->Dr6, env->dr[6]); + sttul_p(&cr->Dr7, env->dr[7]); + stw_p(&cr->ReportFlags, REPORT_INCLUDES_SEGS | REPORT_STANDARD_CS); + stw_p(&cr->SegCs, env->segs[R_CS].selector); + stw_p(&cr->SegDs, env->segs[R_DS].selector); + stw_p(&cr->SegEs, env->segs[R_ES].selector); + stw_p(&cr->SegFs, env->segs[R_FS].selector); + stl_p(&cr->EFlags, env->eflags); + + err =3D cpu_memory_rw_debug(cpu, sc->ProgramCounter, + PTR(cr->InstructionStream[0]), + DBGKD_MAXSTREAM, 0); + if (!err) { + stw_p(&cr->InstructionCount, DBGKD_MAXSTREAM); + } +} + #endif From nobody Sun Apr 28 23:53:21 2024 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 1511273902020671.0510142919495; Tue, 21 Nov 2017 06:18:22 -0800 (PST) Received: from localhost ([::1]:34665 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9NP-0000aZ-4t for importer@patchew.org; Tue, 21 Nov 2017 09:18:15 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39433) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9EG-0000u6-4n for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9EB-0002d9-Gz for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:48 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37964) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9EB-0002cx-9V for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:43 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 9911C54006E; Tue, 21 Nov 2017 17:08:42 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:40 +0300 Message-ID: <151127332036.6888.3168353085464706816.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 15/45] windbg: sized data buffer 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 Defined useful sized data buffer. It contains pointer to data and size of t= his data. Also, defined some macros for init and free. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 6ce870beb1..b729cd604e 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -67,6 +67,22 @@ typedef struct PacketData { uint16_t extra_size; } PacketData; =20 +typedef struct SizedBuf { + uint8_t *data; + size_t size; +} SizedBuf; + +#define SBUF_INIT(buf, mem_ptr, len) do { \ + buf.data =3D mem_ptr; \ + buf.size =3D len; \ +} while (false) +#define SBUF_MALLOC(buf, size) SBUF_INIT(buf, g_malloc0(size), size) +#define SBUF_FREE(buf) do { \ + g_free(buf.data); \ + buf.data =3D NULL; \ + buf.size =3D 0; \ +} while (false) + InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); =20 From nobody Sun Apr 28 23:53:21 2024 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 1511273902069542.3933999144225; Tue, 21 Nov 2017 06:18:22 -0800 (PST) Received: from localhost ([::1]:34667 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9NV-0000jc-8b for importer@patchew.org; Tue, 21 Nov 2017 09:18:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39502) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9EL-0000wv-2L for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9EH-0002fs-7w for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:53 -0500 Received: from mail.ispras.ru ([83.149.199.45]:37982) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9EG-0002fd-Vt for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:49 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 4420754006E; Tue, 21 Nov 2017 17:08:48 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:46 +0300 Message-ID: <151127332602.6888.9977201576638308100.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 16/45] windbg: generate ExceptionStateChange 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 Added function for generate ExceptionStateChange packet. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 2 ++ target/i386/windbgstub.c | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index b729cd604e..f35873eca0 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -86,6 +86,8 @@ typedef struct SizedBuf { InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); =20 +SizedBuf kd_gen_exception_sc(CPUState *cpu); + bool windbg_on_load(void); =20 #endif diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index a3c433f756..f0edd94dde 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -70,7 +70,6 @@ bool windbg_on_load(void) return true; } =20 -__attribute__ ((unused)) /* unused yet */ static void kd_init_state_change(CPUState *cpu, DBGKD_ANY_WAIT_STATE_CHANGE *sc) { @@ -115,4 +114,23 @@ static void kd_init_state_change(CPUState *cpu, } } =20 +SizedBuf kd_gen_exception_sc(CPUState *cpu) +{ + CPUArchState *env =3D cpu->env_ptr; + DBGKD_ANY_WAIT_STATE_CHANGE *sc; + DBGKM_EXCEPTION_RECORD64 *exc; + SizedBuf buf; + + SBUF_MALLOC(buf, sizeof(DBGKD_ANY_WAIT_STATE_CHANGE) + sizeof(int)); + sc =3D (DBGKD_ANY_WAIT_STATE_CHANGE *) buf.data; + exc =3D &sc->u.Exception.ExceptionRecord; + kd_init_state_change(cpu, sc); + + stl_p(&sc->NewState, DbgKdExceptionStateChange); + stl_p(&exc->ExceptionCode, 0x80000003); + sttul_p(&exc->ExceptionAddress, env->eip); + + return buf; +} + #endif From nobody Sun Apr 28 23:53:21 2024 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 (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1511274093139525.3986697136834; Tue, 21 Nov 2017 06:21:33 -0800 (PST) Received: from localhost ([::1]:34682 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9QI-00030B-UT for importer@patchew.org; Tue, 21 Nov 2017 09:21:15 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39547) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9EQ-00012B-Sv for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9EM-0002i3-US for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:58 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38012) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9EM-0002ht-Lp for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:08:54 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id E07DE54006E; Tue, 21 Nov 2017 17:08:53 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:51 +0300 Message-ID: <151127333169.6888.10315185193447806092.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 17/45] windbg: generate LoadSymbolsStateChange 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 Added function for generate LoadSymbolsStateChange packet. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 1 + target/i386/windbgstub.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index f35873eca0..8558bc6c8a 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -87,6 +87,7 @@ InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); +SizedBuf kd_gen_load_symbols_sc(CPUState *cpu); =20 bool windbg_on_load(void); =20 diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index f0edd94dde..261e441db1 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -133,4 +133,19 @@ SizedBuf kd_gen_exception_sc(CPUState *cpu) return buf; } =20 +SizedBuf kd_gen_load_symbols_sc(CPUState *cpu) +{ + DBGKD_ANY_WAIT_STATE_CHANGE *sc; + SizedBuf buf; + + SBUF_MALLOC(buf, sizeof(DBGKD_ANY_WAIT_STATE_CHANGE)); + sc =3D (DBGKD_ANY_WAIT_STATE_CHANGE *) buf.data; + kd_init_state_change(cpu, sc); + + stl_p(&sc->NewState, DbgKdLoadSymbolsStateChange); + stl_p(&sc->u.LoadSymbols.PathNameLength, 0); + + return buf; +} + #endif From nobody Sun Apr 28 23:53:21 2024 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 1511274574323607.3357037320816; Tue, 21 Nov 2017 06:29:34 -0800 (PST) Received: from localhost ([::1]:34736 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9YG-0002i6-IU for importer@patchew.org; Tue, 21 Nov 2017 09:29:28 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39566) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9ET-000159-AZ for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9ES-0002kf-GU for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:01 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38028) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9ES-0002k5-8L for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:00 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 8362254006E; Tue, 21 Nov 2017 17:08:59 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:08:57 +0300 Message-ID: <151127333727.6888.4473483435704863115.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 18/45] windbg: windbg_vm_stop 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 Added function for stop vm. Also, ExceptionStateChange data is generated an= d sent here. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- windbgstub.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/windbgstub.c b/windbgstub.c index b71449e369..dc9eba3e3c 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -71,7 +71,6 @@ static uint32_t compute_checksum(uint8_t *data, uint16_t = len) return checksum; } =20 -__attribute__ ((unused)) /* unused yet */ static void windbg_send_data_packet(uint8_t *data, uint16_t byte_count, uint16_t type) { @@ -116,6 +115,16 @@ static void windbg_send_control_packet(uint16_t type) windbg_state->ctrl_packet_id ^=3D 1; } =20 +static void windbg_vm_stop(void) +{ + CPUState *cpu =3D qemu_get_cpu(0); + vm_stop(RUN_STATE_PAUSED); + + SizedBuf buf =3D kd_gen_exception_sc(cpu); + windbg_send_data_packet(buf.data, buf.size, PACKET_TYPE_KD_STATE_CHANG= E64); + SBUF_FREE(buf); +} + static void windbg_process_data_packet(ParsingContext *ctx) {} =20 @@ -129,7 +138,7 @@ static void windbg_ctx_handler(ParsingContext *ctx) break; =20 case RESULT_BREAKIN_BYTE: - vm_stop(RUN_STATE_PAUSED); + windbg_vm_stop(); break; =20 case RESULT_CONTROL_PACKET: From nobody Sun Apr 28 23:53:21 2024 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 1511273728392443.2426637469557; Tue, 21 Nov 2017 06:15:28 -0800 (PST) Received: from localhost ([::1]:34647 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9KR-0006E1-T0 for importer@patchew.org; Tue, 21 Nov 2017 09:15:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39656) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Ee-0001Dd-0V for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:15 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9EY-0002ml-6F for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:11 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38068) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9EX-0002mM-UW for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:06 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 471B154006E; Tue, 21 Nov 2017 17:09:05 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:03 +0300 Message-ID: <151127334297.6888.6977131257577184018.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 19/45] windbg: implemented windbg_process_control_packet 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 --- windbgstub.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/windbgstub.c b/windbgstub.c index dc9eba3e3c..b2d4881ee8 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -129,7 +129,31 @@ static void windbg_process_data_packet(ParsingContext = *ctx) {} =20 static void windbg_process_control_packet(ParsingContext *ctx) -{} +{ + switch (ctx->packet.PacketType) { + case PACKET_TYPE_KD_ACKNOWLEDGE: + break; + + case PACKET_TYPE_KD_RESET: + { + SizedBuf buf =3D kd_gen_load_symbols_sc(qemu_get_cpu(0)); + + windbg_send_data_packet(buf.data, buf.size, + PACKET_TYPE_KD_STATE_CHANGE64); + windbg_send_control_packet(ctx->packet.PacketType); + windbg_state->ctrl_packet_id =3D INITIAL_PACKET_ID; + SBUF_FREE(buf); + break; + } + default: + WINDBG_ERROR("Caught unsupported control packet 0x%x", + ctx->packet.PacketType); + + windbg_state->ctrl_packet_id =3D 0; + windbg_send_control_packet(PACKET_TYPE_KD_RESEND); + break; + } +} =20 static void windbg_ctx_handler(ParsingContext *ctx) { From nobody Sun Apr 28 23:53:21 2024 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 1511274334868967.6732256008704; Tue, 21 Nov 2017 06:25:34 -0800 (PST) Received: from localhost ([::1]:34702 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9UK-0006tz-2Q for importer@patchew.org; Tue, 21 Nov 2017 09:25:24 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39671) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Ee-0001ED-Jk for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Ed-0002o6-P9 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:12 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38086) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Ed-0002nx-Hm for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:11 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id DA12154006E; Tue, 21 Nov 2017 17:09:10 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:08 +0300 Message-ID: <151127334868.6888.9233330051036328440.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 20/45] windbg: implemented windbg_process_data_packet 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 --- windbgstub.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/windbgstub.c b/windbgstub.c index b2d4881ee8..8058972dc7 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -125,9 +125,27 @@ static void windbg_vm_stop(void) SBUF_FREE(buf); } =20 -static void windbg_process_data_packet(ParsingContext *ctx) +static void windbg_process_manipulate_packet(ParsingContext *ctx) {} =20 +static void windbg_process_data_packet(ParsingContext *ctx) +{ + switch (ctx->packet.PacketType) { + case PACKET_TYPE_KD_STATE_MANIPULATE: + windbg_send_control_packet(PACKET_TYPE_KD_ACKNOWLEDGE); + windbg_process_manipulate_packet(ctx); + break; + + default: + WINDBG_ERROR("Caught unsupported data packet 0x%x", + ctx->packet.PacketType); + + windbg_state->ctrl_packet_id =3D 0; + windbg_send_control_packet(PACKET_TYPE_KD_RESEND); + break; + } +} + static void windbg_process_control_packet(ParsingContext *ctx) { switch (ctx->packet.PacketType) { From nobody Sun Apr 28 23:53:21 2024 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 1511273893991471.1615372185605; Tue, 21 Nov 2017 06:18:13 -0800 (PST) Received: from localhost ([::1]:34664 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9NG-0000Tu-6C for importer@patchew.org; Tue, 21 Nov 2017 09:18:06 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39782) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Es-0001QO-Rw for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Ej-0002pt-FE for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:26 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38106) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Ej-0002pZ-70 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:17 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 83CE854006E; Tue, 21 Nov 2017 17:09:16 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:14 +0300 Message-ID: <151127335426.6888.7354675198390750120.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 21/45] windbg: implemented windbg_process_manipulate_packet 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 --- include/exec/windbgstub-utils.h | 2 ++ windbgstub-utils.c | 8 ++++++++ windbgstub.c | 26 +++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 8558bc6c8a..28fd53039a 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -86,6 +86,8 @@ typedef struct SizedBuf { InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); =20 +void kd_api_unsupported(CPUState *cpu, PacketData *pd); + SizedBuf kd_gen_exception_sc(CPUState *cpu); SizedBuf kd_gen_load_symbols_sc(CPUState *cpu); =20 diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 347c61553a..04a7e1cc7b 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -23,3 +23,11 @@ InitedAddr *windbg_get_version(void) { return &version; } + +void kd_api_unsupported(CPUState *cpu, PacketData *pd) +{ + WINDBG_ERROR("Caught unimplemented api %s", + KD_API_NAME(pd->m64.ApiNumber)); + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + pd->extra_size =3D 0; +} diff --git a/windbgstub.c b/windbgstub.c index 8058972dc7..2467d2d247 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -126,7 +126,31 @@ static void windbg_vm_stop(void) } =20 static void windbg_process_manipulate_packet(ParsingContext *ctx) -{} +{ + CPUState *cpu; + + ctx->data.extra_size =3D ctx->packet.ByteCount - + sizeof(DBGKD_MANIPULATE_STATE64); + ctx->data.m64.ReturnStatus =3D STATUS_SUCCESS; + + cpu =3D qemu_get_cpu(ctx->data.m64.Processor); + if (cpu =3D=3D NULL) { + cpu =3D qemu_get_cpu(0); + } + + switch (ctx->data.m64.ApiNumber) { + + default: + kd_api_unsupported(cpu, &ctx->data); + break; + } + + stl_p(&ctx->data.m64.ReturnStatus, ctx->data.m64.ReturnStatus); + + windbg_send_data_packet(ctx->data.buf, ctx->data.extra_size + + sizeof(DBGKD_MANIPULATE_STATE64), + ctx->packet.PacketType); +} =20 static void windbg_process_data_packet(ParsingContext *ctx) { From nobody Sun Apr 28 23:53:21 2024 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 1511274087987617.4648804126921; Tue, 21 Nov 2017 06:21:27 -0800 (PST) Received: from localhost ([::1]:34683 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9QP-00037K-Dd for importer@patchew.org; Tue, 21 Nov 2017 09:21:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39759) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Eq-0001OB-Bj for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Ep-0002rf-6g for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:24 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38150) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Eo-0002rV-QM for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:23 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 28F8554006E; Tue, 21 Nov 2017 17:09:22 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:20 +0300 Message-ID: <151127335992.6888.10847608262485289638.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 22/45] windbg: implemented kd_api_read_virtual_memory and kd_api_write_virtual_memory 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 --- include/exec/windbgstub-utils.h | 2 ++ windbgstub-utils.c | 47 +++++++++++++++++++++++++++++++++++= ++++ windbgstub.c | 8 +++++++ 3 files changed, 57 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 28fd53039a..827aabb6d3 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -86,6 +86,8 @@ typedef struct SizedBuf { InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); =20 +void kd_api_read_virtual_memory(CPUState *cpu, PacketData *pd); +void kd_api_write_virtual_memory(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 04a7e1cc7b..1e81c37501 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -24,6 +24,53 @@ InitedAddr *windbg_get_version(void) return &version; } =20 +void kd_api_read_virtual_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_MEMORY64 *mem =3D &pd->m64.u.ReadMemory; + uint32_t len; + target_ulong addr; + int err; + + len =3D MIN(ldl_p(&mem->TransferCount), + PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)); + addr =3D ldtul_p(&mem->TargetBaseAddress); + err =3D cpu_memory_rw_debug(cpu, addr, pd->extra, len, 0); + + if (err) { + len =3D 0; + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + + WINDBG_DEBUG("read_virtual_memory: No physical page mapped: " FMT_= ADDR, + (target_ulong) mem->TargetBaseAddress); + } + + pd->extra_size =3D len; + stl_p(&mem->ActualBytesRead, len); +} + +void kd_api_write_virtual_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_WRITE_MEMORY64 *mem =3D &pd->m64.u.WriteMemory; + uint32_t len; + target_ulong addr; + int err; + + len =3D MIN(ldl_p(&mem->TransferCount), pd->extra_size); + addr =3D ldtul_p(&mem->TargetBaseAddress); + err =3D cpu_memory_rw_debug(cpu, addr, pd->extra, len, 1); + + if (err) { + len =3D 0; + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + + WINDBG_DEBUG("read_write_memory: No physical page mapped: " FMT_AD= DR, + (target_ulong) mem->TargetBaseAddress); + } + + pd->extra_size =3D 0; + stl_p(&mem->ActualBytesWritten, len); +} + void kd_api_unsupported(CPUState *cpu, PacketData *pd) { WINDBG_ERROR("Caught unimplemented api %s", diff --git a/windbgstub.c b/windbgstub.c index 2467d2d247..1725107722 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -140,6 +140,14 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) =20 switch (ctx->data.m64.ApiNumber) { =20 + case DbgKdReadVirtualMemoryApi: + kd_api_read_virtual_memory(cpu, &ctx->data); + break; + + case DbgKdWriteVirtualMemoryApi: + kd_api_write_virtual_memory(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break; From nobody Sun Apr 28 23:53:21 2024 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 1511274492958339.88530056699256; Tue, 21 Nov 2017 06:28:12 -0800 (PST) Received: from localhost ([::1]:34720 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9X0-0001cj-3I for importer@patchew.org; Tue, 21 Nov 2017 09:28:10 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39823) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9F4-0001ZH-Mf for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Eu-0002sl-Ph for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:38 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38178) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Eu-0002sb-De for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:28 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id BB3AE54006E; Tue, 21 Nov 2017 17:09:27 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:25 +0300 Message-ID: <151127336553.6888.5261319788471833164.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 23/45] windbg: kernel's structures 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 Defined Windows kernel's structures (CPU_CONTEXT and CPU_KSPECIAL_REGISTERS= ) for i386 and x64_86. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- target/i386/windbgstub.c | 247 ++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 247 insertions(+) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 261e441db1..43efb47471 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -26,6 +26,253 @@ # define OFFSET_KPRCB_CURRTHREAD 0x4 #endif =20 +/* + * Next code copied from winnt.h + */ +#ifdef TARGET_X86_64 + +#define CPU_CONTEXT_AMD64 0x100000 + +#define CPU_CONTEXT_CONTROL (CPU_CONTEXT_AMD64 | 0x1) +#define CPU_CONTEXT_INTEGER (CPU_CONTEXT_AMD64 | 0x2) +#define CPU_CONTEXT_SEGMENTS (CPU_CONTEXT_AMD64 | 0x4) +#define CPU_CONTEXT_FLOATING_POINT (CPU_CONTEXT_AMD64 | 0x8) +#define CPU_CONTEXT_DEBUG_REGISTERS (CPU_CONTEXT_AMD64 | 0x10) + +#define CPU_CONTEXT_FULL \ + (CPU_CONTEXT_CONTROL | CPU_CONTEXT_INTEGER | CPU_CONTEXT_FLOATING_POIN= T) +#define CPU_CONTEXT_ALL \ + (CPU_CONTEXT_FULL | CPU_CONTEXT_SEGMENTS | CPU_CONTEXT_DEBUG_REGISTERS) + +typedef struct _CPU_DESCRIPTOR { + uint16_t Pad[3]; + uint16_t Limit; + uint64_t Base; +} CPU_DESCRIPTOR, *PCPU_DESCRIPTOR; + +typedef struct _CPU_KSPECIAL_REGISTERS { + uint64_t Cr0; + uint64_t Cr2; + uint64_t Cr3; + uint64_t Cr4; + uint64_t KernelDr0; + uint64_t KernelDr1; + uint64_t KernelDr2; + uint64_t KernelDr3; + uint64_t KernelDr6; + uint64_t KernelDr7; + CPU_DESCRIPTOR Gdtr; + CPU_DESCRIPTOR Idtr; + uint16_t Tr; + uint16_t Ldtr; + uint32_t MxCsr; + uint64_t DebugControl; + uint64_t LastBranchToRip; + uint64_t LastBranchFromRip; + uint64_t LastExceptionToRip; + uint64_t LastExceptionFromRip; + uint64_t Cr8; + uint64_t MsrGsBase; + uint64_t MsrGsSwap; + uint64_t MsrStar; + uint64_t MsrLStar; + uint64_t MsrCStar; + uint64_t MsrSyscallMask; + uint64_t Xcr0; +} CPU_KSPECIAL_REGISTERS, *PCPU_KSPECIAL_REGISTERS; + +#pragma pack(push, 2) +typedef struct _CPU_M128A { + uint64_t Low; + int64_t High; +} CPU_M128A, *PCPU_M128A; +#pragma pack(pop) + +typedef struct _CPU_XMM_SAVE_AREA32 { + uint16_t ControlWord; + uint16_t StatusWord; + uint8_t TagWord; + uint8_t Reserved1; + uint16_t ErrorOpcode; + uint32_t ErrorOffset; + uint16_t ErrorSelector; + uint16_t Reserved2; + uint32_t DataOffset; + uint16_t DataSelector; + uint16_t Reserved3; + uint32_t MxCsr; + uint32_t MxCsr_Mask; + CPU_M128A FloatRegisters[8]; + CPU_M128A XmmRegisters[16]; + uint8_t Reserved4[96]; +} CPU_XMM_SAVE_AREA32, *PCPU_XMM_SAVE_AREA32; + +#pragma pack(push, 2) +typedef struct _CPU_CONTEXT { /* sizeof =3D 1232 */ + uint64_t P1Home; + uint64_t P2Home; + uint64_t P3Home; + uint64_t P4Home; + uint64_t P5Home; + uint64_t P6Home; + uint32_t ContextFlags; + uint32_t MxCsr; + uint16_t SegCs; + uint16_t SegDs; + uint16_t SegEs; + uint16_t SegFs; + uint16_t SegGs; + uint16_t SegSs; + uint32_t EFlags; + uint64_t Dr0; + uint64_t Dr1; + uint64_t Dr2; + uint64_t Dr3; + uint64_t Dr6; + uint64_t Dr7; + uint64_t Rax; + uint64_t Rcx; + uint64_t Rdx; + uint64_t Rbx; + uint64_t Rsp; + uint64_t Rbp; + uint64_t Rsi; + uint64_t Rdi; + uint64_t R8; + uint64_t R9; + uint64_t R10; + uint64_t R11; + uint64_t R12; + uint64_t R13; + uint64_t R14; + uint64_t R15; + uint64_t Rip; + union { + CPU_XMM_SAVE_AREA32 FltSave; + CPU_XMM_SAVE_AREA32 FloatSave; + struct { + CPU_M128A Header[2]; + CPU_M128A Legacy[8]; + CPU_M128A Xmm0; + CPU_M128A Xmm1; + CPU_M128A Xmm2; + CPU_M128A Xmm3; + CPU_M128A Xmm4; + CPU_M128A Xmm5; + CPU_M128A Xmm6; + CPU_M128A Xmm7; + CPU_M128A Xmm8; + CPU_M128A Xmm9; + CPU_M128A Xmm10; + CPU_M128A Xmm11; + CPU_M128A Xmm12; + CPU_M128A Xmm13; + CPU_M128A Xmm14; + CPU_M128A Xmm15; + }; + }; + CPU_M128A VectorRegister[26]; + uint64_t VectorControl; + uint64_t DebugControl; + uint64_t LastBranchToRip; + uint64_t LastBranchFromRip; + uint64_t LastExceptionToRip; + uint64_t LastExceptionFromRip; +} CPU_CONTEXT, *PCPU_CONTEXT; +#pragma pack(pop) + +#else + +#define SIZE_OF_X86_REG 80 +#define MAX_SUP_EXT 512 + +#define CPU_CONTEXT_i386 0x10000 + +#define CPU_CONTEXT_CONTROL (CPU_CONTEXT_i386 | 0x1) +#define CPU_CONTEXT_INTEGER (CPU_CONTEXT_i386 | 0x2) +#define CPU_CONTEXT_SEGMENTS (CPU_CONTEXT_i386 | 0x4) +#define CPU_CONTEXT_FLOATING_POINT (CPU_CONTEXT_i386 | 0x8) +#define CPU_CONTEXT_DEBUG_REGISTERS (CPU_CONTEXT_i386 | 0x10) +#define CPU_CONTEXT_EXTENDED_REGISTERS (CPU_CONTEXT_i386 | 0x20) + +#define CPU_CONTEXT_FULL \ + (CPU_CONTEXT_CONTROL | CPU_CONTEXT_INTEGER | CPU_CONTEXT_SEGMENTS) +#define CPU_CONTEXT_ALL \ + (CPU_CONTEXT_FULL | CPU_CONTEXT_FLOATING_POINT | \ + CPU_CONTEXT_DEBUG_REGISTERS | CPU_CONTEXT_EXTENDED_REGISTERS) + +typedef struct _CPU_DESCRIPTOR { + uint16_t Pad; + uint16_t Limit; + uint32_t Base; +} CPU_DESCRIPTOR, *PCPU_DESCRIPTOR; + +typedef struct _CPU_KSPECIAL_REGISTERS { + uint32_t Cr0; + uint32_t Cr2; + uint32_t Cr3; + uint32_t Cr4; + uint32_t KernelDr0; + uint32_t KernelDr1; + uint32_t KernelDr2; + uint32_t KernelDr3; + uint32_t KernelDr6; + uint32_t KernelDr7; + CPU_DESCRIPTOR Gdtr; + CPU_DESCRIPTOR Idtr; + uint16_t Tr; + uint16_t Ldtr; + uint32_t Reserved[6]; +} CPU_KSPECIAL_REGISTERS, *PCPU_KSPECIAL_REGISTERS; + +typedef struct _CPU_FLOATING_SAVE_AREA { + uint32_t ControlWord; + uint32_t StatusWord; + uint32_t TagWord; + uint32_t ErrorOffset; + uint32_t ErrorSelector; + uint32_t DataOffset; + uint32_t DataSelector; + uint8_t RegisterArea[SIZE_OF_X86_REG]; + uint32_t Cr0NpxState; +} CPU_FLOATING_SAVE_AREA, *PCPU_FLOATING_SAVE_AREA; + +typedef struct _CPU_CONTEXT { /* sizeof =3D 716 */ + uint32_t ContextFlags; + uint32_t Dr0; + uint32_t Dr1; + uint32_t Dr2; + uint32_t Dr3; + uint32_t Dr6; + uint32_t Dr7; + CPU_FLOATING_SAVE_AREA FloatSave; + uint32_t SegGs; + uint32_t SegFs; + uint32_t SegEs; + uint32_t SegDs; + + uint32_t Edi; + uint32_t Esi; + uint32_t Ebx; + uint32_t Edx; + uint32_t Ecx; + uint32_t Eax; + uint32_t Ebp; + uint32_t Eip; + uint32_t SegCs; + uint32_t EFlags; + uint32_t Esp; + uint32_t SegSs; + uint8_t ExtendedRegisters[MAX_SUP_EXT]; +} CPU_CONTEXT, *PCPU_CONTEXT; + +#endif + +typedef struct _CPU_KPROCESSOR_STATE { + CPU_CONTEXT ContextFrame; + CPU_KSPECIAL_REGISTERS SpecialRegisters; +} CPU_KPROCESSOR_STATE, *PCPU_KPROCESSOR_STATE; + bool windbg_on_load(void) { CPUState *cpu =3D qemu_get_cpu(0); From nobody Sun Apr 28 23:53:21 2024 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 1511274701499938.1952244171958; Tue, 21 Nov 2017 06:31:41 -0800 (PST) Received: from localhost ([::1]:34751 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9aL-0004Rx-L3 for importer@patchew.org; Tue, 21 Nov 2017 09:31:37 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39833) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9F6-0001Zw-3o for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9F0-0002td-Aa for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:40 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38210) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9F0-0002tS-2A for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:34 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 5797754006E; Tue, 21 Nov 2017 17:09:33 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:31 +0300 Message-ID: <151127337115.6888.3770911670468199202.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 24/45] windbg: implemented kd_api_get_context and kd_api_set_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 --- include/exec/windbgstub-utils.h | 2 ++ target/i386/windbgstub.c | 39 +++++++++++++++++++++++++++++++++++= ++++ windbgstub.c | 8 ++++++++ 3 files changed, 49 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 827aabb6d3..65be4793d3 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -88,6 +88,8 @@ InitedAddr *windbg_get_version(void); =20 void kd_api_read_virtual_memory(CPUState *cpu, PacketData *pd); void kd_api_write_virtual_memory(CPUState *cpu, PacketData *pd); +void kd_api_get_context(CPUState *cpu, PacketData *pd); +void kd_api_set_context(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 43efb47471..be8fc21374 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -273,6 +273,45 @@ typedef struct _CPU_KPROCESSOR_STATE { CPU_KSPECIAL_REGISTERS SpecialRegisters; } CPU_KPROCESSOR_STATE, *PCPU_KPROCESSOR_STATE; =20 +static int windbg_read_context(CPUState *cpu, uint8_t *buf, int buf_size, + int offset, int len) +{ + return 0; +} + +static int windbg_write_context(CPUState *cpu, uint8_t *buf, int buf_size, + int offset, int len) +{ + return 0; +} + +void kd_api_get_context(CPUState *cpu, PacketData *pd) +{ + int err; + + pd->extra_size =3D sizeof(CPU_CONTEXT); + err =3D windbg_read_context(cpu, pd->extra, pd->extra_size, 0, + pd->extra_size); + + if (err) { + pd->extra_size =3D 0; + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + } +} + +void kd_api_set_context(CPUState *cpu, PacketData *pd) +{ + int err; + + err =3D windbg_write_context(cpu, pd->extra, pd->extra_size, 0, + sizeof(CPU_CONTEXT)); + pd->extra_size =3D 0; + + if (err) { + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + } +} + bool windbg_on_load(void) { CPUState *cpu =3D qemu_get_cpu(0); diff --git a/windbgstub.c b/windbgstub.c index 1725107722..ad8638b793 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -148,6 +148,14 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_write_virtual_memory(cpu, &ctx->data); break; =20 + case DbgKdGetContextApi: + kd_api_get_context(cpu, &ctx->data); + break; + + case DbgKdSetContextApi: + kd_api_set_context(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break; From nobody Sun Apr 28 23:53:21 2024 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 1511274434479184.4373967779958; Tue, 21 Nov 2017 06:27:14 -0800 (PST) Received: from localhost ([::1]:34718 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Vz-0008Mr-IT for importer@patchew.org; Tue, 21 Nov 2017 09:27:07 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39844) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9F8-0001be-RX for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9F6-0002ud-5V for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:42 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38250) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9F5-0002uQ-Ng for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:40 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 07A7C54006E; Tue, 21 Nov 2017 17:09:39 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:37 +0300 Message-ID: <151127337679.6888.4561921111146653923.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 25/45] windbg: implemented kd_api_read_control_space and kd_api_write_control_space 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 --- include/exec/windbgstub-utils.h | 2 + target/i386/windbgstub.c | 89 +++++++++++++++++++++++++++++++++++= ++++ windbgstub.c | 8 ++++ 3 files changed, 99 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 65be4793d3..5e5893bac8 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -90,6 +90,8 @@ void kd_api_read_virtual_memory(CPUState *cpu, PacketData= *pd); void kd_api_write_virtual_memory(CPUState *cpu, PacketData *pd); void kd_api_get_context(CPUState *cpu, PacketData *pd); void kd_api_set_context(CPUState *cpu, PacketData *pd); +void kd_api_read_control_space(CPUState *cpu, PacketData *pd); +void kd_api_write_control_space(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index be8fc21374..bf1afab1f8 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -285,6 +285,18 @@ static int windbg_write_context(CPUState *cpu, uint8_t= *buf, int buf_size, return 0; } =20 +static int windbg_read_ks_regs(CPUState *cpu, uint8_t *buf, int buf_size, + int offset, int len) +{ + return 0; +} + +static int windbg_write_ks_regs(CPUState *cpu, uint8_t *buf, int buf_size, + int offset, int len) +{ + return 0; +} + void kd_api_get_context(CPUState *cpu, PacketData *pd) { int err; @@ -312,6 +324,83 @@ void kd_api_set_context(CPUState *cpu, PacketData *pd) } } =20 +void kd_api_read_control_space(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_MEMORY64 *mem =3D &pd->m64.u.ReadMemory; + uint32_t len; + uint32_t context_len; + uint32_t ks_regs_len; + target_ulong addr; + int err =3D -1; + + len =3D MIN(ldl_p(&mem->TransferCount), + PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)); + addr =3D ldtul_p(&mem->TargetBaseAddress); + + if (addr < sizeof(CPU_KPROCESSOR_STATE)) { + len =3D MIN(len, sizeof(CPU_KPROCESSOR_STATE) - addr); + + context_len =3D MAX(0, (int) (sizeof(CPU_CONTEXT) - addr)); + ks_regs_len =3D len - context_len; + + if (context_len > 0) { + err =3D windbg_read_context(cpu, pd->extra, context_len, addr, + context_len); + } + if (ks_regs_len > 0) { + addr =3D addr - sizeof(CPU_CONTEXT) + context_len; + err =3D windbg_read_ks_regs(cpu, pd->extra + context_len, + ks_regs_len, addr, ks_regs_len); + } + } + + if (err) { + len =3D 0; + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + } + + pd->extra_size =3D len; + stl_p(&mem->ActualBytesRead, len); +} + +void kd_api_write_control_space(CPUState *cpu, PacketData *pd) +{ + DBGKD_WRITE_MEMORY64 *mem =3D &pd->m64.u.WriteMemory; + uint32_t len; + uint32_t context_len; + uint32_t ks_regs_len; + target_ulong addr; + int err =3D -1; + + len =3D MIN(ldl_p(&mem->TransferCount), pd->extra_size); + addr =3D ldtul_p(&mem->TargetBaseAddress); + + if (addr < sizeof(CPU_KPROCESSOR_STATE)) { + len =3D MIN(len, sizeof(CPU_KPROCESSOR_STATE) - addr); + + context_len =3D MAX(0, (int) (sizeof(CPU_CONTEXT) - addr)); + ks_regs_len =3D len - context_len; + + if (context_len > 0) { + err =3D windbg_write_context(cpu, pd->extra, context_len, addr, + context_len); + } + if (ks_regs_len > 0) { + addr =3D addr - sizeof(CPU_CONTEXT) + context_len; + err =3D windbg_write_ks_regs(cpu, pd->extra + context_len, + ks_regs_len, addr, ks_regs_len); + } + } + + if (err) { + mem->ActualBytesWritten =3D 0; + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + } + + pd->extra_size =3D 0; + stl_p(&mem->ActualBytesWritten, len); +} + bool windbg_on_load(void) { CPUState *cpu =3D qemu_get_cpu(0); diff --git a/windbgstub.c b/windbgstub.c index ad8638b793..5b0a15ea4e 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -156,6 +156,14 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_set_context(cpu, &ctx->data); break; =20 + case DbgKdReadControlSpaceApi: + kd_api_read_control_space(cpu, &ctx->data); + break; + + case DbgKdWriteControlSpaceApi: + kd_api_write_control_space(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break; From nobody Sun Apr 28 23:53:21 2024 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 From nobody Sun Apr 28 23:53:21 2024 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 1511274575036133.30564713696333; Tue, 21 Nov 2017 06:29:35 -0800 (PST) Received: from localhost ([::1]:34737 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9YK-0002kC-49 for importer@patchew.org; Tue, 21 Nov 2017 09:29:32 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39994) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FM-0001ob-6P for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9FH-0002xZ-En for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:56 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38322) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FH-0002xM-1v for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:51 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 4E23854006E; Tue, 21 Nov 2017 17:09:50 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:48 +0300 Message-ID: <151127338809.6888.8871616354338249287.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 27/45] windbg: implemented windbg_write_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 | 212 ++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 212 insertions(+) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 1fccd8eee7..dc2a10f8e6 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -273,6 +273,12 @@ typedef struct _CPU_KPROCESSOR_STATE { CPU_KSPECIAL_REGISTERS SpecialRegisters; } CPU_KPROCESSOR_STATE, *PCPU_KPROCESSOR_STATE; =20 +static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) +{} + +static void windbg_set_sr(CPUState *cpu, int sr, uint16_t selector) +{} + static int windbg_read_context(CPUState *cpu, uint8_t *buf, int buf_size, int offset, int len) { @@ -378,6 +384,212 @@ static int windbg_read_context(CPUState *cpu, uint8_t= *buf, int buf_size, static int windbg_write_context(CPUState *cpu, uint8_t *buf, int buf_size, int offset, int len) { + CPUArchState *env =3D cpu->env_ptr; + int mem_size, i, tmp; + uint8_t *mem_ptr =3D buf; + + if (len < 0 || len > buf_size) { + WINDBG_ERROR("windbg_write_context: incorrect length %d", len); + return 1; + } + + if (offset < 0 || offset + len > sizeof(CPU_CONTEXT)) { + WINDBG_ERROR("windbg_write_context: incorrect offset %d", offset); + return 2; + } + + while (len > 0 && offset < sizeof(CPU_CONTEXT)) { + mem_size =3D 1; + switch (offset) { + + case offsetof(CPU_CONTEXT, ContextFlags): + mem_size =3D sizeof_field(CPU_CONTEXT, ContextFlags); + break; + + case offsetof(CPU_CONTEXT, Dr0): + mem_size =3D sizeof_field(CPU_CONTEXT, Dr0); + windbg_set_dr(cpu, 0, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr1): + mem_size =3D sizeof_field(CPU_CONTEXT, Dr1); + windbg_set_dr(cpu, 1, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr2): + mem_size =3D sizeof_field(CPU_CONTEXT, Dr2); + windbg_set_dr(cpu, 2, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr3): + mem_size =3D sizeof_field(CPU_CONTEXT, Dr3); + windbg_set_dr(cpu, 3, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr6): + mem_size =3D sizeof_field(CPU_CONTEXT, Dr6); + windbg_set_dr(cpu, 6, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr7): + mem_size =3D sizeof_field(CPU_CONTEXT, Dr7); + windbg_set_dr(cpu, 7, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, FloatSave.ControlWord): + mem_size =3D sizeof_field(CPU_CONTEXT, FloatSave.ControlWord); + cpu_set_fpuc(env, ldl_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, FloatSave.StatusWord): + mem_size =3D sizeof_field(CPU_CONTEXT, FloatSave.StatusWord); + tmp =3D ldl_p(buf + offset); + env->fpstt =3D (tmp >> 11) & 7; + env->fpus =3D tmp & ~0x3800; + break; + + case offsetof(CPU_CONTEXT, FloatSave.TagWord): + mem_size =3D sizeof_field(CPU_CONTEXT, FloatSave.TagWord); + tmp =3D ldl_p(buf + offset); + for (i =3D 0; i < 8; ++i) { + env->fptags[i] =3D !((tmp >> i) & 1); + } + break; + + case offsetof(CPU_CONTEXT, FloatSave.ErrorOffset): + mem_size =3D sizeof_field(CPU_CONTEXT, FloatSave.ErrorOffset); + UINT32_P(&env->fpip)[0] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, FloatSave.ErrorSelector): + mem_size =3D sizeof_field(CPU_CONTEXT, FloatSave.ErrorSelector= ); + UINT32_P(&env->fpip)[1] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, FloatSave.DataOffset): + mem_size =3D sizeof_field(CPU_CONTEXT, FloatSave.DataOffset); + UINT32_P(&env->fpdp)[0] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, FloatSave.DataSelector): + mem_size =3D sizeof_field(CPU_CONTEXT, FloatSave.DataSelector); + UINT32_P(&env->fpdp)[1] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, FloatSave.RegisterArea): + mem_size =3D sizeof_field(CPU_CONTEXT, FloatSave.RegisterArea); + for (i =3D 0; i < 8; ++i) { + memcpy(PTR(env->fpregs[i]), mem_ptr + i * 10, 10); + } + break; + + case offsetof(CPU_CONTEXT, FloatSave.Cr0NpxState): + mem_size =3D sizeof_field(CPU_CONTEXT, FloatSave.Cr0NpxState); + env->xcr0 =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, SegGs): + mem_size =3D sizeof_field(CPU_CONTEXT, SegGs); + windbg_set_sr(cpu, R_GS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, SegFs): + mem_size =3D sizeof_field(CPU_CONTEXT, SegFs); + windbg_set_sr(cpu, R_FS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, SegEs): + mem_size =3D sizeof_field(CPU_CONTEXT, SegEs); + windbg_set_sr(cpu, R_ES, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, SegDs): + mem_size =3D sizeof_field(CPU_CONTEXT, SegDs); + windbg_set_sr(cpu, R_DS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Edi): + mem_size =3D sizeof_field(CPU_CONTEXT, Edi); + env->regs[R_EDI] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Esi): + mem_size =3D sizeof_field(CPU_CONTEXT, Esi); + env->regs[R_ESI] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Ebx): + mem_size =3D sizeof_field(CPU_CONTEXT, Ebx); + env->regs[R_EBX] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Edx): + mem_size =3D sizeof_field(CPU_CONTEXT, Edx); + env->regs[R_EDX] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Ecx): + mem_size =3D sizeof_field(CPU_CONTEXT, Ecx); + env->regs[R_ECX] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Eax): + mem_size =3D sizeof_field(CPU_CONTEXT, Eax); + env->regs[R_EAX] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Ebp): + mem_size =3D sizeof_field(CPU_CONTEXT, Ebp); + env->regs[R_EBP] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Eip): + mem_size =3D sizeof_field(CPU_CONTEXT, Eip); + env->eip =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, SegCs): + mem_size =3D sizeof_field(CPU_CONTEXT, SegCs); + windbg_set_sr(cpu, R_CS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, EFlags): + mem_size =3D sizeof_field(CPU_CONTEXT, EFlags); + env->eflags =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Esp): + mem_size =3D sizeof_field(CPU_CONTEXT, Esp); + env->regs[R_ESP] =3D ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, SegSs): + mem_size =3D sizeof_field(CPU_CONTEXT, SegSs); + windbg_set_sr(cpu, R_SS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, ExtendedRegisters): + mem_size =3D sizeof_field(CPU_CONTEXT, ExtendedRegisters); + + uint8_t *ptr =3D mem_ptr + 160; + for (i =3D 0; i < 8; ++i, ptr +=3D 16) { + env->xmm_regs[i].ZMM_Q(0) =3D ldl_p(ptr); + env->xmm_regs[i].ZMM_Q(1) =3D ldl_p(ptr + 8); + } + + cpu_set_mxcsr(env, ldl_p(mem_ptr + 24)); + break; + + default: + WINDBG_ERROR("write_context: Unknown offset %d", offset); + return -1; + } + + mem_ptr +=3D mem_size; + offset +=3D mem_size; + len -=3D mem_size; + } + return 0; } =20 From nobody Sun Apr 28 23:53:21 2024 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 1511274626614648.5134440416185; Tue, 21 Nov 2017 06:30:26 -0800 (PST) Received: from localhost ([::1]:34738 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Z4-0003Lr-TF for importer@patchew.org; Tue, 21 Nov 2017 09:30:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40023) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FQ-0001u7-Sb for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9FM-0002zz-S1 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:00 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38342) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FM-0002zq-KB for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:09:56 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id F05F154006E; Tue, 21 Nov 2017 17:09:55 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:54 +0300 Message-ID: <151127339375.6888.2530523412750283528.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 28/45] windbg: implemented windbg_read_ks_regs 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 | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index dc2a10f8e6..c492ee58d8 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -596,6 +596,45 @@ static int windbg_write_context(CPUState *cpu, uint8_t= *buf, int buf_size, static int windbg_read_ks_regs(CPUState *cpu, uint8_t *buf, int buf_size, int offset, int len) { + CPUArchState *env =3D cpu->env_ptr; + CPU_KSPECIAL_REGISTERS *ckr; + bool new_mem; + + new_mem =3D (len !=3D sizeof(CPU_KSPECIAL_REGISTERS) || offset !=3D 0); + if (new_mem) { + ckr =3D g_new(CPU_KSPECIAL_REGISTERS, 1); + } else { + ckr =3D (CPU_KSPECIAL_REGISTERS *) buf; + } + + memset(ckr, 0, len); + + ckr->Cr0 =3D ldl_p(&env->cr[0]); + ckr->Cr2 =3D ldl_p(&env->cr[2]); + ckr->Cr3 =3D ldl_p(&env->cr[3]); + ckr->Cr4 =3D ldl_p(&env->cr[4]); + + ckr->KernelDr0 =3D ldtul_p(&env->dr[0]); + ckr->KernelDr1 =3D ldtul_p(&env->dr[1]); + ckr->KernelDr2 =3D ldtul_p(&env->dr[2]); + ckr->KernelDr3 =3D ldtul_p(&env->dr[3]); + ckr->KernelDr6 =3D ldtul_p(&env->dr[6]); + ckr->KernelDr7 =3D ldtul_p(&env->dr[7]); + + ckr->Gdtr.Pad =3D lduw_p(&env->gdt.selector); + ckr->Idtr.Pad =3D lduw_p(&env->idt.selector); + + ckr->Gdtr.Limit =3D lduw_p(&env->gdt.limit); + ckr->Gdtr.Base =3D ldtul_p(&env->gdt.base); + ckr->Idtr.Limit =3D lduw_p(&env->idt.limit); + ckr->Idtr.Base =3D ldtul_p(&env->idt.base); + ckr->Tr =3D lduw_p(&env->tr.selector); + ckr->Ldtr =3D lduw_p(&env->ldt.selector); + + if (new_mem) { + memcpy(buf, (uint8_t *) ckr + offset, len); + g_free(ckr); + } return 0; } =20 From nobody Sun Apr 28 23:53:21 2024 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 151127476640823.091374940009587; Tue, 21 Nov 2017 06:32:46 -0800 (PST) Received: from localhost ([::1]:34753 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9bC-000569-SQ for importer@patchew.org; Tue, 21 Nov 2017 09:32:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40057) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FW-0001yc-Nj for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9FS-000337-Lc for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:06 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38376) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FS-00032n-8J for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:02 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 855E754006E; Tue, 21 Nov 2017 17:10:01 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:09:59 +0300 Message-ID: <151127339933.6888.15067151619046465118.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 29/45] windbg: implemented windbg_write_ks_regs 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 | 111 ++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 111 insertions(+) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index c492ee58d8..63962b48dd 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -641,6 +641,117 @@ static int windbg_read_ks_regs(CPUState *cpu, uint8_t= *buf, int buf_size, static int windbg_write_ks_regs(CPUState *cpu, uint8_t *buf, int buf_size, int offset, int len) { + CPUArchState *env =3D cpu->env_ptr; + int mem_size; + uint8_t *mem_ptr =3D buf; + while (len > 0 && offset < sizeof(CPU_KSPECIAL_REGISTERS)) { + mem_size =3D 1; + switch (offset) { + + case offsetof(CPU_KSPECIAL_REGISTERS, Cr0): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Cr0); + cpu_x86_update_cr0(env, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Cr2): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Cr2); + env->cr[2] =3D ldtul_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Cr3): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Cr3); + cpu_x86_update_cr3(env, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Cr4): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Cr4); + cpu_x86_update_cr4(env, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr0): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr0); + windbg_set_dr(cpu, 0, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr1): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr1); + windbg_set_dr(cpu, 1, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr2): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr2); + windbg_set_dr(cpu, 2, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr3): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr3); + windbg_set_dr(cpu, 3, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr6): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr6); + windbg_set_dr(cpu, 6, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr7): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr7); + windbg_set_dr(cpu, 7, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Gdtr.Pad): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Gdtr.Pad); + env->gdt.selector =3D lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Gdtr.Limit): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Gdtr.Limit); + env->gdt.limit =3D lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Gdtr.Base): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Gdtr.Base); + env->gdt.base =3D ldtul_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Idtr.Pad): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Idtr.Pad); + env->idt.selector =3D lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Idtr.Limit): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Idtr.Limit); + env->idt.limit =3D lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Idtr.Base): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Idtr.Base); + env->idt.base =3D ldtul_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Tr): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Tr); + env->tr.selector =3D lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Ldtr): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Ldtr); + env->ldt.selector =3D lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Reserved): + mem_size =3D sizeof_field(CPU_KSPECIAL_REGISTERS, Reserved); + break; + + default: + WINDBG_ERROR("write_context: Unknown offset %d", offset); + return -1; + } + + mem_ptr +=3D mem_size; + offset +=3D mem_size; + len -=3D mem_size; + } + return 0; } =20 From nobody Sun Apr 28 23:53:21 2024 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 1511274913262550.9416939847582; Tue, 21 Nov 2017 06:35:13 -0800 (PST) Received: from localhost ([::1]:34765 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9dg-0006ol-CJ for importer@patchew.org; Tue, 21 Nov 2017 09:35:04 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40086) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FZ-00020h-0G for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9FY-00034f-2t for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:08 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38400) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9FX-00034Z-RQ for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:08 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 3723D54006E; Tue, 21 Nov 2017 17:10:07 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:05 +0300 Message-ID: <151127340497.6888.15997106699521359739.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 30/45] windbg: implemented windbg_set_sr 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 | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 63962b48dd..c59d1401ad 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -277,7 +277,22 @@ static void windbg_set_dr(CPUState *cpu, int index, ta= rget_ulong value) {} =20 static void windbg_set_sr(CPUState *cpu, int sr, uint16_t selector) -{} +{ + CPUArchState *env =3D cpu->env_ptr; + + if (selector !=3D env->segs[sr].selector && + (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK))) { + unsigned int limit, flags; + target_ulong base; + + int dpl =3D (env->eflags & VM_MASK) ? 3 : 0; + base =3D selector << 4; + limit =3D 0xffff; + flags =3D DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK | (dpl << DESC_DPL_SHIFT); + cpu_x86_load_seg_cache(env, sr, selector, base, limit, flags); + } +} =20 static int windbg_read_context(CPUState *cpu, uint8_t *buf, int buf_size, int offset, int len) From nobody Sun Apr 28 23:53:21 2024 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 1511274072978643.5045828288143; Tue, 21 Nov 2017 06:21:12 -0800 (PST) Received: from localhost ([::1]:34681 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9QA-0002u2-Ml for importer@patchew.org; Tue, 21 Nov 2017 09:21:06 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40147) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Fh-00027r-MX for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Fd-000371-OE for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:17 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38426) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Fd-00036N-Gh for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:13 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id C939454006E; Tue, 21 Nov 2017 17:10:12 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:10 +0300 Message-ID: <151127341057.6888.4836291640056893717.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 31/45] windbg: implemented windbg_set_dr 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 Defined useful macros for breakpoints. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- target/i386/windbgstub.c | 50 ++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index c59d1401ad..14ad195107 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -14,6 +14,21 @@ #ifndef TARGET_X86_64 #include "exec/windbgstub-utils.h" =20 +#define IS_LOCAL_BP_ENABLED(dr7, index) (((dr7) >> ((index) * 2)) & 1) + +#define IS_GLOBAL_BP_ENABLED(dr7, index) (((dr7) >> ((index) * 2)) & 2) + +#define IS_BP_ENABLED(dr7, index) \ + (IS_LOCAL_BP_ENABLED(dr7, index) | IS_GLOBAL_BP_ENABLED(dr7, index)) + +#define BP_TYPE(dr7, index) \ + ((int) ((dr7) >> (DR7_TYPE_SHIFT + ((index) * 4))) & 3) + +#define BP_LEN(dr7, index) ({ \ + int _len =3D (((dr7) >> (DR7_LEN_SHIFT + ((index) * 4))) & 3); \ + (_len =3D=3D 2) ? 8 : _len + 1; \ +}) + #ifdef TARGET_X86_64 # define OFFSET_SELF_PCR 0x18 # define OFFSET_VERS 0x108 @@ -273,9 +288,42 @@ typedef struct _CPU_KPROCESSOR_STATE { CPU_KSPECIAL_REGISTERS SpecialRegisters; } CPU_KPROCESSOR_STATE, *PCPU_KPROCESSOR_STATE; =20 -static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) +static int windbg_hw_breakpoint_insert(CPUState *cpu, int index) +{ + return 0; +} + +static int windbg_hw_breakpoint_remove(CPUState *cpu, int index) +{ + return 0; +} + +static void windbg_set_dr7(CPUState *cpu, target_ulong new_dr7) {} =20 +static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) +{ + CPUArchState *env =3D cpu->env_ptr; + + switch (index) { + case 0 ... 3: + if (IS_BP_ENABLED(env->dr[7], index) && env->dr[index] !=3D value)= { + windbg_hw_breakpoint_remove(cpu, index); + env->dr[index] =3D value; + windbg_hw_breakpoint_insert(cpu, index); + } else { + env->dr[index] =3D value; + } + return; + case 6: + env->dr[6] =3D value | DR6_FIXED_1; + return; + case 7: + windbg_set_dr7(cpu, value); + return; + } +} + static void windbg_set_sr(CPUState *cpu, int sr, uint16_t selector) { CPUArchState *env =3D cpu->env_ptr; From nobody Sun Apr 28 23:53:21 2024 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 1511274973927600.210999872231; Tue, 21 Nov 2017 06:36:13 -0800 (PST) Received: from localhost ([::1]:34785 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9el-0007nJ-6C for importer@patchew.org; Tue, 21 Nov 2017 09:36:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40178) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Fk-0002Cj-HQ for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Fj-0003CU-Cr for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:20 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38450) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Fj-0003CD-5U for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:19 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 793F754006E; Tue, 21 Nov 2017 17:10:18 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:16 +0300 Message-ID: <151127341622.6888.467609082965426336.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 32/45] windbg: implemented windbg_set_dr7 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 | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 14ad195107..deb0e728e0 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -299,7 +299,32 @@ static int windbg_hw_breakpoint_remove(CPUState *cpu, = int index) } =20 static void windbg_set_dr7(CPUState *cpu, target_ulong new_dr7) -{} +{ + CPUArchState *env =3D cpu->env_ptr; + target_ulong old_dr7 =3D env->dr[7]; + int iobpt =3D 0; + int i; + + new_dr7 |=3D DR7_FIXED_1; + if (new_dr7 =3D=3D old_dr7) { + return; + } + + for (i =3D 0; i < DR7_MAX_BP; i++) { + if (IS_BP_ENABLED(old_dr7, i) && !IS_BP_ENABLED(new_dr7, i)) { + windbg_hw_breakpoint_remove(cpu, i); + } + } + + env->dr[7] =3D new_dr7; + for (i =3D 0; i < DR7_MAX_BP; i++) { + if (IS_BP_ENABLED(env->dr[7], i)) { + iobpt |=3D windbg_hw_breakpoint_insert(cpu, i); + } + } + + env->hflags =3D (env->hflags & ~HF_IOBPT_MASK) | iobpt; +} =20 static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) { From nobody Sun Apr 28 23:53:21 2024 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 1511275023630737.7078321805315; Tue, 21 Nov 2017 06:37:03 -0800 (PST) Received: from localhost ([::1]:34786 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9fM-0008F3-To for importer@patchew.org; Tue, 21 Nov 2017 09:36:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40247) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Fv-0002N4-F8 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Fp-0003Dz-1W for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:30 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38478) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Fo-0003Ds-PO for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:24 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 183BB54006E; Tue, 21 Nov 2017 17:10:24 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:22 +0300 Message-ID: <151127342187.6888.10071306547141532589.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 33/45] windbg: implemented windbg_hw_breakpoint_insert and windbg_hw_breakpoint_remove 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 | 56 ++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 56 insertions(+) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index deb0e728e0..43e6d45df9 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -290,11 +290,67 @@ typedef struct _CPU_KPROCESSOR_STATE { =20 static int windbg_hw_breakpoint_insert(CPUState *cpu, int index) { + CPUArchState *env =3D cpu->env_ptr; + + target_ulong addr =3D env->dr[index]; + int type =3D BP_TYPE(env->dr[7], index); + int len =3D BP_LEN(env->dr[7], index); + int err =3D 0; + + switch (type) { + case DR7_TYPE_DATA_WR: + err =3D cpu_watchpoint_insert(cpu, addr, len, BP_MEM_WRITE | BP_GD= B, + &env->cpu_watchpoint[index]); + break; + case DR7_TYPE_DATA_RW: + err =3D cpu_watchpoint_insert(cpu, addr, len, BP_MEM_ACCESS | BP_G= DB, + &env->cpu_watchpoint[index]); + break; + case DR7_TYPE_BP_INST: + err =3D cpu_breakpoint_insert(cpu, addr, BP_GDB, + &env->cpu_breakpoint[index]); + break; + case DR7_TYPE_IO_RW: + return HF_IOBPT_MASK; + default: + return 0; + } + + if (!err) { + WINDBG_DEBUG("hw_breakpoint_insert: index(%d), " FMT_ADDR, + index, addr); + } else { + env->cpu_breakpoint[index] =3D NULL; + WINDBG_ERROR("hw_breakpoint_insert: index(%d), " FMT_ADDR ", " FMT= _ERR, + index, addr, err); + } return 0; } =20 static int windbg_hw_breakpoint_remove(CPUState *cpu, int index) { + CPUArchState *env =3D cpu->env_ptr; + int type =3D BP_TYPE(env->dr[7], index); + + switch (type) { + case DR7_TYPE_BP_INST: + if (env->cpu_breakpoint[index]) { + cpu_breakpoint_remove_by_ref(cpu, env->cpu_breakpoint[index]); + } + break; + case DR7_TYPE_DATA_WR: + case DR7_TYPE_DATA_RW: + if (env->cpu_watchpoint[index]) { + cpu_watchpoint_remove_by_ref(cpu, env->cpu_watchpoint[index]); + } + break; + default: + return 0; + } + + env->cpu_breakpoint[index] =3D NULL; + WINDBG_DEBUG("hw_breakpoint_remove: index(%d), " FMT_ADDR, + index, env->dr[index]); return 0; } =20 From nobody Sun Apr 28 23:53:21 2024 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 1511275089854537.6329969955514; Tue, 21 Nov 2017 06:38:09 -0800 (PST) Received: from localhost ([::1]:34791 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9gW-0000Zq-0n for importer@patchew.org; Tue, 21 Nov 2017 09:38:00 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40265) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9G0-0002Ri-UO for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Fv-0003Fd-1B for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:36 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38510) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Fu-0003FJ-EC for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:30 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id B223754006E; Tue, 21 Nov 2017 17:10:29 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:27 +0300 Message-ID: <151127342748.6888.16000796755963632674.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 34/45] windbg: implemented kd_api_write_breakpoint and kd_api_restore_breakpoint 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 Added supporting of windbg breakpoints. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 2 + windbgstub-utils.c | 62 +++++++++++++++++++++++++++++++++++= ++++ windbgstub.c | 11 +++++++ 3 files changed, 75 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 5e5893bac8..0d9ccf9801 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -90,6 +90,8 @@ void kd_api_read_virtual_memory(CPUState *cpu, PacketData= *pd); void kd_api_write_virtual_memory(CPUState *cpu, PacketData *pd); void kd_api_get_context(CPUState *cpu, PacketData *pd); void kd_api_set_context(CPUState *cpu, PacketData *pd); +void kd_api_write_breakpoint(CPUState *cpu, PacketData *pd); +void kd_api_restore_breakpoint(CPUState *cpu, PacketData *pd); void kd_api_read_control_space(CPUState *cpu, PacketData *pd); void kd_api_write_control_space(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 1e81c37501..f00dab2a9d 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -14,6 +14,8 @@ static InitedAddr KPCR; static InitedAddr version; =20 +static InitedAddr bps[KD_BREAKPOINT_MAX]; + InitedAddr *windbg_get_KPCR(void) { return &KPCR; @@ -71,6 +73,66 @@ void kd_api_write_virtual_memory(CPUState *cpu, PacketDa= ta *pd) stl_p(&mem->ActualBytesWritten, len); } =20 +void kd_api_write_breakpoint(CPUState *cpu, PacketData *pd) +{ + DBGKD_WRITE_BREAKPOINT64 *m64c =3D &pd->m64.u.WriteBreakPoint; + target_ulong addr; + int i, err =3D 0; + + addr =3D ldtul_p(&m64c->BreakPointAddress); + + for (i =3D 0; i < KD_BREAKPOINT_MAX; ++i) { + if (!bps[i].is_init) { + err =3D cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL); + if (!err) { + bps[i].addr =3D addr; + bps[i].is_init =3D true; + WINDBG_DEBUG("write_breakpoint: " FMT_ADDR, addr); + break; + } else { + WINDBG_ERROR("write_breakpoint: " FMT_ADDR ", " FMT_ERR, + addr, err); + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + return; + } + } else if (addr =3D=3D bps[i].addr) { + break; + } + } + + if (!err) { + stl_p(&m64c->BreakPointHandle, i + 1); + pd->m64.ReturnStatus =3D STATUS_SUCCESS; + } else { + WINDBG_ERROR("write_breakpoint: All breakpoints occupied"); + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + } +} + +void kd_api_restore_breakpoint(CPUState *cpu, PacketData *pd) +{ + DBGKD_RESTORE_BREAKPOINT *m64c =3D &pd->m64.u.RestoreBreakPoint; + uint8_t index; + int err =3D -1; + + index =3D ldtul_p(&m64c->BreakPointHandle) - 1; + + if (bps[index].is_init) { + err =3D cpu_breakpoint_remove(cpu, bps[index].addr, BP_GDB); + if (!err) { + WINDBG_DEBUG("restore_breakpoint: " FMT_ADDR ", index(%d)", + bps[index].addr, index); + } else { + WINDBG_ERROR("restore_breakpoint: " FMT_ADDR ", index(%d), " + FMT_ERR, bps[index].addr, index, err); + } + bps[index].is_init =3D false; + pd->m64.ReturnStatus =3D STATUS_SUCCESS; + } else { + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + } +} + void kd_api_unsupported(CPUState *cpu, PacketData *pd) { WINDBG_ERROR("Caught unimplemented api %s", diff --git a/windbgstub.c b/windbgstub.c index 5b0a15ea4e..489abe6d6c 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -156,6 +156,14 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_set_context(cpu, &ctx->data); break; =20 + case DbgKdWriteBreakPointApi: + kd_api_write_breakpoint(cpu, &ctx->data); + break; + + case DbgKdRestoreBreakPointApi: + kd_api_restore_breakpoint(cpu, &ctx->data); + break; + case DbgKdReadControlSpaceApi: kd_api_read_control_space(cpu, &ctx->data); break; @@ -164,6 +172,9 @@ static void windbg_process_manipulate_packet(ParsingCon= text *ctx) kd_api_write_control_space(cpu, &ctx->data); break; =20 + case DbgKdClearAllInternalBreakpointsApi: + return; + default: kd_api_unsupported(cpu, &ctx->data); break; From nobody Sun Apr 28 23:53:21 2024 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 1511275126475252.4669698655722; Tue, 21 Nov 2017 06:38:46 -0800 (PST) Received: from localhost ([::1]:34792 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9hA-000136-Os for importer@patchew.org; Tue, 21 Nov 2017 09:38:40 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40291) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9G4-0002US-I8 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9G0-0003Gs-Er for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:40 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38532) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9G0-0003Gh-2F for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:36 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 62A6E54006E; Tue, 21 Nov 2017 17:10:35 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:33 +0300 Message-ID: <151127343314.6888.13289325558071964830.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 35/45] windbg: debug exception subscribing 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 Added handler registration of gdb debug exception. Its exception also can b= e used for windbg. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- cpus.c | 18 +++++++++++++++++- gdbstub.c | 4 ++++ include/sysemu/sysemu.h | 2 ++ windbgstub.c | 16 ++++++++++++---- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/cpus.c b/cpus.c index 9bed61eefc..212553b7e3 100644 --- a/cpus.c +++ b/cpus.c @@ -77,6 +77,8 @@ int64_t max_advance; static QEMUTimer *throttle_timer; static unsigned int throttle_percentage; =20 +static void (*excp_debug_handler)(CPUState *cpu); + #define CPU_THROTTLE_PCT_MIN 1 #define CPU_THROTTLE_PCT_MAX 99 #define CPU_THROTTLE_TIMESLICE_NS 10000000 @@ -960,9 +962,23 @@ static bool cpu_can_run(CPUState *cpu) return true; } =20 +bool register_excp_debug_handler(void (*handler)(CPUState *cpu)) +{ + if (excp_debug_handler =3D=3D NULL) { + excp_debug_handler =3D handler; + return true; + } else { + error_report("ERROR: Something debugger already using"); + return false; + } +} + static void cpu_handle_guest_debug(CPUState *cpu) { - gdb_set_stop_cpu(cpu); + if (excp_debug_handler !=3D NULL) { + excp_debug_handler(cpu); + } + qemu_system_debug_request(); cpu->stopped =3D true; } diff --git a/gdbstub.c b/gdbstub.c index 2a94030d3b..8c76f54117 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -2006,6 +2006,10 @@ int gdbserver_start(const char *device) s->mon_chr =3D mon_chr; s->current_syscall_cb =3D NULL; =20 + if (!register_excp_debug_handler(gdb_set_stop_cpu)) { + exit(1); + } + return 0; } =20 diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index b21369672a..34588c99b4 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -193,6 +193,8 @@ QemuOpts *qemu_get_machine_opts(void); =20 bool defaults_enabled(void); =20 +bool register_excp_debug_handler(void (*handler)(CPUState *cpu)); + extern QemuOptsList qemu_legacy_drive_opts; extern QemuOptsList qemu_common_drive_opts; extern QemuOptsList qemu_drive_opts; diff --git a/windbgstub.c b/windbgstub.c index 489abe6d6c..b33f412659 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -115,16 +115,20 @@ static void windbg_send_control_packet(uint16_t type) windbg_state->ctrl_packet_id ^=3D 1; } =20 -static void windbg_vm_stop(void) +static void windbg_bp_handler(CPUState *cpu) { - CPUState *cpu =3D qemu_get_cpu(0); - vm_stop(RUN_STATE_PAUSED); - SizedBuf buf =3D kd_gen_exception_sc(cpu); windbg_send_data_packet(buf.data, buf.size, PACKET_TYPE_KD_STATE_CHANG= E64); SBUF_FREE(buf); } =20 +static void windbg_vm_stop(void) +{ + CPUState *cpu =3D qemu_get_cpu(0); + vm_stop(RUN_STATE_PAUSED); + windbg_bp_handler(cpu); +} + static void windbg_process_manipulate_packet(ParsingContext *ctx) { CPUState *cpu; @@ -432,6 +436,10 @@ int windbg_server_start(const char *device) =20 qemu_register_reset(windbg_handle_reset, NULL); =20 + if (!register_excp_debug_handler(windbg_bp_handler)) { + exit(1); + } + atexit(windbg_exit); return 0; } From nobody Sun Apr 28 23:53:21 2024 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 1511275262675104.49824371334921; Tue, 21 Nov 2017 06:41:02 -0800 (PST) Received: from localhost ([::1]:34807 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9jH-0002jC-T8 for importer@patchew.org; Tue, 21 Nov 2017 09:40:51 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40330) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9GA-0002Yn-6e for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9G6-0003Ir-4m for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:46 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38554) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9G5-0003Ih-Sl for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:42 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 0132654006F; Tue, 21 Nov 2017 17:10:40 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:39 +0300 Message-ID: <151127343877.6888.18445085019247800959.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 36/45] windbg: implemented kd_api_continue 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 --- include/exec/windbgstub-utils.h | 1 + windbgstub-utils.c | 15 +++++++++++++++ windbgstub.c | 5 +++++ 3 files changed, 21 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 0d9ccf9801..2cfca92183 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -92,6 +92,7 @@ void kd_api_get_context(CPUState *cpu, PacketData *pd); void kd_api_set_context(CPUState *cpu, PacketData *pd); void kd_api_write_breakpoint(CPUState *cpu, PacketData *pd); void kd_api_restore_breakpoint(CPUState *cpu, PacketData *pd); +void kd_api_continue(CPUState *cpu, PacketData *pd); void kd_api_read_control_space(CPUState *cpu, PacketData *pd); void kd_api_write_control_space(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index f00dab2a9d..fe3adb0b88 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -10,6 +10,7 @@ */ =20 #include "exec/windbgstub-utils.h" +#include "sysemu/sysemu.h" =20 static InitedAddr KPCR; static InitedAddr version; @@ -133,6 +134,20 @@ void kd_api_restore_breakpoint(CPUState *cpu, PacketDa= ta *pd) } } =20 +void kd_api_continue(CPUState *cpu, PacketData *pd) +{ + uint32_t status =3D ldl_p(&pd->m64.u.Continue2.ContinueStatus); + uint32_t trace =3D ldl_p(&pd->m64.u.Continue2.ControlSet.TraceFlag); + int ssFlag =3D trace ? SSTEP_ENABLE | SSTEP_NOIRQ | SSTEP_NOTIMER : 0; + + if (NT_SUCCESS(status)) { + cpu_single_step(cpu, ssFlag); + if (!runstate_needs_reset()) { + vm_start(); + } + } +} + void kd_api_unsupported(CPUState *cpu, PacketData *pd) { WINDBG_ERROR("Caught unimplemented api %s", diff --git a/windbgstub.c b/windbgstub.c index b33f412659..a04698b003 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -168,6 +168,11 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_restore_breakpoint(cpu, &ctx->data); break; =20 + case DbgKdContinueApi: + case DbgKdContinueApi2: + kd_api_continue(cpu, &ctx->data); + return; + case DbgKdReadControlSpaceApi: kd_api_read_control_space(cpu, &ctx->data); break; From nobody Sun Apr 28 23:53:21 2024 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 1511275219120347.5383894905467; Tue, 21 Nov 2017 06:40:19 -0800 (PST) Received: from localhost ([::1]:34800 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9iV-0001zT-9r for importer@patchew.org; Tue, 21 Nov 2017 09:40:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40366) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9GE-0002cP-Ak for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9GB-0003Kd-TJ for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:50 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38576) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9GB-0003KT-Gc for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:47 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id CAB6A54006E; Tue, 21 Nov 2017 17:10:46 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:44 +0300 Message-ID: <151127344459.6888.9361026523542993921.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 37/45] windbg: implemented kd_api_read_io_space and kd_api_write_io_space 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 --- include/exec/windbgstub-utils.h | 2 + windbgstub-utils.c | 62 +++++++++++++++++++++++++++++++++++= ++++ windbgstub.c | 8 +++++ 3 files changed, 72 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 2cfca92183..7f52acbae3 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -95,6 +95,8 @@ void kd_api_restore_breakpoint(CPUState *cpu, PacketData = *pd); void kd_api_continue(CPUState *cpu, PacketData *pd); void kd_api_read_control_space(CPUState *cpu, PacketData *pd); void kd_api_write_control_space(CPUState *cpu, PacketData *pd); +void kd_api_read_io_space(CPUState *cpu, PacketData *pd); +void kd_api_write_io_space(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index fe3adb0b88..3f8ce1f8be 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -11,6 +11,7 @@ =20 #include "exec/windbgstub-utils.h" #include "sysemu/sysemu.h" +#include "exec/address-spaces.h" =20 static InitedAddr KPCR; static InitedAddr version; @@ -148,6 +149,67 @@ void kd_api_continue(CPUState *cpu, PacketData *pd) } } =20 +void kd_api_read_io_space(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_WRITE_IO64 *io =3D &pd->m64.u.ReadWriteIo; + CPUArchState *env =3D cpu->env_ptr; + + target_ulong addr =3D ldtul_p(&io->IoAddress); + uint32_t value =3D 0; + + switch (io->DataSize) { + case 1: + value =3D address_space_ldub(&address_space_io, addr, + cpu_get_mem_attrs(env), NULL); + stl_p(&io->DataValue, value); + break; + case 2: + value =3D address_space_lduw(&address_space_io, addr, + cpu_get_mem_attrs(env), NULL); + stl_p(&io->DataValue, value); + break; + case 4: + value =3D address_space_ldl(&address_space_io, addr, + cpu_get_mem_attrs(env), NULL); + stl_p(&io->DataValue, value); + break; + default: + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + return; + } + + pd->m64.ReturnStatus =3D STATUS_SUCCESS; +} + +void kd_api_write_io_space(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_WRITE_IO64 *io =3D &pd->m64.u.ReadWriteIo; + CPUArchState *env =3D cpu->env_ptr; + + target_ulong addr =3D ldtul_p(&io->IoAddress); + uint32_t value =3D ldl_p(&io->DataValue); + + switch (io->DataSize) { + case 1: + address_space_stb(&address_space_io, addr, value, + cpu_get_mem_attrs(env), NULL); + break; + case 2: + address_space_stw(&address_space_io, addr, value, + cpu_get_mem_attrs(env), NULL); + break; + case 4: + address_space_stl(&address_space_io, addr, value, + cpu_get_mem_attrs(env), NULL); + break; + default: + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + return; + } + + pd->m64.ReturnStatus =3D STATUS_SUCCESS; +} + void kd_api_unsupported(CPUState *cpu, PacketData *pd) { WINDBG_ERROR("Caught unimplemented api %s", diff --git a/windbgstub.c b/windbgstub.c index a04698b003..397dedd9d1 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -168,6 +168,14 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_restore_breakpoint(cpu, &ctx->data); break; =20 + case DbgKdReadIoSpaceApi: + kd_api_read_io_space(cpu, &ctx->data); + break; + + case DbgKdWriteIoSpaceApi: + kd_api_write_io_space(cpu, &ctx->data); + break; + case DbgKdContinueApi: case DbgKdContinueApi2: kd_api_continue(cpu, &ctx->data); From nobody Sun Apr 28 23:53:21 2024 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 1511275332349928.0719598441159; Tue, 21 Nov 2017 06:42:12 -0800 (PST) Received: from localhost ([::1]:34815 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9kS-0003e7-Ll for importer@patchew.org; Tue, 21 Nov 2017 09:42:04 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40408) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9GL-0002hz-Fe for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9GH-0003M9-CT for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:57 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38616) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9GH-0003M3-4l for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:53 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 6EA0054006E; Tue, 21 Nov 2017 17:10:52 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:50 +0300 Message-ID: <151127345022.6888.7353172210861790809.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 38/45] windbg: implemented kd_api_read_physical_memory and kd_api_write_physical_memory 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 --- include/exec/windbgstub-utils.h | 2 ++ windbgstub-utils.c | 29 +++++++++++++++++++++++++++++ windbgstub.c | 8 ++++++++ 3 files changed, 39 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 7f52acbae3..be48f69f40 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -97,6 +97,8 @@ void kd_api_read_control_space(CPUState *cpu, PacketData = *pd); void kd_api_write_control_space(CPUState *cpu, PacketData *pd); void kd_api_read_io_space(CPUState *cpu, PacketData *pd); void kd_api_write_io_space(CPUState *cpu, PacketData *pd); +void kd_api_read_physical_memory(CPUState *cpu, PacketData *pd); +void kd_api_write_physical_memory(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 3f8ce1f8be..6708e62798 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -210,6 +210,35 @@ void kd_api_write_io_space(CPUState *cpu, PacketData *= pd) pd->m64.ReturnStatus =3D STATUS_SUCCESS; } =20 +void kd_api_read_physical_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_MEMORY64 *mem =3D &pd->m64.u.ReadMemory; + uint32_t len; + target_ulong addr; + + len =3D MIN(ldl_p(&mem->TransferCount), + PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)); + addr =3D ldtul_p(&mem->TargetBaseAddress); + + cpu_physical_memory_rw(addr, pd->extra, len, 0); + pd->extra_size =3D len; + stl_p(&mem->ActualBytesRead, len); +} + +void kd_api_write_physical_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_WRITE_MEMORY64 *mem =3D &pd->m64.u.WriteMemory; + uint32_t len; + target_ulong addr; + + len =3D MIN(ldl_p(&mem->TransferCount), pd->extra_size); + addr =3D ldtul_p(&mem->TargetBaseAddress); + + cpu_physical_memory_rw(addr, pd->extra, len, 1); + pd->extra_size =3D 0; + stl_p(&mem->ActualBytesWritten, len); +} + void kd_api_unsupported(CPUState *cpu, PacketData *pd) { WINDBG_ERROR("Caught unimplemented api %s", diff --git a/windbgstub.c b/windbgstub.c index 397dedd9d1..72324ae53d 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -189,6 +189,14 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_write_control_space(cpu, &ctx->data); break; =20 + case DbgKdReadPhysicalMemoryApi: + kd_api_read_physical_memory(cpu, &ctx->data); + break; + + case DbgKdWritePhysicalMemoryApi: + kd_api_write_physical_memory(cpu, &ctx->data); + break; + case DbgKdClearAllInternalBreakpointsApi: return; =20 From nobody Sun Apr 28 23:53:21 2024 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 1511275451449464.3797929689516; Tue, 21 Nov 2017 06:44:11 -0800 (PST) Received: from localhost ([::1]:34824 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9mM-0005CW-SX for importer@patchew.org; Tue, 21 Nov 2017 09:44:02 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40445) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9GP-0002n3-K5 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9GM-0003Qn-VJ for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:01 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38644) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9GM-0003QD-Nd for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:10:58 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 1570954006E; Tue, 21 Nov 2017 17:10:58 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:10:56 +0300 Message-ID: <151127345586.6888.4109654104815822158.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 39/45] windbg: implemented kd_api_get_version 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 --- include/exec/windbgstub-utils.h | 1 + windbgstub-utils.c | 22 ++++++++++++++++++++++ windbgstub.c | 4 ++++ 3 files changed, 27 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index be48f69f40..bc5b6a8468 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -99,6 +99,7 @@ void kd_api_read_io_space(CPUState *cpu, PacketData *pd); void kd_api_write_io_space(CPUState *cpu, PacketData *pd); void kd_api_read_physical_memory(CPUState *cpu, PacketData *pd); void kd_api_write_physical_memory(CPUState *cpu, PacketData *pd); +void kd_api_get_version(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 6708e62798..7ef301bac7 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -239,6 +239,28 @@ void kd_api_write_physical_memory(CPUState *cpu, Packe= tData *pd) stl_p(&mem->ActualBytesWritten, len); } =20 +void kd_api_get_version(CPUState *cpu, PacketData *pd) +{ + DBGKD_GET_VERSION64 *kdver; + int err =3D cpu_memory_rw_debug(cpu, version.addr, PTR(pd->m64) + 0x10, + sizeof(DBGKD_MANIPULATE_STATE64) - 0x10,= 0); + if (!err) { + kdver =3D (DBGKD_GET_VERSION64 *) (PTR(pd->m64) + 0x10); + + stw_p(&kdver->MajorVersion, kdver->MajorVersion); + stw_p(&kdver->MinorVersion, kdver->MinorVersion); + stw_p(&kdver->Flags, kdver->Flags); + stw_p(&kdver->MachineType, kdver->MachineType); + stw_p(&kdver->Unused[0], kdver->Unused[0]); + sttul_p(&kdver->KernBase, kdver->KernBase); + sttul_p(&kdver->PsLoadedModuleList, kdver->PsLoadedModuleList); + sttul_p(&kdver->DebuggerDataList, kdver->DebuggerDataList); + } else { + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + WINDBG_ERROR("get_version: " FMT_ERR, err); + } +} + void kd_api_unsupported(CPUState *cpu, PacketData *pd) { WINDBG_ERROR("Caught unimplemented api %s", diff --git a/windbgstub.c b/windbgstub.c index 72324ae53d..ddca290694 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -197,6 +197,10 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_write_physical_memory(cpu, &ctx->data); break; =20 + case DbgKdGetVersionApi: + kd_api_get_version(cpu, &ctx->data); + break; + case DbgKdClearAllInternalBreakpointsApi: return; =20 From nobody Sun Apr 28 23:53:21 2024 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 151127470920753.43661972909729; Tue, 21 Nov 2017 06:31:49 -0800 (PST) Received: from localhost ([::1]:34752 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9aR-0004W3-Er for importer@patchew.org; Tue, 21 Nov 2017 09:31:43 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40506) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Ga-0002wp-K6 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:15 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9GT-0003bR-Qt for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:12 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38678) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9GT-0003b4-Cc for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:05 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id A7F1854006E; Tue, 21 Nov 2017 17:11:03 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:11:01 +0300 Message-ID: <151127346143.6888.10589409888753299614.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 40/45] windbg: implemented kd_api_read_msr and kd_api_write_msr 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 --- include/exec/windbgstub-utils.h | 2=20 target/i386/windbgstub.c | 319 +++++++++++++++++++++++++++++++++++= ++++ windbgstub.c | 8 + 3 files changed, 329 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index bc5b6a8468..73d49b774d 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -100,6 +100,8 @@ void kd_api_write_io_space(CPUState *cpu, PacketData *p= d); void kd_api_read_physical_memory(CPUState *cpu, PacketData *pd); void kd_api_write_physical_memory(CPUState *cpu, PacketData *pd); void kd_api_get_version(CPUState *cpu, PacketData *pd); +void kd_api_read_msr(CPUState *cpu, PacketData *pd); +void kd_api_write_msr(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 43e6d45df9..735b2edd5f 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -1003,6 +1003,325 @@ void kd_api_write_control_space(CPUState *cpu, Pack= etData *pd) stl_p(&mem->ActualBytesWritten, len); } =20 +void kd_api_read_msr(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_WRITE_MSR *m64c =3D &pd->m64.u.ReadWriteMsr; + CPUArchState *env =3D cpu->env_ptr; + + uint64_t val; + + cpu_svm_check_intercept_param(env, SVM_EXIT_MSR, 0, 0); + + switch ((uint32_t)env->regs[R_ECX]) { + case MSR_IA32_SYSENTER_CS: + val =3D env->sysenter_cs; + break; + case MSR_IA32_SYSENTER_ESP: + val =3D env->sysenter_esp; + break; + case MSR_IA32_SYSENTER_EIP: + val =3D env->sysenter_eip; + break; + case MSR_IA32_APICBASE: + val =3D cpu_get_apic_base(x86_env_get_cpu(env)->apic_state); + break; + case MSR_EFER: + val =3D env->efer; + break; + case MSR_STAR: + val =3D env->star; + break; + case MSR_PAT: + val =3D env->pat; + break; + case MSR_VM_HSAVE_PA: + val =3D env->vm_hsave; + break; + case MSR_IA32_PERF_STATUS: + /* tsc_increment_by_tick */ + val =3D 1000ULL; + /* CPU multiplier */ + val |=3D (((uint64_t)4ULL) << 40); + break; +#ifdef TARGET_X86_64 + case MSR_LSTAR: + val =3D env->lstar; + break; + case MSR_CSTAR: + val =3D env->cstar; + break; + case MSR_FMASK: + val =3D env->fmask; + break; + case MSR_FSBASE: + val =3D env->segs[R_FS].base; + break; + case MSR_GSBASE: + val =3D env->segs[R_GS].base; + break; + case MSR_KERNELGSBASE: + val =3D env->kernelgsbase; + break; + case MSR_TSC_AUX: + val =3D env->tsc_aux; + break; +#endif + case MSR_MTRRphysBase(0): + case MSR_MTRRphysBase(1): + case MSR_MTRRphysBase(2): + case MSR_MTRRphysBase(3): + case MSR_MTRRphysBase(4): + case MSR_MTRRphysBase(5): + case MSR_MTRRphysBase(6): + case MSR_MTRRphysBase(7): + val =3D env->mtrr_var[((uint32_t)env->regs[R_ECX] - + MSR_MTRRphysBase(0)) / 2].base; + break; + case MSR_MTRRphysMask(0): + case MSR_MTRRphysMask(1): + case MSR_MTRRphysMask(2): + case MSR_MTRRphysMask(3): + case MSR_MTRRphysMask(4): + case MSR_MTRRphysMask(5): + case MSR_MTRRphysMask(6): + case MSR_MTRRphysMask(7): + val =3D env->mtrr_var[((uint32_t)env->regs[R_ECX] - + MSR_MTRRphysMask(0)) / 2].mask; + break; + case MSR_MTRRfix64K_00000: + val =3D env->mtrr_fixed[0]; + break; + case MSR_MTRRfix16K_80000: + case MSR_MTRRfix16K_A0000: + val =3D env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix16K_80000 + 1]; + break; + case MSR_MTRRfix4K_C0000: + case MSR_MTRRfix4K_C8000: + case MSR_MTRRfix4K_D0000: + case MSR_MTRRfix4K_D8000: + case MSR_MTRRfix4K_E0000: + case MSR_MTRRfix4K_E8000: + case MSR_MTRRfix4K_F0000: + case MSR_MTRRfix4K_F8000: + val =3D env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix4K_C0000 + 3]; + break; + case MSR_MTRRdefType: + val =3D env->mtrr_deftype; + break; + case MSR_MTRRcap: + if (env->features[FEAT_1_EDX] & CPUID_MTRR) { + val =3D MSR_MTRRcap_VCNT | MSR_MTRRcap_FIXRANGE_SUPPORT | + MSR_MTRRcap_WC_SUPPORTED; + } else { + /* XXX: exception? */ + val =3D 0; + } + break; + case MSR_MCG_CAP: + val =3D env->mcg_cap; + break; + case MSR_MCG_CTL: + if (env->mcg_cap & MCG_CTL_P) { + val =3D env->mcg_ctl; + } else { + val =3D 0; + } + break; + case MSR_MCG_STATUS: + val =3D env->mcg_status; + break; + case MSR_IA32_MISC_ENABLE: + val =3D env->msr_ia32_misc_enable; + break; + case MSR_IA32_BNDCFGS: + val =3D env->msr_bndcfgs; + break; + default: + if ((uint32_t)env->regs[R_ECX] >=3D MSR_MC0_CTL + && (uint32_t)env->regs[R_ECX] < MSR_MC0_CTL + + (4 * env->mcg_cap & 0xff)) { + uint32_t offset =3D (uint32_t)env->regs[R_ECX] - MSR_MC0_CTL; + val =3D env->mce_banks[offset]; + break; + } + /* XXX: exception? */ + val =3D 0; + break; + } + + stq_p(&val, val); + m64c->DataValueLow =3D UINT32_P(val)[0]; + m64c->DataValueHigh =3D UINT32_P(val)[1]; + pd->m64.ReturnStatus =3D STATUS_SUCCESS; +} + +void kd_api_write_msr(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_WRITE_MSR *m64c =3D &pd->m64.u.ReadWriteMsr; + CPUArchState *env =3D cpu->env_ptr; + + uint64_t val; + + cpu_svm_check_intercept_param(env, SVM_EXIT_MSR, 1, 0); + + val =3D m64c->DataValueLow | ((uint64_t) m64c->DataValueHigh) << 32; + val =3D ldq_p(&val); + + switch ((uint32_t)env->regs[R_ECX]) { + case MSR_IA32_SYSENTER_CS: + env->sysenter_cs =3D val & 0xffff; + break; + case MSR_IA32_SYSENTER_ESP: + env->sysenter_esp =3D val; + break; + case MSR_IA32_SYSENTER_EIP: + env->sysenter_eip =3D val; + break; + case MSR_IA32_APICBASE: + cpu_set_apic_base(x86_env_get_cpu(env)->apic_state, val); + break; + case MSR_EFER: + { + uint64_t update_mask; + + update_mask =3D 0; + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_SYSCALL) { + update_mask |=3D MSR_EFER_SCE; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { + update_mask |=3D MSR_EFER_LME; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_FFXSR) { + update_mask |=3D MSR_EFER_FFXSR; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_NX) { + update_mask |=3D MSR_EFER_NXE; + } + if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) { + update_mask |=3D MSR_EFER_SVME; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_FFXSR) { + update_mask |=3D MSR_EFER_FFXSR; + } + cpu_load_efer(env, (env->efer & ~update_mask) | + (val & update_mask)); + } + break; + case MSR_STAR: + env->star =3D val; + break; + case MSR_PAT: + env->pat =3D val; + break; + case MSR_VM_HSAVE_PA: + env->vm_hsave =3D val; + break; +#ifdef TARGET_X86_64 + case MSR_LSTAR: + env->lstar =3D val; + break; + case MSR_CSTAR: + env->cstar =3D val; + break; + case MSR_FMASK: + env->fmask =3D val; + break; + case MSR_FSBASE: + env->segs[R_FS].base =3D val; + break; + case MSR_GSBASE: + env->segs[R_GS].base =3D val; + break; + case MSR_KERNELGSBASE: + env->kernelgsbase =3D val; + break; +#endif + case MSR_MTRRphysBase(0): + case MSR_MTRRphysBase(1): + case MSR_MTRRphysBase(2): + case MSR_MTRRphysBase(3): + case MSR_MTRRphysBase(4): + case MSR_MTRRphysBase(5): + case MSR_MTRRphysBase(6): + case MSR_MTRRphysBase(7): + env->mtrr_var[((uint32_t)env->regs[R_ECX] - + MSR_MTRRphysBase(0)) / 2].base =3D val; + break; + case MSR_MTRRphysMask(0): + case MSR_MTRRphysMask(1): + case MSR_MTRRphysMask(2): + case MSR_MTRRphysMask(3): + case MSR_MTRRphysMask(4): + case MSR_MTRRphysMask(5): + case MSR_MTRRphysMask(6): + case MSR_MTRRphysMask(7): + env->mtrr_var[((uint32_t)env->regs[R_ECX] - + MSR_MTRRphysMask(0)) / 2].mask =3D val; + break; + case MSR_MTRRfix64K_00000: + env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix64K_00000] =3D val; + break; + case MSR_MTRRfix16K_80000: + case MSR_MTRRfix16K_A0000: + env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix16K_80000 + 1] =3D val; + break; + case MSR_MTRRfix4K_C0000: + case MSR_MTRRfix4K_C8000: + case MSR_MTRRfix4K_D0000: + case MSR_MTRRfix4K_D8000: + case MSR_MTRRfix4K_E0000: + case MSR_MTRRfix4K_E8000: + case MSR_MTRRfix4K_F0000: + case MSR_MTRRfix4K_F8000: + env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix4K_C0000 + 3] =3D val; + break; + case MSR_MTRRdefType: + env->mtrr_deftype =3D val; + break; + case MSR_MCG_STATUS: + env->mcg_status =3D val; + break; + case MSR_MCG_CTL: + if ((env->mcg_cap & MCG_CTL_P) + && (val =3D=3D 0 || val =3D=3D ~(uint64_t)0)) { + env->mcg_ctl =3D val; + } + break; + case MSR_TSC_AUX: + env->tsc_aux =3D val; + break; + case MSR_IA32_MISC_ENABLE: + env->msr_ia32_misc_enable =3D val; + break; + case MSR_IA32_BNDCFGS: + /* FIXME: #GP if reserved bits are set. */ + /* FIXME: Extend highest implemented bit of linear address. */ + env->msr_bndcfgs =3D val; + cpu_sync_bndcs_hflags(env); + break; + default: + if ((uint32_t)env->regs[R_ECX] >=3D MSR_MC0_CTL + && (uint32_t)env->regs[R_ECX] < MSR_MC0_CTL + + (4 * env->mcg_cap & 0xff)) { + uint32_t offset =3D (uint32_t)env->regs[R_ECX] - MSR_MC0_CTL; + if ((offset & 0x3) !=3D 0 + || (val =3D=3D 0 || val =3D=3D ~(uint64_t)0)) { + env->mce_banks[offset] =3D val; + } + break; + } + /* XXX: exception? */ + break; + } + + pd->m64.ReturnStatus =3D STATUS_SUCCESS; +} + bool windbg_on_load(void) { CPUState *cpu =3D qemu_get_cpu(0); diff --git a/windbgstub.c b/windbgstub.c index ddca290694..0268d0818e 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -197,6 +197,14 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_write_physical_memory(cpu, &ctx->data); break; =20 + case DbgKdReadMachineSpecificRegister: + kd_api_read_msr(cpu, &ctx->data); + break; + + case DbgKdWriteMachineSpecificRegister: + kd_api_write_msr(cpu, &ctx->data); + break; + case DbgKdGetVersionApi: kd_api_get_version(cpu, &ctx->data); break; From nobody Sun Apr 28 23:53:21 2024 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 1511275565993787.6026225456814; Tue, 21 Nov 2017 06:46:05 -0800 (PST) Received: from localhost ([::1]:34854 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9oG-0000CN-A6 for importer@patchew.org; Tue, 21 Nov 2017 09:46:00 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40514) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Gf-000310-SV for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9GZ-0003d3-S7 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:17 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38690) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9GZ-0003cv-K7 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:11 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 5B54054006E; Tue, 21 Nov 2017 17:11:10 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:11:08 +0300 Message-ID: <151127346810.6888.6227202235013087727.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 41/45] windbg: implemented kd_api_search_memory 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 --- include/exec/windbgstub-utils.h | 1 + windbgstub-utils.c | 33 +++++++++++++++++++++++++++++++++ windbgstub.c | 4 ++++ 3 files changed, 38 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index 73d49b774d..c2eb8a75a7 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -102,6 +102,7 @@ void kd_api_write_physical_memory(CPUState *cpu, Packet= Data *pd); void kd_api_get_version(CPUState *cpu, PacketData *pd); void kd_api_read_msr(CPUState *cpu, PacketData *pd); void kd_api_write_msr(CPUState *cpu, PacketData *pd); +void kd_api_search_memory(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 7ef301bac7..1f4590f338 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -261,6 +261,39 @@ void kd_api_get_version(CPUState *cpu, PacketData *pd) } } =20 +void kd_api_search_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_SEARCH_MEMORY *m64c =3D &pd->m64.u.SearchMemory; + int s_len =3D MAX(ldq_p(&m64c->SearchLength), 1); + int p_len =3D MIN(ldl_p(&m64c->PatternLength), pd->extra_size); + target_ulong addr =3D ldq_p(&m64c->SearchAddress); + int size =3D MIN(s_len, 10); + uint8_t mem[size + p_len]; + int i, err; + + pd->extra_size =3D 0; + pd->m64.ReturnStatus =3D STATUS_NO_MORE_ENTRIES; + + while (s_len) { + err =3D cpu_memory_rw_debug(cpu, addr, mem, size + p_len, 0); + if (!err) { + for (i =3D 0; i < size; ++i) { + if (memcmp(mem + i, pd->extra, p_len) =3D=3D 0) { + stl_p(&m64c->FoundAddress, addr + i); + pd->m64.ReturnStatus =3D STATUS_SUCCESS; + return; + } + } + } else { + WINDBG_DEBUG("search_memory: No physical page mapped: " FMT_AD= DR, + addr); + } + s_len -=3D size; + addr +=3D size; + size =3D MIN(s_len, 10); + } +} + void kd_api_unsupported(CPUState *cpu, PacketData *pd) { WINDBG_ERROR("Caught unimplemented api %s", diff --git a/windbgstub.c b/windbgstub.c index 0268d0818e..d35ff6ba96 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -212,6 +212,10 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) case DbgKdClearAllInternalBreakpointsApi: return; =20 + case DbgKdSearchMemoryApi: + kd_api_search_memory(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break; From nobody Sun Apr 28 23:53:21 2024 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 1511274254962203.58275168748492; Tue, 21 Nov 2017 06:24:14 -0800 (PST) Received: from localhost ([::1]:34699 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9T0-0005t4-3m for importer@patchew.org; Tue, 21 Nov 2017 09:24:02 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40529) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Gj-000348-I0 for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Gf-0003ds-El for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:21 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38712) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Gf-0003dm-6s for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:17 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 862B654006E; Tue, 21 Nov 2017 17:11:16 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:11:14 +0300 Message-ID: <151127347432.6888.8678423294546071513.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 42/45] windbg: implemented kd_api_fill_memory 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 --- include/exec/windbgstub-utils.h | 1 + windbgstub-utils.c | 39 +++++++++++++++++++++++++++++++++++= ++++ windbgstub.c | 4 ++++ 3 files changed, 44 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index c2eb8a75a7..e144294b51 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -103,6 +103,7 @@ void kd_api_get_version(CPUState *cpu, PacketData *pd); void kd_api_read_msr(CPUState *cpu, PacketData *pd); void kd_api_write_msr(CPUState *cpu, PacketData *pd); void kd_api_search_memory(CPUState *cpu, PacketData *pd); +void kd_api_fill_memory(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 1f4590f338..fb2c378460 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -294,6 +294,45 @@ void kd_api_search_memory(CPUState *cpu, PacketData *p= d) } } =20 +void kd_api_fill_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_FILL_MEMORY *m64c =3D &pd->m64.u.FillMemory; + uint32_t len =3D ldl_p(&m64c->Length); + target_ulong addr =3D ldq_p(&m64c->Address); + uint16_t pattern =3D ldl_p(&m64c->PatternLength); + uint16_t flags =3D ldl_p(&m64c->Flags); + int err, offset =3D 0; + + uint8_t mem[pattern]; + memcpy(mem, pd->extra, pattern); + + pd->extra_size =3D 0; + + switch (flags) { + case DBGKD_FILL_MEMORY_VIRTUAL: + while (offset < len) { + err =3D cpu_memory_rw_debug(cpu, addr + offset, mem, + MIN(pattern, len - offset), 1); + offset +=3D pattern; + if (err) { + WINDBG_DEBUG("fill_memory: No physical page mapped: " FMT_= ADDR, + addr); + } + } + break; + + case DBGKD_FILL_MEMORY_PHYSICAL: + while (offset < len) { + cpu_physical_memory_rw(addr, mem, MIN(pattern, len - offset), = 1); + offset +=3D pattern; + } + break; + + default: + break; + } +} + void kd_api_unsupported(CPUState *cpu, PacketData *pd) { WINDBG_ERROR("Caught unimplemented api %s", diff --git a/windbgstub.c b/windbgstub.c index d35ff6ba96..b348028dfd 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -216,6 +216,10 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_search_memory(cpu, &ctx->data); break; =20 + case DbgKdFillMemoryApi: + kd_api_fill_memory(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break; From nobody Sun Apr 28 23:53:21 2024 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 1511275635974865.5390110783015; Tue, 21 Nov 2017 06:47:15 -0800 (PST) Received: from localhost ([::1]:34862 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9pP-0001Lo-72 for importer@patchew.org; Tue, 21 Nov 2017 09:47:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40545) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Gn-00036d-Lu for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Gl-0003ey-2G for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:25 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38734) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Gk-0003eo-QK for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:22 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 2193054006E; Tue, 21 Nov 2017 17:11:22 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:11:20 +0300 Message-ID: <151127347991.6888.8008733504996106931.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 43/45] windbg: implemented kd_api_query_memory 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 --- include/exec/windbgstub-utils.h | 1 + windbgstub-utils.c | 12 ++++++++++++ windbgstub.c | 4 ++++ 3 files changed, 17 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index e144294b51..fa1ebbb6d2 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -105,6 +105,7 @@ void kd_api_write_msr(CPUState *cpu, PacketData *pd); void kd_api_search_memory(CPUState *cpu, PacketData *pd); void kd_api_fill_memory(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); +void kd_api_query_memory(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); SizedBuf kd_gen_load_symbols_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index fb2c378460..edd23c1971 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -333,6 +333,18 @@ void kd_api_fill_memory(CPUState *cpu, PacketData *pd) } } =20 +void kd_api_query_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_QUERY_MEMORY *mem =3D &pd->m64.u.QueryMemory; + + mem->AddressSpace =3D DBGKD_QUERY_MEMORY_PROCESS; + mem->Flags =3D DBGKD_QUERY_MEMORY_READ | + DBGKD_QUERY_MEMORY_WRITE | + DBGKD_QUERY_MEMORY_EXECUTE; + mem->AddressSpace =3D ldl_p(&mem->AddressSpace); + mem->Flags =3D ldl_p(&mem->Flags); +} + void kd_api_unsupported(CPUState *cpu, PacketData *pd) { WINDBG_ERROR("Caught unimplemented api %s", diff --git a/windbgstub.c b/windbgstub.c index b348028dfd..36372c0ea5 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -220,6 +220,10 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_fill_memory(cpu, &ctx->data); break; =20 + case DbgKdQueryMemoryApi: + kd_api_query_memory(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break; From nobody Sun Apr 28 23:53:21 2024 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 1511274435131349.34288819131586; Tue, 21 Nov 2017 06:27:15 -0800 (PST) Received: from localhost ([::1]:34717 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Vl-0008At-RH for importer@patchew.org; Tue, 21 Nov 2017 09:26:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40577) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Gv-0003Dy-IO for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Gq-0003gO-PZ for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:33 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38758) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Gq-0003gF-HQ for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:28 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id BD60A54006E; Tue, 21 Nov 2017 17:11:27 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:11:25 +0300 Message-ID: <151127348551.6888.14578205398774037869.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 44/45] windbg: added new api functions 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 Added some definitions for new windbg. Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgkd.h | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/include/exec/windbgkd.h b/include/exec/windbgkd.h index 40a23f8cd0..e5b9bb3b37 100755 --- a/include/exec/windbgkd.h +++ b/include/exec/windbgkd.h @@ -112,7 +112,10 @@ #define DbgKdFillMemoryApi 0x0000315b #define DbgKdQueryMemoryApi 0x0000315c #define DbgKdSwitchPartition 0x0000315d -#define DbgKdMaximumManipulate 0x0000315e +#define DbgKdWriteCustomBreakpointApi 0x0000315e +#define DbgKdGetContextExApi 0x0000315f +#define DbgKdSetContextExApi 0x00003160 +#define DbgKdMaximumManipulate 0x00003161 =20 /* * Debug I/O Types @@ -723,6 +726,20 @@ typedef struct _DBGKD_SWITCH_PARTITION { uint32_t Partition; } DBGKD_SWITCH_PARTITION; =20 +typedef struct _DBGKD_CONTEXT_EX { + uint32_t Offset; + uint32_t ByteCount; + uint32_t BytesCopied; +} DBGKD_CONTEXT_EX, *PDBGKD_CONTEXT_EX; + +typedef struct _DBGKD_WRITE_CUSTOM_BREAKPOINT { + uint64_t BreakPointAddress; + uint64_t BreakPointInstruction; + uint32_t BreakPointHandle; + uint16_t BreakPointInstructionSize; + uint16_t BreakPointInstructionAlignment; +} DBGKD_WRITE_CUSTOM_BREAKPOINT, *PDBGKD_WRITE_CUSTOM_BREAKPOINT; + /* * DBGKD Structure for Manipulate */ @@ -787,6 +804,8 @@ typedef struct _DBGKD_MANIPULATE_STATE64 { DBGKD_FILL_MEMORY FillMemory; DBGKD_QUERY_MEMORY QueryMemory; DBGKD_SWITCH_PARTITION SwitchPartition; + DBGKD_WRITE_CUSTOM_BREAKPOINT WriteCustomBreakpoint; + DBGKD_CONTEXT_EX ContextEx; } u; } DBGKD_MANIPULATE_STATE64, *PDBGKD_MANIPULATE_STATE64; =20 From nobody Sun Apr 28 23:53:21 2024 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 1511275715018455.8999607714735; Tue, 21 Nov 2017 06:48:35 -0800 (PST) Received: from localhost ([::1]:34866 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9qa-0002Ey-8e for importer@patchew.org; Tue, 21 Nov 2017 09:48:24 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40627) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9H2-0003JV-Vp for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eH9Gw-0003jt-KR for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:40 -0500 Received: from mail.ispras.ru ([83.149.199.45]:38784) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eH9Gw-0003ij-5V for qemu-devel@nongnu.org; Tue, 21 Nov 2017 09:11:34 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 65E2354006E; Tue, 21 Nov 2017 17:11:33 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 21 Nov 2017 17:11:31 +0300 Message-ID: <151127349122.6888.9523124333246477608.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 45/45] windbg: implemented kd_api_get_context_ex and kd_api_set_context_ex 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 --- include/exec/windbgstub-utils.h | 2 + target/i386/windbgstub.c | 129 ++++++++++++++++++++++++++++-------= ---- windbgstub.c | 14 +++- 3 files changed, 105 insertions(+), 40 deletions(-) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index fa1ebbb6d2..ea6828b973 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -106,6 +106,8 @@ void kd_api_search_memory(CPUState *cpu, PacketData *pd= ); void kd_api_fill_memory(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); void kd_api_query_memory(CPUState *cpu, PacketData *pd); +void kd_api_get_context_ex(CPUState *cpu, PacketData *pd); +void kd_api_set_context_ex(CPUState *cpu, PacketData *pd); =20 SizedBuf kd_gen_exception_sc(CPUState *cpu); SizedBuf kd_gen_load_symbols_sc(CPUState *cpu); diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 735b2edd5f..aca4bfedec 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -899,6 +899,52 @@ static int windbg_write_ks_regs(CPUState *cpu, uint8_t= *buf, int buf_size, return 0; } =20 +static int windbg_rw_context_ex(CPUState *cpu, uint8_t *buf, int buf_size, + int offset, int len, bool is_read) +{ + uint32_t context_len; + uint32_t ks_regs_len; + int err =3D -1; + + if (offset < sizeof(CPU_KPROCESSOR_STATE)) { + len =3D MIN(len, sizeof(CPU_KPROCESSOR_STATE) - offset); + + context_len =3D MAX(0, (int) (sizeof(CPU_CONTEXT) - offset)); + ks_regs_len =3D len - context_len; + + if (context_len > 0) { + if (is_read) { + err =3D windbg_read_context(cpu, buf, context_len, offset, + context_len); + } else { + err =3D windbg_write_context(cpu, buf, context_len, offset, + context_len); + } + + if (err) { + return err; + } + } + + if (ks_regs_len > 0) { + offset +=3D context_len - sizeof(CPU_CONTEXT); + if (is_read) { + err =3D windbg_read_ks_regs(cpu, buf + context_len, ks_reg= s_len, + offset, ks_regs_len); + } else { + err =3D windbg_write_ks_regs(cpu, buf + context_len, ks_re= gs_len, + offset, ks_regs_len); + } + + if (err) { + return err; + } + } + } + + return err; +} + void kd_api_get_context(CPUState *cpu, PacketData *pd) { int err; @@ -930,31 +976,14 @@ void kd_api_read_control_space(CPUState *cpu, PacketD= ata *pd) { DBGKD_READ_MEMORY64 *mem =3D &pd->m64.u.ReadMemory; uint32_t len; - uint32_t context_len; - uint32_t ks_regs_len; target_ulong addr; - int err =3D -1; + int err; =20 len =3D MIN(ldl_p(&mem->TransferCount), PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)); addr =3D ldtul_p(&mem->TargetBaseAddress); =20 - if (addr < sizeof(CPU_KPROCESSOR_STATE)) { - len =3D MIN(len, sizeof(CPU_KPROCESSOR_STATE) - addr); - - context_len =3D MAX(0, (int) (sizeof(CPU_CONTEXT) - addr)); - ks_regs_len =3D len - context_len; - - if (context_len > 0) { - err =3D windbg_read_context(cpu, pd->extra, context_len, addr, - context_len); - } - if (ks_regs_len > 0) { - addr =3D addr - sizeof(CPU_CONTEXT) + context_len; - err =3D windbg_read_ks_regs(cpu, pd->extra + context_len, - ks_regs_len, addr, ks_regs_len); - } - } + err =3D windbg_rw_context_ex(cpu, pd->extra, len, addr, len, true); =20 if (err) { len =3D 0; @@ -969,38 +998,64 @@ void kd_api_write_control_space(CPUState *cpu, Packet= Data *pd) { DBGKD_WRITE_MEMORY64 *mem =3D &pd->m64.u.WriteMemory; uint32_t len; - uint32_t context_len; - uint32_t ks_regs_len; target_ulong addr; - int err =3D -1; + int err; =20 len =3D MIN(ldl_p(&mem->TransferCount), pd->extra_size); addr =3D ldtul_p(&mem->TargetBaseAddress); =20 - if (addr < sizeof(CPU_KPROCESSOR_STATE)) { - len =3D MIN(len, sizeof(CPU_KPROCESSOR_STATE) - addr); + err =3D windbg_rw_context_ex(cpu, pd->extra, len, addr, len, false); =20 - context_len =3D MAX(0, (int) (sizeof(CPU_CONTEXT) - addr)); - ks_regs_len =3D len - context_len; + if (err) { + len =3D 0; + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; + } =20 - if (context_len > 0) { - err =3D windbg_write_context(cpu, pd->extra, context_len, addr, - context_len); - } - if (ks_regs_len > 0) { - addr =3D addr - sizeof(CPU_CONTEXT) + context_len; - err =3D windbg_write_ks_regs(cpu, pd->extra + context_len, - ks_regs_len, addr, ks_regs_len); - } + pd->extra_size =3D 0; + stl_p(&mem->ActualBytesWritten, len); +} + +void kd_api_get_context_ex(CPUState *cpu, PacketData *pd) +{ + DBGKD_CONTEXT_EX *ctx =3D &pd->m64.u.ContextEx; + uint32_t offset; + uint32_t len; + int err; + + len =3D MIN(ldl_p(&ctx->ByteCount), + PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)); + offset =3D ldl_p(&ctx->Offset); + + err =3D windbg_rw_context_ex(cpu, pd->extra, len, offset, len, true); + + if (err) { + len =3D 0; + pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; } =20 + pd->extra_size =3D len; + stl_p(&ctx->BytesCopied, len); +} + +void kd_api_set_context_ex(CPUState *cpu, PacketData *pd) +{ + DBGKD_CONTEXT_EX *ctx =3D &pd->m64.u.ContextEx; + uint32_t offset; + uint32_t len; + int err; + + len =3D MIN(ldl_p(&ctx->ByteCount), pd->extra_size); + offset =3D ldl_p(&ctx->Offset); + + err =3D windbg_rw_context_ex(cpu, pd->extra, len, offset, len, false); + if (err) { - mem->ActualBytesWritten =3D 0; + len =3D 0; pd->m64.ReturnStatus =3D STATUS_UNSUCCESSFUL; } =20 pd->extra_size =3D 0; - stl_p(&mem->ActualBytesWritten, len); + stl_p(&ctx->BytesCopied, len); } =20 void kd_api_read_msr(CPUState *cpu, PacketData *pd) diff --git a/windbgstub.c b/windbgstub.c index 36372c0ea5..3bcf6a8cbb 100755 --- a/windbgstub.c +++ b/windbgstub.c @@ -224,6 +224,14 @@ static void windbg_process_manipulate_packet(ParsingCo= ntext *ctx) kd_api_query_memory(cpu, &ctx->data); break; =20 + case DbgKdGetContextExApi: + kd_api_get_context_ex(cpu, &ctx->data); + break; + + case DbgKdSetContextExApi: + kd_api_set_context_ex(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break; @@ -262,12 +270,12 @@ static void windbg_process_control_packet(ParsingCont= ext *ctx) =20 case PACKET_TYPE_KD_RESET: { - SizedBuf buf =3D kd_gen_load_symbols_sc(qemu_get_cpu(0)); + windbg_send_control_packet(ctx->packet.PacketType); + windbg_state->ctrl_packet_id =3D INITIAL_PACKET_ID; =20 + SizedBuf buf =3D kd_gen_load_symbols_sc(qemu_get_cpu(0)); windbg_send_data_packet(buf.data, buf.size, PACKET_TYPE_KD_STATE_CHANGE64); - windbg_send_control_packet(ctx->packet.PacketType); - windbg_state->ctrl_packet_id =3D INITIAL_PACKET_ID; SBUF_FREE(buf); break; }