nops.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_X86_NOPS_H
  3. #define _ASM_X86_NOPS_H
  4. #include <asm/asm.h>
  5. /*
  6. * Define nops for use with alternative() and for tracing.
  7. */
  8. #ifndef CONFIG_64BIT
  9. /*
  10. * Generic 32bit nops from GAS:
  11. *
  12. * 1: nop
  13. * 2: movl %esi,%esi
  14. * 3: leal 0x0(%esi),%esi
  15. * 4: leal 0x0(%esi,%eiz,1),%esi
  16. * 5: leal %ds:0x0(%esi,%eiz,1),%esi
  17. * 6: leal 0x0(%esi),%esi
  18. * 7: leal 0x0(%esi,%eiz,1),%esi
  19. * 8: leal %ds:0x0(%esi,%eiz,1),%esi
  20. *
  21. * Except 5 and 8, which are DS prefixed 4 and 7 resp, where GAS would emit 2
  22. * nop instructions.
  23. */
  24. #define BYTES_NOP1 0x90
  25. #define BYTES_NOP2 0x89,0xf6
  26. #define BYTES_NOP3 0x8d,0x76,0x00
  27. #define BYTES_NOP4 0x8d,0x74,0x26,0x00
  28. #define BYTES_NOP5 0x3e,BYTES_NOP4
  29. #define BYTES_NOP6 0x8d,0xb6,0x00,0x00,0x00,0x00
  30. #define BYTES_NOP7 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00
  31. #define BYTES_NOP8 0x3e,BYTES_NOP7
  32. #else
  33. /*
  34. * Generic 64bit nops from GAS:
  35. *
  36. * 1: nop
  37. * 2: osp nop
  38. * 3: nopl (%eax)
  39. * 4: nopl 0x00(%eax)
  40. * 5: nopl 0x00(%eax,%eax,1)
  41. * 6: osp nopl 0x00(%eax,%eax,1)
  42. * 7: nopl 0x00000000(%eax)
  43. * 8: nopl 0x00000000(%eax,%eax,1)
  44. */
  45. #define BYTES_NOP1 0x90
  46. #define BYTES_NOP2 0x66,BYTES_NOP1
  47. #define BYTES_NOP3 0x0f,0x1f,0x00
  48. #define BYTES_NOP4 0x0f,0x1f,0x40,0x00
  49. #define BYTES_NOP5 0x0f,0x1f,0x44,0x00,0x00
  50. #define BYTES_NOP6 0x66,BYTES_NOP5
  51. #define BYTES_NOP7 0x0f,0x1f,0x80,0x00,0x00,0x00,0x00
  52. #define BYTES_NOP8 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00
  53. #endif /* CONFIG_64BIT */
  54. #define ASM_NOP1 _ASM_BYTES(BYTES_NOP1)
  55. #define ASM_NOP2 _ASM_BYTES(BYTES_NOP2)
  56. #define ASM_NOP3 _ASM_BYTES(BYTES_NOP3)
  57. #define ASM_NOP4 _ASM_BYTES(BYTES_NOP4)
  58. #define ASM_NOP5 _ASM_BYTES(BYTES_NOP5)
  59. #define ASM_NOP6 _ASM_BYTES(BYTES_NOP6)
  60. #define ASM_NOP7 _ASM_BYTES(BYTES_NOP7)
  61. #define ASM_NOP8 _ASM_BYTES(BYTES_NOP8)
  62. #define ASM_NOP_MAX 8
  63. #ifndef __ASSEMBLY__
  64. extern const unsigned char * const x86_nops[];
  65. #endif
  66. #endif /* _ASM_X86_NOPS_H */