On Tue, Oct 15, 2019 at 12:51:48PM +0000, Kang, Luwei wrote: > qemu> > diff --git a/target/i386/kvm.c b/target/i386/kvm.c index > > > f9f4cd1..097c953 100644 > > > --- a/target/i386/kvm.c > > > +++ b/target/i386/kvm.c > > > @@ -1811,6 +1811,25 @@ static int kvm_put_msrs(X86CPU *cpu, int level) > > > kvm_msr_entry_add(cpu, MSR_MTRRphysMask(i), mask); > > > } > > > } > > > + if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) { > > > + int addr_num = kvm_arch_get_supported_cpuid(kvm_state, > > > + 0x14, 1, R_EAX) & > > > + 0x7; > > > + > > > + kvm_msr_entry_add(cpu, MSR_IA32_RTIT_CTL, > > > + env->msr_rtit_ctrl); > > > + kvm_msr_entry_add(cpu, MSR_IA32_RTIT_STATUS, > > > + env->msr_rtit_status); > > > + kvm_msr_entry_add(cpu, MSR_IA32_RTIT_OUTPUT_BASE, > > > + env->msr_rtit_output_base); > > > > This causes the following crash on some hosts: > > > > qemu-system-x86_64: error: failed to set MSR 0x560 to 0x0 > > qemu-system-x86_64: target/i386/kvm.c:2673: kvm_put_msrs: Assertion `ret > > == cpu->kvm_msr_buf->nmsrs' failed. > > > > Checking for CPUID_7_0_EBX_INTEL_PT is not enough: KVM has additional > > conditions that might prevent writing to this MSR > > (PT_CAP_topa_output && PT_CAP_single_range_output). This causes QEMU to > > crash if some of the conditions aren't met. > > > > Writing and reading this MSR (and the ones below) need to be conditional on > > KVM_GET_MSR_INDEX_LIST. > > > > Hi Eduardo, > I found this issue can't be reproduced in upstream source code but can be > reproduced on RHEL8.1. I haven't got the qemu source code of RHEL8.1. But > after adding some trace in KVM, I found the KVM has reported the complete > Intel PT CPUID information to qemu but the Intel PT CPUID (0x14) is lost when > qemu setting the CPUID to KVM (cpuid level is 0xd). It looks like lost the > below patch. > > commit f24c3a79a415042f6dc195f029a2ba7247d14cac > Author: Luwei Kang <luwei.k...@intel.com> > Date: Tue Jan 29 18:52:59 2019 -0500 > i386: extended the cpuid_level when Intel PT is enabled > > Intel Processor Trace required CPUID[0x14] but the cpuid_level > have no change when create a kvm guest with > e.g. "-cpu qemu64,+intel-pt".
Thanks for the pointer. This may avoid triggering the bug in the default configuration, but we still need to make the MSR writing conditional on KVM_GET_MSR_INDEX_LIST. Older machine-types have x-intel-pt-auto-level=off, and the user may set `level` manually. -- Eduardo