mirror of https://github.com/mkerrisk/man-pages
134 lines
5.0 KiB
Groff
134 lines
5.0 KiB
Groff
.\" Copyright (c) 2010 Michael Kerrisk <mtk.manpages@gmail.com>
|
|
.\" based on a proposal from Stephan Mueller <smueller@atsec.com>
|
|
.\"
|
|
.\" %%%LICENSE_START(VERBATIM)
|
|
.\" Permission is granted to make and distribute verbatim copies of this
|
|
.\" manual provided the copyright notice and this permission notice are
|
|
.\" preserved on all copies.
|
|
.\"
|
|
.\" Permission is granted to copy and distribute modified versions of
|
|
.\" this manual under the conditions for verbatim copying, provided that
|
|
.\" the entire resulting derived work is distributed under the terms of
|
|
.\" a permission notice identical to this one.
|
|
.\"
|
|
.\" Since the Linux kernel and libraries are constantly changing, this
|
|
.\" manual page may be incorrect or out-of-date. The author(s) assume
|
|
.\" no responsibility for errors or omissions, or for damages resulting
|
|
.\" from the use of the information contained herein. The author(s) may
|
|
.\" not have taken the same level of care in the production of this
|
|
.\" manual, which is licensed free of charge, as they might when working
|
|
.\" professionally.
|
|
.\"
|
|
.\" Formatted or processed versions of this manual, if unaccompanied by
|
|
.\" the source, must acknowledge the copyright and authors of this work.
|
|
.\" %%%LICENSE_END
|
|
.\"
|
|
.\" Various pieces of text taken from the kernel source and the commentary
|
|
.\" in kernel commit fa28237cfcc5827553044cbd6ee52e33692b0faa
|
|
.\" both written by Paul Mackerras <paulus@samba.org>
|
|
.\"
|
|
.TH SUBPAGE_PROT 2 2012-07-13 "Linux" "Linux Programmer's Manual"
|
|
.SH NAME
|
|
subpage_prot \- define a subpage protection for an address range
|
|
.SH SYNOPSIS
|
|
.nf
|
|
.BI "long subpage_prot(unsigned long " addr ", unsigned long " len ,
|
|
.BI " uint32_t *" map ");
|
|
.fi
|
|
|
|
.IR Note :
|
|
There is no glibc wrapper for this system call; see NOTES.
|
|
.SH DESCRIPTION
|
|
The PowerPC-specific
|
|
.BR subpage_prot ()
|
|
system call provides the facility to control the access
|
|
permissions on individual 4kB subpages on systems configured with
|
|
a page size of 64kB.
|
|
|
|
The protection map is applied to the memory pages in the region starting at
|
|
.I addr
|
|
and continuing for
|
|
.I len
|
|
bytes.
|
|
Both of these arguments must be aligned to a 64-kB boundary.
|
|
|
|
The protection map is specified in the buffer pointed to by
|
|
.IR map .
|
|
The map has 2 bits per 4kB subpage;
|
|
thus each 32-bit word specifies the protections of 16 4kB subpages
|
|
inside a 64kB page
|
|
(so, the number of 32-bit words pointed to by
|
|
.I map
|
|
should equate to the number of 64-kB pages specified by
|
|
.IR len ).
|
|
Each 2-bit field in the protection map is either 0 to allow any access,
|
|
1 to prevent writes, or 2 or 3 to prevent all accesses.
|
|
.SH RETURN VALUE
|
|
On success,
|
|
.BR subpage_prot ()
|
|
returns 0.
|
|
Otherwise, one of the error codes specified below is returned.
|
|
.SH ERRORS
|
|
.TP
|
|
.B EFAULT
|
|
The buffer referred to by
|
|
.I map
|
|
is not accessible.
|
|
.TP
|
|
.B EINVAL
|
|
The
|
|
.I addr
|
|
or
|
|
.I len
|
|
arguments are incorrect.
|
|
Both of these arguments must be aligned to a multiple of the system page size,
|
|
and they must not refer to a region outside of the
|
|
address space of the process or to a region that consists of huge pages.
|
|
.TP
|
|
.B ENOMEM
|
|
Out of memory.
|
|
.SH VERSIONS
|
|
This system call is provided on the PowerPC architecture
|
|
since Linux 2.6.25.
|
|
The system call is provided only if the kernel is configured with
|
|
.BR CONFIG_PPC_64K_PAGES .
|
|
No library support is provided.
|
|
.SH CONFORMING TO
|
|
This system call is Linux-specific.
|
|
.SH NOTES
|
|
Glibc does not provide a wrapper for this system call; call it using
|
|
.BR syscall (2).
|
|
|
|
Normal page protections (at the 64-kB page level) also apply;
|
|
the subpage protection mechanism is an additional constraint,
|
|
so putting 0 in a 2-bit field won't allow writes to a page that is otherwise
|
|
write-protected.
|
|
.SS Rationale
|
|
This system call is provided to assist writing emulators that
|
|
operate using 64-kB pages on PowerPC systems.
|
|
When emulating systems such as x86, which uses a smaller page size,
|
|
the emulator can no longer use the memory-management unit (MMU)
|
|
and normal system calls for controlling page protections.
|
|
(The emulator could emulate the MMU by checking and possibly remapping
|
|
the address for each memory access in software, but that is slow.)
|
|
The idea is that the emulator supplies an array of protection masks
|
|
to apply to a specified range of virtual addresses.
|
|
These masks are applied at the level where hardware page-table entries (PTEs)
|
|
are inserted into the hardware page table based on the Linux PTEs,
|
|
so the Linux PTEs are not affected.
|
|
Implicit in this is that the regions of the address space that are
|
|
protected are switched to use 4-kB hardware pages rather than 64-kB
|
|
hardware pages (on machines with hardware 64-kB page support).
|
|
.\" In the initial implementation, it was the case that:
|
|
.\" In fact the whole process is switched to use 4k hardware pages when the
|
|
.\" subpage_prot system call is used, but this could be improved in future
|
|
.\" to switch only the affected segments.
|
|
.\" But Paul Mackerass says (Oct 2010): I'm pretty sure we now only switch
|
|
.\" the affected segment, not the whole process.
|
|
.SH SEE ALSO
|
|
.BR mprotect (2),
|
|
.BR syscall (2)
|
|
|
|
.IR Documentation/vm/hugetlbpage.txt
|
|
in the Linux kernel source tree
|