~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/arch/powerpc/dexcr.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. SPDX-License-Identifier: GPL-2.0-or-later
  2 
  3 ==========================================
  4 DEXCR (Dynamic Execution Control Register)
  5 ==========================================
  6 
  7 Overview
  8 ========
  9 
 10 The DEXCR is a privileged special purpose register (SPR) introduced in
 11 PowerPC ISA 3.1B (Power10) that allows per-cpu control over several dynamic
 12 execution behaviours. These behaviours include speculation (e.g., indirect
 13 branch target prediction) and enabling return-oriented programming (ROP)
 14 protection instructions.
 15 
 16 The execution control is exposed in hardware as up to 32 bits ('aspects') in
 17 the DEXCR. Each aspect controls a certain behaviour, and can be set or cleared
 18 to enable/disable the aspect. There are several variants of the DEXCR for
 19 different purposes:
 20 
 21 DEXCR
 22     A privileged SPR that can control aspects for userspace and kernel space
 23 HDEXCR
 24     A hypervisor-privileged SPR that can control aspects for the hypervisor and
 25     enforce aspects for the kernel and userspace.
 26 UDEXCR
 27     An optional ultravisor-privileged SPR that can control aspects for the ultravisor.
 28 
 29 Userspace can examine the current DEXCR state using a dedicated SPR that
 30 provides a non-privileged read-only view of the userspace DEXCR aspects.
 31 There is also an SPR that provides a read-only view of the hypervisor enforced
 32 aspects, which ORed with the userspace DEXCR view gives the effective DEXCR
 33 state for a process.
 34 
 35 
 36 Configuration
 37 =============
 38 
 39 prctl
 40 -----
 41 
 42 A process can control its own userspace DEXCR value using the
 43 ``PR_PPC_GET_DEXCR`` and ``PR_PPC_SET_DEXCR`` pair of
 44 :manpage:`prctl(2)` commands. These calls have the form::
 45 
 46     prctl(PR_PPC_GET_DEXCR, unsigned long which, 0, 0, 0);
 47     prctl(PR_PPC_SET_DEXCR, unsigned long which, unsigned long ctrl, 0, 0);
 48 
 49 The possible 'which' and 'ctrl' values are as follows. Note there is no relation
 50 between the 'which' value and the DEXCR aspect's index.
 51 
 52 .. flat-table::
 53    :header-rows: 1
 54    :widths: 2 7 1
 55 
 56    * - ``prctl()`` which
 57      - Aspect name
 58      - Aspect index
 59 
 60    * - ``PR_PPC_DEXCR_SBHE``
 61      - Speculative Branch Hint Enable (SBHE)
 62      - 0
 63 
 64    * - ``PR_PPC_DEXCR_IBRTPD``
 65      - Indirect Branch Recurrent Target Prediction Disable (IBRTPD)
 66      - 3
 67 
 68    * - ``PR_PPC_DEXCR_SRAPD``
 69      - Subroutine Return Address Prediction Disable (SRAPD)
 70      - 4
 71 
 72    * - ``PR_PPC_DEXCR_NPHIE``
 73      - Non-Privileged Hash Instruction Enable (NPHIE)
 74      - 5
 75 
 76 .. flat-table::
 77    :header-rows: 1
 78    :widths: 2 8
 79 
 80    * - ``prctl()`` ctrl
 81      - Meaning
 82 
 83    * - ``PR_PPC_DEXCR_CTRL_EDITABLE``
 84      - This aspect can be configured with PR_PPC_SET_DEXCR (get only)
 85 
 86    * - ``PR_PPC_DEXCR_CTRL_SET``
 87      - This aspect is set / set this aspect
 88 
 89    * - ``PR_PPC_DEXCR_CTRL_CLEAR``
 90      - This aspect is clear / clear this aspect
 91 
 92    * - ``PR_PPC_DEXCR_CTRL_SET_ONEXEC``
 93      - This aspect will be set after exec / set this aspect after exec
 94 
 95    * - ``PR_PPC_DEXCR_CTRL_CLEAR_ONEXEC``
 96      - This aspect will be clear after exec / clear this aspect after exec
 97 
 98 Note that
 99 
100 * which is a plain value, not a bitmask. Aspects must be worked with individually.
101 
102 * ctrl is a bitmask. ``PR_PPC_GET_DEXCR`` returns both the current and onexec
103   configuration. For example, ``PR_PPC_GET_DEXCR`` may return
104   ``PR_PPC_DEXCR_CTRL_EDITABLE | PR_PPC_DEXCR_CTRL_SET |
105   PR_PPC_DEXCR_CTRL_CLEAR_ONEXEC``. This would indicate the aspect is currently
106   set, it will be cleared when you run exec, and you can change this with the
107   ``PR_PPC_SET_DEXCR`` prctl.
108 
109 * The set/clear terminology refers to setting/clearing the bit in the DEXCR.
110   For example::
111 
112       prctl(PR_PPC_SET_DEXCR, PR_PPC_DEXCR_IBRTPD, PR_PPC_DEXCR_CTRL_SET, 0, 0);
113 
114   will set the IBRTPD aspect bit in the DEXCR, causing indirect branch prediction
115   to be disabled.
116 
117 * The status returned by ``PR_PPC_GET_DEXCR`` represents what value the process
118   would like applied. It does not include any alternative overrides, such as if
119   the hypervisor is enforcing the aspect be set. To see the true DEXCR state
120   software should read the appropriate SPRs directly.
121 
122 * The aspect state when starting a process is copied from the parent's state on
123   :manpage:`fork(2)`. The state is reset to a fixed value on
124   :manpage:`execve(2)`. The PR_PPC_SET_DEXCR prctl() can control both of these
125   values.
126 
127 * The ``*_ONEXEC`` controls do not change the current process's DEXCR.
128 
129 Use ``PR_PPC_SET_DEXCR`` with one of ``PR_PPC_DEXCR_CTRL_SET`` or
130 ``PR_PPC_DEXCR_CTRL_CLEAR`` to edit a given aspect.
131 
132 Common error codes for both getting and setting the DEXCR are as follows:
133 
134 .. flat-table::
135    :header-rows: 1
136    :widths: 2 8
137 
138    * - Error
139      - Meaning
140 
141    * - ``EINVAL``
142      - The DEXCR is not supported by the kernel.
143 
144    * - ``ENODEV``
145      - The aspect is not recognised by the kernel or not supported by the
146        hardware.
147 
148 ``PR_PPC_SET_DEXCR`` may also report the following error codes:
149 
150 .. flat-table::
151    :header-rows: 1
152    :widths: 2 8
153 
154    * - Error
155      - Meaning
156 
157    * - ``EINVAL``
158      - The ctrl value contains unrecognised flags.
159 
160    * - ``EINVAL``
161      - The ctrl value contains mutually conflicting flags (e.g.,
162        ``PR_PPC_DEXCR_CTRL_SET | PR_PPC_DEXCR_CTRL_CLEAR``)
163 
164    * - ``EPERM``
165      - This aspect cannot be modified with prctl() (check for the
166        PR_PPC_DEXCR_CTRL_EDITABLE flag with PR_PPC_GET_DEXCR).
167 
168    * - ``EPERM``
169      - The process does not have sufficient privilege to perform the operation.
170        For example, clearing NPHIE on exec is a privileged operation (a process
171        can still clear its own NPHIE aspect without privileges).
172 
173 This interface allows a process to control its own DEXCR aspects, and also set
174 the initial DEXCR value for any children in its process tree (up to the next
175 child to use an ``*_ONEXEC`` control). This allows fine-grained control over the
176 default value of the DEXCR, for example allowing containers to run with different
177 default values.
178 
179 
180 coredump and ptrace
181 ===================
182 
183 The userspace values of the DEXCR and HDEXCR (in this order) are exposed under
184 ``NT_PPC_DEXCR``. These are each 64 bits and readonly, and are intended to
185 assist with core dumps. The DEXCR may be made writable in future. The top 32
186 bits of both registers (corresponding to the non-userspace bits) are masked off.
187 
188 If the kernel config ``CONFIG_CHECKPOINT_RESTORE`` is enabled, then
189 ``NT_PPC_HASHKEYR`` is available and exposes the HASHKEYR value of the process
190 for reading and writing. This is a tradeoff between increased security and
191 checkpoint/restore support: a process should normally have no need to know its
192 secret key, but restoring a process requires setting its original key. The key
193 therefore appears in core dumps, and an attacker may be able to retrieve it from
194 a coredump and effectively bypass ROP protection on any threads that share this
195 key (potentially all threads from the same parent that have not run ``exec()``).

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php