msr-reg.S 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <linux/linkage.h>
  2. #include <linux/errno.h>
  3. #include <asm/dwarf2.h>
  4. #include <asm/asm.h>
  5. #include <asm/msr.h>
  6. #ifdef CONFIG_X86_64
  7. /*
  8. * int native_{rdmsr,wrmsr}_safe_regs(u32 gprs[8]);
  9. *
  10. * reg layout: u32 gprs[eax, ecx, edx, ebx, esp, ebp, esi, edi]
  11. *
  12. */
  13. .macro op_safe_regs op
  14. ENTRY(native_\op\()_safe_regs)
  15. CFI_STARTPROC
  16. pushq_cfi %rbx
  17. pushq_cfi %rbp
  18. movq %rdi, %r10 /* Save pointer */
  19. xorl %r11d, %r11d /* Return value */
  20. movl (%rdi), %eax
  21. movl 4(%rdi), %ecx
  22. movl 8(%rdi), %edx
  23. movl 12(%rdi), %ebx
  24. movl 20(%rdi), %ebp
  25. movl 24(%rdi), %esi
  26. movl 28(%rdi), %edi
  27. CFI_REMEMBER_STATE
  28. 1: \op
  29. 2: movl %eax, (%r10)
  30. movl %r11d, %eax /* Return value */
  31. movl %ecx, 4(%r10)
  32. movl %edx, 8(%r10)
  33. movl %ebx, 12(%r10)
  34. movl %ebp, 20(%r10)
  35. movl %esi, 24(%r10)
  36. movl %edi, 28(%r10)
  37. popq_cfi %rbp
  38. popq_cfi %rbx
  39. ret
  40. 3:
  41. CFI_RESTORE_STATE
  42. movl $-EIO, %r11d
  43. jmp 2b
  44. _ASM_EXTABLE(1b, 3b)
  45. CFI_ENDPROC
  46. ENDPROC(native_\op\()_safe_regs)
  47. .endm
  48. #else /* X86_32 */
  49. .macro op_safe_regs op
  50. ENTRY(native_\op\()_safe_regs)
  51. CFI_STARTPROC
  52. pushl_cfi %ebx
  53. pushl_cfi %ebp
  54. pushl_cfi %esi
  55. pushl_cfi %edi
  56. pushl_cfi $0 /* Return value */
  57. pushl_cfi %eax
  58. movl 4(%eax), %ecx
  59. movl 8(%eax), %edx
  60. movl 12(%eax), %ebx
  61. movl 20(%eax), %ebp
  62. movl 24(%eax), %esi
  63. movl 28(%eax), %edi
  64. movl (%eax), %eax
  65. CFI_REMEMBER_STATE
  66. 1: \op
  67. 2: pushl_cfi %eax
  68. movl 4(%esp), %eax
  69. popl_cfi (%eax)
  70. addl $4, %esp
  71. CFI_ADJUST_CFA_OFFSET -4
  72. movl %ecx, 4(%eax)
  73. movl %edx, 8(%eax)
  74. movl %ebx, 12(%eax)
  75. movl %ebp, 20(%eax)
  76. movl %esi, 24(%eax)
  77. movl %edi, 28(%eax)
  78. popl_cfi %eax
  79. popl_cfi %edi
  80. popl_cfi %esi
  81. popl_cfi %ebp
  82. popl_cfi %ebx
  83. ret
  84. 3:
  85. CFI_RESTORE_STATE
  86. movl $-EIO, 4(%esp)
  87. jmp 2b
  88. _ASM_EXTABLE(1b, 3b)
  89. CFI_ENDPROC
  90. ENDPROC(native_\op\()_safe_regs)
  91. .endm
  92. #endif
  93. op_safe_regs rdmsr
  94. op_safe_regs wrmsr