From patchwork Thu Nov 29 14:27:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Abakumov X-Patchwork-Id: 1005412 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=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ispras.ru Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 435Kl50VBpz9sP0 for ; Fri, 30 Nov 2018 01:33:37 +1100 (AEDT) Received: from localhost ([::1]:54472 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gSNNm-0008Km-Lp for incoming@patchwork.ozlabs.org; Thu, 29 Nov 2018 09:33:34 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52347) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gSNIK-0003Rk-W8 for qemu-devel@nongnu.org; Thu, 29 Nov 2018 09:28:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gSNIK-0004Rk-3R for qemu-devel@nongnu.org; Thu, 29 Nov 2018 09:27:57 -0500 Received: from mail.ispras.ru ([83.149.199.45]:39168) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gSNIJ-0004LW-Mp for qemu-devel@nongnu.org; Thu, 29 Nov 2018 09:27:56 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id F3BA95400A7; Thu, 29 Nov 2018 17:27:54 +0300 (MSK) From: Mikhail Abakumov To: qemu-devel@nongnu.org Date: Thu, 29 Nov 2018 17:27:52 +0300 Message-ID: <154350167242.8036.17729571538406950488.stgit@Misha-PC.lan02.inno> In-Reply-To: <154350164526.8036.12623669071583857903.stgit@Misha-PC.lan02.inno> References: <154350164526.8036.12623669071583857903.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH 04/39] windbg: add 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" Add some helper features for windbgstub. Signed-off-by: Mikhail Abakumov Signed-off-by: Pavel Dovgalyuk --- include/exec/windbgstub-utils.h | 40 +++++++++++++++++++ include/exec/windbgstub.h | 6 +++ windbgstub-utils.c | 83 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h index e80b9cba8f..e7db062289 100644 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -13,7 +13,47 @@ #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" +#define DPRINTF(fmt, ...) \ + do { \ + if (WINDBG_DPRINT) { \ + qemu_log("windbg: " fmt, ##__VA_ARGS__); \ + } \ + } while (0) + +#define WINDBG_ERROR(...) error_report("windbg: " __VA_ARGS__) + +#define FMT_ADDR "addr:0x" TARGET_FMT_lx +#define FMT_ERR "Error:%d" + +#define PTR(var) ((uint8_t *) (&var)) + +#define VMEM_ADDR(cpu, addr) \ + ({ \ + target_ulong _addr; \ + cpu_memory_rw_debug(cpu, addr, PTR(_addr), sizeof(target_ulong), 0); \ + ldtul_p(&_addr); \ + }) + +#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; +} InitedAddr; + +const char *kd_api_name(int id); +const char *kd_pkt_type_name(int id); + #endif /* WINDBGSTUB_UTILS_H */ diff --git a/include/exec/windbgstub.h b/include/exec/windbgstub.h index 9656c152ef..576acb1ee8 100644 --- a/include/exec/windbgstub.h +++ b/include/exec/windbgstub.h @@ -12,6 +12,12 @@ #ifndef WINDBGSTUB_H #define WINDBGSTUB_H +#ifdef DEBUG_WINDBG +#define WINDBG_DPRINT true +#else +#define WINDBG_DPRINT false +#endif + int windbg_server_start(const char *device); #endif /* WINDBGSTUB_H */ diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 7f603b7f3f..968e5cb2dd 100644 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -10,3 +10,86 @@ */ #include "exec/windbgstub-utils.h" + +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", + "DbgKdWriteCustomBreakpointApi", + "DbgKdGetContextExApi", + "DbgKdSetContextExApi", + "DbgKdUnknownApi", +}; + +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", +}; + +const char *kd_api_name(int id) +{ + return (id >= DbgKdMinimumManipulate && id < DbgKdMaximumManipulate) + ? kd_api_names[id - DbgKdMinimumManipulate] + : kd_api_names[DbgKdMaximumManipulate - DbgKdMinimumManipulate]; +} + +const char *kd_pkt_type_name(int id) +{ + return (id >= 0 && id < PACKET_TYPE_MAX) + ? kd_packet_type_names[id] + : kd_packet_type_names[PACKET_TYPE_MAX - 1]; +}