summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2020-02-16 09:33:48 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2020-02-16 09:33:48 +0000
commitad579a7eb1c6c386b8f4f0af9d727a05e2592e05 (patch)
treee082d24154bf1fb87aac5c324c866f5d44d34f98 /sys/arch
parent2cd26457d696b252618618426b29f7790bc3e9b1 (diff)
Change arm64 system call ABI to skip two instructions. This allows us to
insert a barrier after each system call to address a speculative execution issue discovered by Anthony Steinhauser. A change to insert two nop instructions after each system call instruction in crt0.o/libc/ld.so has been committed a few weeks ago, so the transition should go smoothly. However, old static binaries and binaries that roll their own syscalls (like go) will no longer work. Snapshot packages that work with the new syscall ABI are available (including a fixed go). Together with deraadt@ and guenther@ ok deraadt@
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/arm64/arm64/locore.S10
-rw-r--r--sys/arch/arm64/arm64/syscall.c7
2 files changed, 10 insertions, 7 deletions
diff --git a/sys/arch/arm64/arm64/locore.S b/sys/arch/arm64/arm64/locore.S
index 849604ece00..f0eff2b4246 100644
--- a/sys/arch/arm64/arm64/locore.S
+++ b/sys/arch/arm64/arm64/locore.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.S,v 1.28 2020/02/02 18:55:46 deraadt Exp $ */
+/* $OpenBSD: locore.S,v 1.29 2020/02/16 09:33:47 kettenis Exp $ */
/*-
* Copyright (c) 2012-2014 Andrew Turner
* All rights reserved.
@@ -347,16 +347,16 @@ _C_LABEL(sigcode):
1:
mov x8, #SYS_sigreturn
svc 0
+ dsb nsh
+ isb
.globl _C_LABEL(sigcoderet)
_C_LABEL(sigcoderet):
- nop
- nop
/* sigreturn failed, exit */
mov x8, #SYS_exit
svc 0
- nop
- nop
+ dsb nsh
+ isb
b 1b
END(sigcode)
diff --git a/sys/arch/arm64/arm64/syscall.c b/sys/arch/arm64/arm64/syscall.c
index 865dd68bbc2..9c530d049bd 100644
--- a/sys/arch/arm64/arm64/syscall.c
+++ b/sys/arch/arm64/arm64/syscall.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: syscall.c,v 1.4 2020/01/26 01:11:50 kettenis Exp $ */
+/* $OpenBSD: syscall.c,v 1.5 2020/02/16 09:33:47 kettenis Exp $ */
/*
* Copyright (c) 2015 Dale Rahn <drahn@dalerahn.com>
*
@@ -50,6 +50,9 @@ svc_handler(trapframe_t *frame)
if (__predict_true((frame->tf_spsr & I_bit) == 0))
enable_interrupts();
+ /* Skip over barrier. */
+ frame->tf_elr += 8;
+
code = frame->tf_x[8];
ap = &frame->tf_x[0];
@@ -100,7 +103,7 @@ svc_handler(trapframe_t *frame)
/*
* Reconstruct the pc to point at the svc.
*/
- frame->tf_elr -= 4;
+ frame->tf_elr -= 12;
break;
case EJUSTRETURN: