| From stefan.bader@canonical.com Wed Apr 7 14:44:45 2010 |
| From: Jan Kiszka <jan.kiszka@siemens.com> |
| Date: Fri, 19 Mar 2010 15:47:35 +0100 |
| Subject: KVM: VMX: Update instruction length on intercepted BP |
| To: stable@kernel.org |
| Cc: Marcelo Tosatti <mtosatti@redhat.com>, Avi Kivity <avi@redhat.com>, Gleb Natapov <gleb@redhat.com> |
| Message-ID: <1269010059-25309-8-git-send-email-stefan.bader@canonical.com> |
| |
| |
| From: Jan Kiszka <jan.kiszka@siemens.com> |
| |
| commit c573cd22939e54fc1b8e672054a505048987a7cb upstream |
| |
| We intercept #BP while in guest debugging mode. As VM exits due to |
| intercepted exceptions do not necessarily come with valid |
| idt_vectoring, we have to update event_exit_inst_len explicitly in such |
| cases. At least in the absence of migration, this ensures that |
| re-injections of #BP will find and use the correct instruction length. |
| |
| Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> |
| Signed-off-by: Avi Kivity <avi@redhat.com> |
| Signed-off-by: Stefan Bader <stefan.bader@canonical.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| arch/x86/kvm/vmx.c | 13 +++++++++++++ |
| 1 file changed, 13 insertions(+) |
| |
| --- a/arch/x86/kvm/vmx.c |
| +++ b/arch/x86/kvm/vmx.c |
| @@ -2674,6 +2674,12 @@ static int handle_rmode_exception(struct |
| kvm_queue_exception(vcpu, vec); |
| return 1; |
| case BP_VECTOR: |
| + /* |
| + * Update instruction length as we may reinject the exception |
| + * from user space while in guest debugging mode. |
| + */ |
| + to_vmx(vcpu)->vcpu.arch.event_exit_inst_len = |
| + vmcs_read32(VM_EXIT_INSTRUCTION_LEN); |
| if (vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) |
| return 0; |
| /* fall through */ |
| @@ -2790,6 +2796,13 @@ static int handle_exception(struct kvm_v |
| kvm_run->debug.arch.dr7 = vmcs_readl(GUEST_DR7); |
| /* fall through */ |
| case BP_VECTOR: |
| + /* |
| + * Update instruction length as we may reinject #BP from |
| + * user space while in guest debugging mode. Reading it for |
| + * #DB as well causes no harm, it is not used in that case. |
| + */ |
| + vmx->vcpu.arch.event_exit_inst_len = |
| + vmcs_read32(VM_EXIT_INSTRUCTION_LEN); |
| kvm_run->exit_reason = KVM_EXIT_DEBUG; |
| kvm_run->debug.arch.pc = vmcs_readl(GUEST_CS_BASE) + rip; |
| kvm_run->debug.arch.exception = ex_no; |