Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Jan 2014 00:37:21 +0000 (UTC)
From:      "Pedro F. Giffuni" <pfg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r261175 - in head/contrib/binutils: gas/config opcodes
Message-ID:  <201401260037.s0Q0bL0t006626@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pfg
Date: Sun Jan 26 00:37:21 2014
New Revision: 261175
URL: http://svnweb.freebsd.org/changeset/base/261175

Log:
  binutils: add support for Intel SMAP-related instructions
  
  Add support for stac/clac instructions to manipulate the flag
  that controls the behaviour of Intel's Supervisor Mode Access
  Prevention (SMAP) feature.
  
  Tested by:	dim
  Obtained from:	OpenBSD
  MFC after:	5 days

Modified:
  head/contrib/binutils/gas/config/tc-i386.c
  head/contrib/binutils/opcodes/i386-dis.c
  head/contrib/binutils/opcodes/i386-opc.h
  head/contrib/binutils/opcodes/i386-tbl.h

Modified: head/contrib/binutils/gas/config/tc-i386.c
==============================================================================
--- head/contrib/binutils/gas/config/tc-i386.c	Sat Jan 25 23:59:20 2014	(r261174)
+++ head/contrib/binutils/gas/config/tc-i386.c	Sun Jan 26 00:37:21 2014	(r261175)
@@ -1827,7 +1827,7 @@ md_assemble (line)
     {
       expressionS *exp;
 
-      if ((i.tm.cpu_flags & CpuSSE3) && i.operands > 0)
+      if ((i.tm.cpu_flags & (CpuSSE3|CpuSMAP)) && i.operands > 0)
 	{
 	  /* Streaming SIMD extensions 3 Instructions have the fixed
 	     operands with an opcode suffix which is coded in the same

Modified: head/contrib/binutils/opcodes/i386-dis.c
==============================================================================
--- head/contrib/binutils/opcodes/i386-dis.c	Sat Jan 25 23:59:20 2014	(r261174)
+++ head/contrib/binutils/opcodes/i386-dis.c	Sun Jan 26 00:37:21 2014	(r261175)
@@ -6257,6 +6257,16 @@ PNI_Fixup (int extrachar ATTRIBUTE_UNUSE
 
       codep++;
     }
+  else if (modrm.mod == 3 && modrm.reg == 1 && modrm.rm <= 3)
+    {
+      size_t olen = strlen (obuf);
+      char *p = obuf + olen - 4;
+      if (*codep == 0xca)
+        strcpy (p, "clac");
+      else if (*codep == 0xcb)
+        strcpy (p, "stac");
+      codep++;
+    }
   else
     OP_M (0, sizeflag);
 }

Modified: head/contrib/binutils/opcodes/i386-opc.h
==============================================================================
--- head/contrib/binutils/opcodes/i386-opc.h	Sat Jan 25 23:59:20 2014	(r261174)
+++ head/contrib/binutils/opcodes/i386-opc.h	Sun Jan 26 00:37:21 2014	(r261175)
@@ -80,6 +80,7 @@ typedef struct template
 
 #define CpuPCLMUL   0x10000000	/* Carry-less Multiplication extensions */
 #define CpuRdRnd    0x20000000	/* Intel Random Number Generator extensions */
+#define CpuSMAP     0x40000000	/* Intel Supervisor Mode Access Prevention */
 
 /* SSE4.1/4.2 Instructions required */
 #define CpuSSE4	     (CpuSSE4_1|CpuSSE4_2)
@@ -88,7 +89,7 @@ typedef struct template
 #define CpuUnknownFlags (Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 \
 	|CpuP4|CpuSledgehammer|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3|CpuVMX \
 	|Cpu3dnow|Cpu3dnowA|CpuK6|CpuPadLock|CpuSVME|CpuSSSE3|CpuSSE4_1 \
-	|CpuSSE4_2|CpuABM|CpuSSE4a|CpuXSAVE|CpuAES|CpuPCLMUL|CpuRdRnd)
+	|CpuSSE4_2|CpuABM|CpuSSE4a|CpuXSAVE|CpuAES|CpuPCLMUL|CpuRdRnd|CpuSMAP)
 
   /* the bits in opcode_modifier are used to generate the final opcode from
      the base_opcode.  These bits also are used to detect alternate forms of

Modified: head/contrib/binutils/opcodes/i386-tbl.h
==============================================================================
--- head/contrib/binutils/opcodes/i386-tbl.h	Sat Jan 25 23:59:20 2014	(r261174)
+++ head/contrib/binutils/opcodes/i386-tbl.h	Sun Jan 26 00:37:21 2014	(r261175)
@@ -4379,6 +4379,12 @@ const template i386_optab[] =
   {"rdrand", 1, 0x0fc7, 0x6, CpuRdRnd,
     Modrm|NoSuf,
     { Reg16|Reg32|Reg64 } },
+
+  /* Intel Supervisor Mode Access Prevention extensions */
+  {"clac", 0, 0x0f01, 0xca, CpuSMAP,
+    NoSuf|ImmExt, { 0, 0, 0 } },
+  {"stac", 0, 0x0f01, 0xcb, CpuSMAP,
+    NoSuf|ImmExt, { 0, 0, 0 } },
   
   { NULL, 0, 0, 0, 0, 0, { 0 } }
 };



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201401260037.s0Q0bL0t006626>