Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

398 lines
5.2 KiB

  1. /*++
  2. Copyright (c) 1999-2000 Microsoft Corporation. All Rights Reserved.
  3. Module Name:
  4. x86.h
  5. Abstract:
  6. This module contains private x86 processor specific defines, structures, inline
  7. functions and macros.
  8. Author:
  9. Joseph Ballantyne
  10. Environment:
  11. Kernel Mode
  12. Revision History:
  13. --*/
  14. // CR0 floating point unit flags.
  15. #define FPUMONITOR 0x2
  16. #define FPUEMULATION 0x4
  17. #define FPUTASKSWITCHED 0x8
  18. #define FPU387COMPATIBLE 0x10
  19. #define FPUEXCEPTION 0x20
  20. #define FPUMASK (FPUEXCEPTION|FPU387COMPATIBLE|FPUTASKSWITCHED|FPUEMULATION|FPUMONITOR)
  21. #pragma pack(push,1)
  22. typedef struct {
  23. DWORD offset;
  24. WORD selector;
  25. } SPTR;
  26. // x86 interrupt descriptor table base register
  27. typedef struct {
  28. WORD limit;
  29. DWORD base;
  30. } IDT;
  31. // x86 interrupt descriptor.
  32. typedef struct {
  33. WORD lowoffset;
  34. WORD selector;
  35. WORD flags;
  36. WORD highoffset;
  37. } ID;
  38. // x86 task state segment
  39. typedef struct {
  40. WORD link; WORD reserved0;
  41. DWORD esp0;
  42. WORD ss0; WORD reserved1;
  43. DWORD esp1;
  44. WORD ss1; WORD reserved2;
  45. DWORD esp2;
  46. WORD ss2; WORD reserved3;
  47. DWORD cr3;
  48. DWORD eip;
  49. DWORD eflags;
  50. DWORD eax;
  51. DWORD ecx;
  52. DWORD edx;
  53. DWORD ebx;
  54. DWORD esp;
  55. DWORD ebp;
  56. DWORD esi;
  57. DWORD edi;
  58. WORD es; WORD reserved4;
  59. WORD cs; WORD reserved5;
  60. WORD ss; WORD reserved6;
  61. WORD ds; WORD reserved7;
  62. WORD fs; WORD reserved8;
  63. WORD gs; WORD reserved9;
  64. WORD ldt; WORD reserved10;
  65. WORD t;
  66. WORD iomap;
  67. } TSS;
  68. #pragma pack(pop)
  69. #pragma warning ( disable : 4035 )
  70. //
  71. // __inline
  72. // ULONG
  73. // ReadCR0 (
  74. // VOID
  75. // )
  76. //
  77. //*++
  78. //
  79. // Routine Description:
  80. //
  81. // This routine returns the current contents of the processor CR0 register.
  82. //
  83. // Arguments:
  84. //
  85. // None.
  86. //
  87. // Return Value:
  88. //
  89. // 32 bit contents of CR0.
  90. //
  91. //*--
  92. __inline
  93. ULONG
  94. ReadCR0 (
  95. VOID
  96. )
  97. {
  98. __asm {
  99. mov eax,cr0
  100. }
  101. }
  102. // __inline
  103. // VOID
  104. // WriteCR0 (
  105. // ULONG data
  106. // )
  107. //
  108. //*++
  109. //
  110. // Routine Description:
  111. //
  112. // Loads processor CR0 register with the value passed in data.
  113. //
  114. // Arguments:
  115. //
  116. // data - Supplies the value to be loaded into processor CR0 register.
  117. //
  118. // Return Value:
  119. //
  120. // None.
  121. //
  122. //*--
  123. __inline
  124. VOID
  125. WriteCR0 (
  126. ULONG data
  127. )
  128. {
  129. __asm {
  130. mov eax,data
  131. mov cr0,eax
  132. }
  133. }
  134. // __inline
  135. // ULONG
  136. // ReadCR3 (
  137. // VOID
  138. // )
  139. //
  140. //*++
  141. //
  142. // Routine Description:
  143. //
  144. // This routine returns the current contents of the processor CR3 register.
  145. //
  146. // Arguments:
  147. //
  148. // Return Value:
  149. //
  150. // 32 bit contents of CR3.
  151. //
  152. //*--
  153. __inline
  154. ULONG
  155. ReadCR3 (
  156. VOID
  157. )
  158. {
  159. __asm {
  160. __asm _emit 0xf __asm _emit 0x20 __asm _emit 0xd8 //mov eax,cr3
  161. }
  162. }
  163. // __inline
  164. // ULONG
  165. // ReadCR4 (
  166. // VOID
  167. // )
  168. //
  169. //*++
  170. //
  171. // Routine Description:
  172. //
  173. // This routine returns the current contents of the processor CR4 register.
  174. //
  175. // Arguments:
  176. //
  177. // Return Value:
  178. //
  179. // 32 bit contents of CR4.
  180. //
  181. //*--
  182. __inline
  183. ULONG
  184. ReadCR4 (
  185. VOID
  186. )
  187. {
  188. __asm {
  189. __asm _emit 0xf __asm _emit 0x20 __asm _emit 0xe0 //mov eax,cr4
  190. }
  191. }
  192. // __inline
  193. // VOID
  194. // WriteCR4 (
  195. // ULONG data
  196. // )
  197. //
  198. //*++
  199. //
  200. // Routine Description:
  201. //
  202. // Loads processor CR4 register with the value passed in data.
  203. //
  204. // Arguments:
  205. //
  206. // Return Value:
  207. //
  208. // None.
  209. //
  210. //*--
  211. __inline
  212. VOID
  213. WriteCR4 (
  214. ULONG data
  215. )
  216. {
  217. __asm {
  218. mov eax,data
  219. __asm _emit 0xf __asm _emit 0x22 __asm _emit 0xe0 // mov cr4,eax
  220. }
  221. }
  222. #pragma warning ( default : 4035 )
  223. // __inline
  224. // VOID
  225. // LoadCR0 (
  226. // ULONG value
  227. // )
  228. //
  229. //*++
  230. //
  231. // Macro Description:
  232. //
  233. // Loads processor CR0 register with the value passed in value. Uses CS (code
  234. // segment) override to read contents of value so that it can be used when the
  235. // contents of DS (data segment) are indeterminate/invalid.
  236. //
  237. // Arguments:
  238. //
  239. // value - Supplies the variable whose value is to be loaded into processor CR0 register.
  240. //
  241. // (assumed) CS - code segment pointer is used to access value parameter.
  242. //
  243. // Return Value:
  244. //
  245. // None.
  246. //
  247. //*--
  248. #define LoadCR0(value) \
  249. __asm { \
  250. __asm mov eax,cs:value \
  251. __asm mov cr0,eax \
  252. }
  253. // __inline
  254. // VOID
  255. // SaveIDT (
  256. // IDT IDT
  257. // )
  258. //
  259. //*++
  260. //
  261. // Macro Description:
  262. //
  263. // Saves processor IDT register into variable IDT.
  264. //
  265. // Arguments:
  266. //
  267. // IDT - Supplies variable into which processor IDT value is written.
  268. //
  269. // Return Value:
  270. //
  271. // None.
  272. //
  273. //*--
  274. #define SaveIDT( IDT ) \
  275. __asm sidt IDT
  276. // __inline
  277. // VOID
  278. // LoadIDT (
  279. // IDT IDT
  280. // )
  281. //
  282. //*++
  283. //
  284. // Macro Description:
  285. //
  286. // Loads processor IDT register from variable IDT.
  287. //
  288. // Arguments:
  289. //
  290. // IDT - Supplies value which is loaded into processor IDT. Uses CS (code
  291. // segment) override to read contents of value so that it can be used when the
  292. // contents of DS (data segment) are indeterminate/invalid.
  293. //
  294. // (assumed) CS - code segment pointer is used to access IDT parameter.
  295. //
  296. // Return Value:
  297. //
  298. // None.
  299. //
  300. //*--
  301. #define LoadIDT( IDT ) \
  302. __asm lidt cs:IDT
  303. // __inline
  304. // VOID
  305. // Return (
  306. // VOID
  307. // )
  308. //
  309. //*++
  310. //
  311. // Macro Description:
  312. //
  313. // Performs an IRETD.
  314. //
  315. // Arguments:
  316. //
  317. // None.
  318. //
  319. // Return Value:
  320. //
  321. // None.
  322. //
  323. //*--
  324. #define Return() \
  325. __asm iretd