--- svm.c.orig 2008-01-23 10:04:14.000000000 +0100 +++ svm.c 2008-01-25 12:52:11.000000000 +0100 @@ -1099,6 +1100,21 @@ case MSR_IA32_SYSENTER_ESP: *data = svm->vmcb->save.sysenter_esp; break; + case MSR_IA32_DEBUGCTLMSR: + *data = svm->vmcb->save.dbgctl; + break; + case MSR_IA32_LASTBRANCHFROMIP: + *data = svm->vmcb->save.br_from; + break; + case MSR_IA32_LASTBRANCHTOIP: + *data = svm->vmcb->save.br_to; + break; + case MSR_IA32_LASTINTFROMIP: + *data = svm->vmcb->save.last_excp_from; + break; + case MSR_IA32_LASTINTTOIP: + *data = svm->vmcb->save.last_excp_to; + break; default: return kvm_get_msr_common(vcpu, ecx, data); } @@ -1171,6 +1187,19 @@ if (data != 0) goto unhandled; break; + case MSR_IA32_DEBUGCTLMSR: + svm->vmcb->save.dbgctl = data; + if (svm->vmcb->save.dbgctl && svm_has(SVM_FEATURE_LBRV)) { + void *msrpm_va; + svm->vmcb->control.lbr_ctl = 1; + msrpm_va = page_address(pfn_to_page(msrpm_base >> PAGE_SHIFT)); + set_msr_interception(msrpm_va, MSR_IA32_DEBUGCTLMSR, 0, 0); + set_msr_interception(msrpm_va, MSR_IA32_LASTBRANCHFROMIP, 0, 0); + set_msr_interception(msrpm_va, MSR_IA32_LASTBRANCHTOIP, 0, 0); + set_msr_interception(msrpm_va, MSR_IA32_LASTINTFROMIP, 0, 0); + set_msr_interception(msrpm_va, MSR_IA32_LASTINTTOIP, 0, 0); + } + break; default: unhandled: return kvm_set_msr_common(vcpu, ecx, data);