socsvn commit: r269064 - soc2014/op/freebsd-base/sys/amd64/amd64
op at FreeBSD.org
op at FreeBSD.org
Wed Jun 4 14:42:51 UTC 2014
Author: op
Date: Wed Jun 4 14:42:50 2014
New Revision: 269064
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269064
Log:
SMAP AMD64: added stac and clac to funtions which live in support.S and interacted with user-space
git: https://github.com/opntr/opBSD/tree/op/gsoc2014/smap
Signed-off-by: Oliver Pinter <oliver.pntr at gmail.com>
Modified:
soc2014/op/freebsd-base/sys/amd64/amd64/support.S
Modified: soc2014/op/freebsd-base/sys/amd64/amd64/support.S
==============================================================================
--- soc2014/op/freebsd-base/sys/amd64/amd64/support.S Wed Jun 4 14:42:13 2014 (r269063)
+++ soc2014/op/freebsd-base/sys/amd64/amd64/support.S Wed Jun 4 14:42:50 2014 (r269064)
@@ -203,6 +203,9 @@
* These routines set curpcb->pcb_onfault for the time they execute. When a
* protection violation occurs inside the functions, the trap handler
* returns to *curpcb->pcb_onfault instead of the function.
+ *
+ * Warning: when Intel SMAP are enabled on CPU, the EFLAGS.AC bit gets
+ * cleared before reaches the fault handler.
*/
/*
@@ -244,12 +247,16 @@
shrq $3,%rcx
cld
+ stac /* open user-space */
rep
movsq
+ clac /* close user-space */
movb %dl,%cl
andb $7,%cl
+ stac /* open user-space */
rep
movsb
+ clac /* close user-space */
done_copyout:
xorl %eax,%eax
@@ -259,6 +266,9 @@
ALIGN_TEXT
copyout_fault:
+ /*
+ * WARNING: on fault EFLAGS.AC gets cleared by Intel SMAP if available
+ */
movq PCPU(CURPCB),%rdx
movq $0,PCB_ONFAULT(%rdx)
movq $EFAULT,%rax
@@ -290,12 +300,16 @@
movb %cl,%al
shrq $3,%rcx /* copy longword-wise */
cld
+ stac /* open user-space */
rep
movsq
+ clac /* close user-space */
movb %al,%cl
andb $7,%cl /* copy remaining bytes */
+ stac /* open user-space */
rep
movsb
+ clac /* close user-space */
done_copyin:
xorl %eax,%eax
@@ -305,6 +319,9 @@
ALIGN_TEXT
copyin_fault:
+ /*
+ * WARNING: on fault EFLAGS.AC gets cleared by Intel SMAP if available
+ */
movq PCPU(CURPCB),%rdx
movq $0,PCB_ONFAULT(%rdx)
movq $EFAULT,%rax
@@ -324,10 +341,12 @@
ja fusufault
movl %esi,%eax /* old */
+ stac /* open user-space */
#ifdef SMP
lock
#endif
cmpxchgl %edx,(%rdi) /* new = %edx */
+ clac /* close user-space */
/*
* The old value is in %eax. If the store succeeded it will be the
@@ -353,10 +372,12 @@
ja fusufault
movq %rsi,%rax /* old */
+ stac /* open user-space */
#ifdef SMP
lock
#endif
cmpxchgq %rdx,(%rdi) /* new = %rdx */
+ clac /* close user-space */
/*
* The old value is in %eax. If the store succeeded it will be the
@@ -385,7 +406,9 @@
cmpq %rax,%rdi /* verify address is valid */
ja fusufault
+ stac /* open user-space */
movq (%rdi),%rax
+ clac /* close user-space */
movq $0,PCB_ONFAULT(%rcx)
ret
END(fuword64)
@@ -399,7 +422,9 @@
cmpq %rax,%rdi /* verify address is valid */
ja fusufault
+ stac /* open user-space */
movl (%rdi),%eax
+ clac /* close user-space */
movq $0,PCB_ONFAULT(%rcx)
ret
END(fuword32)
@@ -426,7 +451,9 @@
cmpq %rax,%rdi
ja fusufault
+ stac /* open user-space */
movzwl (%rdi),%eax
+ clac /* close user-space */
movq $0,PCB_ONFAULT(%rcx)
ret
END(fuword16)
@@ -439,13 +466,18 @@
cmpq %rax,%rdi
ja fusufault
+ stac /* open user-space */
movzbl (%rdi),%eax
+ clac /* close user-space */
movq $0,PCB_ONFAULT(%rcx)
ret
END(fubyte)
ALIGN_TEXT
fusufault:
+ /*
+ * WARNING: on fault EFLAGS.AC gets cleared by Intel SMAP if available
+ */
movq PCPU(CURPCB),%rcx
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%rcx)
@@ -466,7 +498,9 @@
cmpq %rax,%rdi /* verify address validity */
ja fusufault
+ stac /* open user-space */
movq %rsi,(%rdi)
+ clac /* close user-space */
xorl %eax,%eax
movq PCPU(CURPCB),%rcx
movq %rax,PCB_ONFAULT(%rcx)
@@ -482,7 +516,9 @@
cmpq %rax,%rdi /* verify address validity */
ja fusufault
+ stac /* open user-space */
movl %esi,(%rdi)
+ clac /* close user-space */
xorl %eax,%eax
movq PCPU(CURPCB),%rcx
movq %rax,PCB_ONFAULT(%rcx)
@@ -497,7 +533,9 @@
cmpq %rax,%rdi /* verify address validity */
ja fusufault
+ stac /* open user-space */
movw %si,(%rdi)
+ clac /* close user-space */
xorl %eax,%eax
movq PCPU(CURPCB),%rcx /* restore trashed register */
movq %rax,PCB_ONFAULT(%rcx)
@@ -513,7 +551,9 @@
ja fusufault
movl %esi,%eax
+ stac /* open user-space */
movb %al,(%rdi)
+ clac /* close user-space */
xorl %eax,%eax
movq PCPU(CURPCB),%rcx /* restore trashed register */
movq %rax,PCB_ONFAULT(%rcx)
@@ -555,7 +595,9 @@
decq %rdx
jz 3f
+ stac /* open user-space */
lodsb
+ clac /* close user-space */
stosb
orb %al,%al
jnz 2b
@@ -584,7 +626,9 @@
testq %r9,%r9
jz 1f
subq %rdx,%r8
+ stac /* open user-space */
movq %r8,(%r9)
+ clac /* close user-space */
1:
ret
END(copyinstr)
More information about the svn-soc-all
mailing list