1. 26 Sep, 2022 19 commits
  2. 30 Aug, 2022 2 commits
  3. 24 Aug, 2022 4 commits
  4. 19 Aug, 2022 15 commits
    • David Matlack's avatar
      KVM: selftests: Fix ambiguous mov in KVM_ASM_SAFE() · 372d0708
      David Matlack authored
      Change the mov in KVM_ASM_SAFE() that zeroes @vector to a movb to
      make it unambiguous.
      
      This fixes a build failure with Clang since, unlike the GNU assembler,
      the LLVM integrated assembler rejects ambiguous X86 instructions that
      don't have suffixes:
      
        In file included from x86_64/hyperv_features.c:13:
        include/x86_64/processor.h:825:9: error: ambiguous instructions require an explicit suffix (could be 'movb', 'movw', 'movl', or 'movq')
                return kvm_asm_safe("wrmsr", "a"(val & -1u), "d"(val >> 32), "c"(msr));
                       ^
        include/x86_64/processor.h:802:15: note: expanded from macro 'kvm_asm_safe'
                asm volatile(KVM_ASM_SAFE(insn)                 \
                             ^
        include/x86_64/processor.h:788:16: note: expanded from macro 'KVM_ASM_SAFE'
                "1: " insn "\n\t"                                       \
                              ^
        <inline asm>:5:2: note: instantiated into assembly here
                mov $0, 15(%rsp)
                ^
      
      It seems like this change could introduce undesirable behavior in the
      future, e.g. if someone used a type larger than a u8 for @vector, since
      KVM_ASM_SAFE() will only zero the bottom byte. I tried changing the type
      of @vector to an int to see what would happen. GCC failed to compile due
      to a size mismatch between `movb` and `%eax`. Clang succeeded in
      compiling, but the generated code looked correct, so perhaps it will not
      be an issue. That being said it seems like there could be a better
      solution to this issue that does not assume @vector is a u8.
      
      Fixes: 3b23054c ("KVM: selftests: Add x86-64 support for exception fixup")
      Signed-off-by: default avatarDavid Matlack <dmatlack@google.com>
      Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
      Message-Id: <20220722234838.2160385-3-dmatlack@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      372d0708
    • David Matlack's avatar
      KVM: selftests: Fix KVM_EXCEPTION_MAGIC build with Clang · 67ef8664
      David Matlack authored
      Change KVM_EXCEPTION_MAGIC to use the all-caps "ULL", rather than lower
      case. This fixes a build failure with Clang:
      
        In file included from x86_64/hyperv_features.c:13:
        include/x86_64/processor.h:825:9: error: unexpected token in argument list
                return kvm_asm_safe("wrmsr", "a"(val & -1u), "d"(val >> 32), "c"(msr));
                       ^
        include/x86_64/processor.h:802:15: note: expanded from macro 'kvm_asm_safe'
                asm volatile(KVM_ASM_SAFE(insn)                 \
                             ^
        include/x86_64/processor.h:785:2: note: expanded from macro 'KVM_ASM_SAFE'
                "mov $" __stringify(KVM_EXCEPTION_MAGIC) ", %%r9\n\t"   \
                ^
        <inline asm>:1:18: note: instantiated into assembly here
                mov $0xabacadabaull, %r9
                                ^
      
      Fixes: 3b23054c ("KVM: selftests: Add x86-64 support for exception fixup")
      Signed-off-by: default avatarDavid Matlack <dmatlack@google.com>
      Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
      Message-Id: <20220722234838.2160385-2-dmatlack@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      67ef8664
    • Jim Mattson's avatar
      KVM: VMX: Heed the 'msr' argument in msr_write_intercepted() · 020dac41
      Jim Mattson authored
      Regardless of the 'msr' argument passed to the VMX version of
      msr_write_intercepted(), the function always checks to see if a
      specific MSR (IA32_SPEC_CTRL) is intercepted for write.  This behavior
      seems unintentional and unexpected.
      
      Modify the function so that it checks to see if the provided 'msr'
      index is intercepted for write.
      
      Fixes: 67f4b996 ("KVM: nVMX: Handle dynamic MSR intercept toggling")
      Cc: Sean Christopherson <seanjc@google.com>
      Signed-off-by: default avatarJim Mattson <jmattson@google.com>
      Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
      Message-Id: <20220810213050.2655000-1-jmattson@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      020dac41
    • Junaid Shahid's avatar
      kvm: x86: mmu: Always flush TLBs when enabling dirty logging · b64d740e
      Junaid Shahid authored
      When A/D bits are not available, KVM uses a software access tracking
      mechanism, which involves making the SPTEs inaccessible. However,
      the clear_young() MMU notifier does not flush TLBs. So it is possible
      that there may still be stale, potentially writable, TLB entries.
      This is usually fine, but can be problematic when enabling dirty
      logging, because it currently only does a TLB flush if any SPTEs were
      modified. But if all SPTEs are in access-tracked state, then there
      won't be a TLB flush, which means that the guest could still possibly
      write to memory and not have it reflected in the dirty bitmap.
      
      So just unconditionally flush the TLBs when enabling dirty logging.
      As an alternative, KVM could explicitly check the MMU-Writable bit when
      write-protecting SPTEs to decide if a flush is needed (instead of
      checking the Writable bit), but given that a flush almost always happens
      anyway, so just making it unconditional seems simpler.
      Signed-off-by: default avatarJunaid Shahid <junaids@google.com>
      Message-Id: <20220810224939.2611160-1-junaids@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      b64d740e
    • Junaid Shahid's avatar
      kvm: x86: mmu: Drop the need_remote_flush() function · 1441ca14
      Junaid Shahid authored
      This is only used by kvm_mmu_pte_write(), which no longer actually
      creates the new SPTE and instead just clears the old SPTE. So we
      just need to check if the old SPTE was shadow-present instead of
      calling need_remote_flush(). Hence we can drop this function. It was
      incomplete anyway as it didn't take access-tracking into account.
      
      This patch should not result in any functional change.
      Signed-off-by: default avatarJunaid Shahid <junaids@google.com>
      Reviewed-by: default avatarDavid Matlack <dmatlack@google.com>
      Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
      Message-Id: <20220723024316.2725328-1-junaids@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      1441ca14
    • Paolo Bonzini's avatar
      Merge tag 'kvmarm-fixes-6.0-1' of... · 959d6c4a
      Paolo Bonzini authored
      Merge tag 'kvmarm-fixes-6.0-1' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD
      
      KVM/arm64 fixes for 6.0, take #1
      
      - Fix unexpected sign extension of KVM_ARM_DEVICE_ID_MASK
      
      - Tidy-up handling of AArch32 on asymmetric systems
      959d6c4a
    • Li kunyu's avatar
      KVM: Drop unnecessary initialization of "ops" in kvm_ioctl_create_device() · eceb6e1d
      Li kunyu authored
      The variable is initialized but it is only used after its assignment.
      Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
      Signed-off-by: default avatarLi kunyu <kunyu@nfschina.com>
      Message-Id: <20220819021535.483702-1-kunyu@nfschina.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      eceb6e1d
    • Li kunyu's avatar
      KVM: Drop unnecessary initialization of "npages" in hva_to_pfn_slow() · 28249139
      Li kunyu authored
      The variable is initialized but it is only used after its assignment.
      Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
      Signed-off-by: default avatarLi kunyu <kunyu@nfschina.com>
      Message-Id: <20220819022804.483914-1-kunyu@nfschina.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      28249139
    • Josh Poimboeuf's avatar
      x86/kvm: Fix "missing ENDBR" BUG for fastop functions · 3d9606b0
      Josh Poimboeuf authored
      The following BUG was reported:
      
        traps: Missing ENDBR: andw_ax_dx+0x0/0x10 [kvm]
        ------------[ cut here ]------------
        kernel BUG at arch/x86/kernel/traps.c:253!
        invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
         <TASK>
         asm_exc_control_protection+0x2b/0x30
        RIP: 0010:andw_ax_dx+0x0/0x10 [kvm]
        Code: c3 cc cc cc cc 0f 1f 44 00 00 66 0f 1f 00 48 19 d0 c3 cc cc cc
              cc 0f 1f 40 00 f3 0f 1e fa 20 d0 c3 cc cc cc cc 0f 1f 44 00 00
              <66> 0f 1f 00 66 21 d0 c3 cc cc cc cc 0f 1f 40 00 66 0f 1f 00 21
              d0
      
         ? andb_al_dl+0x10/0x10 [kvm]
         ? fastop+0x5d/0xa0 [kvm]
         x86_emulate_insn+0x822/0x1060 [kvm]
         x86_emulate_instruction+0x46f/0x750 [kvm]
         complete_emulated_mmio+0x216/0x2c0 [kvm]
         kvm_arch_vcpu_ioctl_run+0x604/0x650 [kvm]
         kvm_vcpu_ioctl+0x2f4/0x6b0 [kvm]
         ? wake_up_q+0xa0/0xa0
      
      The BUG occurred because the ENDBR in the andw_ax_dx() fastop function
      had been incorrectly "sealed" (converted to a NOP) by apply_ibt_endbr().
      
      Objtool marked it to be sealed because KVM has no compile-time
      references to the function.  Instead KVM calculates its address at
      runtime.
      
      Prevent objtool from annotating fastop functions as sealable by creating
      throwaway dummy compile-time references to the functions.
      
      Fixes: 6649fa87 ("x86/ibt,kvm: Add ENDBR to fastops")
      Reported-by: default avatarPengfei Xu <pengfei.xu@intel.com>
      Debugged-by: default avatarPeter Zijlstra <peterz@infradead.org>
      Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
      Message-Id: <0d4116f90e9d0c1b754bb90c585e6f0415a1c508.1660837839.git.jpoimboe@kernel.org>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      3d9606b0
    • Josh Poimboeuf's avatar
      x86/kvm: Simplify FOP_SETCC() · 22472d12
      Josh Poimboeuf authored
      SETCC_ALIGN and FOP_ALIGN are both 16.  Remove the special casing for
      FOP_SETCC() and just make it a normal fastop.
      Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
      Message-Id: <7c13d94d1a775156f7e36eed30509b274a229140.1660837839.git.jpoimboe@kernel.org>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      22472d12
    • Josh Poimboeuf's avatar
      x86/ibt, objtool: Add IBT_NOSEAL() · e27e5bea
      Josh Poimboeuf authored
      Add a macro which prevents a function from getting sealed if there are
      no compile-time references to it.
      Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
      Message-Id: <20220818213927.e44fmxkoq4yj6ybn@treble>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      e27e5bea
    • Chao Peng's avatar
      KVM: Rename mmu_notifier_* to mmu_invalidate_* · 20ec3ebd
      Chao Peng authored
      The motivation of this renaming is to make these variables and related
      helper functions less mmu_notifier bound and can also be used for non
      mmu_notifier based page invalidation. mmu_invalidate_* was chosen to
      better describe the purpose of 'invalidating' a page that those
      variables are used for.
      
        - mmu_notifier_seq/range_start/range_end are renamed to
          mmu_invalidate_seq/range_start/range_end.
      
        - mmu_notifier_retry{_hva} helper functions are renamed to
          mmu_invalidate_retry{_hva}.
      
        - mmu_notifier_count is renamed to mmu_invalidate_in_progress to
          avoid confusion with mn_active_invalidate_count.
      
        - While here, also update kvm_inc/dec_notifier_count() to
          kvm_mmu_invalidate_begin/end() to match the change for
          mmu_notifier_count.
      
      No functional change intended.
      Signed-off-by: default avatarChao Peng <chao.p.peng@linux.intel.com>
      Message-Id: <20220816125322.1110439-3-chao.p.peng@linux.intel.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      20ec3ebd
    • Chao Peng's avatar
      KVM: Rename KVM_PRIVATE_MEM_SLOTS to KVM_INTERNAL_MEM_SLOTS · bdd1c37a
      Chao Peng authored
      KVM_INTERNAL_MEM_SLOTS better reflects the fact those slots are KVM
      internally used (invisible to userspace) and avoids confusion to future
      private slots that can have different meaning.
      Signed-off-by: default avatarChao Peng <chao.p.peng@linux.intel.com>
      Message-Id: <20220816125322.1110439-2-chao.p.peng@linux.intel.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      bdd1c37a
    • Paolo Bonzini's avatar
      KVM: MIPS: remove unnecessary definition of KVM_PRIVATE_MEM_SLOTS · b0754508
      Paolo Bonzini authored
      KVM_PRIVATE_MEM_SLOTS defaults to zero, so it is not necessary to
      define it in MIPS's asm/kvm_host.h.
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      b0754508
    • Sean Christopherson's avatar
      KVM: Move coalesced MMIO initialization (back) into kvm_create_vm() · c2b82397
      Sean Christopherson authored
      Invoke kvm_coalesced_mmio_init() from kvm_create_vm() now that allocating
      and initializing coalesced MMIO objects is separate from registering any
      associated devices.  Moving coalesced MMIO cleans up the last oddity
      where KVM does VM creation/initialization after kvm_create_vm(), and more
      importantly after kvm_arch_post_init_vm() is called and the VM is added
      to the global vm_list, i.e. after the VM is fully created as far as KVM
      is concerned.
      
      Originally, kvm_coalesced_mmio_init() was called by kvm_create_vm(), but
      the original implementation was completely devoid of error handling.
      Commit 6ce5a090 ("KVM: coalesced_mmio: fix kvm_coalesced_mmio_init()'s
      error handling" fixed the various bugs, and in doing so rightly moved the
      call to after kvm_create_vm() because kvm_coalesced_mmio_init() also
      registered the coalesced MMIO device.  Commit 2b3c246a ("KVM: Make
      coalesced mmio use a device per zone") cleaned up that mess by having
      each zone register a separate device, i.e. moved device registration to
      its logical home in kvm_vm_ioctl_register_coalesced_mmio().  As a result,
      kvm_coalesced_mmio_init() is now a "pure" initialization helper and can
      be safely called from kvm_create_vm().
      
      Opportunstically drop the #ifdef, KVM provides stubs for
      kvm_coalesced_mmio_{init,free}() when CONFIG_KVM_MMIO=n (s390).
      Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
      Message-Id: <20220816053937.2477106-4-seanjc@google.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      c2b82397