From nobody Mon Feb 9 22:05:18 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 154350272791017.686403176986687; Thu, 29 Nov 2018 06:45:27 -0800 (PST) Received: from localhost ([::1]:54538 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gSNZB-0002eO-Fd for importer@patchew.org; Thu, 29 Nov 2018 09:45:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54290) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gSNLP-0006oP-I6 for qemu-devel@nongnu.org; Thu, 29 Nov 2018 09:31:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gSNLJ-00026D-DH for qemu-devel@nongnu.org; Thu, 29 Nov 2018 09:31:07 -0500 Received: from mail.ispras.ru ([83.149.199.45]:40030) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gSNLJ-0001pE-07 for qemu-devel@nongnu.org; Thu, 29 Nov 2018 09:31:01 -0500 Received: from Misha-PC.lan02.inno (unknown [85.142.117.226]) by mail.ispras.ru (Postfix) with ESMTPSA id 6292B540218; Thu, 29 Nov 2018 17:30:50 +0300 (MSK) From: Mikhail Abakumov To: qemu-devel@nongnu.org Date: Thu, 29 Nov 2018 17:30:48 +0300 Message-ID: <154350184782.8036.12941562089463018287.stgit@Misha-PC.lan02.inno> In-Reply-To: <154350164526.8036.12623669071583857903.stgit@Misha-PC.lan02.inno> References: <154350164526.8036.12623669071583857903.stgit@Misha-PC.lan02.inno> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH 35/39] windbg: implement kd_api_read_msr and kd_api_write_msr X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: sw@weilnetz.de, lprosek@redhat.com, dovgaluk@ispras.ru, rkagan@virtuozzo.com, pbonzini@redhat.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Add sub functions for helper_wrmsr and helper_rdmsr: cpu_x86_write_msr and cpu_x86_read_msr. Signed-off-by: Mikhail Abakumov Signed-off-by: Pavel Dovgalyuk --- include/exec/windbgstub-utils.h | 2 ++ target/i386/cpu.h | 5 +++++ target/i386/misc_helper.c | 39 ++++++++++++++++++++++++++++-------= ---- target/i386/windbgstub.c | 30 ++++++++++++++++++++++++++++++ windbgstub.c | 8 ++++++++ 5 files changed, 73 insertions(+), 11 deletions(-) diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-util= s.h index adfc9936f3..74e3b9a0da 100644 --- a/include/exec/windbgstub-utils.h +++ b/include/exec/windbgstub-utils.h @@ -81,6 +81,8 @@ void kd_api_write_io_space(CPUState *cs, PacketData *pd); void kd_api_read_physical_memory(CPUState *cs, PacketData *pd); void kd_api_write_physical_memory(CPUState *cs, PacketData *pd); void kd_api_get_version(CPUState *cs, PacketData *pd); +void kd_api_read_msr(CPUState *cs, PacketData *pd); +void kd_api_write_msr(CPUState *cs, PacketData *pd); void kd_api_clear_all_internal_breakpoints(CPUState *cs, PacketData *pd); void kd_api_get_context_ex(CPUState *cs, PacketData *pd); void kd_api_set_context_ex(CPUState *cs, PacketData *pd); diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 9c52d0cbeb..0f451d81bf 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1680,6 +1680,11 @@ void cpu_x86_update_cr3(CPUX86State *env, target_ulo= ng new_cr3); void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_cr4); void cpu_x86_update_dr7(CPUX86State *env, uint32_t new_dr7); =20 +#ifndef CONFIG_USER_ONLY +void cpu_x86_write_msr(CPUX86State *env, uint64_t val); +uint64_t cpu_x86_read_msr(CPUX86State *env); +#endif + /* hw/pc.c */ uint64_t cpu_get_tsc(CPUX86State *env); =20 diff --git a/target/i386/misc_helper.c b/target/i386/misc_helper.c index 6ae67cf885..1f9adb246d 100644 --- a/target/i386/misc_helper.c +++ b/target/i386/misc_helper.c @@ -228,15 +228,8 @@ void helper_rdmsr(CPUX86State *env) { } #else -void helper_wrmsr(CPUX86State *env) +void cpu_x86_write_msr(CPUX86State *env, uint64_t val) { - uint64_t val; - - cpu_svm_check_intercept_param(env, SVM_EXIT_MSR, 1, GETPC()); - - val =3D ((uint32_t)env->regs[R_EAX]) | - ((uint64_t)((uint32_t)env->regs[R_EDX]) << 32); - switch ((uint32_t)env->regs[R_ECX]) { case MSR_IA32_SYSENTER_CS: env->sysenter_cs =3D val & 0xffff; @@ -386,11 +379,9 @@ void helper_wrmsr(CPUX86State *env) /* XXX: exception? */ break; } - - windbg_try_load(); } =20 -void helper_rdmsr(CPUX86State *env) +uint64_t cpu_x86_read_msr(CPUX86State *env) { uint64_t val; =20 @@ -537,6 +528,32 @@ void helper_rdmsr(CPUX86State *env) val =3D 0; break; } + + return val; +} + +void helper_wrmsr(CPUX86State *env) +{ + uint64_t val; + + cpu_svm_check_intercept_param(env, SVM_EXIT_MSR, 1, GETPC()); + + val =3D ((uint32_t)env->regs[R_EAX]) | + ((uint64_t)((uint32_t)env->regs[R_EDX]) << 32); + + cpu_x86_write_msr(env, val); + + windbg_try_load(); +} + +void helper_rdmsr(CPUX86State *env) +{ + uint64_t val; + + cpu_svm_check_intercept_param(env, SVM_EXIT_MSR, 0, GETPC()); + + val =3D cpu_x86_read_msr(env); + env->regs[R_EAX] =3D (uint32_t)(val); env->regs[R_EDX] =3D (uint32_t)(val >> 32); } diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index a5be1bc158..071a5d7f77 100644 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -1083,6 +1083,36 @@ void kd_api_set_context_ex(CPUState *cs, PacketData = *pd) stl_p(&ctx->BytesCopied, len); } =20 +void kd_api_read_msr(CPUState *cs, PacketData *pd) +{ +#ifndef CONFIG_USER_ONLY + DBGKD_READ_WRITE_MSR *m64c =3D &pd->m64.u.ReadWriteMsr; + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + uint64_t val =3D cpu_x86_read_msr(env); + + stq_p(&val, val); + + m64c->DataValueLow =3D val; + m64c->DataValueHigh =3D val >> 32; + pd->m64.ReturnStatus =3D STATUS_SUCCESS; +#endif /* !CONFIG_USER_ONLY */ +} + +void kd_api_write_msr(CPUState *cs, PacketData *pd) +{ +#ifndef CONFIG_USER_ONLY + DBGKD_READ_WRITE_MSR *m64c =3D &pd->m64.u.ReadWriteMsr; + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + uint64_t val =3D m64c->DataValueLow | ((uint64_t) m64c->DataValueHigh)= << 32; + + cpu_x86_write_msr(env, ldq_p(&val)); + + pd->m64.ReturnStatus =3D STATUS_SUCCESS; +#endif /* !CONFIG_USER_ONLY */ +} + void kd_api_get_version(CPUState *cs, PacketData *pd) { DBGKD_GET_VERSION64 *kdver =3D (DBGKD_GET_VERSION64 *) (PTR(pd->m64) += 0x10); diff --git a/windbgstub.c b/windbgstub.c index 366856bc81..109a52b663 100644 --- a/windbgstub.c +++ b/windbgstub.c @@ -216,6 +216,14 @@ static void windbg_process_manipulate_packet(WindbgSta= te *state) kd_api_get_version(cs, data); break; =20 + case DbgKdReadMachineSpecificRegister: + kd_api_read_msr(cs, data); + break; + + case DbgKdWriteMachineSpecificRegister: + kd_api_write_msr(cs, data); + break; + case DbgKdClearAllInternalBreakpointsApi: kd_api_clear_all_internal_breakpoints(cs, data); return;