ebdb6f2377
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
18 lines
581 B
Plaintext
18 lines
581 B
Plaintext
LIB1ASMSRC = arm/lib1funcs.S
|
|
LIB1ASMFUNCS = _thumb1_case_sqi _thumb1_case_uqi _thumb1_case_shi \
|
|
_thumb1_case_uhi _thumb1_case_si _speculation_barrier
|
|
|
|
HAVE_CMSE:=$(findstring __ARM_FEATURE_CMSE,$(shell $(gcc_compile_bare) -dM -E - </dev/null))
|
|
ifneq ($(shell $(gcc_compile_bare) -E -mcmse - </dev/null 2>/dev/null),)
|
|
CMSE_OPTS:=-mcmse
|
|
endif
|
|
|
|
ifdef HAVE_CMSE
|
|
libgcc-objects += cmse.o cmse_nonsecure_call.o
|
|
|
|
cmse.o: $(srcdir)/config/arm/cmse.c
|
|
$(gcc_compile) -c $(CMSE_OPTS) $<
|
|
cmse_nonsecure_call.o: $(srcdir)/config/arm/cmse_nonsecure_call.S
|
|
$(gcc_compile) -c $<
|
|
endif
|