Module Name: src
Committed By: maxv
Date: Thu Mar 29 07:21:25 UTC 2018
Modified Files:
src/sys/arch/amd64/amd64: locore.S
src/sys/arch/x86/x86: spectre.c
Log Message:
Allow IBRS to be disabled dynamically.
To generate a diff of this commit:
cvs rdiff -u -r1.161 -r1.162 src/sys/arch/amd64/amd64/locore.S
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/x86/x86/spectre.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/locore.S
diff -u src/sys/arch/amd64/amd64/locore.S:1.161 src/sys/arch/amd64/amd64/locore.S:1.162
--- src/sys/arch/amd64/amd64/locore.S:1.161 Wed Mar 28 19:56:40 2018
+++ src/sys/arch/amd64/amd64/locore.S Thu Mar 29 07:21:24 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.161 2018/03/28 19:56:40 maxv Exp $ */
+/* $NetBSD: locore.S,v 1.162 2018/03/29 07:21:24 maxv Exp $ */
/*
* Copyright-o-rama!
@@ -1682,3 +1682,11 @@ LABEL(ibrs_leave)
wrmsr
1234:
LABEL(ibrs_leave_end)
+
+LABEL(noibrs_enter)
+ NOIBRS_ENTER
+LABEL(noibrs_enter_end)
+
+LABEL(noibrs_leave)
+ NOIBRS_LEAVE
+LABEL(noibrs_leave_end)
Index: src/sys/arch/x86/x86/spectre.c
diff -u src/sys/arch/x86/x86/spectre.c:1.4 src/sys/arch/x86/x86/spectre.c:1.5
--- src/sys/arch/x86/x86/spectre.c:1.4 Thu Mar 29 07:15:12 2018
+++ src/sys/arch/x86/x86/spectre.c Thu Mar 29 07:21:24 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: spectre.c,v 1.4 2018/03/29 07:15:12 maxv Exp $ */
+/* $NetBSD: spectre.c,v 1.5 2018/03/29 07:21:24 maxv Exp $ */
/*
* Copyright (c) 2018 NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spectre.c,v 1.4 2018/03/29 07:15:12 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spectre.c,v 1.5 2018/03/29 07:21:24 maxv Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -129,6 +129,28 @@ static volatile unsigned long ibrs_cpu_b
static volatile unsigned long ibrs_cpu_barrier2 __cacheline_aligned;
static void
+ibrs_disable_hotpatch(void)
+{
+ extern uint8_t noibrs_enter, noibrs_enter_end;
+ extern uint8_t noibrs_leave, noibrs_leave_end;
+ u_long psl, cr0;
+ uint8_t *bytes;
+ size_t size;
+
+ x86_patch_window_open(&psl, &cr0);
+
+ bytes = &noibrs_enter;
+ size = (size_t)&noibrs_enter_end - (size_t)&noibrs_enter;
+ x86_hotpatch(HP_NAME_IBRS_ENTER, bytes, size);
+
+ bytes = &noibrs_leave;
+ size = (size_t)&noibrs_leave_end - (size_t)&noibrs_leave;
+ x86_hotpatch(HP_NAME_IBRS_LEAVE, bytes, size);
+
+ x86_patch_window_close(psl, cr0);
+}
+
+static void
ibrs_enable_hotpatch(void)
{
extern uint8_t ibrs_enter, ibrs_enter_end;
@@ -170,10 +192,14 @@ ibrs_change_cpu(void *arg1, void *arg2)
if (enabled) {
ibrs_enable_hotpatch();
} else {
- /* TODO */
+ ibrs_disable_hotpatch();
}
}
+ if (!enabled) {
+ wrmsr(MSR_IA32_SPEC_CTRL, 0);
+ }
+
atomic_dec_ulong(&ibrs_cpu_barrier2);
while (atomic_cas_ulong(&ibrs_cpu_barrier2, 0, 0) != 0) {
x86_pause();