Re: [PATCH v6 13/41] mm: Make pte_mkwrite() take a VMA

2023-03-01 Thread Deepak Gupta

On Sat, Feb 18, 2023 at 01:14:05PM -0800, Rick Edgecombe wrote:

The x86 Control-flow Enforcement Technology (CET) 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().

In addition to VM_WRITE, the shadow stack VMA's will have a flag denoting
that they are special shadow stack flavor of writable memory. So make
pte_mkwrite() take a VMA, so that the x86 implementation of it can know to
create regular writable memory or shadow stack memory.

Apply the same changes for pmd_mkwrite() and huge_pte_mkwrite().

No functional change.

Cc: linux-...@vger.kernel.org
Cc: linux-ker...@vger.kernel.org
Cc: linux-al...@vger.kernel.org
Cc: linux-snps-arc@lists.infradead.org
Cc: linux-arm-ker...@lists.infradead.org
Cc: linux-c...@vger.kernel.org
Cc: linux-hexa...@vger.kernel.org
Cc: linux-i...@vger.kernel.org
Cc: loonga...@lists.linux.dev
Cc: linux-m...@lists.linux-m68k.org
Cc: Michal Simek 
Cc: Dinh Nguyen 
Cc: linux-m...@vger.kernel.org
Cc: openr...@lists.librecores.org
Cc: linux-par...@vger.kernel.org
Cc: linuxppc-...@lists.ozlabs.org
Cc: linux-ri...@lists.infradead.org
Cc: linux-s...@vger.kernel.org
Cc: linux...@vger.kernel.org
Cc: sparcli...@vger.kernel.org
Cc: linux...@lists.infradead.org
Cc: xen-de...@lists.xenproject.org
Cc: linux-a...@vger.kernel.org
Cc: linux...@kvack.org
Tested-by: Pengfei Xu 
Suggested-by: David Hildenbrand 
Signed-off-by: Rick Edgecombe 



Acked-by: Deepak Gupta 

___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


Re: [PATCH 3/3] mm: Care about shadow stack guard gap when getting an unmapped area

2024-09-04 Thread Deepak Gupta

On Mon, Sep 02, 2024 at 08:08:15PM +0100, Mark Brown wrote:

As covered in the commit log for c44357c2e76b ("x86/mm: care about shadow
stack guard gap during placement") our current mmap() implementation does
not take care to ensure that a new mapping isn't placed with existing
mappings inside it's own guard gaps. This is particularly important for
shadow stacks since if two shadow stacks end up getting placed adjacent to
each other then they can overflow into each other which weakens the
protection offered by the feature.

On x86 there is a custom arch_get_unmapped_area() which was updated by the
above commit to cover this case by specifying a start_gap for allocations
with VM_SHADOW_STACK. Both arm64 and RISC-V have equivalent features and
use the generic implementation of arch_get_unmapped_area() so let's make
the equivalent change there so they also don't get shadow stack pages
placed without guard pages.

Architectures which do not have this feature will define VM_SHADOW_STACK
to VM_NONE and hence be unaffected.

Suggested-by: Rick Edgecombe 
Signed-off-by: Mark Brown 
---
mm/mmap.c | 10 ++
1 file changed, 10 insertions(+)

diff --git a/mm/mmap.c b/mm/mmap.c
index b06ba847c96e..902c482b6084 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1753,6 +1753,14 @@ static unsigned long unmapped_area_topdown(struct 
vm_unmapped_area_info *info)
return gap;
}

+static inline unsigned long stack_guard_placement(vm_flags_t vm_flags)
+{
+   if (vm_flags & VM_SHADOW_STACK)
+   return PAGE_SIZE;
+
+   return 0;
+}
+
/*
 * Search for an unmapped address range.
 *
@@ -1814,6 +1822,7 @@ generic_get_unmapped_area(struct file *filp, unsigned 
long addr,
info.length = len;
info.low_limit = mm->mmap_base;
info.high_limit = mmap_end;
+   info.start_gap = stack_guard_placement(vm_flags);
return vm_unmapped_area(&info);
}

@@ -1863,6 +1872,7 @@ generic_get_unmapped_area_topdown(struct file *filp, 
unsigned long addr,
info.length = len;
info.low_limit = PAGE_SIZE;
info.high_limit = arch_get_mmap_base(addr, mm->mmap_base);
+   info.start_gap = stack_guard_placement(vm_flags);
addr = vm_unmapped_area(&info);

/*



lgtm

Reviewed-by: Deepak Gupta 


--
2.39.2



___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


Re: [PATCH 2/3] mm: Pass vm_flags to generic_get_unmapped_area()

2024-09-04 Thread Deepak Gupta

On Mon, Sep 02, 2024 at 08:08:14PM +0100, Mark Brown wrote:

In preparation for using vm_flags to ensure guard pages for shadow stacks
supply them as an argument to generic_get_unmapped_area(). The only user
outside of the core code is the PowerPC book3s64 implementation which is
trivially wrapping the generic implementation in the radix_enabled() case.

Signed-off-by: Mark Brown 


Reviewed-by: Deepak Gupta 


___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc


Re: [PATCH 3/3] mm: Care about shadow stack guard gap when getting an unmapped area

2024-09-04 Thread Deepak Gupta

On Tue, Sep 03, 2024 at 08:57:20PM +0100, Mark Brown wrote:

On Tue, Sep 03, 2024 at 03:41:49PM -0400, Liam R. Howlett wrote:

* Mark Brown  [240902 15:09]:



> +static inline unsigned long stack_guard_placement(vm_flags_t vm_flags)
> +{
> +  if (vm_flags & VM_SHADOW_STACK)
> +  return PAGE_SIZE;



Is PAGE_SIZE is enough?


It's what x86 currently uses so it'll be no worse off if it gets moved
to the generic code (there's a comment in the arch code explaing what's
needed there) and it's enough for arm64, we only do single record
pushes/pops or (optionally) writes to unconstrained addresses.


It's enough for RISC-V too.


___
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc