1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
--- sys/amd64/amd64/support.S.orig
+++ sys/amd64/amd64/support.S
@@ -919,9 +919,11 @@
END(copyin_smap_erms)
ALIGN_TEXT
- /* Trap entry clears PSL.AC */
copy_fault:
- movq $0,PCB_ONFAULT(%r11)
+ testl $CPUID_STDEXT_SMAP,cpu_stdext_feature(%rip)
+ je 1f
+ clac
+1: movq $0,PCB_ONFAULT(%r11)
movl $EFAULT,%eax
POP_FRAME_POINTER
ret
@@ -1358,9 +1360,11 @@
END(subyte_smap)
ALIGN_TEXT
- /* Fault entry clears PSL.AC */
fusufault:
- movq PCPU(CURPCB),%rcx
+ testl $CPUID_STDEXT_SMAP,cpu_stdext_feature(%rip)
+ je 1f
+ clac
+1: movq PCPU(CURPCB),%rcx
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%rcx)
decq %rax
@@ -1443,8 +1447,10 @@
END(copyinstr_smap)
cpystrflt:
- /* Fault entry clears PSL.AC */
- movl $EFAULT,%eax
+ testl $CPUID_STDEXT_SMAP,cpu_stdext_feature(%rip)
+ je 1f
+ clac
+1: movl $EFAULT,%eax
cpystrflt_x:
/* set *lencopied and return %eax */
movq $0,PCB_ONFAULT(%r9)
--- sys/amd64/linux/linux_support.s.orig
+++ sys/amd64/linux/linux_support.s
@@ -30,11 +30,15 @@
#include "linux_assym.h" /* system definitions */
#include <machine/asmacros.h> /* miscellaneous asm macros */
+#include <machine/specialreg.h>
#include "assym.inc"
futex_fault:
- movq $0,PCB_ONFAULT(%r8)
+ testl $CPUID_STDEXT_SMAP,cpu_stdext_feature(%rip)
+ je 1f
+ clac
+1: movq $0,PCB_ONFAULT(%r8)
movl $-EFAULT,%eax
ret
--- sys/amd64/linux32/linux32_support.s.orig
+++ sys/amd64/linux32/linux32_support.s
@@ -30,11 +30,15 @@
#include "linux32_assym.h" /* system definitions */
#include <machine/asmacros.h> /* miscellaneous asm macros */
+#include <machine/specialreg.h>
#include "assym.inc"
futex_fault:
- movq $0,PCB_ONFAULT(%r8)
+ testl $CPUID_STDEXT_SMAP,cpu_stdext_feature(%rip)
+ je 1f
+ clac
+1: movq $0,PCB_ONFAULT(%r8)
movl $-EFAULT,%eax
ret
|