From patchwork Tue Oct 17 13:08:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826961 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbBl1dP2z9sBZ for ; Wed, 18 Oct 2017 00:09:50 +1100 (AEDT) Received: from localhost ([::1]:39121 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rcx-0002hE-Dx for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:09:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60766) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RcP-0002gp-7i for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RcK-0004RU-6a for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:13 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56402) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RcJ-0004M0-P8 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:08 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id A1B6554006C; Tue, 17 Oct 2017 16:08:58 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:08:56 +0300 Message-ID: <150824573608.6816.2050963202048147426.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 01/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- Makefile.target | 5 +++++ 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 | 13 +++++++++++++ windbgstub-utils.c | 12 ++++++++++++ windbgstub.c | 19 +++++++++++++++++++ 9 files changed, 104 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..0272b5e0ab 100644 --- a/Makefile.target +++ b/Makefile.target @@ -148,6 +148,11 @@ obj-y += dump.o obj-y += migration/ram.o LIBS := $(libs_softmmu) $(LIBS) +# WinDbg support +ifeq ($(TARGET_NAME), i386) +obj-y += windbgstub.o windbgstub-utils.o +endif + # Hardware support ifeq ($(TARGET_NAME), sparc64) obj-y += hw/sparc64/ diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.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 later. + * 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 later. + * 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 += dump.o stub-obj-y += error-printf.o stub-obj-y += fdset.o stub-obj-y += gdbstub.o +stub-obj-y += windbgstub.o stub-obj-y += get-vm-name.o stub-obj-y += iothread.o stub-obj-y += 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 later. + * 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 += helper.o cpu.o gdbstub.o xsave_helper.o +obj-y += helper.o cpu.o gdbstub.o windbgstub.o xsave_helper.o obj-$(CONFIG_TCG) += translate.o obj-$(CONFIG_TCG) += bpt_helper.o cc_helper.o excp_helper.o fpu_helper.o obj-$(CONFIG_TCG) += 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..f54f5178fb --- /dev/null +++ b/target/i386/windbgstub.c @@ -0,0 +1,13 @@ +/* + * 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 later. + * See the COPYING file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "exec/windbgstub-utils.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 later. + * 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 later. + * 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 patchwork Tue Oct 17 13:09:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826966 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbG60TDmz9s8J for ; Wed, 18 Oct 2017 00:12:46 +1100 (AEDT) Received: from localhost ([::1]:39143 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfo-00054x-3c for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:12:44 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60821) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RcR-0002h8-Tl for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RcL-0004Sa-7o for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:15 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56426) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RcJ-0004OU-PB for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:09 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 4CB9454006E; Tue, 17 Oct 2017 16:09:04 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:01 +0300 Message-ID: <150824574170.6816.17543234287870228009.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 02/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 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 later. + * 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) >= 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_REPORT; +#elif defined(TARGET_X86_64) +typedef AMD64_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT; +#elif defined(TARGET_ARM) +typedef ARM_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT; +#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-utils.h index 67d190bf6c..2390597f1f 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -14,5 +14,6 @@ #include "qemu/osdep.h" #include "exec/windbgstub.h" +#include "exec/windbgkd.h" #endif From patchwork Tue Oct 17 13:09:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826963 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbC21vCNz9sBZ for ; Wed, 18 Oct 2017 00:10:06 +1100 (AEDT) Received: from localhost ([::1]:39127 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdE-0002pr-2g for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:10:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60847) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RcT-0002hq-J5 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RcN-0004Uc-7P for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:17 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56454) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RcM-0004Tx-Us for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:11 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 3DA9954006B; Tue, 17 Oct 2017 16:09:10 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:07 +0300 Message-ID: <150824574764.6816.17021935649953125286.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 03/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Added useful name arrays of some defines. Not used yet. Needs for the future. 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; +__attribute__ ((unused)) /* maybe unused */ +static const char *kd_api_names[] = { + "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[] = { + "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 >= 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 patchwork Tue Oct 17 13:09:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826970 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbKb4G9jz9sBZ for ; Wed, 18 Oct 2017 00:15:47 +1100 (AEDT) Received: from localhost ([::1]:39175 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rij-0007dW-KA for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:15:45 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60934) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RcY-0002md-Uf for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RcS-0004cL-Ro for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:22 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56484) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RcS-0004bZ-IQ for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:16 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id D12EA54006C; Tue, 17 Oct 2017 16:09:15 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:13 +0300 Message-ID: <150824575325.6816.580234093427015826.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 04/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 +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 = true; @@ -4586,6 +4591,9 @@ int main(int argc, char **argv, char **envp) exit(1); } + 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 patchwork Tue Oct 17 13:09:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826979 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbNs2t3Vz9s8J for ; Wed, 18 Oct 2017 00:18:37 +1100 (AEDT) Received: from localhost ([::1]:39187 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RlT-0001iF-Dq for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:18:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32804) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rcf-0002sd-9y for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RcZ-0004jP-DE for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:29 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56504) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RcZ-0004im-5y for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:23 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 735DD54006B; Tue, 17 Oct 2017 16:09:21 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:19 +0300 Message-ID: <150824575888.6816.8665703540737889367.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 05/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 | 34 ++++++++++++++++++++++++++++++++++ include/exec/windbgstub.h | 6 ++++++ 2 files changed, 40 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h index 2390597f1f..1c27ee4ce8 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -13,7 +13,41 @@ #define WINDBGSTUB_UTILS_H #include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "log.h" +#include "cpu.h" #include "exec/windbgstub.h" #include "exec/windbgkd.h" +#ifndef TARGET_I386 +#error Unsupported Architecture +#endif +#ifdef TARGET_X86_64 /* Unimplemented yet */ +#error Unsupported Architecture +#endif + +# 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 +#define WINDBG "windbg" + +#ifndef WINDBG_DEBUG_ON +#define WINDBG_DEBUG_ON false +#endif + int windbg_server_start(const char *device); #endif From patchwork Tue Oct 17 13:09:24 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826967 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbGK3G32z9s8J for ; Wed, 18 Oct 2017 00:12:57 +1100 (AEDT) Received: from localhost ([::1]:39152 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfz-0005Dc-DU for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:12:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32862) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rci-0002vj-K1 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rce-0004nl-JL for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:32 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56538) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rcd-0004n7-RP for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:28 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 0F1D154006B; Tue, 17 Oct 2017 16:09:27 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:24 +0300 Message-ID: <150824576448.6816.18253591118188645266.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 06/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 @@ */ #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" +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 = g_new0(WindbgState, 1); + windbg_state->ctrl_packet_id = RESET_PACKET_ID; + windbg_state->data_packet_id = INITIAL_PACKET_ID; + + atexit(windbg_exit); return 0; } From patchwork Tue Oct 17 13:09:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826971 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbKf4R61z9s8J for ; Wed, 18 Oct 2017 00:15:50 +1100 (AEDT) Received: from localhost ([::1]:39176 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rim-0007eh-EF for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:15:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32956) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rco-0002y6-29 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rcj-0004r8-Nr for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:38 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56560) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rcj-0004qp-Eu for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:33 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id B860454006B; Tue, 17 Oct 2017 16:09:32 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:30 +0300 Message-ID: <150824577017.6816.18445123367944855125.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 07/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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; + CharBackend chr; + uint32_t ctrl_packet_id; uint32_t data_packet_id; } WindbgState; static WindbgState *windbg_state; +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) int windbg_server_start(const char *device) { + Chardev *chr = NULL; + if (windbg_state) { WINDBG_ERROR("Multiple instances of windbg are not supported."); exit(1); } + if (!strstart(device, "pipe:", NULL)) { + WINDBG_ERROR("Unsupported device. Supported only pipe."); + exit(1); + } + windbg_state = g_new0(WindbgState, 1); windbg_state->ctrl_packet_id = RESET_PACKET_ID; windbg_state->data_packet_id = INITIAL_PACKET_ID; + chr = 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, true); + atexit(windbg_exit); return 0; } From patchwork Tue Oct 17 13:09:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826980 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbNv11p3z9s8J for ; Wed, 18 Oct 2017 00:18:39 +1100 (AEDT) Received: from localhost ([::1]:39191 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RlV-0001kc-5P for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:18:37 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33023) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rct-00032j-2q for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rcp-0004uQ-Ej for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:43 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56596) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rcp-0004uA-2A for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:39 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 5428D54006C; Tue, 17 Oct 2017 16:09:38 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:35 +0300 Message-ID: <150824577575.6816.902878105747508734.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 08/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 server 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 | 5 +++++ windbgstub.c | 13 +++++++++++++ 6 files changed, 27 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h index 1c27ee4ce8..825d58b76b 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -50,4 +50,6 @@ _t; \ }) +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 +void windbg_try_load(void); int windbg_server_start(const char *device); #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" +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" 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(); } void helper_rdmsr(CPUX86State *env) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index f54f5178fb..f2f83423a0 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -11,3 +11,8 @@ #include "qemu/osdep.h" #include "exec/windbgstub-utils.h" + +bool windbg_on_load(void) +{ + return false; +} 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" typedef struct WindbgState { bool is_loaded; @@ -45,6 +46,13 @@ static void windbg_exit(void) g_free(windbg_state); } +void windbg_try_load(void) +{ + if (windbg_state && !windbg_state->is_loaded) { + windbg_state->is_loaded = windbg_on_load(); + } +} + int windbg_server_start(const char *device) { Chardev *chr = NULL; @@ -54,6 +62,11 @@ int windbg_server_start(const char *device) exit(1); } + 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 patchwork Tue Oct 17 13:09:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826964 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbCl5Rnfz9s8J for ; Wed, 18 Oct 2017 00:10:43 +1100 (AEDT) Received: from localhost ([::1]:39132 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rdp-0003ET-P6 for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:10:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33079) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rd0-00038f-2Q for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rcv-0004ws-Ea for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:50 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56612) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rcv-0004w8-1L for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:45 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id E523054006B; Tue, 17 Oct 2017 16:09:43 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:41 +0300 Message-ID: <150824578138.6816.8943744353407171634.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 09/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Added handler of fs/gs register. It tries to find and check KPCR and version 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-utils.h index 825d58b76b..ff260287dc 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -50,6 +50,14 @@ _t; \ }) +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); #endif diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index f2f83423a0..83e80bdfc8 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -12,7 +12,54 @@ #include "qemu/osdep.h" #include "exec/windbgstub-utils.h" +#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 = qemu_get_cpu(0); + CPUArchState *env = cpu->env_ptr; + InitedAddr *KPCR = windbg_get_KPCR(); + InitedAddr *version = windbg_get_version(); + + if (!KPCR->is_init) { + + #ifdef TARGET_X86_64 + KPCR->addr = env->segs[R_GS].base; + #else + KPCR->addr = env->segs[R_FS].base; + #endif + + static target_ulong prev_KPCR; + if (!KPCR->addr || prev_KPCR == KPCR->addr) { + return false; + } + prev_KPCR = KPCR->addr; + + if (KPCR->addr != READ_VMEM(cpu, KPCR->addr + OFFSET_SELF_PCR, + target_ulong)) { + return false; + } + + KPCR->is_init = true; + } + + if (!version->is_init && KPCR->is_init) { + version->addr = READ_VMEM(cpu, KPCR->addr + OFFSET_VERS, + target_ulong); + if (!version->addr) { + return false; + } + version->is_init = true; + } + + WINDBG_DEBUG("windbg_on_load: KPCR " FMT_ADDR, KPCR->addr); + WINDBG_DEBUG("windbg_on_load: version " FMT_ADDR, version->addr); + + return true; } 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 @@ */ #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" typedef struct WindbgState { bool is_loaded; @@ -46,6 +47,13 @@ static void windbg_exit(void) g_free(windbg_state); } +static void windbg_handle_reset(void *opaque) +{ + windbg_state->is_loaded = false; + windbg_get_KPCR()->is_init = false; + windbg_get_version()->is_init = 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, true); + qemu_register_reset(windbg_handle_reset, NULL); + atexit(windbg_exit); return 0; } From patchwork Tue Oct 17 13:09:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826984 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbS93xPXz9sBZ for ; Wed, 18 Oct 2017 00:21:29 +1100 (AEDT) Received: from localhost ([::1]:39211 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RoF-0004Ab-Hl for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:21:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33170) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rd8-0003Hq-BG for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rd4-00052i-BY for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:58 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56638) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rd3-00051g-J7 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:54 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 77A4654006B; Tue, 17 Oct 2017 16:09:49 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:47 +0300 Message-ID: <150824578694.6816.15621161801519932541.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 10/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index ff260287dc..d6abb82dfa 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -55,6 +55,17 @@ typedef struct InitedAddr { bool is_init; } InitedAddr; +typedef struct PacketData { + union { + struct { + DBGKD_MANIPULATE_STATE64 m64; + uint8_t extra[PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)]; + }; + uint8_t buf[PACKET_MAX_SIZE]; + }; + uint16_t extra_size; +} PacketData; + InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); 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" +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; From patchwork Tue Oct 17 13:09:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826983 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbS93XyCz9s8J for ; Wed, 18 Oct 2017 00:21:29 +1100 (AEDT) Received: from localhost ([::1]:39207 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RoF-00049p-Gi for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:21:27 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33282) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdM-0003So-Pr for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rd8-00055r-R0 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:08 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56664) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rd6-00054M-Ob for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:09:58 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 0C70254006B; Tue, 17 Oct 2017 16:09:55 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:52 +0300 Message-ID: <150824579248.6816.1844461790634235463.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 11/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 { static WindbgState *windbg_state; +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 = RESULT_NONE; + if (byte == PACKET_LEADER_BYTE || byte == CONTROL_PACKET_LEADER_BYTE) { + if (ctx->index > 0 && byte != PTR(ctx->packet.PacketLeader)[0]) { + ctx->index = 0; + } + PTR(ctx->packet.PacketLeader)[ctx->index] = byte; + ++ctx->index; + if (ctx->index == sizeof(ctx->packet.PacketLeader)) { + ctx->state = STATE_PACKET_TYPE; + ctx->index = 0; + } + } else if (byte == BREAKIN_PACKET_BYTE) { + ctx->result = RESULT_BREAKIN_BYTE; + ctx->index = 0; + } else { + ctx->index = 0; + } + break; + + case STATE_PACKET_TYPE: + PTR(ctx->packet.PacketType)[ctx->index] = byte; + ++ctx->index; + if (ctx->index == sizeof(ctx->packet.PacketType)) { + ctx->packet.PacketType = lduw_p(&ctx->packet.PacketType); + if (ctx->packet.PacketType >= PACKET_TYPE_MAX) { + ctx->state = STATE_LEADER; + ctx->result = RESULT_UNKNOWN_PACKET; + } else { + ctx->state = STATE_PACKET_BYTE_COUNT; + } + ctx->index = 0; + } + break; + + case STATE_PACKET_BYTE_COUNT: + PTR(ctx->packet.ByteCount)[ctx->index] = byte; + ++ctx->index; + if (ctx->index == sizeof(ctx->packet.ByteCount)) { + ctx->packet.ByteCount = lduw_p(&ctx->packet.ByteCount); + ctx->state = STATE_PACKET_ID; + ctx->index = 0; + } + break; + + case STATE_PACKET_ID: + PTR(ctx->packet.PacketId)[ctx->index] = byte; + ++ctx->index; + if (ctx->index == sizeof(ctx->packet.PacketId)) { + ctx->packet.PacketId = ldl_p(&ctx->packet.PacketId); + ctx->state = STATE_PACKET_CHECKSUM; + ctx->index = 0; + } + break; + + case STATE_PACKET_CHECKSUM: + PTR(ctx->packet.Checksum)[ctx->index] = byte; + ++ctx->index; + if (ctx->index == sizeof(ctx->packet.Checksum)) { + ctx->packet.Checksum = ldl_p(&ctx->packet.Checksum); + if (ctx->packet.PacketLeader == CONTROL_PACKET_LEADER) { + ctx->state = STATE_LEADER; + ctx->result = RESULT_CONTROL_PACKET; + } else if (ctx->packet.ByteCount > PACKET_MAX_SIZE) { + ctx->state = STATE_LEADER; + ctx->result = RESULT_ERROR; + } else { + ctx->state = STATE_PACKET_DATA; + } + ctx->index = 0; + } + break; + + case STATE_PACKET_DATA: + ctx->data.buf[ctx->index] = byte; + ++ctx->index; + if (ctx->index == ctx->packet.ByteCount) { + ctx->state = STATE_TRAILING_BYTE; + ctx->index = 0; + } + break; + + case STATE_TRAILING_BYTE: + if (byte == PACKET_TRAILING_BYTE) { + ctx->result = RESULT_DATA_PACKET; + } else { + ctx->result = RESULT_ERROR; + } + ctx->state = 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) static void windbg_chr_receive(void *opaque, const uint8_t *buf, int size) { + static ParsingContext ctx = { + .state = STATE_LEADER, + .result = RESULT_NONE, + .name = "" + }; + if (windbg_state->is_loaded) { - /* T0D0: parse data */ + int i; + for (i = 0; i < size; i++) { + windbg_read_byte(&ctx, buf[i]); + windbg_ctx_handler(&ctx); + } } } From patchwork Tue Oct 17 13:09:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826990 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbWL5LXpz9s8J for ; Wed, 18 Oct 2017 00:24:14 +1100 (AEDT) Received: from localhost ([::1]:39227 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rqu-0006N8-NN for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:24:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33271) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdL-0003Rm-IZ for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RdC-000590-IK for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:07 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56686) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdC-00058a-BC for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:02 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id A008F54006B; Tue, 17 Oct 2017 16:10:00 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:09:58 +0300 Message-ID: <150824579807.6816.6764464794987005387.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 12/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 { static WindbgState *windbg_state; +static uint32_t compute_checksum(uint8_t *data, uint16_t len) +{ + uint32_t checksum = 0; + while (len) { + --len; + checksum += *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 = PACKET_TRAILING_BYTE; + + KD_PACKET packet = { + .PacketLeader = PACKET_LEADER, + .PacketType = type, + .ByteCount = byte_count, + .PacketId = windbg_state->data_packet_id, + .Checksum = 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 ^= 1; +} + +__attribute__ ((unused)) /* unused yet */ +static void windbg_send_control_packet(uint16_t type) +{ + KD_PACKET packet = { + .PacketLeader = CONTROL_PACKET_LEADER, + .PacketType = type, + .ByteCount = 0, + .PacketId = windbg_state->ctrl_packet_id, + .Checksum = 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 ^= 1; +} + static void windbg_ctx_handler(ParsingContext *ctx) {} From patchwork Tue Oct 17 13:10:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826968 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbHv3xnGz9s8J for ; Wed, 18 Oct 2017 00:14:19 +1100 (AEDT) Received: from localhost ([::1]:39165 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RhJ-0006MM-H6 for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:14:17 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33402) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdW-0003gY-PZ for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RdO-0005G8-BU for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:20 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56730) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdO-0005ET-4E for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:14 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 3C77D54006C; Tue, 17 Oct 2017 16:10:06 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:03 +0300 Message-ID: <150824580366.6816.5820779598615789570.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 13/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 @@ #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 ^= 1; } -__attribute__ ((unused)) /* unused yet */ static void windbg_send_control_packet(uint16_t type) { KD_PACKET packet = { @@ -116,9 +116,41 @@ static void windbg_send_control_packet(uint16_t type) windbg_state->ctrl_packet_id ^= 1; } -static void windbg_ctx_handler(ParsingContext *ctx) +static void windbg_process_data_packet(ParsingContext *ctx) {} +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 = 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 patchwork Tue Oct 17 13:10:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826973 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbM60r1sz9s8J for ; Wed, 18 Oct 2017 00:17:06 +1100 (AEDT) Received: from localhost ([::1]:39183 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rk0-0000Ph-3q for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:17:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33401) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdW-0003gX-PX for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RdP-0005Hm-TI for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:20 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56744) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdP-0005Eu-0E for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:15 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 1B21A54006B; Tue, 17 Oct 2017 16:10:12 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:09 +0300 Message-ID: <150824580953.6816.17308668705388913065.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 14/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Added function for init DBGKD_ANY_WAIT_STATE_CHANGE. It is a header of 'state 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-utils.h index d6abb82dfa..5aa54550cd 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -50,6 +50,14 @@ _t; \ }) +#if TARGET_LONG_BITS == 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 83e80bdfc8..da0aeb4f1b 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -15,9 +15,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 bool windbg_on_load(void) @@ -63,3 +67,48 @@ bool windbg_on_load(void) return true; } + +__attribute__ ((unused)) /* unused yet */ +static void kd_init_state_change(CPUState *cpu, + DBGKD_ANY_WAIT_STATE_CHANGE *sc) +{ + CPUArchState *env = cpu->env_ptr; + DBGKD_CONTROL_REPORT *cr = &sc->ControlReport; + InitedAddr *KPCR = windbg_get_KPCR(); + target_ulong KPRCB; + int err = 0; + + /* T0D0: HEADER */ + + sc->Processor = 0; + + sc->NumberProcessors = 0; + CPUState *cpu_tmp; + CPU_FOREACH(cpu_tmp) { + sc->NumberProcessors++; + } + stl_p(&sc->NumberProcessors, sc->NumberProcessors); + + KPRCB = READ_VMEM(cpu, KPCR->addr + OFFSET_KPRCB, target_ulong); + sc->Thread = 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 = cpu_memory_rw_debug(cpu, sc->ProgramCounter, + PTR(cr->InstructionStream[0]), + DBGKD_MAXSTREAM, 0); + if (!err) { + stw_p(&cr->InstructionCount, DBGKD_MAXSTREAM); + } +} From patchwork Tue Oct 17 13:10:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826981 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbQS1RP6z9s8J for ; Wed, 18 Oct 2017 00:19:59 +1100 (AEDT) Received: from localhost ([::1]:39192 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rmn-0002u3-59 for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:19:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33412) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdW-0003ga-S8 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RdV-0005Pi-R4 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:22 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56766) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdV-0005Mn-00 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:21 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id ABF0454006B; Tue, 17 Oct 2017 16:10:17 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:15 +0300 Message-ID: <150824581514.6816.7961186838212807574.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 15/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Defined useful sized data buffer. It contains pointer to data and size of this 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-utils.h index 5aa54550cd..f0da3cbd86 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -74,6 +74,22 @@ typedef struct PacketData { uint16_t extra_size; } PacketData; +typedef struct SizedBuf { + uint8_t *data; + size_t size; +} SizedBuf; + +#define SBUF_INIT(buf, mem_ptr, len) do { \ + buf.data = mem_ptr; \ + buf.size = 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 = NULL; \ + buf.size = 0; \ +} while (false) + InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); From patchwork Tue Oct 17 13:10:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826993 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbZN1gFXz9s8J for ; Wed, 18 Oct 2017 00:26:52 +1100 (AEDT) Received: from localhost ([::1]:39246 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RtS-0000H7-6a for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:26:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33534) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rdf-0003oT-U7 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RdZ-0005SA-3Q for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:31 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56790) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RdY-0005R9-0y for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:24 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 4B8B954006B; Tue, 17 Oct 2017 16:10:23 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:20 +0300 Message-ID: <150824582072.6816.7754220722530913728.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 16/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index f0da3cbd86..fea04cbc89 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -93,6 +93,8 @@ typedef struct SizedBuf { InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); +SizedBuf kd_gen_exception_sc(CPUState *cpu); + bool windbg_on_load(void); #endif diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index da0aeb4f1b..334642b677 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -68,7 +68,6 @@ bool windbg_on_load(void) return true; } -__attribute__ ((unused)) /* unused yet */ static void kd_init_state_change(CPUState *cpu, DBGKD_ANY_WAIT_STATE_CHANGE *sc) { @@ -112,3 +111,22 @@ static void kd_init_state_change(CPUState *cpu, stw_p(&cr->InstructionCount, DBGKD_MAXSTREAM); } } + +SizedBuf kd_gen_exception_sc(CPUState *cpu) +{ + CPUArchState *env = 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 = (DBGKD_ANY_WAIT_STATE_CHANGE *) buf.data; + exc = &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; +} From patchwork Tue Oct 17 13:10:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826989 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbWJ6nLfz9s8J for ; Wed, 18 Oct 2017 00:24:12 +1100 (AEDT) Received: from localhost ([::1]:39225 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rqt-0006Mf-1y for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:24:11 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33563) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rdi-0003qq-HR for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rdd-0005Ub-Sg for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:34 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56816) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rdd-0005U9-Lk for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:29 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id E5D7D54006B; Tue, 17 Oct 2017 16:10:28 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:26 +0300 Message-ID: <150824582633.6816.5852422519729126672.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 17/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index fea04cbc89..1c43be7c41 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -94,6 +94,7 @@ InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); SizedBuf kd_gen_exception_sc(CPUState *cpu); +SizedBuf kd_gen_load_symbols_sc(CPUState *cpu); bool windbg_on_load(void); diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 334642b677..314301545b 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -130,3 +130,18 @@ SizedBuf kd_gen_exception_sc(CPUState *cpu) return buf; } + +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 = (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; +} From patchwork Tue Oct 17 13:10:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826994 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbZN4j0Pz9sBZ for ; Wed, 18 Oct 2017 00:26:52 +1100 (AEDT) Received: from localhost ([::1]:39244 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RtS-0000GW-Dd for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:26:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33660) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rdo-0003ww-Op for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rdj-0005XU-VE for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:40 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56836) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rdj-0005Wt-NG for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:35 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 9872554006B; Tue, 17 Oct 2017 16:10:34 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:32 +0300 Message-ID: <150824583198.6816.6831787773022564675.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 18/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Added function for stop vm. Also, ExceptionStateChange data is generated and 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; } -__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 ^= 1; } +static void windbg_vm_stop(void) +{ + CPUState *cpu = qemu_get_cpu(0); + vm_stop(RUN_STATE_PAUSED); + + SizedBuf buf = kd_gen_exception_sc(cpu); + windbg_send_data_packet(buf.data, buf.size, PACKET_TYPE_KD_STATE_CHANGE64); + SBUF_FREE(buf); +} + static void windbg_process_data_packet(ParsingContext *ctx) {} @@ -129,7 +138,7 @@ static void windbg_ctx_handler(ParsingContext *ctx) break; case RESULT_BREAKIN_BYTE: - vm_stop(RUN_STATE_PAUSED); + windbg_vm_stop(); break; case RESULT_CONTROL_PACKET: From patchwork Tue Oct 17 13:10:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826969 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbHz5B4hz9sP1 for ; Wed, 18 Oct 2017 00:14:23 +1100 (AEDT) Received: from localhost ([::1]:39168 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RhN-0006PK-KG for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:14:21 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33706) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rdt-00040j-3O for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rdp-0005Zi-4i for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:45 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56860) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rdo-0005ZU-T6 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:41 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 3250C54006B; Tue, 17 Oct 2017 16:10:40 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:37 +0300 Message-ID: <150824583761.6816.16744916033263507022.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 19/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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) {} 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 = 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 = INITIAL_PACKET_ID; + SBUF_FREE(buf); + break; + } + default: + WINDBG_ERROR("Caught unsupported control packet 0x%x", + ctx->packet.PacketType); + + windbg_state->ctrl_packet_id = 0; + windbg_send_control_packet(PACKET_TYPE_KD_RESEND); + break; + } +} static void windbg_ctx_handler(ParsingContext *ctx) { From patchwork Tue Oct 17 13:10:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826997 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbdQ6rMmz9sBZ for ; Wed, 18 Oct 2017 00:29:30 +1100 (AEDT) Received: from localhost ([::1]:39259 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rw1-0002Vo-2f for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:29:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33845) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReB-0004DG-RG for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Re7-0005lX-VR for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:03 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56878) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Re7-0005fd-OL for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:59 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id B995354006B; Tue, 17 Oct 2017 16:10:45 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:43 +0300 Message-ID: <150824584321.6816.10550333084187854303.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 20/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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); } -static void windbg_process_data_packet(ParsingContext *ctx) +static void windbg_process_manipulate_packet(ParsingContext *ctx) {} +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 = 0; + windbg_send_control_packet(PACKET_TYPE_KD_RESEND); + break; + } +} + static void windbg_process_control_packet(ParsingContext *ctx) { switch (ctx->packet.PacketType) { From patchwork Tue Oct 17 13:10:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826998 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbdS3X3hz9s8J for ; Wed, 18 Oct 2017 00:29:32 +1100 (AEDT) Received: from localhost ([::1]:39261 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rw2-0002Wx-Hc for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:29:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33813) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Re6-0004Ao-Gy for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Re1-0005hX-Ph for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:58 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56908) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Re1-0005hH-HI for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:10:53 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 6007654006C; Tue, 17 Oct 2017 16:10:51 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:49 +0300 Message-ID: <150824584877.6816.10575945691482585714.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 21/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 2 ++ windbgstub-utils.c | 10 ++++++++++ windbgstub.c | 26 +++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h index 1c43be7c41..01f115f091 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -93,6 +93,8 @@ typedef struct SizedBuf { InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); +void kd_api_unsupported(CPUState *cpu, PacketData *pd); + 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 347c61553a..501a7435df 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -23,3 +23,13 @@ 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 = STATUS_UNSUCCESSFUL; + pd->extra_size = 0; + + exit(1); +} 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) } static void windbg_process_manipulate_packet(ParsingContext *ctx) -{} +{ + CPUState *cpu; + + ctx->data.extra_size = ctx->packet.ByteCount - + sizeof(DBGKD_MANIPULATE_STATE64); + ctx->data.m64.ReturnStatus = STATUS_SUCCESS; + + cpu = qemu_get_cpu(ctx->data.m64.Processor); + if (cpu == NULL) { + cpu = 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); +} static void windbg_process_data_packet(ParsingContext *ctx) { From patchwork Tue Oct 17 13:10:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826974 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbM80Rwxz9s8J for ; Wed, 18 Oct 2017 00:17:08 +1100 (AEDT) Received: from localhost ([::1]:39184 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rk2-0000S3-2x for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:17:06 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33842) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReB-0004Cz-I5 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Re9-0005mt-Lp for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:03 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56930) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Re8-0005kb-OX for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:01 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 5678154006C; Tue, 17 Oct 2017 16:10:58 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:10:54 +0300 Message-ID: <150824585443.6816.5360930357630890364.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 22/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index 01f115f091..552318ad05 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -93,6 +93,8 @@ typedef struct SizedBuf { InitedAddr *windbg_get_KPCR(void); InitedAddr *windbg_get_version(void); +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); SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 501a7435df..c363d905af 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -24,6 +24,53 @@ InitedAddr *windbg_get_version(void) return &version; } +void kd_api_read_virtual_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_MEMORY64 *mem = &pd->m64.u.ReadMemory; + uint32_t len; + target_ulong addr; + int err; + + len = MIN(ldl_p(&mem->TransferCount), + PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)); + addr = ldtul_p(&mem->TargetBaseAddress); + err = cpu_memory_rw_debug(cpu, addr, pd->extra, len, 0); + + if (err) { + len = 0; + pd->m64.ReturnStatus = STATUS_UNSUCCESSFUL; + + WINDBG_DEBUG("read_virtual_memory: No physical page mapped: " FMT_ADDR, + (target_ulong) mem->TargetBaseAddress); + } + + pd->extra_size = len; + stl_p(&mem->ActualBytesRead, len); +} + +void kd_api_write_virtual_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_WRITE_MEMORY64 *mem = &pd->m64.u.WriteMemory; + uint32_t len; + target_ulong addr; + int err; + + len = MIN(ldl_p(&mem->TransferCount), pd->extra_size); + addr = ldtul_p(&mem->TargetBaseAddress); + err = cpu_memory_rw_debug(cpu, addr, pd->extra, len, 1); + + if (err) { + len = 0; + pd->m64.ReturnStatus = STATUS_UNSUCCESSFUL; + + WINDBG_DEBUG("read_write_memory: No physical page mapped: " FMT_ADDR, + (target_ulong) mem->TargetBaseAddress); + } + + pd->extra_size = 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(ParsingContext *ctx) switch (ctx->data.m64.ApiNumber) { + 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 patchwork Tue Oct 17 13:11:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826982 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbQh45fWz9s8J for ; Wed, 18 Oct 2017 00:20:05 +1100 (AEDT) Received: from localhost ([::1]:39195 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rmt-0002xT-EP for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:20:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33907) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReJ-0004KN-8R for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4ReD-0005qC-46 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:11 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56950) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReC-0005pW-MB for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:05 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id E670E54006B; Tue, 17 Oct 2017 16:11:03 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:01 +0300 Message-ID: <150824586137.6816.10362323048929510566.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 23/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 314301545b..dcbb8313b5 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -24,6 +24,253 @@ # define OFFSET_KPRCB_CURRTHREAD 0x4 #endif +/* + * 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_POINT) +#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 = 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 = 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; + +typedef struct _CPU_KPROCESSOR_STATE { + CPU_CONTEXT ContextFrame; + CPU_KSPECIAL_REGISTERS SpecialRegisters; +} CPU_KPROCESSOR_STATE, *PCPU_KPROCESSOR_STATE; + +#endif + bool windbg_on_load(void) { CPUState *cpu = qemu_get_cpu(0); From patchwork Tue Oct 17 13:11:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827004 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbhb3z1rz9s8J for ; Wed, 18 Oct 2017 00:32:15 +1100 (AEDT) Received: from localhost ([::1]:39272 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Ryf-0004ur-Hm for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:32:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33958) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReO-0004OR-CI for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4ReI-0005va-Jg for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:16 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56974) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReI-0005uz-Ai for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:10 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 8C41D54006B; Tue, 17 Oct 2017 16:11:09 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:07 +0300 Message-ID: <150824586699.6816.12521626029136655328.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 24/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index 552318ad05..39fbfc8d3a 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -95,6 +95,8 @@ InitedAddr *windbg_get_version(void); 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); SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index dcbb8313b5..175fa09f24 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -271,6 +271,45 @@ typedef struct _CPU_KPROCESSOR_STATE { #endif +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 = sizeof(CPU_CONTEXT); + err = windbg_read_context(cpu, pd->extra, pd->extra_size, 0, + pd->extra_size); + + if (err) { + pd->extra_size = 0; + pd->m64.ReturnStatus = STATUS_UNSUCCESSFUL; + } +} + +void kd_api_set_context(CPUState *cpu, PacketData *pd) +{ + int err; + + err = windbg_write_context(cpu, pd->extra, pd->extra_size, 0, + sizeof(CPU_CONTEXT)); + pd->extra_size = 0; + + if (err) { + pd->m64.ReturnStatus = STATUS_UNSUCCESSFUL; + } +} + bool windbg_on_load(void) { CPUState *cpu = 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(ParsingContext *ctx) kd_api_write_virtual_memory(cpu, &ctx->data); break; + 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 patchwork Tue Oct 17 13:11:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826986 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbTk28LKz9sBZ for ; Wed, 18 Oct 2017 00:22:50 +1100 (AEDT) Received: from localhost ([::1]:39216 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RpY-0005Ef-BP for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:22:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34054) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReV-0004VK-IJ for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4ReP-00062y-9Z for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:23 -0400 Received: from mail.ispras.ru ([83.149.199.45]:56998) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReO-00062D-S1 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:17 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 2BD0454006B; Tue, 17 Oct 2017 16:11:15 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:12 +0300 Message-ID: <150824587263.6816.10587533738326202158.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 25/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index 39fbfc8d3a..468a874ab7 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -97,6 +97,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); SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 175fa09f24..3e238525da 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -283,6 +283,18 @@ static int windbg_write_context(CPUState *cpu, uint8_t *buf, int buf_size, return 0; } +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; @@ -310,6 +322,83 @@ void kd_api_set_context(CPUState *cpu, PacketData *pd) } } +void kd_api_read_control_space(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_MEMORY64 *mem = &pd->m64.u.ReadMemory; + uint32_t len; + uint32_t context_len; + uint32_t ks_regs_len; + target_ulong addr; + int err = -1; + + len = MIN(ldl_p(&mem->TransferCount), + PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)); + addr = ldtul_p(&mem->TargetBaseAddress); + + if (addr < sizeof(CPU_KPROCESSOR_STATE)) { + len = MIN(len, sizeof(CPU_KPROCESSOR_STATE) - addr); + + context_len = MAX(0, (int) (sizeof(CPU_CONTEXT) - addr)); + ks_regs_len = len - context_len; + + if (context_len > 0) { + err = windbg_read_context(cpu, pd->extra, context_len, addr, + context_len); + } + if (ks_regs_len > 0) { + addr = addr - sizeof(CPU_CONTEXT) + context_len; + err = windbg_read_ks_regs(cpu, pd->extra + context_len, + ks_regs_len, addr, ks_regs_len); + } + } + + if (err) { + len = 0; + pd->m64.ReturnStatus = STATUS_UNSUCCESSFUL; + } + + pd->extra_size = len; + stl_p(&mem->ActualBytesRead, len); +} + +void kd_api_write_control_space(CPUState *cpu, PacketData *pd) +{ + DBGKD_WRITE_MEMORY64 *mem = &pd->m64.u.WriteMemory; + uint32_t len; + uint32_t context_len; + uint32_t ks_regs_len; + target_ulong addr; + int err = -1; + + len = MIN(ldl_p(&mem->TransferCount), pd->extra_size); + addr = ldtul_p(&mem->TargetBaseAddress); + + if (addr < sizeof(CPU_KPROCESSOR_STATE)) { + len = MIN(len, sizeof(CPU_KPROCESSOR_STATE) - addr); + + context_len = MAX(0, (int) (sizeof(CPU_CONTEXT) - addr)); + ks_regs_len = len - context_len; + + if (context_len > 0) { + err = windbg_write_context(cpu, pd->extra, context_len, addr, + context_len); + } + if (ks_regs_len > 0) { + addr = addr - sizeof(CPU_CONTEXT) + context_len; + err = windbg_write_ks_regs(cpu, pd->extra + context_len, + ks_regs_len, addr, ks_regs_len); + } + } + + if (err) { + mem->ActualBytesWritten = 0; + pd->m64.ReturnStatus = STATUS_UNSUCCESSFUL; + } + + pd->extra_size = 0; + stl_p(&mem->ActualBytesWritten, len); +} + bool windbg_on_load(void) { CPUState *cpu = 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(ParsingContext *ctx) kd_api_set_context(cpu, &ctx->data); break; + 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 patchwork Tue Oct 17 13:11:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827005 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbhc0lsvz9sBZ for ; Wed, 18 Oct 2017 00:32:16 +1100 (AEDT) Received: from localhost ([::1]:39275 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Ryg-0004wC-3F for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:32:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34111) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReZ-0004Z9-Va for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4ReT-00067z-Tp for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:27 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57016) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReT-00066z-GX for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:21 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id BD78D54006B; Tue, 17 Oct 2017 16:11:20 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:18 +0300 Message-ID: <150824587818.6816.15425368718818424541.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 26/43] windbg: implemented windbg_read_context X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: sw@weilnetz.de, lprosek@redhat.com, dovgaluk@ispras.ru, rkagan@virtuozzo.com, pbonzini@redhat.com, den@openvz.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- target/i386/windbgstub.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index 3e238525da..a3ec5c1c6a 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -274,6 +274,102 @@ typedef struct _CPU_KPROCESSOR_STATE { static int windbg_read_context(CPUState *cpu, uint8_t *buf, int buf_size, int offset, int len) { + CPUArchState *env = 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 = len != sizeof(CPU_CONTEXT) || offset != 0; + if (new_mem) { + cc = g_new0(CPU_CONTEXT, 1); + } else { + cc = (CPU_CONTEXT *) buf; + memset(cc, 0, sizeof(CPU_CONTEXT)); + } + + cc->ContextFlags = 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 = 0, twd = 0; + swd = env->fpus & ~(7 << 11); + swd |= (env->fpstt & 7) << 11; + int i; + for (i = 0; i < 8; ++i) { + twd |= (!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 = 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 = cc->ExtendedRegisters + 160; + int i; + for (i = 0; i < 8; ++i, ptr += 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; } From patchwork Tue Oct 17 13:11:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827012 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbm62VKsz9s8J for ; Wed, 18 Oct 2017 00:35:18 +1100 (AEDT) Received: from localhost ([::1]:39316 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4S1b-0007Lv-Kp for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:35:15 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34198) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Reg-0004if-2d for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4ReZ-0006Gl-HI for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:34 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57044) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4ReZ-0006Ee-3G for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:27 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 5609954006B; Tue, 17 Oct 2017 16:11:26 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:23 +0300 Message-ID: <150824588380.6816.7746616652974828958.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 27/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 a3ec5c1c6a..490dadbae1 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -271,6 +271,12 @@ typedef struct _CPU_KPROCESSOR_STATE { #endif +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) { @@ -376,6 +382,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 = cpu->env_ptr; + int mem_size, i, tmp; + uint8_t *mem_ptr = 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 = 1; + switch (offset) { + + case offsetof(CPU_CONTEXT, ContextFlags): + mem_size = sizeof_field(CPU_CONTEXT, ContextFlags); + break; + + case offsetof(CPU_CONTEXT, Dr0): + mem_size = sizeof_field(CPU_CONTEXT, Dr0); + windbg_set_dr(cpu, 0, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr1): + mem_size = sizeof_field(CPU_CONTEXT, Dr1); + windbg_set_dr(cpu, 1, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr2): + mem_size = sizeof_field(CPU_CONTEXT, Dr2); + windbg_set_dr(cpu, 2, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr3): + mem_size = sizeof_field(CPU_CONTEXT, Dr3); + windbg_set_dr(cpu, 3, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr6): + mem_size = sizeof_field(CPU_CONTEXT, Dr6); + windbg_set_dr(cpu, 6, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Dr7): + mem_size = sizeof_field(CPU_CONTEXT, Dr7); + windbg_set_dr(cpu, 7, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, FloatSave.ControlWord): + mem_size = sizeof_field(CPU_CONTEXT, FloatSave.ControlWord); + cpu_set_fpuc(env, ldl_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, FloatSave.StatusWord): + mem_size = sizeof_field(CPU_CONTEXT, FloatSave.StatusWord); + tmp = ldl_p(buf + offset); + env->fpstt = (tmp >> 11) & 7; + env->fpus = tmp & ~0x3800; + break; + + case offsetof(CPU_CONTEXT, FloatSave.TagWord): + mem_size = sizeof_field(CPU_CONTEXT, FloatSave.TagWord); + tmp = ldl_p(buf + offset); + for (i = 0; i < 8; ++i) { + env->fptags[i] = !((tmp >> i) & 1); + } + break; + + case offsetof(CPU_CONTEXT, FloatSave.ErrorOffset): + mem_size = sizeof_field(CPU_CONTEXT, FloatSave.ErrorOffset); + UINT32_P(&env->fpip)[0] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, FloatSave.ErrorSelector): + mem_size = sizeof_field(CPU_CONTEXT, FloatSave.ErrorSelector); + UINT32_P(&env->fpip)[1] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, FloatSave.DataOffset): + mem_size = sizeof_field(CPU_CONTEXT, FloatSave.DataOffset); + UINT32_P(&env->fpdp)[0] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, FloatSave.DataSelector): + mem_size = sizeof_field(CPU_CONTEXT, FloatSave.DataSelector); + UINT32_P(&env->fpdp)[1] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, FloatSave.RegisterArea): + mem_size = sizeof_field(CPU_CONTEXT, FloatSave.RegisterArea); + for (i = 0; i < 8; ++i) { + memcpy(PTR(env->fpregs[i]), mem_ptr + i * 10, 10); + } + break; + + case offsetof(CPU_CONTEXT, FloatSave.Cr0NpxState): + mem_size = sizeof_field(CPU_CONTEXT, FloatSave.Cr0NpxState); + env->xcr0 = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, SegGs): + mem_size = sizeof_field(CPU_CONTEXT, SegGs); + windbg_set_sr(cpu, R_GS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, SegFs): + mem_size = sizeof_field(CPU_CONTEXT, SegFs); + windbg_set_sr(cpu, R_FS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, SegEs): + mem_size = sizeof_field(CPU_CONTEXT, SegEs); + windbg_set_sr(cpu, R_ES, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, SegDs): + mem_size = sizeof_field(CPU_CONTEXT, SegDs); + windbg_set_sr(cpu, R_DS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, Edi): + mem_size = sizeof_field(CPU_CONTEXT, Edi); + env->regs[R_EDI] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Esi): + mem_size = sizeof_field(CPU_CONTEXT, Esi); + env->regs[R_ESI] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Ebx): + mem_size = sizeof_field(CPU_CONTEXT, Ebx); + env->regs[R_EBX] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Edx): + mem_size = sizeof_field(CPU_CONTEXT, Edx); + env->regs[R_EDX] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Ecx): + mem_size = sizeof_field(CPU_CONTEXT, Ecx); + env->regs[R_ECX] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Eax): + mem_size = sizeof_field(CPU_CONTEXT, Eax); + env->regs[R_EAX] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Ebp): + mem_size = sizeof_field(CPU_CONTEXT, Ebp); + env->regs[R_EBP] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Eip): + mem_size = sizeof_field(CPU_CONTEXT, Eip); + env->eip = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, SegCs): + mem_size = sizeof_field(CPU_CONTEXT, SegCs); + windbg_set_sr(cpu, R_CS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, EFlags): + mem_size = sizeof_field(CPU_CONTEXT, EFlags); + env->eflags = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, Esp): + mem_size = sizeof_field(CPU_CONTEXT, Esp); + env->regs[R_ESP] = ldl_p(buf + offset); + break; + + case offsetof(CPU_CONTEXT, SegSs): + mem_size = sizeof_field(CPU_CONTEXT, SegSs); + windbg_set_sr(cpu, R_SS, lduw_p(buf + offset)); + break; + + case offsetof(CPU_CONTEXT, ExtendedRegisters): + mem_size = sizeof_field(CPU_CONTEXT, ExtendedRegisters); + + uint8_t *ptr = mem_ptr + 160; + for (i = 0; i < 8; ++i, ptr += 16) { + env->xmm_regs[i].ZMM_Q(0) = ldl_p(ptr); + env->xmm_regs[i].ZMM_Q(1) = 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 += mem_size; + offset += mem_size; + len -= mem_size; + } + return 0; } From patchwork Tue Oct 17 13:11:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827016 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbrT2R2Tz9s8J for ; Wed, 18 Oct 2017 00:39:05 +1100 (AEDT) Received: from localhost ([::1]:39398 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4S5H-0002Gg-DD for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:39:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34261) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rej-0004mJ-PR for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Ref-0006MD-12 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:37 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57064) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Ree-0006Lk-Or for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:32 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 0A5BE54006C; Tue, 17 Oct 2017 16:11:32 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:29 +0300 Message-ID: <150824588939.6816.8686431398510628144.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 28/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 490dadbae1..b22584a45a 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -594,6 +594,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 = cpu->env_ptr; + CPU_KSPECIAL_REGISTERS *ckr; + bool new_mem; + + new_mem = (len != sizeof(CPU_KSPECIAL_REGISTERS) || offset != 0); + if (new_mem) { + ckr = g_new(CPU_KSPECIAL_REGISTERS, 1); + } else { + ckr = (CPU_KSPECIAL_REGISTERS *) buf; + } + + memset(ckr, 0, len); + + ckr->Cr0 = ldl_p(&env->cr[0]); + ckr->Cr2 = ldl_p(&env->cr[2]); + ckr->Cr3 = ldl_p(&env->cr[3]); + ckr->Cr4 = ldl_p(&env->cr[4]); + + ckr->KernelDr0 = ldtul_p(&env->dr[0]); + ckr->KernelDr1 = ldtul_p(&env->dr[1]); + ckr->KernelDr2 = ldtul_p(&env->dr[2]); + ckr->KernelDr3 = ldtul_p(&env->dr[3]); + ckr->KernelDr6 = ldtul_p(&env->dr[6]); + ckr->KernelDr7 = ldtul_p(&env->dr[7]); + + ckr->Gdtr.Pad = lduw_p(&env->gdt.selector); + ckr->Idtr.Pad = lduw_p(&env->idt.selector); + + ckr->Gdtr.Limit = lduw_p(&env->gdt.limit); + ckr->Gdtr.Base = ldtul_p(&env->gdt.base); + ckr->Idtr.Limit = lduw_p(&env->idt.limit); + ckr->Idtr.Base = ldtul_p(&env->idt.base); + ckr->Tr = lduw_p(&env->tr.selector); + ckr->Ldtr = lduw_p(&env->ldt.selector); + + if (new_mem) { + memcpy(buf, (uint8_t *) ckr + offset, len); + g_free(ckr); + } return 0; } From patchwork Tue Oct 17 13:11:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826987 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbTq2y9Bz9s8J for ; Wed, 18 Oct 2017 00:22:55 +1100 (AEDT) Received: from localhost ([::1]:39220 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rpd-0005Iu-FB for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:22:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34342) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rep-0004pt-UZ for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rel-0006SP-9O for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:43 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57088) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rek-0006RE-CI for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:39 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 9BE9B54006B; Tue, 17 Oct 2017 16:11:37 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:35 +0300 Message-ID: <150824589507.6816.9710938068242094925.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 29/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 b22584a45a..fbb42d05bd 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -639,6 +639,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 = cpu->env_ptr; + int mem_size; + uint8_t *mem_ptr = buf; + while (len > 0 && offset < sizeof(CPU_KSPECIAL_REGISTERS)) { + mem_size = 1; + switch (offset) { + + case offsetof(CPU_KSPECIAL_REGISTERS, Cr0): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Cr0); + cpu_x86_update_cr0(env, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Cr2): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Cr2); + env->cr[2] = ldtul_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Cr3): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Cr3); + cpu_x86_update_cr3(env, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Cr4): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Cr4); + cpu_x86_update_cr4(env, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr0): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr0); + windbg_set_dr(cpu, 0, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr1): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr1); + windbg_set_dr(cpu, 1, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr2): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr2); + windbg_set_dr(cpu, 2, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr3): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr3); + windbg_set_dr(cpu, 3, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr6): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, KernelDr6); + windbg_set_dr(cpu, 6, ldtul_p(buf + offset)); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, KernelDr7): + mem_size = 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 = sizeof_field(CPU_KSPECIAL_REGISTERS, Gdtr.Pad); + env->gdt.selector = lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Gdtr.Limit): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Gdtr.Limit); + env->gdt.limit = lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Gdtr.Base): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Gdtr.Base); + env->gdt.base = ldtul_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Idtr.Pad): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Idtr.Pad); + env->idt.selector = lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Idtr.Limit): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Idtr.Limit); + env->idt.limit = lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Idtr.Base): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Idtr.Base); + env->idt.base = ldtul_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Tr): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Tr); + env->tr.selector = lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Ldtr): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Ldtr); + env->ldt.selector = lduw_p(buf + offset); + break; + + case offsetof(CPU_KSPECIAL_REGISTERS, Reserved): + mem_size = sizeof_field(CPU_KSPECIAL_REGISTERS, Reserved); + break; + + default: + WINDBG_ERROR("write_context: Unknown offset %d", offset); + return -1; + } + + mem_ptr += mem_size; + offset += mem_size; + len -= mem_size; + } + return 0; } From patchwork Tue Oct 17 13:11:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826991 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbXm6Bn2z9s8J for ; Wed, 18 Oct 2017 00:25:28 +1100 (AEDT) Received: from localhost ([::1]:39230 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rs6-0007UO-Qf for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:25:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34432) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rew-0004vw-5C for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rev-0006aL-7K for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:50 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57108) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Reu-0006Zo-Vw for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:49 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 51B8754006B; Tue, 17 Oct 2017 16:11:43 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:40 +0300 Message-ID: <150824590066.6816.17516686057228279307.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 30/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 fbb42d05bd..d67ad8cf0c 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -275,7 +275,22 @@ static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) {} static void windbg_set_sr(CPUState *cpu, int sr, uint16_t selector) -{} +{ + CPUArchState *env = cpu->env_ptr; + + if (selector != env->segs[sr].selector && + (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK))) { + unsigned int limit, flags; + target_ulong base; + + int dpl = (env->eflags & VM_MASK) ? 3 : 0; + base = selector << 4; + limit = 0xffff; + flags = 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); + } +} static int windbg_read_context(CPUState *cpu, uint8_t *buf, int buf_size, int offset, int len) From patchwork Tue Oct 17 13:11:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826992 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbXv1tNzz9s8J for ; Wed, 18 Oct 2017 00:25:35 +1100 (AEDT) Received: from localhost ([::1]:39235 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RsD-0007Zr-AE for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:25:33 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34505) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rez-0004zU-Tx for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rev-0006bC-SY for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:53 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57142) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rev-0006aT-Jh for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:49 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id E398F54006C; Tue, 17 Oct 2017 16:11:48 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:46 +0300 Message-ID: <150824590636.6816.17152155223503474492.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 31/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 d67ad8cf0c..7dff5e6c1b 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -12,6 +12,21 @@ #include "qemu/osdep.h" #include "exec/windbgstub-utils.h" +#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 = (((dr7) >> (DR7_LEN_SHIFT + ((index) * 4))) & 3); \ + (_len == 2) ? 8 : _len + 1; \ +}) + #ifdef TARGET_X86_64 # define OFFSET_SELF_PCR 0x18 # define OFFSET_VERS 0x108 @@ -271,9 +286,42 @@ typedef struct _CPU_KPROCESSOR_STATE { #endif -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) {} +static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) +{ + CPUArchState *env = cpu->env_ptr; + + switch (index) { + case 0 ... 3: + if (IS_BP_ENABLED(env->dr[7], index) && env->dr[index] != value) { + windbg_hw_breakpoint_remove(cpu, index); + env->dr[index] = value; + windbg_hw_breakpoint_insert(cpu, index); + } else { + env->dr[index] = value; + } + return; + case 6: + env->dr[6] = 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 = cpu->env_ptr; From patchwork Tue Oct 17 13:11:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827018 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbvK16Dzz9s8J for ; Wed, 18 Oct 2017 00:41:33 +1100 (AEDT) Received: from localhost ([::1]:39433 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4S7f-0004Pr-5y for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:41:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34589) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rf5-00055k-8O for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rf1-0006hO-DQ for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:59 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57192) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rf1-0006ge-5r for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:11:55 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 7DDC454006B; Tue, 17 Oct 2017 16:11:54 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:52 +0300 Message-ID: <150824591192.6816.2324759466048015841.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 32/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 7dff5e6c1b..570e68a735 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -297,7 +297,32 @@ static int windbg_hw_breakpoint_remove(CPUState *cpu, int index) } static void windbg_set_dr7(CPUState *cpu, target_ulong new_dr7) -{} +{ + CPUArchState *env = cpu->env_ptr; + target_ulong old_dr7 = env->dr[7]; + int iobpt = 0; + int i; + + new_dr7 |= DR7_FIXED_1; + if (new_dr7 == old_dr7) { + return; + } + + for (i = 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] = new_dr7; + for (i = 0; i < DR7_MAX_BP; i++) { + if (IS_BP_ENABLED(env->dr[7], i)) { + iobpt |= windbg_hw_breakpoint_insert(cpu, i); + } + } + + env->hflags = (env->hflags & ~HF_IOBPT_MASK) | iobpt; +} static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) { From patchwork Tue Oct 17 13:11:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827020 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbyK2j8Kz9s8J for ; Wed, 18 Oct 2017 00:44:09 +1100 (AEDT) Received: from localhost ([::1]:39470 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4SAB-0006kq-GO for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:44:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34701) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RfD-0005DT-LE for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rf7-0006pc-Tj for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:07 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57242) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rf7-0006nz-Lp for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:01 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 66D8754006B; Tue, 17 Oct 2017 16:12:00 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:11:57 +0300 Message-ID: <150824591748.6816.16828342704579456200.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 33/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 570e68a735..f9336b607f 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -288,11 +288,67 @@ typedef struct _CPU_KPROCESSOR_STATE { static int windbg_hw_breakpoint_insert(CPUState *cpu, int index) { + CPUArchState *env = cpu->env_ptr; + + target_ulong addr = env->dr[index]; + int type = BP_TYPE(env->dr[7], index); + int len = BP_LEN(env->dr[7], index); + int err = 0; + + switch (type) { + case DR7_TYPE_DATA_WR: + err = cpu_watchpoint_insert(cpu, addr, len, BP_MEM_WRITE | BP_GDB, + &env->cpu_watchpoint[index]); + break; + case DR7_TYPE_DATA_RW: + err = cpu_watchpoint_insert(cpu, addr, len, BP_MEM_ACCESS | BP_GDB, + &env->cpu_watchpoint[index]); + break; + case DR7_TYPE_BP_INST: + err = 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] = NULL; + WINDBG_ERROR("hw_breakpoint_insert: index(%d), " FMT_ADDR ", " FMT_ERR, + index, addr, err); + } return 0; } static int windbg_hw_breakpoint_remove(CPUState *cpu, int index) { + CPUArchState *env = cpu->env_ptr; + int type = 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] = NULL; + WINDBG_DEBUG("hw_breakpoint_remove: index(%d), " FMT_ADDR, + index, env->dr[index]); return 0; } From patchwork Tue Oct 17 13:12:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827013 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbm91ckSz9s8J for ; Wed, 18 Oct 2017 00:35:21 +1100 (AEDT) Received: from localhost ([::1]:39323 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4S1f-0007N7-8F for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:35:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34776) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RfO-0005Kx-V6 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RfI-0006zE-S9 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:18 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57268) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RfI-0006xy-3Y for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:12 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 1779E54006B; Tue, 17 Oct 2017 16:12:06 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:03 +0300 Message-ID: <150824592353.6816.9060062121278536675.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 34/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index 468a874ab7..8cea2afdf1 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -97,6 +97,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 c363d905af..0f23f3c865 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -14,6 +14,8 @@ static InitedAddr KPCR; static InitedAddr version; +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, PacketData *pd) stl_p(&mem->ActualBytesWritten, len); } +void kd_api_write_breakpoint(CPUState *cpu, PacketData *pd) +{ + DBGKD_WRITE_BREAKPOINT64 *m64c = &pd->m64.u.WriteBreakPoint; + target_ulong addr; + int i, err = 0; + + addr = ldtul_p(&m64c->BreakPointAddress); + + for (i = 0; i < KD_BREAKPOINT_MAX; ++i) { + if (!bps[i].is_init) { + err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL); + if (!err) { + bps[i].addr = addr; + bps[i].is_init = true; + WINDBG_DEBUG("write_breakpoint: " FMT_ADDR, addr); + break; + } else { + WINDBG_ERROR("write_breakpoint: " FMT_ADDR ", " FMT_ERR, + addr, err); + pd->m64.ReturnStatus = STATUS_UNSUCCESSFUL; + return; + } + } else if (addr == bps[i].addr) { + break; + } + } + + if (!err) { + stl_p(&m64c->BreakPointHandle, i + 1); + pd->m64.ReturnStatus = STATUS_SUCCESS; + } else { + WINDBG_ERROR("write_breakpoint: All breakpoints occupied"); + pd->m64.ReturnStatus = STATUS_UNSUCCESSFUL; + } +} + +void kd_api_restore_breakpoint(CPUState *cpu, PacketData *pd) +{ + DBGKD_RESTORE_BREAKPOINT *m64c = &pd->m64.u.RestoreBreakPoint; + uint8_t index; + int err = -1; + + index = ldtul_p(&m64c->BreakPointHandle) - 1; + + if (bps[index].is_init) { + err = 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 = false; + pd->m64.ReturnStatus = STATUS_SUCCESS; + } else { + pd->m64.ReturnStatus = 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(ParsingContext *ctx) kd_api_set_context(cpu, &ctx->data); break; + 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(ParsingContext *ctx) kd_api_write_control_space(cpu, &ctx->data); break; + case DbgKdClearAllInternalBreakpointsApi: + return; + default: kd_api_unsupported(cpu, &ctx->data); break; From patchwork Tue Oct 17 13:12:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827023 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGc0n58hDz9s9Y for ; Wed, 18 Oct 2017 00:46:16 +1100 (AEDT) Received: from localhost ([::1]:39488 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4SCE-0008J7-5l for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:46:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34771) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RfO-0005Kp-Pd for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RfI-0006z2-OS for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:18 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57298) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RfI-0006yW-B1 for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:12 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id A128254006C; Tue, 17 Oct 2017 16:12:11 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:09 +0300 Message-ID: <150824592910.6816.15328039229084611078.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 35/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Added handler registration of gdb debug exception. Its exception also can be 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; +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; } +bool register_excp_debug_handler(void (*handler)(CPUState *cpu)) +{ + if (excp_debug_handler == NULL) { + excp_debug_handler = 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 != NULL) { + excp_debug_handler(cpu); + } + qemu_system_debug_request(); cpu->stopped = 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 = mon_chr; s->current_syscall_cb = NULL; + if (!register_excp_debug_handler(gdb_set_stop_cpu)) { + exit(1); + } + return 0; } 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); bool defaults_enabled(void); +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 ^= 1; } -static void windbg_vm_stop(void) +static void windbg_bp_handler(CPUState *cpu) { - CPUState *cpu = qemu_get_cpu(0); - vm_stop(RUN_STATE_PAUSED); - SizedBuf buf = kd_gen_exception_sc(cpu); windbg_send_data_packet(buf.data, buf.size, PACKET_TYPE_KD_STATE_CHANGE64); SBUF_FREE(buf); } +static void windbg_vm_stop(void) +{ + CPUState *cpu = 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) qemu_register_reset(windbg_handle_reset, NULL); + if (!register_excp_debug_handler(windbg_bp_handler)) { + exit(1); + } + atexit(windbg_exit); return 0; } From patchwork Tue Oct 17 13:12:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826995 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbbr6lHKz9s8J for ; Wed, 18 Oct 2017 00:28:08 +1100 (AEDT) Received: from localhost ([::1]:39252 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Ruh-0001Pq-0t for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:28:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34804) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RfS-0005Ld-Te for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RfO-00074g-8k for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:22 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57330) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RfO-00074E-0K for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:18 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 45B0D54006B; Tue, 17 Oct 2017 16:12:17 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:14 +0300 Message-ID: <150824593465.6816.16332217244673633518.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 36/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index 8cea2afdf1..49b05226b3 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -99,6 +99,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 0f23f3c865..dce2b4ccde 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -10,6 +10,7 @@ */ #include "exec/windbgstub-utils.h" +#include "sysemu/sysemu.h" static InitedAddr KPCR; static InitedAddr version; @@ -133,6 +134,20 @@ void kd_api_restore_breakpoint(CPUState *cpu, PacketData *pd) } } +void kd_api_continue(CPUState *cpu, PacketData *pd) +{ + uint32_t status = ldl_p(&pd->m64.u.Continue2.ContinueStatus); + uint32_t trace = ldl_p(&pd->m64.u.Continue2.ControlSet.TraceFlag); + int ssFlag = 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(ParsingContext *ctx) kd_api_restore_breakpoint(cpu, &ctx->data); break; + case DbgKdContinueApi: + case DbgKdContinueApi2: + kd_api_continue(cpu, &ctx->data); + return; + case DbgKdReadControlSpaceApi: kd_api_read_control_space(cpu, &ctx->data); break; From patchwork Tue Oct 17 13:12:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826996 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbby69HVz9s8J for ; Wed, 18 Oct 2017 00:28:14 +1100 (AEDT) Received: from localhost ([::1]:39255 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rum-0001UN-TB for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:28:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34848) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RfZ-0005VG-Rl for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4RfU-0007C6-Vy for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:29 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57352) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RfU-0007BN-Ig for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:24 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id D328754006C; Tue, 17 Oct 2017 16:12:22 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:20 +0300 Message-ID: <150824594030.6816.9993391145420015010.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 37/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index 49b05226b3..dde88f24c9 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -102,6 +102,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); SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index dce2b4ccde..b32b4ea570 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -11,6 +11,7 @@ #include "exec/windbgstub-utils.h" #include "sysemu/sysemu.h" +#include "exec/address-spaces.h" static InitedAddr KPCR; static InitedAddr version; @@ -148,6 +149,67 @@ void kd_api_continue(CPUState *cpu, PacketData *pd) } } +void kd_api_read_io_space(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_WRITE_IO64 *io = &pd->m64.u.ReadWriteIo; + CPUArchState *env = cpu->env_ptr; + + target_ulong addr = ldtul_p(&io->IoAddress); + uint32_t value = 0; + + switch (io->DataSize) { + case 1: + value = address_space_ldub(&address_space_io, addr, + cpu_get_mem_attrs(env), NULL); + stl_p(&io->DataValue, value); + break; + case 2: + value = address_space_lduw(&address_space_io, addr, + cpu_get_mem_attrs(env), NULL); + stl_p(&io->DataValue, value); + break; + case 4: + value = address_space_ldl(&address_space_io, addr, + cpu_get_mem_attrs(env), NULL); + stl_p(&io->DataValue, value); + break; + default: + pd->m64.ReturnStatus = STATUS_UNSUCCESSFUL; + return; + } + + pd->m64.ReturnStatus = STATUS_SUCCESS; +} + +void kd_api_write_io_space(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_WRITE_IO64 *io = &pd->m64.u.ReadWriteIo; + CPUArchState *env = cpu->env_ptr; + + target_ulong addr = ldtul_p(&io->IoAddress); + uint32_t value = 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 = STATUS_UNSUCCESSFUL; + return; + } + + pd->m64.ReturnStatus = 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(ParsingContext *ctx) kd_api_restore_breakpoint(cpu, &ctx->data); break; + 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 patchwork Tue Oct 17 13:12:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827024 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGc2v0jG3z9sBZ for ; Wed, 18 Oct 2017 00:48:07 +1100 (AEDT) Received: from localhost ([::1]:39493 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4SE1-0001Cc-7I for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:48:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34899) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfj-0005eP-Jz for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rfe-0007MS-Vp for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:39 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57378) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfe-0007Hy-Jq for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:34 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 66C3E54006B; Tue, 17 Oct 2017 16:12:28 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:26 +0300 Message-ID: <150824594587.6816.3941059152860779884.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 38/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index dde88f24c9..8b0091c53b 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -104,6 +104,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); SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index b32b4ea570..319e70e01d 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 = STATUS_SUCCESS; } +void kd_api_read_physical_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_MEMORY64 *mem = &pd->m64.u.ReadMemory; + uint32_t len; + target_ulong addr; + + len = MIN(ldl_p(&mem->TransferCount), + PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)); + addr = ldtul_p(&mem->TargetBaseAddress); + + cpu_physical_memory_rw(addr, pd->extra, len, 0); + pd->extra_size = len; + stl_p(&mem->ActualBytesRead, len); +} + +void kd_api_write_physical_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_WRITE_MEMORY64 *mem = &pd->m64.u.WriteMemory; + uint32_t len; + target_ulong addr; + + len = MIN(ldl_p(&mem->TransferCount), pd->extra_size); + addr = ldtul_p(&mem->TargetBaseAddress); + + cpu_physical_memory_rw(addr, pd->extra, len, 1); + pd->extra_size = 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(ParsingContext *ctx) kd_api_write_control_space(cpu, &ctx->data); break; + 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; From patchwork Tue Oct 17 13:12:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 826999 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbfx1Jscz9s8J for ; Wed, 18 Oct 2017 00:30:49 +1100 (AEDT) Received: from localhost ([::1]:39264 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RxH-0003jp-5f for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:30:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34897) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfj-0005eJ-IK for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rfe-0007MF-UL for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:39 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57408) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfe-0007LA-MU for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:34 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id E517F54006C; Tue, 17 Oct 2017 16:12:33 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:31 +0300 Message-ID: <150824595139.6816.4226767258774206043.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 39/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index 8b0091c53b..0fcef14f20 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -106,6 +106,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); SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 319e70e01d..40f859009a 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -239,6 +239,28 @@ void kd_api_write_physical_memory(CPUState *cpu, PacketData *pd) stl_p(&mem->ActualBytesWritten, len); } +void kd_api_get_version(CPUState *cpu, PacketData *pd) +{ + DBGKD_GET_VERSION64 *kdver; + int err = cpu_memory_rw_debug(cpu, version.addr, PTR(pd->m64) + 0x10, + sizeof(DBGKD_MANIPULATE_STATE64) - 0x10, 0); + if (!err) { + kdver = (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 = 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(ParsingContext *ctx) kd_api_write_physical_memory(cpu, &ctx->data); break; + case DbgKdGetVersionApi: + kd_api_get_version(cpu, &ctx->data); + break; + case DbgKdClearAllInternalBreakpointsApi: return; From patchwork Tue Oct 17 13:12:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827026 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGc501pwBz9s9Y for ; Wed, 18 Oct 2017 00:49:56 +1100 (AEDT) Received: from localhost ([::1]:39501 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4SFm-0002K3-BW for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:49:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34932) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfp-0005mx-Mv for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rfk-0007Wx-WC for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:45 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57428) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfk-0007We-Ai for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:40 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 8ED3B54006B; Tue, 17 Oct 2017 16:12:39 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:37 +0300 Message-ID: <150824595701.6816.3361946905693701355.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 40/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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 | 319 +++++++++++++++++++++++++++++++++++++++ windbgstub.c | 8 + 3 files changed, 329 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h index 0fcef14f20..0199a47343 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -107,6 +107,8 @@ 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_read_msr(CPUState *cpu, PacketData *pd); +void kd_api_write_msr(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index f9336b607f..12c0aca9ae 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -1001,6 +1001,325 @@ void kd_api_write_control_space(CPUState *cpu, PacketData *pd) stl_p(&mem->ActualBytesWritten, len); } +void kd_api_read_msr(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_WRITE_MSR *m64c = &pd->m64.u.ReadWriteMsr; + CPUArchState *env = 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 = env->sysenter_cs; + break; + case MSR_IA32_SYSENTER_ESP: + val = env->sysenter_esp; + break; + case MSR_IA32_SYSENTER_EIP: + val = env->sysenter_eip; + break; + case MSR_IA32_APICBASE: + val = cpu_get_apic_base(x86_env_get_cpu(env)->apic_state); + break; + case MSR_EFER: + val = env->efer; + break; + case MSR_STAR: + val = env->star; + break; + case MSR_PAT: + val = env->pat; + break; + case MSR_VM_HSAVE_PA: + val = env->vm_hsave; + break; + case MSR_IA32_PERF_STATUS: + /* tsc_increment_by_tick */ + val = 1000ULL; + /* CPU multiplier */ + val |= (((uint64_t)4ULL) << 40); + break; +#ifdef TARGET_X86_64 + case MSR_LSTAR: + val = env->lstar; + break; + case MSR_CSTAR: + val = env->cstar; + break; + case MSR_FMASK: + val = env->fmask; + break; + case MSR_FSBASE: + val = env->segs[R_FS].base; + break; + case MSR_GSBASE: + val = env->segs[R_GS].base; + break; + case MSR_KERNELGSBASE: + val = env->kernelgsbase; + break; + case MSR_TSC_AUX: + val = 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 = 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 = env->mtrr_var[((uint32_t)env->regs[R_ECX] - + MSR_MTRRphysMask(0)) / 2].mask; + break; + case MSR_MTRRfix64K_00000: + val = env->mtrr_fixed[0]; + break; + case MSR_MTRRfix16K_80000: + case MSR_MTRRfix16K_A0000: + val = 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 = env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix4K_C0000 + 3]; + break; + case MSR_MTRRdefType: + val = env->mtrr_deftype; + break; + case MSR_MTRRcap: + if (env->features[FEAT_1_EDX] & CPUID_MTRR) { + val = MSR_MTRRcap_VCNT | MSR_MTRRcap_FIXRANGE_SUPPORT | + MSR_MTRRcap_WC_SUPPORTED; + } else { + /* XXX: exception? */ + val = 0; + } + break; + case MSR_MCG_CAP: + val = env->mcg_cap; + break; + case MSR_MCG_CTL: + if (env->mcg_cap & MCG_CTL_P) { + val = env->mcg_ctl; + } else { + val = 0; + } + break; + case MSR_MCG_STATUS: + val = env->mcg_status; + break; + case MSR_IA32_MISC_ENABLE: + val = env->msr_ia32_misc_enable; + break; + case MSR_IA32_BNDCFGS: + val = env->msr_bndcfgs; + break; + default: + if ((uint32_t)env->regs[R_ECX] >= MSR_MC0_CTL + && (uint32_t)env->regs[R_ECX] < MSR_MC0_CTL + + (4 * env->mcg_cap & 0xff)) { + uint32_t offset = (uint32_t)env->regs[R_ECX] - MSR_MC0_CTL; + val = env->mce_banks[offset]; + break; + } + /* XXX: exception? */ + val = 0; + break; + } + + stq_p(&val, val); + m64c->DataValueLow = UINT32_P(val)[0]; + m64c->DataValueHigh = UINT32_P(val)[1]; + pd->m64.ReturnStatus = STATUS_SUCCESS; +} + +void kd_api_write_msr(CPUState *cpu, PacketData *pd) +{ + DBGKD_READ_WRITE_MSR *m64c = &pd->m64.u.ReadWriteMsr; + CPUArchState *env = cpu->env_ptr; + + uint64_t val; + + cpu_svm_check_intercept_param(env, SVM_EXIT_MSR, 1, 0); + + val = m64c->DataValueLow | ((uint64_t) m64c->DataValueHigh) << 32; + val = ldq_p(&val); + + switch ((uint32_t)env->regs[R_ECX]) { + case MSR_IA32_SYSENTER_CS: + env->sysenter_cs = val & 0xffff; + break; + case MSR_IA32_SYSENTER_ESP: + env->sysenter_esp = val; + break; + case MSR_IA32_SYSENTER_EIP: + env->sysenter_eip = 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 = 0; + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_SYSCALL) { + update_mask |= MSR_EFER_SCE; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { + update_mask |= MSR_EFER_LME; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_FFXSR) { + update_mask |= MSR_EFER_FFXSR; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_NX) { + update_mask |= MSR_EFER_NXE; + } + if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) { + update_mask |= MSR_EFER_SVME; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_FFXSR) { + update_mask |= MSR_EFER_FFXSR; + } + cpu_load_efer(env, (env->efer & ~update_mask) | + (val & update_mask)); + } + break; + case MSR_STAR: + env->star = val; + break; + case MSR_PAT: + env->pat = val; + break; + case MSR_VM_HSAVE_PA: + env->vm_hsave = val; + break; +#ifdef TARGET_X86_64 + case MSR_LSTAR: + env->lstar = val; + break; + case MSR_CSTAR: + env->cstar = val; + break; + case MSR_FMASK: + env->fmask = val; + break; + case MSR_FSBASE: + env->segs[R_FS].base = val; + break; + case MSR_GSBASE: + env->segs[R_GS].base = val; + break; + case MSR_KERNELGSBASE: + env->kernelgsbase = 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 = 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 = val; + break; + case MSR_MTRRfix64K_00000: + env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix64K_00000] = val; + break; + case MSR_MTRRfix16K_80000: + case MSR_MTRRfix16K_A0000: + env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix16K_80000 + 1] = 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] = val; + break; + case MSR_MTRRdefType: + env->mtrr_deftype = val; + break; + case MSR_MCG_STATUS: + env->mcg_status = val; + break; + case MSR_MCG_CTL: + if ((env->mcg_cap & MCG_CTL_P) + && (val == 0 || val == ~(uint64_t)0)) { + env->mcg_ctl = val; + } + break; + case MSR_TSC_AUX: + env->tsc_aux = val; + break; + case MSR_IA32_MISC_ENABLE: + env->msr_ia32_misc_enable = val; + break; + case MSR_IA32_BNDCFGS: + /* FIXME: #GP if reserved bits are set. */ + /* FIXME: Extend highest implemented bit of linear address. */ + env->msr_bndcfgs = val; + cpu_sync_bndcs_hflags(env); + break; + default: + if ((uint32_t)env->regs[R_ECX] >= MSR_MC0_CTL + && (uint32_t)env->regs[R_ECX] < MSR_MC0_CTL + + (4 * env->mcg_cap & 0xff)) { + uint32_t offset = (uint32_t)env->regs[R_ECX] - MSR_MC0_CTL; + if ((offset & 0x3) != 0 + || (val == 0 || val == ~(uint64_t)0)) { + env->mce_banks[offset] = val; + } + break; + } + /* XXX: exception? */ + break; + } + + pd->m64.ReturnStatus = STATUS_SUCCESS; +} + bool windbg_on_load(void) { CPUState *cpu = 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(ParsingContext *ctx) kd_api_write_physical_memory(cpu, &ctx->data); break; + 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 patchwork Tue Oct 17 13:12:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827029 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGc6j4z1yz9s72 for ; Wed, 18 Oct 2017 00:51:22 +1100 (AEDT) Received: from localhost ([::1]:39515 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4SH8-0003Dx-3R for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:51:18 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34966) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfv-0005p6-4P for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rfu-0007cs-6x for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:51 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57452) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rft-0007bS-Vc for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:50 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 4045554006B; Tue, 17 Oct 2017 16:12:45 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:42 +0300 Message-ID: <150824596263.6816.4069912549519336456.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 41/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index 0199a47343..6c587dadd8 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -109,6 +109,7 @@ 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_search_memory(CPUState *cpu, PacketData *pd); void kd_api_unsupported(CPUState *cpu, PacketData *pd); SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 40f859009a..8417de8fb1 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -261,6 +261,39 @@ void kd_api_get_version(CPUState *cpu, PacketData *pd) } } +void kd_api_search_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_SEARCH_MEMORY *m64c = &pd->m64.u.SearchMemory; + int s_len = MAX(ldq_p(&m64c->SearchLength), 1); + int p_len = MIN(ldl_p(&m64c->PatternLength), pd->extra_size); + target_ulong addr = ldq_p(&m64c->SearchAddress); + int size = MIN(s_len, 10); + uint8_t mem[size + p_len]; + int i, err; + + pd->extra_size = 0; + pd->m64.ReturnStatus = STATUS_NO_MORE_ENTRIES; + + while (s_len) { + err = cpu_memory_rw_debug(cpu, addr, mem, size + p_len, 0); + if (!err) { + for (i = 0; i < size; ++i) { + if (memcmp(mem + i, pd->extra, p_len) == 0) { + stl_p(&m64c->FoundAddress, addr + i); + pd->m64.ReturnStatus = STATUS_SUCCESS; + return; + } + } + } else { + WINDBG_DEBUG("search_memory: No physical page mapped: " FMT_ADDR, + addr); + } + s_len -= size; + addr += size; + size = 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(ParsingContext *ctx) case DbgKdClearAllInternalBreakpointsApi: return; + case DbgKdSearchMemoryApi: + kd_api_search_memory(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break; From patchwork Tue Oct 17 13:12:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827001 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbg63863z9s8J for ; Wed, 18 Oct 2017 00:30:58 +1100 (AEDT) Received: from localhost ([::1]:39271 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4RxQ-0003vg-3G for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:30:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35038) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rg4-0005wm-Py for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:13:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rfz-0007gv-0o for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:13:00 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57476) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rfy-0007f4-Kd for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:54 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id DBAF254006B; Tue, 17 Oct 2017 16:12:50 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:48 +0300 Message-ID: <150824596832.6816.18169176089248824069.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 42/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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-utils.h index 6c587dadd8..0438ea44b6 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -110,6 +110,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); SizedBuf kd_gen_exception_sc(CPUState *cpu); diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 8417de8fb1..444bb0474d 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -294,6 +294,45 @@ void kd_api_search_memory(CPUState *cpu, PacketData *pd) } } +void kd_api_fill_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_FILL_MEMORY *m64c = &pd->m64.u.FillMemory; + uint32_t len = ldl_p(&m64c->Length); + target_ulong addr = ldq_p(&m64c->Address); + uint16_t pattern = ldl_p(&m64c->PatternLength); + uint16_t flags = ldl_p(&m64c->Flags); + int err, offset = 0; + + uint8_t mem[pattern]; + memcpy(mem, pd->extra, pattern); + + pd->extra_size = 0; + + switch (flags) { + case DBGKD_FILL_MEMORY_VIRTUAL: + while (offset < len) { + err = cpu_memory_rw_debug(cpu, addr + offset, mem, + MIN(pattern, len - offset), 1); + offset += 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 += 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(ParsingContext *ctx) kd_api_search_memory(cpu, &ctx->data); break; + case DbgKdFillMemoryApi: + kd_api_fill_memory(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break; From patchwork Tue Oct 17 13:12:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 827008 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yGbkG57Dxz9s8J for ; Wed, 18 Oct 2017 00:33:42 +1100 (AEDT) Received: from localhost ([::1]:39278 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4S04-00067j-MB for incoming@patchwork.ozlabs.org; Tue, 17 Oct 2017 09:33:40 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35064) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rg8-0005z1-Gz for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:13:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e4Rg2-0007iS-RK for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:13:04 -0400 Received: from mail.ispras.ru ([83.149.199.45]:57496) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e4Rg2-0007i7-KC for qemu-devel@nongnu.org; Tue, 17 Oct 2017 09:12:58 -0400 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id DED1F54006B; Tue, 17 Oct 2017 16:12:56 +0300 (MSK) From: Mihail Abakumov To: qemu-devel@nongnu.org Date: Tue, 17 Oct 2017 16:12:54 +0300 Message-ID: <150824597393.6816.9995893839577495938.stgit@Misha-PC.lan02.inno> In-Reply-To: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> References: <150824572545.6816.5099701189660002212.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH v2 43/43] 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Mihail Abakumov Signed-off-by: Pavel Dovgalyuk Signed-off-by: Dmitriy Koltunov --- include/exec/windbgstub-utils.h | 1 + windbgstub-utils.c | 14 ++++++++++++++ windbgstub.c | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h index 0438ea44b6..190fdab6b2 100755 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -112,6 +112,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); 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 444bb0474d..7de2fd6ade 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -333,6 +333,20 @@ void kd_api_fill_memory(CPUState *cpu, PacketData *pd) } } +void kd_api_query_memory(CPUState *cpu, PacketData *pd) +{ + DBGKD_QUERY_MEMORY *mem = &pd->m64.u.QueryMemory; + + if (ldl_p(&mem->AddressSpace) == DBGKD_QUERY_MEMORY_VIRTUAL) { + mem->AddressSpace = DBGKD_QUERY_MEMORY_PROCESS; + mem->Flags = DBGKD_QUERY_MEMORY_READ | + DBGKD_QUERY_MEMORY_WRITE | + DBGKD_QUERY_MEMORY_EXECUTE; + mem->AddressSpace = ldl_p(&mem->AddressSpace); + mem->Flags = 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(ParsingContext *ctx) kd_api_fill_memory(cpu, &ctx->data); break; + case DbgKdQueryMemoryApi: + kd_api_query_memory(cpu, &ctx->data); + break; + default: kd_api_unsupported(cpu, &ctx->data); break;