File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/nops.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: #ifndef _ASM_X86_NOPS_H
       2: #define _ASM_X86_NOPS_H
       3: 
       4: /*
       5:  * Define nops for use with alternative() and for tracing.
       6:  *
       7:  * *_NOP5_ATOMIC must be a single instruction.
       8:  */
       9: 
      10: #define NOP_DS_PREFIX 0x3e
      11: 
      12: /* generic versions from gas
      13:    1: nop
      14:    the following instructions are NOT nops in 64-bit mode,
      15:    for 64-bit mode use K8 or P6 nops instead
      16:    2: movl %esi,%esi
      17:    3: leal 0x00(%esi),%esi
      18:    4: leal 0x00(,%esi,1),%esi
      19:    6: leal 0x00000000(%esi),%esi
      20:    7: leal 0x00000000(,%esi,1),%esi
      21: */
      22: #define GENERIC_NOP1 0x90
      23: #define GENERIC_NOP2 0x89,0xf6
      24: #define GENERIC_NOP3 0x8d,0x76,0x00
      25: #define GENERIC_NOP4 0x8d,0x74,0x26,0x00
      26: #define GENERIC_NOP5 GENERIC_NOP1,GENERIC_NOP4
      27: #define GENERIC_NOP6 0x8d,0xb6,0x00,0x00,0x00,0x00
      28: #define GENERIC_NOP7 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00
      29: #define GENERIC_NOP8 GENERIC_NOP1,GENERIC_NOP7
      30: #define GENERIC_NOP5_ATOMIC NOP_DS_PREFIX,GENERIC_NOP4
      31: 
      32: /* Opteron 64bit nops
      33:    1: nop
      34:    2: osp nop
      35:    3: osp osp nop
      36:    4: osp osp osp nop
      37: */
      38: #define K8_NOP1 GENERIC_NOP1
      39: #define K8_NOP2    0x66,K8_NOP1
      40: #define K8_NOP3    0x66,K8_NOP2
      41: #define K8_NOP4    0x66,K8_NOP3
      42: #define K8_NOP5    K8_NOP3,K8_NOP2
      43: #define K8_NOP6    K8_NOP3,K8_NOP3
      44: #define K8_NOP7    K8_NOP4,K8_NOP3
      45: #define K8_NOP8    K8_NOP4,K8_NOP4
      46: #define K8_NOP5_ATOMIC 0x66,K8_NOP4
      47: 
      48: /* K7 nops
      49:    uses eax dependencies (arbitrary choice)
      50:    1: nop
      51:    2: movl %eax,%eax
      52:    3: leal (,%eax,1),%eax
      53:    4: leal 0x00(,%eax,1),%eax
      54:    6: leal 0x00000000(%eax),%eax
      55:    7: leal 0x00000000(,%eax,1),%eax
      56: */
      57: #define K7_NOP1    GENERIC_NOP1
      58: #define K7_NOP2    0x8b,0xc0
      59: #define K7_NOP3    0x8d,0x04,0x20
      60: #define K7_NOP4    0x8d,0x44,0x20,0x00
      61: #define K7_NOP5    K7_NOP4,K7_NOP1
      62: #define K7_NOP6    0x8d,0x80,0,0,0,0
      63: #define K7_NOP7    0x8D,0x04,0x05,0,0,0,0
      64: #define K7_NOP8    K7_NOP7,K7_NOP1
      65: #define K7_NOP5_ATOMIC NOP_DS_PREFIX,K7_NOP4
      66: 
      67: /* P6 nops
      68:    uses eax dependencies (Intel-recommended choice)
      69:    1: nop
      70:    2: osp nop
      71:    3: nopl (%eax)
      72:    4: nopl 0x00(%eax)
      73:    5: nopl 0x00(%eax,%eax,1)
      74:    6: osp nopl 0x00(%eax,%eax,1)
      75:    7: nopl 0x00000000(%eax)
      76:    8: nopl 0x00000000(%eax,%eax,1)
      77:    Note: All the above are assumed to be a single instruction.
      78:     There is kernel code that depends on this.
      79: */
      80: #define P6_NOP1    GENERIC_NOP1
      81: #define P6_NOP2    0x66,0x90
      82: #define P6_NOP3    0x0f,0x1f,0x00
      83: #define P6_NOP4    0x0f,0x1f,0x40,0
      84: #define P6_NOP5    0x0f,0x1f,0x44,0x00,0
      85: #define P6_NOP6    0x66,0x0f,0x1f,0x44,0x00,0
      86: #define P6_NOP7    0x0f,0x1f,0x80,0,0,0,0
      87: #define P6_NOP8    0x0f,0x1f,0x84,0x00,0,0,0,0
      88: #define P6_NOP5_ATOMIC P6_NOP5
      89: 
      90: #ifdef __ASSEMBLY__
      91: #define _ASM_MK_NOP(x) .byte x
      92: #else
      93: #define _ASM_MK_NOP(x) ".byte " __stringify(x) "\n"
      94: #endif
      95: 
      96: #if defined(CONFIG_MK7)
      97: #define ASM_NOP1 _ASM_MK_NOP(K7_NOP1)
      98: #define ASM_NOP2 _ASM_MK_NOP(K7_NOP2)
      99: #define ASM_NOP3 _ASM_MK_NOP(K7_NOP3)
     100: #define ASM_NOP4 _ASM_MK_NOP(K7_NOP4)
     101: #define ASM_NOP5 _ASM_MK_NOP(K7_NOP5)
     102: #define ASM_NOP6 _ASM_MK_NOP(K7_NOP6)
     103: #define ASM_NOP7 _ASM_MK_NOP(K7_NOP7)
     104: #define ASM_NOP8 _ASM_MK_NOP(K7_NOP8)
     105: #define ASM_NOP5_ATOMIC _ASM_MK_NOP(K7_NOP5_ATOMIC)
     106: #elif defined(CONFIG_X86_P6_NOP)
     107: #define ASM_NOP1 _ASM_MK_NOP(P6_NOP1)
     108: #define ASM_NOP2 _ASM_MK_NOP(P6_NOP2)
     109: #define ASM_NOP3 _ASM_MK_NOP(P6_NOP3)
     110: #define ASM_NOP4 _ASM_MK_NOP(P6_NOP4)
     111: #define ASM_NOP5 _ASM_MK_NOP(P6_NOP5)
     112: #define ASM_NOP6 _ASM_MK_NOP(P6_NOP6)
     113: #define ASM_NOP7 _ASM_MK_NOP(P6_NOP7)
     114: #define ASM_NOP8 _ASM_MK_NOP(P6_NOP8)
     115: #define ASM_NOP5_ATOMIC _ASM_MK_NOP(P6_NOP5_ATOMIC)
     116: #elif defined(CONFIG_X86_64)
     117: #define ASM_NOP1 _ASM_MK_NOP(K8_NOP1)
     118: #define ASM_NOP2 _ASM_MK_NOP(K8_NOP2)
     119: #define ASM_NOP3 _ASM_MK_NOP(K8_NOP3)
     120: #define ASM_NOP4 _ASM_MK_NOP(K8_NOP4)
     121: #define ASM_NOP5 _ASM_MK_NOP(K8_NOP5)
     122: #define ASM_NOP6 _ASM_MK_NOP(K8_NOP6)
     123: #define ASM_NOP7 _ASM_MK_NOP(K8_NOP7)
     124: #define ASM_NOP8 _ASM_MK_NOP(K8_NOP8)
     125: #define ASM_NOP5_ATOMIC _ASM_MK_NOP(K8_NOP5_ATOMIC)
     126: #else
     127: #define ASM_NOP1 _ASM_MK_NOP(GENERIC_NOP1)
     128: #define ASM_NOP2 _ASM_MK_NOP(GENERIC_NOP2)
     129: #define ASM_NOP3 _ASM_MK_NOP(GENERIC_NOP3)
     130: #define ASM_NOP4 _ASM_MK_NOP(GENERIC_NOP4)
     131: #define ASM_NOP5 _ASM_MK_NOP(GENERIC_NOP5)
     132: #define ASM_NOP6 _ASM_MK_NOP(GENERIC_NOP6)
     133: #define ASM_NOP7 _ASM_MK_NOP(GENERIC_NOP7)
     134: #define ASM_NOP8 _ASM_MK_NOP(GENERIC_NOP8)
     135: #define ASM_NOP5_ATOMIC _ASM_MK_NOP(GENERIC_NOP5_ATOMIC)
     136: #endif
     137: 
     138: #define ASM_NOP_MAX 8
     139: #define NOP_ATOMIC5 (ASM_NOP_MAX+1)    /* Entry for the 5-byte atomic NOP */
     140: 
     141: #ifndef __ASSEMBLY__
     142: extern const unsigned char * const *ideal_nops;
     143: extern void arch_init_ideal_nops(void);
     144: #endif
     145: 
     146: #endif /* _ASM_X86_NOPS_H */
     147: