svn commit: r338828 - head/sys/amd64/amd64

Mateusz Guzik mjg at FreeBSD.org
Thu Sep 20 13:29:44 UTC 2018


Author: mjg
Date: Thu Sep 20 13:29:43 2018
New Revision: 338828
URL: https://svnweb.freebsd.org/changeset/base/338828

Log:
  amd64: move fusufault after all users
  
  A lot of function have the following check:
          cmpq    %rax,%rdi                       /* verify address is valid */
          ja      fusufault
  
  The label is present earlier in kernel .text, which means this is a jump
  backwards. Absent any information in branch predictor, the cpu predicts it
  as taken. Since it is almost never taken in practice, this results in a
  completely avoidable misprediction.
  
  Move it past all consumers, so that it is predicted as not taken.
  
  Approved by:	re (kib)

Modified:
  head/sys/amd64/amd64/support.S

Modified: head/sys/amd64/amd64/support.S
==============================================================================
--- head/sys/amd64/amd64/support.S	Thu Sep 20 11:44:36 2018	(r338827)
+++ head/sys/amd64/amd64/support.S	Thu Sep 20 13:29:43 2018	(r338828)
@@ -755,16 +755,6 @@ ENTRY(fubyte_smap)
 	ret
 END(fubyte_smap)
 
-	ALIGN_TEXT
-	/* Fault entry clears PSL.AC */
-fusufault:
-	movq	PCPU(CURPCB),%rcx
-	xorl	%eax,%eax
-	movq	%rax,PCB_ONFAULT(%rcx)
-	decq	%rax
-	POP_FRAME_POINTER
-	ret
-
 /*
  * Store a 64-bit word, a 32-bit word, a 16-bit word, or an 8-bit byte to
  * user memory.
@@ -915,6 +905,16 @@ ENTRY(subyte_smap)
 	POP_FRAME_POINTER
 	ret
 END(subyte_smap)
+
+	ALIGN_TEXT
+	/* Fault entry clears PSL.AC */
+fusufault:
+	movq	PCPU(CURPCB),%rcx
+	xorl	%eax,%eax
+	movq	%rax,PCB_ONFAULT(%rcx)
+	decq	%rax
+	POP_FRAME_POINTER
+	ret
 
 /*
  * copyinstr(from, to, maxlen, int *lencopied)


More information about the svn-src-head mailing list