Skip to content
  1. Jul 12, 2023
    • Rick Edgecombe's avatar
      mm: Make pte_mkwrite() take a VMA · 161e393c
      Rick Edgecombe authored
      
      
      The x86 Shadow stack feature includes a new type of memory called shadow
      stack. This shadow stack memory has some unusual properties, which requires
      some core mm changes to function properly.
      
      One of these unusual properties is that shadow stack memory is writable,
      but only in limited ways. These limits are applied via a specific PTE
      bit combination. Nevertheless, the memory is writable, and core mm code
      will need to apply the writable permissions in the typical paths that
      call pte_mkwrite(). Future patches will make pte_mkwrite() take a VMA, so
      that the x86 implementation of it can know whether to create regular
      writable or shadow stack mappings.
      
      But there are a couple of challenges to this. Modifying the signatures of
      each arch pte_mkwrite() implementation would be error prone because some
      are generated with macros and would need to be re-implemented. Also, some
      pte_mkwrite() callers operate on kernel memory without a VMA.
      
      So this can be done in a three step process. First pte_mkwrite() can be
      renamed to pte_mkwrite_novma() in each arch, with a generic pte_mkwrite()
      added that just calls pte_mkwrite_novma(). Next callers without a VMA can
      be moved to pte_mkwrite_novma(). And lastly, pte_mkwrite() and all callers
      can be changed to take/pass a VMA.
      
      Previous work pte_mkwrite() renamed pte_mkwrite_novma() and converted
      callers that don't have a VMA were to use pte_mkwrite_novma(). So now
      change pte_mkwrite() to take a VMA and change the remaining callers to
      pass a VMA. Apply the same changes for pmd_mkwrite().
      
      No functional change.
      
      Suggested-by: default avatarDavid Hildenbrand <david@redhat.com>
      Signed-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
      Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
      Reviewed-by: default avatarMike Rapoport (IBM) <rppt@kernel.org>
      Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
      Link: https://lore.kernel.org/all/20230613001108.3040476-4-rick.p.edgecombe%40intel.com
      161e393c
    • Rick Edgecombe's avatar
      mm: Move pte/pmd_mkwrite() callers with no VMA to _novma() · 6ecc21bb
      Rick Edgecombe authored
      
      
      The x86 Shadow stack feature includes a new type of memory called shadow
      stack. This shadow stack memory has some unusual properties, which requires
      some core mm changes to function properly.
      
      One of these unusual properties is that shadow stack memory is writable,
      but only in limited ways. These limits are applied via a specific PTE
      bit combination. Nevertheless, the memory is writable, and core mm code
      will need to apply the writable permissions in the typical paths that
      call pte_mkwrite(). Future patches will make pte_mkwrite() take a VMA, so
      that the x86 implementation of it can know whether to create regular
      writable or shadow stack mappings.
      
      But there are a couple of challenges to this. Modifying the signatures of
      each arch pte_mkwrite() implementation would be error prone because some
      are generated with macros and would need to be re-implemented. Also, some
      pte_mkwrite() callers operate on kernel memory without a VMA.
      
      So this can be done in a three step process. First pte_mkwrite() can be
      renamed to pte_mkwrite_novma() in each arch, with a generic pte_mkwrite()
      added that just calls pte_mkwrite_novma(). Next callers without a VMA can
      be moved to pte_mkwrite_novma(). And lastly, pte_mkwrite() and all callers
      can be changed to take/pass a VMA.
      
      Earlier work did the first step, so next move the callers that don't have
      a VMA to pte_mkwrite_novma(). Also do the same for pmd_mkwrite().  This
      will be ok for the shadow stack feature, as these callers are on kernel
      memory which will not need to be made shadow stack, and the other
      architectures only currently support one type of memory in pte_mkwrite()
      
      Signed-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
      Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
      Reviewed-by: default avatarMike Rapoport (IBM) <rppt@kernel.org>
      Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
      Link: https://lore.kernel.org/all/20230613001108.3040476-3-rick.p.edgecombe%40intel.com
      6ecc21bb
    • Rick Edgecombe's avatar
      mm: Rename arch pte_mkwrite()'s to pte_mkwrite_novma() · 2f0584f3
      Rick Edgecombe authored
      
      
      The x86 Shadow stack feature includes a new type of memory called shadow
      stack. This shadow stack memory has some unusual properties, which requires
      some core mm changes to function properly.
      
      One of these unusual properties is that shadow stack memory is writable,
      but only in limited ways. These limits are applied via a specific PTE
      bit combination. Nevertheless, the memory is writable, and core mm code
      will need to apply the writable permissions in the typical paths that
      call pte_mkwrite(). The goal is to make pte_mkwrite() take a VMA, so
      that the x86 implementation of it can know whether to create regular
      writable or shadow stack mappings.
      
      But there are a couple of challenges to this. Modifying the signatures of
      each arch pte_mkwrite() implementation would be error prone because some
      are generated with macros and would need to be re-implemented. Also, some
      pte_mkwrite() callers operate on kernel memory without a VMA.
      
      So this can be done in a three step process. First pte_mkwrite() can be
      renamed to pte_mkwrite_novma() in each arch, with a generic pte_mkwrite()
      added that just calls pte_mkwrite_novma(). Next callers without a VMA can
      be moved to pte_mkwrite_novma(). And lastly, pte_mkwrite() and all callers
      can be changed to take/pass a VMA.
      
      Start the process by renaming pte_mkwrite() to pte_mkwrite_novma() and
      adding the pte_mkwrite() wrapper in linux/pgtable.h. Apply the same
      pattern for pmd_mkwrite(). Since not all archs have a pmd_mkwrite_novma(),
      create a new arch config HAS_HUGE_PAGE that can be used to tell if
      pmd_mkwrite() should be defined. Otherwise in the !HAS_HUGE_PAGE cases the
      compiler would not be able to find pmd_mkwrite_novma().
      
      No functional change.
      
      Suggested-by: default avatarLinus Torvalds <torvalds@linuxfoundation.org>
      Signed-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
      Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
      Reviewed-by: default avatarMike Rapoport (IBM) <rppt@kernel.org>
      Acked-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
      Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
      Link: https://lore.kernel.org/lkml/CAHk-=wiZjSu7c9sFYZb3q04108stgHff2wfbokGCCgW7riz+8Q@mail.gmail.com/
      Link: https://lore.kernel.org/all/20230613001108.3040476-2-rick.p.edgecombe%40intel.com
      2f0584f3
  2. Jul 10, 2023
  3. Jul 09, 2023