File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/smap.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       1: /*
       2:  * Supervisor Mode Access Prevention support
       3:  *
       4:  * Copyright (C) 2012 Intel Corporation
       5:  * Author: H. Peter Anvin <hpa@linux.intel.com>
       6:  *
       7:  * This program is free software; you can redistribute it and/or
       8:  * modify it under the terms of the GNU General Public License
       9:  * as published by the Free Software Foundation; version 2
      10:  * of the License.
      11:  */
      12: 
      13: #ifndef _ASM_X86_SMAP_H
      14: #define _ASM_X86_SMAP_H
      15: 
      16: #include <linux/stringify.h>
      17: #include <asm/nops.h>
      18: #include <asm/cpufeature.h>
      19: 
      20: /* "Raw" instruction opcodes */
      21: #define __ASM_CLAC    .byte 0x0f,0x01,0xca
      22: #define __ASM_STAC    .byte 0x0f,0x01,0xcb
      23: 
      24: #ifdef __ASSEMBLY__
      25: 
      26: #include <asm/alternative-asm.h>
      27: 
      28: #ifdef CONFIG_X86_SMAP
      29: 
      30: #define ASM_CLAC                            \
      31:     661: ASM_NOP3 ;                            \
      32:     .pushsection .altinstr_replacement, "ax" ;            \
      33:     662: __ASM_CLAC ;                        \
      34:     .popsection ;                            \
      35:     .pushsection .altinstructions, "a" ;                \
      36:     altinstruction_entry 661b, 662b, X86_FEATURE_SMAP, 3, 3 ;    \
      37:     .popsection
      38: 
      39: #define ASM_STAC                            \
      40:     661: ASM_NOP3 ;                            \
      41:     .pushsection .altinstr_replacement, "ax" ;            \
      42:     662: __ASM_STAC ;                        \
      43:     .popsection ;                            \
      44:     .pushsection .altinstructions, "a" ;                \
      45:     altinstruction_entry 661b, 662b, X86_FEATURE_SMAP, 3, 3 ;    \
      46:     .popsection
      47: 
      48: #else /* CONFIG_X86_SMAP */
      49: 
      50: #define ASM_CLAC
      51: #define ASM_STAC
      52: 
      53: #endif /* CONFIG_X86_SMAP */
      54: 
      55: #else /* __ASSEMBLY__ */
      56: 
      57: #include <asm/alternative.h>
      58: 
      59: #ifdef CONFIG_X86_SMAP
      60: 
      61: static __always_inline void clac(void)
      62: {
      63:     /* Note: a barrier is implicit in alternative() */
      64:     alternative(ASM_NOP3, __stringify(__ASM_CLAC), X86_FEATURE_SMAP);
      65: }
      66: 
      67: static __always_inline void stac(void)
      68: {
      69:     /* Note: a barrier is implicit in alternative() */
      70:     alternative(ASM_NOP3, __stringify(__ASM_STAC), X86_FEATURE_SMAP);
      71: }
      72: 
      73: /* These macros can be used in asm() statements */
      74: #define ASM_CLAC \
      75:     ALTERNATIVE(ASM_NOP3, __stringify(__ASM_CLAC), X86_FEATURE_SMAP)
      76: #define ASM_STAC \
      77:     ALTERNATIVE(ASM_NOP3, __stringify(__ASM_STAC), X86_FEATURE_SMAP)
      78: 
      79: #else /* CONFIG_X86_SMAP */
      80: 
      81: static inline void clac(void) { }
      82: static inline void stac(void) { }
      83: 
      84: #define ASM_CLAC
      85: #define ASM_STAC
      86: 
      87: #endif /* CONFIG_X86_SMAP */
      88: 
      89: #endif /* __ASSEMBLY__ */
      90: 
      91: #endif /* _ASM_X86_SMAP_H */
      92: