aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/arm/bits/rseq.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/arm/bits/rseq.h')
-rw-r--r--sysdeps/unix/sysv/linux/arm/bits/rseq.h83
1 files changed, 0 insertions, 83 deletions
diff --git a/sysdeps/unix/sysv/linux/arm/bits/rseq.h b/sysdeps/unix/sysv/linux/arm/bits/rseq.h
deleted file mode 100644
index 2bf780efcd..0000000000
--- a/sysdeps/unix/sysv/linux/arm/bits/rseq.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Restartable Sequences Linux arm architecture header.
- Copyright (C) 2020 Free Software Foundation, Inc.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _SYS_RSEQ_H
-# error "Never use <bits/rseq.h> directly; include <sys/rseq.h> instead."
-#endif
-
-/*
- RSEQ_SIG is a signature required before each abort handler code.
-
- It is a 32-bit value that maps to actual architecture code compiled
- into applications and libraries. It needs to be defined for each
- architecture. When choosing this value, it needs to be taken into
- account that generating invalid instructions may have ill effects on
- tools like objdump, and may also have impact on the CPU speculative
- execution efficiency in some cases.
-
- - ARM little endian
-
- RSEQ_SIG uses the udf A32 instruction with an uncommon immediate operand
- value 0x5de3. This traps if user-space reaches this instruction by mistake,
- and the uncommon operand ensures the kernel does not move the instruction
- pointer to attacker-controlled code on rseq abort.
-
- The instruction pattern in the A32 instruction set is:
-
- e7f5def3 udf #24035 ; 0x5de3
-
- This translates to the following instruction pattern in the T16 instruction
- set:
-
- little endian:
- def3 udf #243 ; 0xf3
- e7f5 b.n <7f5>
-
- - ARMv6+ big endian (BE8):
-
- ARMv6+ -mbig-endian generates mixed endianness code vs data: little-endian
- code and big-endian data. The data value of the signature needs to have its
- byte order reversed to generate the trap instruction:
-
- Data: 0xf3def5e7
-
- Translates to this A32 instruction pattern:
-
- e7f5def3 udf #24035 ; 0x5de3
-
- Translates to this T16 instruction pattern:
-
- def3 udf #243 ; 0xf3
- e7f5 b.n <7f5>
-
- - Prior to ARMv6 big endian (BE32):
-
- Prior to ARMv6, -mbig-endian generates big-endian code and data
- (which match), so the endianness of the data representation of the
- signature should not be reversed. However, the choice between BE32
- and BE8 is done by the linker, so we cannot know whether code and
- data endianness will be mixed before the linker is invoked. So rather
- than try to play tricks with the linker, the rseq signature is simply
- data (not a trap instruction) prior to ARMv6 on big endian. This is
- why the signature is expressed as data (.word) rather than as
- instruction (.inst) in assembler. */
-
-#ifdef __ARMEB__
-# define RSEQ_SIG 0xf3def5e7 /* udf #24035 ; 0x5de3 (ARMv6+) */
-#else
-# define RSEQ_SIG 0xe7f5def3 /* udf #24035 ; 0x5de3 */
-#endif