Skip to content
  • Dave Hansen's avatar
    x86/pkeys: Make mprotect_key() mask off additional vm_flags · a8502b67
    Dave Hansen authored
    
    
    Today, mprotect() takes 4 bits of data: PROT_READ/WRITE/EXEC/NONE.
    Three of those bits: READ/WRITE/EXEC get translated directly in to
    vma->vm_flags by calc_vm_prot_bits().  If a bit is unset in
    mprotect()'s 'prot' argument then it must be cleared in vma->vm_flags
    during the mprotect() call.
    
    We do this clearing today by first calculating the VMA flags we
    want set, then clearing the ones we do not want to inherit from
    the original VMA:
    
    	vm_flags = calc_vm_prot_bits(prot, key);
    	...
    	newflags = vm_flags;
    	newflags |= (vma->vm_flags & ~(VM_READ | VM_WRITE | VM_EXEC));
    
    However, we *also* want to mask off the original VMA's vm_flags in
    which we store the protection key.
    
    To do that, this patch adds a new macro:
    
    	ARCH_VM_PKEY_FLAGS
    
    which allows the architecture to specify additional bits that it would
    like cleared.  We use that to ensure that the VM_PKEY_BIT* bits get
    cleared.
    
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Acked-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: linux-arch@vger.kernel.org
    Cc: Dave Hansen <dave@sr71.net>
    Cc: arnd@arndb.de
    Cc: linux-api@vger.kernel.org
    Cc: linux-mm@kvack.org
    Cc: luto@kernel.org
    Cc: akpm@linux-foundation.org
    Cc: torvalds@linux-foundation.org
    Link: http://lkml.kernel.org/r/20160729163013.E48D6981@viggo.jf.intel.com
    
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    a8502b67