CpuIA32.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /** @file
  2. Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
  3. SPDX-License-Identifier: BSD-2-Clause-Patent
  4. Module Name:
  5. CpuIA32.c
  6. Abstract:
  7. --*/
  8. #include <Library/CpuIA32.h>
  9. VOID
  10. EfiHalt (VOID)
  11. {
  12. __asm {
  13. hlt
  14. }
  15. }
  16. VOID
  17. EfiWbinvd (VOID)
  18. {
  19. __asm {
  20. wbinvd
  21. }
  22. }
  23. VOID
  24. EfiInvd (VOID)
  25. {
  26. __asm {
  27. invd
  28. }
  29. }
  30. VOID
  31. EfiCpuid (IN UINT32 RegisterInEax,
  32. OUT EFI_CPUID_REGISTER *Reg OPTIONAL)
  33. {
  34. __asm {
  35. pushad
  36. mov eax, RegisterInEax
  37. cpuid
  38. cmp Reg, 0
  39. je _Exit
  40. mov edi, DWORD PTR Reg
  41. mov DWORD PTR [edi].RegEax, eax ; Reg->RegEax
  42. mov DWORD PTR [edi].RegEbx, ebx ; Reg->RegEbx
  43. mov DWORD PTR [edi].RegEcx, ecx ; Reg->RegEcx
  44. mov DWORD PTR [edi].RegEdx, edx ; Reg->RegEdx
  45. _Exit:
  46. popad
  47. }
  48. }
  49. UINT64
  50. EfiReadMsr (IN UINT32 Index)
  51. {
  52. __asm {
  53. mov ecx, Index
  54. rdmsr
  55. }
  56. }
  57. VOID
  58. EfiWriteMsr (
  59. IN UINT32 Index,
  60. IN UINT64 Value
  61. )
  62. {
  63. __asm {
  64. mov ecx, Index
  65. mov eax, DWORD PTR Value[0]
  66. mov edx, DWORD PTR Value[4]
  67. wrmsr
  68. }
  69. }
  70. UINT64
  71. EfiReadTsc (VOID)
  72. {
  73. __asm {
  74. rdtsc
  75. }
  76. }
  77. VOID
  78. EfiDisableCache (VOID)
  79. {
  80. __asm {
  81. mov eax, cr0
  82. bswap eax
  83. and al, 60h
  84. cmp al, 60h
  85. je Exit
  86. mov eax, cr0
  87. or eax, 060000000h
  88. mov cr0, eax
  89. wbinvd
  90. Exit:
  91. }
  92. }
  93. VOID
  94. EfiEnableCache (VOID)
  95. {
  96. __asm {
  97. wbinvd
  98. mov eax, cr0
  99. and eax, 09fffffffh
  100. mov cr0, eax
  101. }
  102. }
  103. UINT32
  104. EfiGetEflags (
  105. VOID
  106. )
  107. {
  108. __asm {
  109. pushfd
  110. pop eax
  111. }
  112. }
  113. VOID
  114. EfiDisableInterrupts (VOID)
  115. {
  116. __asm {
  117. cli
  118. }
  119. }
  120. VOID
  121. EfiEnableInterrupts (
  122. VOID
  123. )
  124. {
  125. __asm {
  126. sti
  127. }
  128. }
  129. VOID
  130. EfiCpuidExt (
  131. IN UINT32 RegisterInEax,
  132. IN UINT32 CacheLevel,
  133. OUT EFI_CPUID_REGISTER *Regs
  134. )
  135. {
  136. __asm {
  137. pushad
  138. mov eax, RegisterInEax
  139. mov ecx, CacheLevel
  140. cpuid
  141. mov edi, DWORD PTR Regs
  142. mov DWORD PTR [edi].RegEax, eax ; Reg->RegEax
  143. mov DWORD PTR [edi].RegEbx, ebx ; Reg->RegEbx
  144. mov DWORD PTR [edi].RegEcx, ecx ; Reg->RegEcx
  145. mov DWORD PTR [edi].RegEdx, edx ; Reg->RegEdx
  146. popad
  147. }
  148. }