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: