• Mark Brown's avatar
    mm: make arch_get_unmapped_area() take vm_flags by default · 25d4054c
    Mark Brown authored
    Patch series "mm: Care about shadow stack guard gap when getting an
    unmapped area", v2.
    
    As covered in the commit log for c44357c2 ("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.  The arm64 and RISC-V shadow stack
    implementations are currently on the list:
    
       https://lore.kernel.org/r/20240829-arm64-gcs-v12-0-42fec94743
       https://lore.kernel.org/lkml/20240403234054.2020347-1-debug@rivosinc.com/
    
    Given the addition of the use of vm_flags in the generic implementation we
    also simplify the set of possibilities that have to be dealt with in the
    core code by making arch_get_unmapped_area() take vm_flags as standard. 
    This is a bit invasive since the prototype change touches quite a few
    architectures but since the parameter is ignored the change is
    straightforward, the simplification for the generic code seems worth it.
    
    
    This patch (of 3):
    
    When we introduced arch_get_unmapped_area_vmflags() in 96114870 ("mm:
    introduce arch_get_unmapped_area_vmflags()") we did so as part of properly
    supporting guard pages for shadow stacks on x86_64, which uses a custom
    arch_get_unmapped_area().  Equivalent features are also present on both
    arm64 and RISC-V, both of which use the generic implementation of
    arch_get_unmapped_area() and will require equivalent modification there. 
    Rather than continue to deal with having two versions of the functions
    let's bite the bullet and have all implementations of
    arch_get_unmapped_area() take vm_flags as a parameter.
    
    The new parameter is currently ignored by all implementations other than
    x86.  The only caller that doesn't have a vm_flags available is
    mm_get_unmapped_area(), as for the x86 implementation and the wrapper used
    on other architectures this is modified to supply no flags.
    
    No functional changes.
    
    Link: https://lkml.kernel.org/r/20240904-mm-generic-shadow-stack-guard-v2-0-a46b8b6dc0ed@kernel.org
    Link: https://lkml.kernel.org/r/20240904-mm-generic-shadow-stack-guard-v2-1-a46b8b6dc0ed@kernel.orgSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    Acked-by: default avatarLorenzo Stoakes <lorenzo.stoakes@oracle.com>
    Reviewed-by: default avatarLiam R. Howlett <Liam.Howlett@Oracle.com>
    Acked-by: Helge Deller <deller@gmx.de>	[parisc]
    Cc: Alexander Gordeev <agordeev@linux.ibm.com>
    Cc: Andreas Larsson <andreas@gaisler.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
    Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
    Cc: Chris Zankel <chris@zankel.net>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
    Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
    Cc: Guo Ren <guoren@kernel.org>
    Cc: Heiko Carstens <hca@linux.ibm.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Huacai Chen <chenhuacai@kernel.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
    Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
    Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    Cc: Matt Turner <mattst88@gmail.com>
    Cc: Max Filippov <jcmvbkbc@gmail.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Naveen N Rao <naveen@kernel.org>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Richard Henderson <richard.henderson@linaro.org>
    Cc: Rich Felker <dalias@libc.org>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Sven Schnelle <svens@linux.ibm.com>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vasily Gorbik <gor@linux.ibm.com>
    Cc: Vineet Gupta <vgupta@kernel.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: WANG Xuerui <kernel@xen0n.name>
    Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    25d4054c
mmap.c 4.68 KB