From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933052AbcK1QNe (ORCPT ); Mon, 28 Nov 2016 11:13:34 -0500 Received: from mail-ua0-f196.google.com ([209.85.217.196]:34329 "EHLO mail-ua0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932468AbcK1QNX (ORCPT ); Mon, 28 Nov 2016 11:13:23 -0500 MIME-Version: 1.0 In-Reply-To: <9eff6257-0420-102d-539a-d3b8b57ba05b@redhat.com> References: <20161128041856.11420-1-khuey@kylehuey.com> <20161128041856.11420-6-khuey@kylehuey.com> <9eff6257-0420-102d-539a-d3b8b57ba05b@redhat.com> From: Kyle Huey Date: Mon, 28 Nov 2016 08:13:15 -0800 Message-ID: Subject: Re: [PATCH 5/5] KVM: VMX: Handle RFLAGS.TF in skip_emulated_instruction To: Paolo Bonzini Cc: =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , "maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)" , Joerg Roedel , kvm list , open list Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Nov 28, 2016 at 3:42 AM, Paolo Bonzini wrote: > > > On 28/11/2016 05:18, Kyle Huey wrote: >> + >> + if (unlikely(vmx_get_rflags(vcpu) & X86_EFLAGS_TF)) { >> + if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) { >> + vcpu->run->debug.arch.dr6 = DR6_BS | DR6_FIXED_1 | >> + DR6_RTM; >> + vcpu->run->debug.arch.pc = vcpu->arch.singlestep_rip; >> + vcpu->run->debug.arch.exception = DB_VECTOR; >> + vcpu->run->exit_reason = KVM_EXIT_DEBUG; >> + return 0; >> + } >> + >> + /* >> + * "Certain debug exceptions may clear bit 0-3. The >> + * remaining contents of the DR6 register are never >> + * cleared by the processor". >> + */ >> + vcpu->arch.dr6 &= ~15; >> + vcpu->arch.dr6 |= DR6_BS | DR6_RTM; >> + kvm_queue_exception(vcpu, DB_VECTOR); >> + } > > This code is pretty much the same as kvm_vcpu_check_singlestep. Let's > not duplicate the code and implement skip_emulated_instruction can be > implemented in x86.c, like > > unsigned long rflags = kvm_x86_ops->get_rflags(vcpu); > int r = EMULATE_DONE; > > /* This would be the no_trap variant */ > kvm_x86_ops->skip_emulated_instruction(vcpu); > kvm_vcpu_check_singlestep(vcpu, rflags, &r); > return r == EMULATE_DONE; > > (because x86.c/vmx.c/svm.c are separate modules, when moving the function > to x86.c you should rename it to kvm_skip_emulated_instruction). > > Paolo They're not exactly the same. For some reason I don't understand kvm_vcpu_check_singlestep clears the trap flag. Perhaps that is also a bug? - Kyle