On Mon, Feb 27, 2023 at 2:31 PM Rick Edgecombe <rick.p.edgecombe@xxxxxxxxx> wrote: > > From: Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx> > > 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. > > Account shadow stack pages to stack memory. Do this by adding a > VM_SHADOW_STACK check in is_stack_mapping(). > > Tested-by: Pengfei Xu <pengfei.xu@xxxxxxxxx> > Tested-by: John Allen <john.allen@xxxxxxx> > Tested-by: Kees Cook <keescook@xxxxxxxxxxxx> > Acked-by: Mike Rapoport (IBM) <rppt@xxxxxxxxxx> > Reviewed-by: Kees Cook <keescook@xxxxxxxxxxxx> > Signed-off-by: Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx> > Co-developed-by: Rick Edgecombe <rick.p.edgecombe@xxxxxxxxx> > Signed-off-by: Rick Edgecombe <rick.p.edgecombe@xxxxxxxxx> > Cc: Kees Cook <keescook@xxxxxxxxxxxx> > > --- > v7: > - Change is_stack_mapping() to know about VM_SHADOW_STACK so the > additions in vm_stat_account() can be dropped. (David Hildenbrand) > > v3: > - Remove unneeded VM_SHADOW_STACK check in accountable_mapping() > (Kirill) > > v2: > - Remove is_shadow_stack_mapping() and just change it to directly bitwise > and VM_SHADOW_STACK. > > Yu-cheng v26: > - Remove redundant #ifdef CONFIG_MMU. > > Yu-cheng v25: > - Remove #ifdef CONFIG_ARCH_HAS_SHADOW_STACK for is_shadow_stack_mapping(). > --- > mm/internal.h | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/mm/internal.h b/mm/internal.h > index 7920a8b7982e..1d13d5580f64 100644 > --- a/mm/internal.h > +++ b/mm/internal.h > @@ -491,14 +491,14 @@ static inline bool is_exec_mapping(vm_flags_t flags) > } > > /* > - * Stack area - automatically grows in one direction > + * Stack area > * > - * VM_GROWSUP / VM_GROWSDOWN VMAs are always private anonymous: > - * do_mmap() forbids all other combinations. > + * VM_GROWSUP, VM_GROWSDOWN VMAs are always private > + * anonymous. do_mmap() forbids all other combinations. > */ > static inline bool is_stack_mapping(vm_flags_t flags) > { > - return (flags & VM_STACK) == VM_STACK; > + return ((flags & VM_STACK) == VM_STACK) || (flags & VM_SHADOW_STACK); Same comment here. `VM_SHADOW_STACK` is an x86 specific way of encoding a shadow stack. Instead let's have a proxy here which allows architectures to have their own encodings to represent a shadow stack. > } > > /* > -- > 2.17.1 >