qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] target/i386: do not set unsupported VMX secondary execution


From: Dr. David Alan Gilbert
Subject: Re: [PATCH] target/i386: do not set unsupported VMX secondary execution controls
Date: Tue, 31 Mar 2020 18:26:40 +0100
User-agent: Mutt/1.13.3 (2020-01-12)

* Montes, Julio (address@hidden) wrote:
> Sorry for my last email, it was incomplete
> 
> Hi Vitaly
> 
> thanks for raising this, unfortunately this patch didn't work for me, I still 
> get the same error:

Are you trying that on top of 5.0 or ontop of the older 4.2 world?

> qemu-system-x86_64: error: failed to set MSR 0x48b to 0x1582e00000000
> qemu-system-x86_64: 
> /home/testpmem/go/src/github.com/kata-containers/qemu/target/i386/kvm.c:2695: 
> kvm_buf_set_msrs: Assertion `ret == cpu->kvm_msr_buf->nmsrs

If my reading of 0x1582e00000000 is correct then we have:
                                               0x1582e 00000000
VMX_SECONDARY_EXEC_RDSEED_EXITING           0x00010000  !
 
VMX_SECONDARY_EXEC_SHADOW_VMCS              0x00004000  !
VMX_SECONDARY_EXEC_ENABLE_INVPCID           0x00001000
 
VMX_SECONDARY_EXEC_RDRAND_EXITING           0x00000800
 
VMX_SECONDARY_EXEC_ENABLE_VPID              0x00000020
 
VMX_SECONDARY_EXEC_ENABLE_EPT               0x00000002
VMX_SECONDARY_EXEC_DESC                     0x00000004
VMX_SECONDARY_EXEC_RDTSCP                   0x00000008

> 
> my qemu command line:
> /usr/bin/qemu-system-x86_64 -name 
> sandbox-f218abcb05f6e05cc68768f74e9106303066f377a877c03ddc64e1e5e8685633 
> -uuid 8189ac12-5a5c-4989-bf82-c0218f8a3d33 -machine 
> pc,accel=kvm,kernel_irqchip,nvdimm -cpu host,pmu=off -qmp 
> unix:/run/vc/vm/f218abcb05f6e05cc68768f74e9106303066f377a877c03ddc64e1e5e8685633/qmp.sock,server,nowait
>  -m 2048M,slots=10,maxmem=17041M -device 
> pci-bridge,bus=pci.0,id=pci-bridge-0,chassis_nr=1,shpc=on,addr=2,romfile= 
> -device virtio-serial-pci,disable-modern=true,id=serial0,romfile= -device 
> virtconsole,chardev=charconsole0,id=console0 -chardev 
> socket,id=charconsole0,path=/run/vc/vm/f218abcb05f6e05cc68768f74e9106303066f377a877c03ddc64e1e5e8685633/console.sock,server,nowait
>  -device nvdimm,id=nv0,memdev=mem0 -object 
> memory-backend-file,id=mem0,mem-path=/usr/share/kata-containers/kata-containers-clearlinux-32700-osbuilder-891b61c-agent-73afd1a.img,size=134217728
>  -device virtio-scsi-pci,id=scsi0,disable-modern=true,romfile= -object 
> rng-random,id=rng0,filename=/dev/urandom -device 
> virtio-rng-pci,rng=rng0,romfile= -device 
> virtserialport,chardev=charch0,id=channel0,name=agent.channel.0 -chardev 
> socket,id=charch0,path=/run/vc/vm/f218abcb05f6e05cc68768f74e9106303066f377a877c03ddc64e1e5e8685633/kata.sock,server,nowait
>  -device 
> virtio-9p-pci,disable-modern=true,fsdev=extra-9p-kataShared,mount_tag=kataShared,romfile=
>  -fsdev 
> local,id=extra-9p-kataShared,path=/run/kata-containers/shared/sandboxes/f218abcb05f6e05cc68768f74e9106303066f377a877c03ddc64e1e5e8685633,security_model=none
>  -netdev tap,id=network-0,vhost=on,vhostfds=3,fds=4 -device 
> driver=virtio-net-pci,netdev=network-0,mac=02:42:ac:11:00:02,disable-modern=true,mq=on,vectors=4,romfile=
>  -global kvm-pit.lost_tick_policy=discard -vga none -no-user-config 
> -nodefaults -nographic -daemonize -object 
> memory-backend-ram,id=dimm1,size=2048M -numa node,memdev=dimm1 -kernel 
> /usr/share/kata-containers/vmlinuz-5.4.15-71 -append tsc=reliable 
> no_timer_check rcupdate.rcu_expedited=1 i8042.direct=1 i8042.dumbkbd=1 
> i8042.nopnp=1 i8042.noaux=1 noreplace-smp reboot=k console=hvc0 console=hvc1 
> iommu=off cryptomgr.notests net.ifnames=0 pci=lastbus=0 root=/dev/pmem0p1 
> rootflags=dax,data=ordered,errors=remount-ro ro rootfstype=ext4 debug 
> systemd.show_status=true systemd.log_level=debug panic=1 nr_cpus=4 
> agent.use_vsock=false systemd.unit=kata-containers.target 
> systemd.mask=systemd-networkd.service systemd.mask=systemd-networkd.socket 
> agent.log=debug agent.log=debug -pidfile 
> /run/vc/vm/f218abcb05f6e05cc68768f74e9106303066f37
> 7a877c03ddc64e1e5e8685633/pid -D 
> /run/vc/vm/f218abcb05f6e05cc68768f74e9106303066f377a877c03ddc64e1e5e8685633/qemu.log
>  -smp 1,cores=1,threads=1,sockets=4,maxcpus=4
> 
> 
> 
> ./vmxcap output:
> 
> secondary processor-based controls
>   Virtualize APIC accesses                 no
>   Enable EPT                               yes
>   Descriptor-table exiting                 yes
>   Enable RDTSCP                            yes
>   Virtualize x2APIC mode                   no
>   Enable VPID                              yes
>   WBINVD exiting                           no
>   Unrestricted guest                       no
>   APIC register emulation                  no
>   Virtual interrupt delivery               no
>   PAUSE-loop exiting                       no
>   RDRAND exiting                           yes
>   Enable INVPCID                           yes
>   Enable VM functions                      no
>   VMCS shadowing                           no   <<<<<
>   Enable ENCLS exiting                     no
>   RDSEED exiting                           no   <<<<<
>   Enable PML                               no
>   EPT-violation #VE                        no
>   Conceal non-root operation from PT       no
>   Enable XSAVES/XRSTORS                    no
>   Mode-based execute control (XS/XU)       no
>   Sub-page write permissions               no
>   GPA translation for PT                   no
>   TSC scaling                              no
>   User wait and pause                      no
>   ENCLV exiting                            no


So we're apparently trying to enable both RDSEED_EXITING and SHADOW_VMCS
which are missing.


> On 31/03/20 18:27, Vitaly Kuznetsov wrote:

> >      case MSR_IA32_VMX_PROCBASED_CTLS2:
> > -        /* KVM forgot to add these bits for some time, do this ourselves.  
> > */
> > -        if (kvm_arch_get_supported_cpuid(s, 0xD, 1, R_ECX) & 
> > CPUID_XSAVE_XSAVES) {
> > -            value |= (uint64_t)VMX_SECONDARY_EXEC_XSAVES << 32;
> > -        }
> > -        if (kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX) & 
> > CPUID_EXT_RDRAND) {
> > -            value |= (uint64_t)VMX_SECONDARY_EXEC_RDRAND_EXITING << 32;
> > -        }
> > -        if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & 
> > CPUID_7_0_EBX_INVPCID) {
> > -            value |= (uint64_t)VMX_SECONDARY_EXEC_ENABLE_INVPCID << 32;
> > -        }
> > -        if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) & 
> > CPUID_7_0_EBX_RDSEED) {
> > -            value |= (uint64_t)VMX_SECONDARY_EXEC_RDSEED_EXITING << 32;
> > -        }
> > -        if (kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_EDX) & 
> > CPUID_EXT2_RDTSCP) {
> > -            value |= (uint64_t)VMX_SECONDARY_EXEC_RDTSCP << 32;
> > +        if (!has_msr_vmx_procbased_ctls2) {
> > +            /* KVM forgot to add these bits for some time, do this 
> > ourselves. */
> > +            if (kvm_arch_get_supported_cpuid(s, 0xD, 1, R_ECX) &
> > +                CPUID_XSAVE_XSAVES) {
> > +                value |= (uint64_t)VMX_SECONDARY_EXEC_XSAVES << 32;
> > +            }
> > +            if (kvm_arch_get_supported_cpuid(s, 1, 0, R_ECX) &
> > +                CPUID_EXT_RDRAND) {
> > +                value |= (uint64_t)VMX_SECONDARY_EXEC_RDRAND_EXITING << 32;
> > +            }
> > +            if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) &
> > +                CPUID_7_0_EBX_INVPCID) {
> > +                value |= (uint64_t)VMX_SECONDARY_EXEC_ENABLE_INVPCID << 32;
> > +            }
> > +            if (kvm_arch_get_supported_cpuid(s, 7, 0, R_EBX) &
> > +                CPUID_7_0_EBX_RDSEED) {
> > +                value |= (uint64_t)VMX_SECONDARY_EXEC_RDSEED_EXITING << 32;
> > +            }
> > +            if (kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_EDX) &
> > +                CPUID_EXT2_RDTSCP) {
> > +                value |= (uint64_t)VMX_SECONDARY_EXEC_RDTSCP << 32;
> > +            }

So you would think that would tkae care of RDSEED exiting - but what
about VMCS shadowing?

Dave

> >          }
> >          /* fall through */
> >      case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
> > @@ -2060,6 +2068,9 @@ static int kvm_get_supported_msrs(KVMState *s)
> >              case MSR_IA32_UCODE_REV:
> >                  has_msr_ucode_rev = true;
> >                  break;
> > +            case MSR_IA32_VMX_PROCBASED_CTLS2:
> > +                has_msr_vmx_procbased_ctls2 = true;
> > +                break;
> >              }
> >          }
> >      }
> >
> 
> 
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK




reply via email to

[Prev in Thread] Current Thread [Next in Thread]