Leaked source code of windows server 2003
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.

617 lines
8.6 KiB

  1. /*++
  2. Copyright (c) 1995-1998 Microsoft Corporation
  3. Module Name:
  4. ds32tbl.c
  5. Abstract:
  6. Dispatch tables for instructions with no DATA: override. It is used for
  7. both DS: and FS: overrides.
  8. Author:
  9. 29-Jun-1995 BarryBo
  10. Revision History:
  11. --*/
  12. #include <nt.h>
  13. #include <ntrtl.h>
  14. #include <nturtl.h>
  15. #include <windows.h>
  16. #include <stdio.h>
  17. #include "threadst.h"
  18. #include "instr.h"
  19. #include "decoderp.h"
  20. #include "bytefns.h"
  21. #include "dwordfns.h"
  22. #include "miscfns.h"
  23. #include "floatfns.h"
  24. pfnDispatchInstruction Dispatch32[256] = {
  25. // 0
  26. add_m_r8,
  27. add_m_r32,
  28. add_r_m8,
  29. add_r_m32,
  30. add_a_i8,
  31. add_a_i32,
  32. push_es,
  33. pop_es,
  34. // 8
  35. or_m_r8,
  36. or_m_r32,
  37. or_r_m8,
  38. or_r_m32,
  39. or_a_i8,
  40. or_a_i32,
  41. push_cs,
  42. dispatch232,
  43. // 10
  44. adc_m_r8,
  45. adc_m_r32,
  46. adc_r_m8,
  47. adc_r_m32,
  48. adc_a_i8,
  49. adc_a_i32,
  50. push_ss,
  51. pop_ss,
  52. // 18
  53. sbb_m_r8,
  54. sbb_m_r32,
  55. sbb_r_m8,
  56. sbb_r_m32,
  57. sbb_a_i8,
  58. sbb_a_i32,
  59. push_ds,
  60. pop_ds,
  61. // 20
  62. and_m_r8,
  63. and_m_r32,
  64. and_r_m8,
  65. and_r_m32,
  66. and_a_i8,
  67. and_a_i32,
  68. ProcessPrefixes, // es:
  69. daa,
  70. // 28
  71. sub_m_r8,
  72. sub_m_r32,
  73. sub_r_m8,
  74. sub_r_m32,
  75. sub_a_i8,
  76. sub_a_i32,
  77. ProcessPrefixes, // cs:
  78. das,
  79. // 30
  80. xor_m_r8,
  81. xor_m_r32,
  82. xor_r_m8,
  83. xor_r_m32,
  84. xor_a_i8,
  85. xor_a_i32,
  86. ProcessPrefixes, // ss:
  87. aaa,
  88. // 38
  89. cmp_m_r8,
  90. cmp_m_r32,
  91. cmp_r_m8,
  92. cmp_r_m32,
  93. cmp_a_i8,
  94. cmp_a_i32,
  95. ProcessPrefixes, // ds:
  96. aas,
  97. // 40
  98. inc_ax32,
  99. inc_cx32,
  100. inc_dx32,
  101. inc_bx32,
  102. inc_sp32,
  103. inc_bp32,
  104. inc_si32,
  105. inc_di32,
  106. // 48
  107. dec_ax32,
  108. dec_cx32,
  109. dec_dx32,
  110. dec_bx32,
  111. dec_sp32,
  112. dec_bp32,
  113. dec_si32,
  114. dec_di32,
  115. // 50
  116. push_ax32,
  117. push_cx32,
  118. push_dx32,
  119. push_bx32,
  120. push_sp32,
  121. push_bp32,
  122. push_si32,
  123. push_di32,
  124. // 58
  125. pop_ax32,
  126. pop_cx32,
  127. pop_dx32,
  128. pop_bx32,
  129. pop_sp32,
  130. pop_bp32,
  131. pop_si32,
  132. pop_di32,
  133. // 60
  134. pusha32,
  135. popa32,
  136. bound32,
  137. arpl,
  138. ProcessPrefixes, // fs:
  139. ProcessPrefixes, // gs:
  140. ProcessPrefixes, // data: prefix
  141. ProcessPrefixes, // adr: prefix
  142. // 68
  143. push_iw32,
  144. imul_rw_m_iw32,
  145. push_ibs32,
  146. imul_rw_m_ib32,
  147. privileged, // in_ib_dx
  148. privileged, // in_iw_dx
  149. privileged, // out_ib_dx
  150. privileged, // out_iw_dx
  151. // 70
  152. jo8,
  153. jno8,
  154. jb8,
  155. jae8,
  156. je8,
  157. jne8,
  158. jbe8,
  159. ja8,
  160. // 78
  161. js8,
  162. jns8,
  163. jp8,
  164. jnp8,
  165. jl8,
  166. jnl8,
  167. jle8,
  168. jg8,
  169. // 80
  170. GROUP_18,
  171. GROUP_132,
  172. bad,
  173. GROUP_1WS32,
  174. test_r_m8,
  175. test_r_m32,
  176. xchg_r_m8,
  177. xchg_r_m32,
  178. // 88
  179. mov_m_r8,
  180. mov_m_r32,
  181. mov_r_m8,
  182. mov_r_m32,
  183. mov_mw_seg,
  184. lea_rw_mw32,
  185. mov_seg_mw,
  186. pop_mw32,
  187. // 90
  188. nop,
  189. xchg_ax_cx32,
  190. xchg_ax_dx32,
  191. xchg_ax_bx32,
  192. xchg_ax_sp32,
  193. xchg_ax_bp32,
  194. xchg_ax_si32,
  195. xchg_ax_di32,
  196. // 98
  197. cbw32,
  198. cwd32,
  199. call_md,
  200. wait,
  201. pushf32,
  202. popf32,
  203. sahf,
  204. lahf,
  205. // a0
  206. mov_a_m8,
  207. mov_a_m32,
  208. mov_m_a8,
  209. mov_m_a32,
  210. movs8,
  211. movs32,
  212. cmps8,
  213. cmps32,
  214. // a8
  215. test_a_i8,
  216. test_a_i32,
  217. stos8,
  218. stos32,
  219. lods8,
  220. lods32,
  221. scas8,
  222. scas32,
  223. // b0
  224. mov_a_i8,
  225. mov_c_i8,
  226. mov_d_i8,
  227. mov_b_i8,
  228. mov_ah_ib,
  229. mov_ch_ib,
  230. mov_dh_ib,
  231. mov_bh_ib,
  232. // b8
  233. mov_a_i32,
  234. mov_c_i32,
  235. mov_d_i32,
  236. mov_b_i32,
  237. mov_sp_iw32,
  238. mov_bp_iw32,
  239. mov_si_iw32,
  240. mov_di_iw32,
  241. // c0
  242. GROUP_28,
  243. GROUP_232,
  244. retn_i32,
  245. retn32,
  246. les_rw_mw32,
  247. lds_rw_mw32,
  248. mov_m_i8,
  249. mov_m_i32,
  250. // c8
  251. enter32,
  252. leave32,
  253. retf_i32,
  254. retf32,
  255. int3,
  256. int_ib,
  257. into,
  258. iret,
  259. // d0
  260. GROUP_2_18,
  261. GROUP_2_132,
  262. GROUP_2_CL8,
  263. GROUP_2_CL32,
  264. aam_ib,
  265. aad_ib,
  266. bad,
  267. xlat,
  268. // d8
  269. FLOAT_GP0,
  270. FLOAT_GP1,
  271. FLOAT_GP2,
  272. FLOAT_GP3,
  273. FLOAT_GP4,
  274. FLOAT_GP5,
  275. FLOAT_GP6,
  276. FLOAT_GP7,
  277. // e0
  278. loopne_b32,
  279. loope_b32,
  280. loop_b32,
  281. jcxz_b32,
  282. privileged, // in_al_memb
  283. privileged, // in_ax_memb
  284. privileged, // out_memb_al
  285. privileged, // out_memb_ax
  286. // e8
  287. call_rel32,
  288. jmp_rel32,
  289. jmpf_md,
  290. jmp_jb,
  291. privileged, // in_al_dx
  292. privileged, // in_ax_dx
  293. privileged, // out_dx_al
  294. privileged, // out_dx_ax
  295. // f0
  296. ProcessPrefixes, // lock: prefix
  297. bad,
  298. ProcessPrefixes, // repnz prefix
  299. ProcessPrefixes, // repz prefix
  300. privileged, // halt
  301. cmc,
  302. GROUP_38,
  303. GROUP_332,
  304. // f8
  305. clc,
  306. stc,
  307. privileged, // cli
  308. privileged, // sti
  309. cld,
  310. std,
  311. GROUP_4,
  312. GROUP_532
  313. };
  314. pfnDispatchInstruction Dispatch232[256] = {
  315. // 0
  316. GROUP_6,
  317. GROUP_7,
  318. lar32,
  319. lsl32,
  320. bad,
  321. bad,
  322. privileged, // clts
  323. bad,
  324. // 8
  325. bad,
  326. bad,
  327. bad,
  328. bad,
  329. bad,
  330. bad,
  331. bad,
  332. bad,
  333. // 10
  334. bad,
  335. bad,
  336. bad,
  337. bad,
  338. bad,
  339. bad,
  340. bad,
  341. bad,
  342. // 18
  343. bad,
  344. bad,
  345. bad,
  346. bad,
  347. bad,
  348. bad,
  349. bad,
  350. bad,
  351. // 20
  352. privileged, // mov reg2W, eeeControl
  353. privileged, // mov reg2W, eeeDebug
  354. privileged, // mov eeeControl, reg2W
  355. privileged, // mov eeeDebug, reg2W
  356. privileged, // mov reg2W, eeeTest
  357. bad,
  358. privileged, // mov eeeTest, reg2W
  359. bad,
  360. // 28
  361. bad,
  362. bad,
  363. bad,
  364. bad,
  365. bad,
  366. bad,
  367. bad,
  368. bad,
  369. // 30
  370. bad,
  371. rdtsc,
  372. bad,
  373. bad,
  374. bad,
  375. bad,
  376. bad,
  377. bad,
  378. // 38
  379. bad,
  380. bad,
  381. bad,
  382. bad,
  383. bad,
  384. bad,
  385. bad,
  386. bad,
  387. // 40
  388. bad,
  389. bad,
  390. bad,
  391. bad,
  392. bad,
  393. bad,
  394. bad,
  395. bad,
  396. // 48
  397. bad,
  398. bad,
  399. bad,
  400. bad,
  401. bad,
  402. bad,
  403. bad,
  404. bad,
  405. // 50
  406. bad,
  407. bad,
  408. bad,
  409. bad,
  410. bad,
  411. bad,
  412. bad,
  413. bad,
  414. // 58
  415. bad,
  416. bad,
  417. bad,
  418. bad,
  419. bad,
  420. bad,
  421. bad,
  422. bad,
  423. // 60
  424. bad,
  425. bad,
  426. bad,
  427. bad,
  428. bad,
  429. bad,
  430. bad,
  431. bad,
  432. // 68
  433. bad,
  434. bad,
  435. bad,
  436. bad,
  437. bad,
  438. bad,
  439. bad,
  440. bad,
  441. // 70
  442. bad,
  443. bad,
  444. bad,
  445. bad,
  446. bad,
  447. bad,
  448. bad,
  449. bad,
  450. // 78
  451. bad,
  452. bad,
  453. bad,
  454. bad,
  455. bad,
  456. bad,
  457. bad,
  458. bad,
  459. // 80
  460. jo32,
  461. jno32,
  462. jb32,
  463. jae32,
  464. je32,
  465. jne32,
  466. jbe32,
  467. ja32,
  468. // 88
  469. js32,
  470. jns32,
  471. jp32,
  472. jnp32,
  473. jl32,
  474. jnl32,
  475. jle32,
  476. jg32,
  477. // 90
  478. seto_modrmb,
  479. setno_modrmb,
  480. setb_modrmb,
  481. setae_modrmb,
  482. sete_modrmb,
  483. setne_modrmb,
  484. setbe_modrmb,
  485. seta_modrmb,
  486. // 98
  487. sets_modrmb,
  488. setns_modrmb,
  489. setp_modrmb,
  490. setnp_modrmb,
  491. setl_modrmb,
  492. setge_modrmb,
  493. setle_modrmb,
  494. setg_modrmb,
  495. // a0
  496. push_fs,
  497. pop_fs,
  498. cpuid,
  499. bt_m_r32,
  500. shld_regw_modrmw_immb32,
  501. shld_regw_modrmw_cl32,
  502. bad,
  503. bad,
  504. // a8
  505. push_gs,
  506. pop_gs,
  507. bad,
  508. bts_m_r32,
  509. shrd_regw_modrmw_immb32,
  510. shrd_regw_modrmw_cl32,
  511. bad,
  512. imul_regw_modrmw32,
  513. // b0
  514. cmpxchg_m_r8,
  515. cmpxchg_m_r32,
  516. lss_rw_mw32,
  517. btr_m_r32,
  518. lfs_rw_mw32,
  519. lgs_rw_mw32,
  520. movzx_regw_modrmb32,
  521. movzx_regw_modrmw,
  522. // b8
  523. bad,
  524. bad,
  525. GROUP_832,
  526. btc_m_r32,
  527. bsf_modrmw_regw32,
  528. bsr_modrmw_regw32,
  529. movsx_regw_modrmb32,
  530. movsx_regw_modrmw,
  531. // c0
  532. xadd_m_r8,
  533. xadd_m_r32,
  534. bad,
  535. bad,
  536. bad,
  537. bad,
  538. bad,
  539. cmpxchg8b,
  540. // c8
  541. bswap_eax,
  542. bswap_ecx,
  543. bswap_edx,
  544. bswap_ebx,
  545. bswap_esp,
  546. bswap_ebp,
  547. bswap_esi,
  548. bswap_edi,
  549. // d0
  550. bad,
  551. bad,
  552. bad,
  553. bad,
  554. bad,
  555. bad,
  556. bad,
  557. bad,
  558. // d8
  559. bad,
  560. bad,
  561. bad,
  562. bad,
  563. bad,
  564. bad,
  565. bad,
  566. bad,
  567. // e0
  568. bad,
  569. bad,
  570. bad,
  571. bad,
  572. bad,
  573. bad,
  574. bad,
  575. bad,
  576. // e8
  577. bad,
  578. bad,
  579. bad,
  580. bad,
  581. bad,
  582. bad,
  583. bad,
  584. bad,
  585. // f0
  586. bad,
  587. bad,
  588. bad,
  589. bad,
  590. bad,
  591. bad,
  592. bad,
  593. bad,
  594. // f8
  595. bad,
  596. bad,
  597. bad,
  598. bad,
  599. bad,
  600. bad,
  601. bad,
  602. bad
  603. };