2005-04-17 05:20:36 +07:00
|
|
|
#ifndef __ALPHA_MMAN_H__
|
|
|
|
#define __ALPHA_MMAN_H__
|
|
|
|
|
|
|
|
#define PROT_READ 0x1 /* page can be read */
|
|
|
|
#define PROT_WRITE 0x2 /* page can be written */
|
|
|
|
#define PROT_EXEC 0x4 /* page can be executed */
|
|
|
|
#define PROT_SEM 0x8 /* page may be used for atomic ops */
|
|
|
|
#define PROT_NONE 0x0 /* page can not be accessed */
|
|
|
|
#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */
|
|
|
|
#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */
|
|
|
|
|
|
|
|
#define MAP_SHARED 0x01 /* Share changes */
|
|
|
|
#define MAP_PRIVATE 0x02 /* Changes are private */
|
|
|
|
#define MAP_TYPE 0x0f /* Mask for type of mapping (OSF/1 is _wrong_) */
|
|
|
|
#define MAP_FIXED 0x100 /* Interpret addr exactly */
|
|
|
|
#define MAP_ANONYMOUS 0x10 /* don't use a file */
|
|
|
|
|
|
|
|
/* not used by linux, but here to make sure we don't clash with OSF/1 defines */
|
|
|
|
#define _MAP_HASSEMAPHORE 0x0200
|
|
|
|
#define _MAP_INHERIT 0x0400
|
|
|
|
#define _MAP_UNALIGNED 0x0800
|
|
|
|
|
|
|
|
/* These are linux-specific */
|
|
|
|
#define MAP_GROWSDOWN 0x01000 /* stack-like segment */
|
|
|
|
#define MAP_DENYWRITE 0x02000 /* ETXTBSY */
|
|
|
|
#define MAP_EXECUTABLE 0x04000 /* mark it as an executable */
|
|
|
|
#define MAP_LOCKED 0x08000 /* lock the mapping */
|
|
|
|
#define MAP_NORESERVE 0x10000 /* don't check for reservations */
|
|
|
|
#define MAP_POPULATE 0x20000 /* populate (prefault) pagetables */
|
|
|
|
#define MAP_NONBLOCK 0x40000 /* do not block on IO */
|
2009-09-22 07:03:45 +07:00
|
|
|
#define MAP_STACK 0x80000 /* give out an address that is best suited for process/thread stacks */
|
|
|
|
#define MAP_HUGETLB 0x100000 /* create a huge page mapping */
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
#define MS_ASYNC 1 /* sync memory asynchronously */
|
|
|
|
#define MS_SYNC 2 /* synchronous memory sync */
|
|
|
|
#define MS_INVALIDATE 4 /* invalidate the caches */
|
|
|
|
|
|
|
|
#define MCL_CURRENT 8192 /* lock all currently mapped pages */
|
|
|
|
#define MCL_FUTURE 16384 /* lock all additions to address space */
|
2015-11-06 09:51:39 +07:00
|
|
|
#define MCL_ONFAULT 32768 /* lock all pages that are faulted in */
|
|
|
|
|
|
|
|
#define MLOCK_ONFAULT 0x01 /* Lock pages in range after they are faulted in, do not prefault */
|
2005-04-17 05:20:36 +07:00
|
|
|
|
|
|
|
#define MADV_NORMAL 0 /* no further special treatment */
|
|
|
|
#define MADV_RANDOM 1 /* expect random page references */
|
|
|
|
#define MADV_SEQUENTIAL 2 /* expect sequential page references */
|
|
|
|
#define MADV_WILLNEED 3 /* will need these pages */
|
|
|
|
#define MADV_SPACEAVAIL 5 /* ensure resources are available */
|
|
|
|
#define MADV_DONTNEED 6 /* don't need these pages */
|
2006-02-16 06:17:39 +07:00
|
|
|
|
|
|
|
/* common/generic parameters */
|
2016-01-16 07:55:02 +07:00
|
|
|
#define MADV_FREE 8 /* free pages only if memory pressure */
|
2006-02-16 06:17:39 +07:00
|
|
|
#define MADV_REMOVE 9 /* remove these pages & resources */
|
|
|
|
#define MADV_DONTFORK 10 /* don't inherit across fork */
|
|
|
|
#define MADV_DOFORK 11 /* do inherit across fork */
|
2005-04-17 05:20:36 +07:00
|
|
|
|
2009-09-22 07:01:53 +07:00
|
|
|
#define MADV_MERGEABLE 12 /* KSM may merge identical pages */
|
|
|
|
#define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages */
|
|
|
|
|
2011-01-14 06:46:31 +07:00
|
|
|
#define MADV_HUGEPAGE 14 /* Worth backing with hugepages */
|
2011-01-14 06:47:17 +07:00
|
|
|
#define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages */
|
2011-01-14 06:46:31 +07:00
|
|
|
|
2012-03-24 05:02:51 +07:00
|
|
|
#define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
|
|
|
|
overrides the coredump filter bits */
|
|
|
|
#define MADV_DODUMP 17 /* Clear the MADV_NODUMP flag */
|
|
|
|
|
mm,fork: introduce MADV_WIPEONFORK
Introduce MADV_WIPEONFORK semantics, which result in a VMA being empty
in the child process after fork. This differs from MADV_DONTFORK in one
important way.
If a child process accesses memory that was MADV_WIPEONFORK, it will get
zeroes. The address ranges are still valid, they are just empty.
If a child process accesses memory that was MADV_DONTFORK, it will get a
segmentation fault, since those address ranges are no longer valid in
the child after fork.
Since MADV_DONTFORK also seems to be used to allow very large programs
to fork in systems with strict memory overcommit restrictions, changing
the semantics of MADV_DONTFORK might break existing programs.
MADV_WIPEONFORK only works on private, anonymous VMAs.
The use case is libraries that store or cache information, and want to
know that they need to regenerate it in the child process after fork.
Examples of this would be:
- systemd/pulseaudio API checks (fail after fork) (replacing a getpid
check, which is too slow without a PID cache)
- PKCS#11 API reinitialization check (mandated by specification)
- glibc's upcoming PRNG (reseed after fork)
- OpenSSL PRNG (reseed after fork)
The security benefits of a forking server having a re-inialized PRNG in
every child process are pretty obvious. However, due to libraries
having all kinds of internal state, and programs getting compiled with
many different versions of each library, it is unreasonable to expect
calling programs to re-initialize everything manually after fork.
A further complication is the proliferation of clone flags, programs
bypassing glibc's functions to call clone directly, and programs calling
unshare, causing the glibc pthread_atfork hook to not get called.
It would be better to have the kernel take care of this automatically.
The patch also adds MADV_KEEPONFORK, to undo the effects of a prior
MADV_WIPEONFORK.
This is similar to the OpenBSD minherit syscall with MAP_INHERIT_ZERO:
https://man.openbsd.org/minherit.2
[akpm@linux-foundation.org: numerically order arch/parisc/include/uapi/asm/mman.h #defines]
Link: http://lkml.kernel.org/r/20170811212829.29186-3-riel@redhat.com
Signed-off-by: Rik van Riel <riel@redhat.com>
Reported-by: Florian Weimer <fweimer@redhat.com>
Reported-by: Colm MacCártaigh <colm@allcosts.net>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: "Kirill A. Shutemov" <kirill@shutemov.name>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Helge Deller <deller@gmx.de>
Cc: Kees Cook <keescook@chromium.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Drewry <wad@chromium.org>
Cc: <linux-api@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2017-09-07 06:25:15 +07:00
|
|
|
#define MADV_WIPEONFORK 18 /* Zero memory on fork, child only */
|
|
|
|
#define MADV_KEEPONFORK 19 /* Undo MADV_WIPEONFORK */
|
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
/* compatibility flags */
|
|
|
|
#define MAP_FILE 0
|
|
|
|
|
x86/pkeys: Allocation/free syscalls
This patch adds two new system calls:
int pkey_alloc(unsigned long flags, unsigned long init_access_rights)
int pkey_free(int pkey);
These implement an "allocator" for the protection keys
themselves, which can be thought of as analogous to the allocator
that the kernel has for file descriptors. The kernel tracks
which numbers are in use, and only allows operations on keys that
are valid. A key which was not obtained by pkey_alloc() may not,
for instance, be passed to pkey_mprotect().
These system calls are also very important given the kernel's use
of pkeys to implement execute-only support. These help ensure
that userspace can never assume that it has control of a key
unless it first asks the kernel. The kernel does not promise to
preserve PKRU (right register) contents except for allocated
pkeys.
The 'init_access_rights' argument to pkey_alloc() specifies the
rights that will be established for the returned pkey. For
instance:
pkey = pkey_alloc(flags, PKEY_DENY_WRITE);
will allocate 'pkey', but also sets the bits in PKRU[1] such that
writing to 'pkey' is already denied.
The kernel does not prevent pkey_free() from successfully freeing
in-use pkeys (those still assigned to a memory range by
pkey_mprotect()). It would be expensive to implement the checks
for this, so we instead say, "Just don't do it" since sane
software will never do it anyway.
Any piece of userspace calling pkey_alloc() needs to be prepared
for it to fail. Why? pkey_alloc() returns the same error code
(ENOSPC) when there are no pkeys and when pkeys are unsupported.
They can be unsupported for a whole host of reasons, so apps must
be prepared for this. Also, libraries or LD_PRELOADs might steal
keys before an application gets access to them.
This allocation mechanism could be implemented in userspace.
Even if we did it in userspace, we would still need additional
user/kernel interfaces to tell userspace which keys are being
used by the kernel internally (such as for execute-only
mappings). Having the kernel provide this facility completely
removes the need for these additional interfaces, or having an
implementation of this in userspace at all.
Note that we have to make changes to all of the architectures
that do not use mman-common.h because we use the new
PKEY_DENY_ACCESS/WRITE macros in arch-independent code.
1. PKRU is the Protection Key Rights User register. It is a
usermode-accessible register that controls whether writes
and/or access to each individual pkey is allowed or denied.
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Acked-by: Mel Gorman <mgorman@techsingularity.net>
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/20160729163015.444FE75F@viggo.jf.intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2016-07-29 23:30:15 +07:00
|
|
|
#define PKEY_DISABLE_ACCESS 0x1
|
|
|
|
#define PKEY_DISABLE_WRITE 0x2
|
|
|
|
#define PKEY_ACCESS_MASK (PKEY_DISABLE_ACCESS |\
|
|
|
|
PKEY_DISABLE_WRITE)
|
|
|
|
|
2005-04-17 05:20:36 +07:00
|
|
|
#endif /* __ALPHA_MMAN_H__ */
|