prctl.2: Add tagged address ABI control prctls (arm64)

Add documentation for the the PR_SET_TAGGED_ADDR_CTRL and
PR_GET_TAGGED_ADDR_CTRL prctls added in Linux 5.4 for arm64.

Signed-off-by: Dave Martin <Dave.Martin@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Dave Martin 2020-06-24 18:36:02 +01:00 committed by Michael Kerrisk
parent 7fe3c5a9cf
commit 9b276f9ea8
1 changed files with 163 additions and 2 deletions

View File

@ -1379,7 +1379,7 @@ Configure the thread's SVE vector length,
as specified by
.IR "(int) arg2" .
Arguments
.IR arg3 ", " arg4 " and " arg5 ,
.IR arg3 ", " arg4 ", and " arg5
are ignored.
.IP
The bits of
@ -1496,7 +1496,7 @@ Don't use it unless you really know what you are doing.
Get the thread's current SVE vector length configuration.
.IP
Arguments
.IR arg2 ", " arg3 ", " arg4 " and " arg5 ,
.IR arg2 ", " arg3 ", " arg4 ", and " arg5
are ignored.
.IP
Provided that the kernel and platform support SVE,
@ -1522,6 +1522,148 @@ For more information, see the kernel source file
(or
.I Documentation/arm64/sve.txt
before Linux 5.3).
.\" prctl PR_SET_TAGGED_ADDR_CTRL
.\" commit 63f0c60379650d82250f22e4cf4137ef3dc4f43d
.TP
.BR PR_SET_TAGGED_ADDR_CTRL " (since Linux 5.4, only on arm64)"
Controls support for passing tagged userspace addresses to the kernel
(i.e., addresses where bits 56\(em63 are not all zero).
.IP
The level of support is selected by
.IR "arg2" ,
which can be one of the following:
.RS
.TP
.B 0
Addresses that are passed
for the purpose of being dereferenced by the kernel
must be untagged.
.TP
.B PR_TAGGED_ADDR_ENABLE
Addresses that are passed
for the purpose of being dereferenced by the kernel
may be tagged, with the exceptions summarized below.
.RE
.IP
The remaining arguments
.IR arg3 ", " arg4 " and " arg5
must all be zero.
.\" Enforcement added in
.\" commit 3e91ec89f527b9870fe42dcbdb74fd389d123a95
.IP
On success, the mode specified in
.I arg2
is set for the calling thread and the the return value is 0.
If the arguments are invalid,
the mode specified in
.I arg2
is unrecognized,
or if this feature is unsupported by the kernel
or disabled via
.IR /proc/sys/abi/tagged_addr_disabled ,
the call fails with
.BR EINVAL .
.IP
In particular, if
.BR prctl ( PR_SET_TAGGED_ADDR_CTRL ,
0, 0, 0, 0)
fails with
.B EINVAL
then all addresses passed to the kernel must be untagged.
.IP
Irrespective of which mode is set,
addresses passed to certain interfaces
must always be untagged:
.RS
.IP \(em
.BR brk (2),
.BR mmap (2),
.BR shmat (2),
.BR shmdt (2),
and the
.I new_address
argument of
.BR mremap (2).
.IP
(Prior to Linux 5.6 these accepted tagged addresses,
but the behaviour may not be what you expect.
Don't rely on it.)
.IP \(em
\(oqpolymorphic\(cq interfaces
that accept pointers to arbitrary types cast to a
.I void *
or other generic type, specifically
.BR prctl (2),
.BR ioctl (2),
and in general
.BR setsockopt (2)
(only certain specific
.BR setsockopt (2)
options allow tagged addresses).
.RE
.IP
This list of exclusions may shrink
when moving from one kernel version to a later kernel version.
While the kernel may make some guarantees
for backwards compatibility reasons,
for the purposes of new software
the effect of passing tagged addresses to these interfaces
is unspecified.
.IP
The mode set by this call is inherited across
.BR fork (2)
and
.BR clone (2).
The mode is reset by
.BR execve (2)
to 0
(i.e., tagged addresses not permitted in the user/kernel ABI).
.IP
For more information, see the kernel source file
.IR Documentation/arm64/tagged\-address\-abi.rst .
.IP
.B Warning:
This call is primarily intended for use by the run-time environment.
A successful
.B PR_SET_TAGGED_ADDR_CTRL
call elsewhere may crash the calling process.
The conditions for using it safely are complex and system-dependent;
Don't use it unless you know what you are doing.
.\" prctl PR_GET_TAGGED_ADDR_CTRL
.\" commit 63f0c60379650d82250f22e4cf4137ef3dc4f43d
.TP
.BR PR_GET_TAGGED_ADDR_CTRL " (since Linux 5.4, only on arm64)"
Returns the current tagged address mode
for the calling thread.
.IP
Arguments
.IR arg2 ", " arg3 ", " arg4 " and " arg5
must all be zero.
.IP
If the arguments are invalid
or this feature is disabled or unsupported by the kernel,
the call fails with
.BR EINVAL .
In particular, if
.BR prctl ( PR_GET_TAGGED_ADDR_CTRL ,
0, 0, 0, 0)
fails with
.BR EINVAL ,
then this feature is definitely either unsupported,
or disabled via
.IR /proc/sys/abi/tagged_addr_disabled .
In this case,
all addresses passed to the kernel must be untagged.
.IP
Otherwise, the call returns a nonnegative value
describing the current tagged address mode,
encoded in the same way as the
.I arg2
argument of
.BR PR_SET_TAGGED_ADDR_CTRL .
.IP
For more information, see the kernel source file
.IR Documentation/arm64/tagged\-address\-abi.rst .
.\"
.\" prctl PR_TASK_PERF_EVENTS_DISABLE
.TP
@ -1767,6 +1909,7 @@ On success,
.BR PR_GET_SPECULATION_CTRL ,
.BR PR_SVE_GET_VL ,
.BR PR_SVE_SET_VL ,
.BR PR_GET_TAGGED_ADDR_CTRL ,
.BR PR_GET_THP_DISABLE ,
.BR PR_GET_TIMING ,
.BR PR_GET_TIMERSLACK ,
@ -2074,6 +2217,24 @@ is
.B PR_SVE_GET_VL
and SVE is not available on this platform.
.TP
.B EINVAL
.I option
is
.BR PR_SET_TAGGED_ADDR_CTRL
and the arguments are invalid or unsupported.
See the description of
.B PR_SET_TAGGED_ADDR_CTRL
above for details.
.TP
.B EINVAL
.I option
is
.BR PR_GET_TAGGED_ADDR_CTRL
and the arguments are invalid or unsupported.
See the description of
.B PR_GET_TAGGED_ADDR_CTRL
above for details.
.TP
.B ENODEV
.I option
was