]> git.ipfire.org Git - thirdparty/gcc.git/commit - gcc/config/arm/arm-protos.h
PR target/86951 arm - Handle speculation barriers on pre-armv7 CPUs
authorRichard Earnshaw <rearnsha@arm.com>
Thu, 23 Aug 2018 09:47:34 +0000 (09:47 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Thu, 23 Aug 2018 09:47:34 +0000 (09:47 +0000)
commitebdb6f237772df251378d2c08350d345135bcb9e
tree6a3c701b592c1d8f41cc87152a53e5dda03dd473
parent60d91c7fae77fe6b7bd50a8b400a045b813e330f
PR target/86951 arm - Handle speculation barriers on pre-armv7 CPUs

The AArch32 instruction sets prior to Armv7 do not define the ISB and
DSB instructions that are needed to form a speculation barrier.  While
I do not know of any instances of cores based on those instruction
sets being vulnerable to speculative side channel attacks it is
possible to run code built for those ISAs on more recent hardware
where they would become vulnerable.

This patch works around this by using a library call added to libgcc.
That code can then take any platform-specific actions necessary to
ensure safety.

For the moment I've only handled two cases: the library code being
built for armv7 or later anyway and running on Linux.

On Linux we can handle this by calling the kernel function that will
flush a small amount of cache.  Such a sequence ends with a ISB+DSB
sequence if running on an Armv7 or later CPU.

gcc:

PR target/86951
* config/arm/arm-protos.h (arm_emit_speculation_barrier): New
prototype.
* config/arm/arm.c (speculation_barrier_libfunc): New static
variable.
(arm_init_libfuncs): Initialize it.
(arm_emit_speculation_barrier): New function.
* config/arm/arm.md (speculation_barrier): Call
arm_emit_speculation_barrier for architectures that do not have
DSB or ISB.
(speculation_barrier_insn): Only match on Armv7 or later.

libgcc:

PR target/86951
* config/arm/lib1funcs.asm (speculation_barrier): New function.
* config/arm/t-arm (LIB1ASMFUNCS): Add it to list of functions
to build.

From-SVN: r263806
gcc/ChangeLog
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.c
gcc/config/arm/arm.md
libgcc/ChangeLog
libgcc/config/arm/lib1funcs.S
libgcc/config/arm/t-arm