On Mon, Aug 13, 2018 at 09:31:42AM -0700, Drew Schmitt wrote: > On Mon, Aug 13, 2018 at 6:50 AM Konrad Rzeszutek Wilk > <konrad.wilk@xxxxxxxxxx> wrote: > > > > On Fri, Aug 10, 2018 at 02:26:03PM -0700, Drew Schmitt wrote: > > > Add KVM_CAP_MSR_PLATFORM_INFO so that userspace can disable guest access > > > to reads of MSR_PLATFORM_INFO. > > > > Or enable it - by default it is enabled. Perhaps by default it should > > be disabled? > > We wanted to make this an opt-out functionality in order to not change > the current default behavior (which today is a guest *can* read this > MSR). <nods> What is the danger of disabling access to this in the first place? Or providing by default some cooked up value ? Does it break Windows? Linux guests? > > > > > > > Also shouldn't there be an update to the API docs? > > Yes, added in v2. > > > > > > > > > Signed-off-by: Drew Schmitt <dasch@xxxxxxxxxx> > > > --- > > > arch/x86/include/asm/kvm_host.h | 2 ++ > > > arch/x86/kvm/x86.c | 10 ++++++++++ > > > include/uapi/linux/kvm.h | 1 + > > > 3 files changed, 13 insertions(+) > > > > > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > > > index c13cd28d9d1be..c0497c7a4869f 100644 > > > --- a/arch/x86/include/asm/kvm_host.h > > > +++ b/arch/x86/include/asm/kvm_host.h > > > @@ -853,6 +853,8 @@ struct kvm_arch { > > > > > > bool x2apic_format; > > > bool x2apic_broadcast_quirk_disabled; > > > + > > > + bool guest_can_read_msr_platform_info; > > > }; > > > > > > struct kvm_vm_stat { > > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > > > index 0278cde1893ca..b27d88fc6eb8f 100644 > > > --- a/arch/x86/kvm/x86.c > > > +++ b/arch/x86/kvm/x86.c > > > @@ -2743,6 +2743,9 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > > > msr_info->data = vcpu->arch.osvw.status; > > > break; > > > case MSR_PLATFORM_INFO: > > > + if (!msr_info->host_initiated && > > > + !vcpu->kvm->arch.guest_can_read_msr_platform_info) > > > + return 1; > > > msr_info->data = vcpu->arch.msr_platform_info; > > > break; > > > case MSR_MISC_FEATURES_ENABLES: > > > @@ -2890,6 +2893,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) > > > case KVM_CAP_SPLIT_IRQCHIP: > > > case KVM_CAP_IMMEDIATE_EXIT: > > > case KVM_CAP_GET_MSR_FEATURES: > > > + case KVM_CAP_MSR_PLATFORM_INFO: > > > r = 1; > > > break; > > > case KVM_CAP_SYNC_REGS: > > > @@ -4259,6 +4263,10 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, > > > kvm->arch.pause_in_guest = true; > > > r = 0; > > > break; > > > + case KVM_CAP_MSR_PLATFORM_INFO: > > > + kvm->arch.guest_can_read_msr_platform_info = cap->args[0]; > > > + r = 0; > > > + break; > > > default: > > > r = -EINVAL; > > > break; > > > @@ -8724,6 +8732,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) > > > kvm->arch.kvmclock_offset = -ktime_get_boot_ns(); > > > pvclock_update_vm_gtod_copy(kvm); > > > > > > + kvm->arch.guest_can_read_msr_platform_info = true; > > > + > > > INIT_DELAYED_WORK(&kvm->arch.kvmclock_update_work, kvmclock_update_fn); > > > INIT_DELAYED_WORK(&kvm->arch.kvmclock_sync_work, kvmclock_sync_fn); > > > > > > diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h > > > index b6270a3b38e9f..f3367041b609b 100644 > > > --- a/include/uapi/linux/kvm.h > > > +++ b/include/uapi/linux/kvm.h > > > @@ -949,6 +949,7 @@ struct kvm_ppc_resize_hpt { > > > #define KVM_CAP_GET_MSR_FEATURES 153 > > > #define KVM_CAP_HYPERV_EVENTFD 154 > > > #define KVM_CAP_HYPERV_TLBFLUSH 155 > > > +#define KVM_CAP_MSR_PLATFORM_INFO 156 > > > > > > #ifdef KVM_CAP_IRQ_ROUTING > > > > > > -- > > > 2.18.0.597.ga71716f1ad-goog > > >