Skip to content
  1. Oct 26, 2021
    • Chang S. Bae's avatar
      x86/fpu/amx: Enable the AMX feature in 64-bit mode · 2308ee57
      Chang S. Bae authored
      
      
      Add the AMX state components in XFEATURE_MASK_USER_SUPPORTED and the
      TILE_DATA component to the dynamic states and update the permission check
      table accordingly.
      
      This is only effective on 64 bit kernels as for 32bit kernels
      XFEATURE_MASK_TILE is defined as 0.
      
      TILE_DATA is caller-saved state and the only dynamic state. Add build time
      sanity check to ensure the assumption that every dynamic feature is caller-
      saved.
      
      Make AMX state depend on XFD as it is dynamic feature.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lore.kernel.org/r/20211021225527.10184-24-chang.seok.bae@intel.com
      2308ee57
    • Chang S. Bae's avatar
      x86/fpu: Add XFD handling for dynamic states · db3e7321
      Chang S. Bae authored
      
      
      To handle the dynamic sizing of buffers on first use the XFD MSR has to be
      armed. Store the delta between the maximum available and the default
      feature bits in init_fpstate where it can be retrieved for task creation.
      
      If the delta is non zero then dynamic features are enabled. This needs also
      to enable the static key which guards the XFD updates. This is delayed to
      an initcall because the FPU setup runs before jump labels are initialized.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lore.kernel.org/r/20211021225527.10184-23-chang.seok.bae@intel.com
      db3e7321
    • Chang S. Bae's avatar
      x86/fpu: Calculate the default sizes independently · 2ae996e0
      Chang S. Bae authored
      
      
      When dynamically enabled states are supported the maximum and default sizes
      for the kernel buffers and user space interfaces are not longer identical.
      
      Put the necessary calculations in place which only take the default enabled
      features into account.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lore.kernel.org/r/20211021225527.10184-22-chang.seok.bae@intel.com
      2ae996e0
    • Chang S. Bae's avatar
      x86/fpu/amx: Define AMX state components and have it used for boot-time checks · eec2113e
      Chang S. Bae authored
      
      
      The XSTATE initialization uses check_xstate_against_struct() to sanity
      check the size of XSTATE-enabled features. AMX is a XSAVE-enabled feature,
      and its size is not hard-coded but discoverable at run-time via CPUID.
      
      The AMX state is composed of state components 17 and 18, which are all user
      state components. The first component is the XTILECFG state of a 64-byte
      tile-related control register. The state component 18, called XTILEDATA,
      contains the actual tile data, and the state size varies on
      implementations. The architectural maximum, as defined in the CPUID(0x1d,
      1): EAX[15:0], is a byte less than 64KB. The first implementation supports
      8KB.
      
      Check the XTILEDATA state size dynamically. The feature introduces the new
      tile register, TMM. Define one register struct only and read the number of
      registers from CPUID. Cross-check the overall size with CPUID again.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lore.kernel.org/r/20211021225527.10184-21-chang.seok.bae@intel.com
      eec2113e
    • Chang S. Bae's avatar
      x86/fpu/xstate: Prepare XSAVE feature table for gaps in state component numbers · 70c3f167
      Chang S. Bae authored
      
      
      The kernel checks at boot time which features are available by walking a
      XSAVE feature table which contains the CPUID feature bit numbers which need
      to be checked whether a feature is available on a CPU or not. So far the
      feature numbers have been linear, but AMX will create a gap which the
      current code cannot handle.
      
      Make the table entries explicitly indexed and adjust the loop code
      accordingly to prepare for that.
      
      No functional change.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Reviewed-by: default avatarLen Brown <len.brown@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lore.kernel.org/r/20211021225527.10184-20-chang.seok.bae@intel.com
      70c3f167
    • Chang S. Bae's avatar
      x86/fpu/xstate: Add fpstate_realloc()/free() · 500afbf6
      Chang S. Bae authored
      
      
      The fpstate embedded in struct fpu is the default state for storing the FPU
      registers. It's sized so that the default supported features can be stored.
      For dynamically enabled features the register buffer is too small.
      
      The #NM handler detects first use of a feature which is disabled in the
      XFD MSR. After handling permission checks it recalculates the size for
      kernel space and user space state and invokes fpstate_realloc() which
      tries to reallocate fpstate and install it.
      
      Provide the allocator function which checks whether the current buffer size
      is sufficient and if not allocates one. If allocation is successful the new
      fpstate is initialized with the new features and sizes and the now enabled
      features is removed from the task's XFD mask.
      
      realloc_fpstate() uses vzalloc(). If use of this mechanism grows to
      re-allocate buffers larger than 64KB, a more sophisticated allocation
      scheme that includes purpose-built reclaim capability might be justified.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lore.kernel.org/r/20211021225527.10184-19-chang.seok.bae@intel.com
      500afbf6
    • Chang S. Bae's avatar
      x86/fpu/xstate: Add XFD #NM handler · 783e87b4
      Chang S. Bae authored
      
      
      If the XFD MSR has feature bits set then #NM will be raised when user space
      attempts to use an instruction related to one of these features.
      
      When the task has no permissions to use that feature, raise SIGILL, which
      is the same behavior as #UD.
      
      If the task has permissions, calculate the new buffer size for the extended
      feature set and allocate a larger fpstate. In the unlikely case that
      vzalloc() fails, SIGSEGV is raised.
      
      The allocation function will be added in the next step. Provide a stub
      which fails for now.
      
        [ tglx: Updated serialization ]
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lore.kernel.org/r/20211021225527.10184-18-chang.seok.bae@intel.com
      783e87b4
    • Chang S. Bae's avatar
      x86/fpu: Update XFD state where required · 67236547
      Chang S. Bae authored
      
      
      The IA32_XFD_MSR allows to arm #NM traps for XSTATE components which are
      enabled in XCR0. The register has to be restored before the tasks XSTATE is
      restored. The life time rules are the same as for FPU state.
      
      XFD is updated on return to userspace only when the FPU state of the task
      is not up to date in the registers. It's updated before the XRSTORS so
      that eventually enabled dynamic features are restored as well and not
      brought into init state.
      
      Also in signal handling for restoring FPU state from user space the
      correctness of the XFD state has to be ensured.
      
      Add it to CPU initialization and resume as well.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lore.kernel.org/r/20211021225527.10184-17-chang.seok.bae@intel.com
      67236547
    • Thomas Gleixner's avatar
      x86/fpu: Add sanity checks for XFD · 5529acf4
      Thomas Gleixner authored
      
      
      Add debug functionality to ensure that the XFD MSR is up to date for XSAVE*
      and XRSTOR* operations.
      
       [ tglx: Improve comment. ]
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-16-chang.seok.bae@intel.com
      5529acf4
    • Chang S. Bae's avatar
      x86/fpu: Add XFD state to fpstate · 8bf26758
      Chang S. Bae authored
      
      
      Add storage for XFD register state to struct fpstate. This will be used to
      store the XFD MSR state. This will be used for switching the XFD MSR when
      FPU content is restored.
      
      Add a per-CPU variable to cache the current MSR value so the MSR has only
      to be written when the values are different.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-15-chang.seok.bae@intel.com
      8bf26758
    • Chang S. Bae's avatar
      x86/msr-index: Add MSRs for XFD · dae1bd58
      Chang S. Bae authored
      
      
      XFD introduces two MSRs:
      
          - IA32_XFD to enable/disable a feature controlled by XFD
      
          - IA32_XFD_ERR to expose to the #NM trap handler which feature
            was tried to be used for the first time.
      
      Both use the same xstate-component bitmap format, used by XCR0.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-14-chang.seok.bae@intel.com
      dae1bd58
    • Chang S. Bae's avatar
      x86/cpufeatures: Add eXtended Feature Disabling (XFD) feature bit · c3511016
      Chang S. Bae authored
      
      
      Intel's eXtended Feature Disable (XFD) feature is an extension of the XSAVE
      architecture. XFD allows the kernel to enable a feature state in XCR0 and
      to receive a #NM trap when a task uses instructions accessing that state.
      
      This is going to be used to postpone the allocation of a larger XSTATE
      buffer for a task to the point where it is actually using a related
      instruction after the permission to use that facility has been granted.
      
      XFD is not used by the kernel, but only applied to userspace. This is a
      matter of policy as the kernel knows how a fpstate is reallocated and the
      XFD state.
      
      The compacted XSAVE format is adjustable for dynamic features. Make XFD
      depend on XSAVES.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-13-chang.seok.bae@intel.com
      c3511016
    • Chang S. Bae's avatar
      x86/fpu: Reset permission and fpstate on exec() · e61d6310
      Chang S. Bae authored
      
      
      On exec(), extended register states saved in the buffer is cleared. With
      dynamic features, each task carries variables besides the register states.
      The struct fpu has permission information and struct fpstate contains
      buffer size and feature masks. They are all dynamically updated with
      dynamic features.
      
      Reset the current task's entire FPU data before an exec() so that the new
      task starts with default permission and fpstate.
      
      Rename the register state reset function because the old naming confuses as
      it does not reset struct fpstate.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-12-chang.seok.bae@intel.com
      e61d6310
    • Thomas Gleixner's avatar
      x86/fpu: Prepare fpu_clone() for dynamically enabled features · 9e798e9a
      Thomas Gleixner authored
      
      
      The default portion of the parent's FPU state is saved in a child task.
      With dynamic features enabled, the non-default portion is not saved in a
      child's fpstate because these register states are defined to be
      caller-saved. The new task's fpstate is therefore the default buffer.
      
      Fork inherits the permission of the parent.
      
      Also, do not use memcpy() when TIF_NEED_FPU_LOAD is set because it is
      invalid when the parent has dynamic features.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-11-chang.seok.bae@intel.com
      9e798e9a
    • Chang S. Bae's avatar
      x86/fpu/signal: Prepare for variable sigframe length · 53599b4d
      Chang S. Bae authored
      
      
      The software reserved portion of the fxsave frame in the signal frame
      is copied from structures which have been set up at boot time. With
      dynamically enabled features the content of these structures is no
      longer correct because the xfeatures and size can be different per task.
      
      Calculate the software reserved portion at runtime and fill in the
      xfeatures and size values from the tasks active fpstate.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-10-chang.seok.bae@intel.com
      53599b4d
    • Thomas Gleixner's avatar
      x86/signal: Use fpu::__state_user_size for sigalt stack validation · 4b7ca609
      Thomas Gleixner authored
      
      
      Use the current->group_leader->fpu to check for pending permissions to use
      extended features and validate against the resulting user space size which
      is stored in the group leaders fpu struct as well.
      
      This prevents a task from installing a too small sized sigaltstack after
      permissions to use dynamically enabled features have been granted, but
      the task has not (yet) used a related instruction.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-9-chang.seok.bae@intel.com
      4b7ca609
    • Thomas Gleixner's avatar
      x86/fpu: Add basic helpers for dynamically enabled features · 23686ef2
      Thomas Gleixner authored
      
      
      To allow building up the infrastructure required to support dynamically
      enabled FPU features, add:
      
       - XFEATURES_MASK_DYNAMIC
      
         This constant will hold xfeatures which can be dynamically enabled.
      
       - fpu_state_size_dynamic()
      
         A static branch for 64-bit and a simple 'return false' for 32-bit.
      
         This helper allows to add dynamic-feature-specific changes to common
         code which is shared between 32-bit and 64-bit without #ifdeffery.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-8-chang.seok.bae@intel.com
      23686ef2
    • Chang S. Bae's avatar
      x86/arch_prctl: Add controls for dynamic XSTATE components · db8268df
      Chang S. Bae authored
      
      
      Dynamically enabled XSTATE features are by default disabled for all
      processes. A process has to request permission to use such a feature.
      
      To support this implement a architecture specific prctl() with the options:
      
         - ARCH_GET_XCOMP_SUPP
      
           Copies the supported feature bitmap into the user space provided
           u64 storage. The pointer is handed in via arg2
      
         - ARCH_GET_XCOMP_PERM
      
           Copies the process wide permitted feature bitmap into the user space
           provided u64 storage. The pointer is handed in via arg2
      
         - ARCH_REQ_XCOMP_PERM
      
           Request permission for a feature set. A feature set can be mapped to a
           facility, e.g. AMX, and can require one or more XSTATE components to
           be enabled.
      
           The feature argument is the number of the highest XSTATE component
           which is required for a facility to work.
      
           The request argument is not a user supplied bitmap because that makes
           filtering harder (think seccomp) and even impossible because to
           support 32bit tasks the argument would have to be a pointer.
      
      The permission mechanism works this way:
      
         Task asks for permission for a facility and kernel checks whether that's
         supported. If supported it does:
      
           1) Check whether permission has already been granted
      
           2) Compute the size of the required kernel and user space buffer
              (sigframe) size.
      
           3) Validate that no task has a sigaltstack installed
              which is smaller than the resulting sigframe size
      
           4) Add the requested feature bit(s) to the permission bitmap of
              current->group_leader->fpu and store the sizes in the group
              leaders fpu struct as well.
      
      If that is successful then the feature is still not enabled for any of the
      tasks. The first usage of a related instruction will result in a #NM
      trap. The trap handler validates the permission bit of the tasks group
      leader and if permitted it installs a larger kernel buffer and transfers
      the permission and size info to the new fpstate container which makes all
      the FPU functions which require per task information aware of the extended
      feature set.
      
        [ tglx: Adopted to new base code, added missing serialization,
                massaged namings, comments and changelog ]
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-7-chang.seok.bae@intel.com
      db8268df
    • Thomas Gleixner's avatar
      x86/fpu: Add fpu_state_config::legacy_features · c33f0a81
      Thomas Gleixner authored
      
      
      The upcoming prctl() which is required to request the permission for a
      dynamically enabled feature will also provide an option to retrieve the
      supported features. If the CPU does not support XSAVE, the supported
      features would be 0 even when the CPU supports FP and SSE.
      
      Provide separate storage for the legacy feature set to avoid that and fill
      in the bits in the legacy init function.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-6-chang.seok.bae@intel.com
      c33f0a81
    • Thomas Gleixner's avatar
      x86/fpu: Add members to struct fpu to cache permission information · 6f6a7c09
      Thomas Gleixner authored
      
      
      Dynamically enabled features can be requested by any thread of a running
      process at any time. The request does neither enable the feature nor
      allocate larger buffers. It just stores the permission to use the feature
      by adding the features to the permission bitmap and by calculating the
      required sizes for kernel and user space.
      
      The reallocation of the kernel buffer happens when the feature is used
      for the first time which is caught by an exception. The permission
      bitmap is then checked and if the feature is permitted, then it becomes
      fully enabled. If not, the task dies similarly to a task which uses an
      undefined instruction.
      
      The size information is precomputed to allow proper sigaltstack size checks
      once the feature is permitted, but not yet in use because otherwise this
      would open race windows where too small stacks could be installed causing
      a later fail on signal delivery.
      
      Initialize them to the default feature set and sizes.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-5-chang.seok.bae@intel.com
      6f6a7c09
    • Chang S. Bae's avatar
      x86/fpu/xstate: Provide xstate_calculate_size() · 84e4dccc
      Chang S. Bae authored
      
      
      Split out the size calculation from the paranoia check so it can be used
      for recalculating buffer sizes when dynamically enabled features are
      supported.
      
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      [ tglx: Adopted to changed base code ]
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-4-chang.seok.bae@intel.com
      84e4dccc
    • Thomas Gleixner's avatar
      x86/signal: Implement sigaltstack size validation · 3aac3ebe
      Thomas Gleixner authored
      
      
      For historical reasons MINSIGSTKSZ is a constant which became already too
      small with AVX512 support.
      
      Add a mechanism to enforce strict checking of the sigaltstack size against
      the real size of the FPU frame.
      
      The strict check can be enabled via a config option and can also be
      controlled via the kernel command line option 'strict_sas_size' independent
      of the config switch.
      
      Enabling it might break existing applications which allocate a too small
      sigaltstack but 'work' because they never get a signal delivered. Though it
      can be handy to filter out binaries which are not yet aware of
      AT_MINSIGSTKSZ.
      
      Also the upcoming support for dynamically enabled FPU features requires a
      strict sanity check to ensure that:
      
         - Enabling of a dynamic feature, which changes the sigframe size fits
           into an enabled sigaltstack
      
         - Installing a too small sigaltstack after a dynamic feature has been
           added is not possible.
      
      Implement the base check which is controlled by config and command line
      options.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-3-chang.seok.bae@intel.com
      3aac3ebe
    • Thomas Gleixner's avatar
      signal: Add an optional check for altstack size · 1bdda24c
      Thomas Gleixner authored
      
      
      New x86 FPU features will be very large, requiring ~10k of stack in
      signal handlers.  These new features require a new approach called
      "dynamic features".
      
      The kernel currently tries to ensure that altstacks are reasonably
      sized. Right now, on x86, sys_sigaltstack() requires a size of >=2k.
      However, that 2k is a constant. Simply raising that 2k requirement
      to >10k for the new features would break existing apps which have a
      compiled-in size of 2k.
      
      Instead of universally enforcing a larger stack, prohibit a process from
      using dynamic features without properly-sized altstacks. This must be
      enforced in two places:
      
       * A dynamic feature can not be enabled without an large-enough altstack
         for each process thread.
       * Once a dynamic feature is enabled, any request to install a too-small
         altstack will be rejected
      
      The dynamic feature enabling code must examine each thread in a
      process to ensure that the altstacks are large enough. Add a new lock
      (sigaltstack_lock()) to ensure that threads can not race and change
      their altstack after being examined.
      
      Add the infrastructure in form of a config option and provide empty
      stubs for architectures which do not need dynamic altstack size checks.
      
      This implementation will be fleshed out for x86 in a future patch called
      
        x86/arch_prctl: Add controls for dynamic XSTATE components
      
        [dhansen: commit message. ]
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarChang S. Bae <chang.seok.bae@intel.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211021225527.10184-2-chang.seok.bae@intel.com
      1bdda24c
  2. Oct 23, 2021
    • Thomas Gleixner's avatar
      x86/fpu: Remove old KVM FPU interface · 582b01b6
      Thomas Gleixner authored
      
      
      No more users.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211022185313.074853631@linutronix.de
      582b01b6
    • Thomas Gleixner's avatar
      x86/kvm: Convert FPU handling to a single swap buffer · d69c1382
      Thomas Gleixner authored
      
      
      For the upcoming AMX support it's necessary to do a proper integration with
      KVM. Currently KVM allocates two FPU structs which are used for saving the user
      state of the vCPU thread and restoring the guest state when entering
      vcpu_run() and doing the reverse operation before leaving vcpu_run().
      
      With the new fpstate mechanism this can be reduced to one extra buffer by
      swapping the fpstate pointer in current::thread::fpu. This makes the
      upcoming support for AMX and XFD simpler because then fpstate information
      (features, sizes, xfd) are always consistent and it does not require any
      nasty workarounds.
      
      Convert the KVM FPU code over to this new scheme.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211022185313.019454292@linutronix.de
      d69c1382
    • Thomas Gleixner's avatar
      x86/fpu: Provide infrastructure for KVM FPU cleanup · 69f6ed1d
      Thomas Gleixner authored
      
      
      For the upcoming AMX support it's necessary to do a proper integration with
      KVM. Currently KVM allocates two FPU structs which are used for saving the user
      state of the vCPU thread and restoring the guest state when entering
      vcpu_run() and doing the reverse operation before leaving vcpu_run().
      
      With the new fpstate mechanism this can be reduced to one extra buffer by
      swapping the fpstate pointer in current::thread::fpu. This makes the
      upcoming support for AMX and XFD simpler because then fpstate information
      (features, sizes, xfd) are always consistent and it does not require any
      nasty workarounds.
      
      Provide:
      
        - An allocator which initializes the state properly
      
        - A replacement for the existing FPU swap mechanim
      
      Aside of the reduced memory footprint, this also makes state switching
      more efficient when TIF_FPU_NEED_LOAD is set. It does not require a
      memcpy as the state is already correct in the to be swapped out fpstate.
      
      The existing interfaces will be removed once KVM is converted over.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211022185312.954684740@linutronix.de
      69f6ed1d
    • Thomas Gleixner's avatar
      x86/fpu: Prepare for sanitizing KVM FPU code · 75c52dad
      Thomas Gleixner authored
      
      
      For the upcoming AMX support it's necessary to do a proper integration with
      KVM. To avoid more nasty hackery in KVM which violate encapsulation extend
      struct fpu and fpstate so the fpstate switching can be consolidated and
      simplified.
      
      Currently KVM allocates two FPU structs which are used for saving the user
      state of the vCPU thread and restoring the guest state when entering
      vcpu_run() and doing the reverse operation before leaving vcpu_run().
      
      With the new fpstate mechanism this can be reduced to one extra buffer by
      swapping the fpstate pointer in current::thread::fpu. This makes the
      upcoming support for AMX and XFD simpler because then fpstate information
      (features, sizes, xfd) are always consistent and it does not require any
      nasty workarounds.
      
      Add fpu::__task_fpstate to save the regular fpstate pointer while the task
      is inside vcpu_run(). Add some state fields to fpstate to indicate the
      nature of the state.
      
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Link: https://lkml.kernel.org/r/20211022185312.896403942@linutronix.de
      75c52dad
  3. Oct 22, 2021
  4. Oct 21, 2021