io.rs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. use core::arch::asm;
  2. pub fn enable_sse() {
  3. unsafe {
  4. asm!(
  5. "mov %cr0, %rax",
  6. "and $(~0xc), %rax",
  7. "or $0x22, %rax",
  8. "mov %rax, %cr0",
  9. "mov %cr4, %rax",
  10. "or $0x600, %rax",
  11. "mov %rax, %cr4",
  12. "fninit",
  13. out("rax") _,
  14. options(att_syntax, nomem, nostack)
  15. )
  16. }
  17. }
  18. pub fn inb(no: u16) -> u8 {
  19. let data;
  20. unsafe {
  21. asm!(
  22. "inb %dx, %al",
  23. in("dx") no,
  24. out("al") data,
  25. options(att_syntax, nomem, nostack)
  26. )
  27. };
  28. data
  29. }
  30. pub fn inw(no: u16) -> u16 {
  31. let data;
  32. unsafe {
  33. asm!(
  34. "inw %dx, %ax",
  35. in("dx") no,
  36. out("ax") data,
  37. options(att_syntax, nomem, nostack)
  38. )
  39. };
  40. data
  41. }
  42. pub fn inl(no: u16) -> u32 {
  43. let data;
  44. unsafe {
  45. asm!(
  46. "inl %dx, %eax",
  47. in("dx") no,
  48. out("eax") data,
  49. options(att_syntax, nomem, nostack)
  50. )
  51. };
  52. data
  53. }
  54. pub fn outb(no: u16, data: u8) {
  55. unsafe {
  56. asm!(
  57. "outb %al, %dx",
  58. in("al") data,
  59. in("dx") no,
  60. options(att_syntax, nomem, nostack)
  61. )
  62. };
  63. }
  64. pub fn outw(no: u16, data: u16) {
  65. unsafe {
  66. asm!(
  67. "outw %ax, %dx",
  68. in("ax") data,
  69. in("dx") no,
  70. options(att_syntax, nomem, nostack)
  71. )
  72. };
  73. }
  74. pub fn outl(no: u16, data: u32) {
  75. unsafe {
  76. asm!(
  77. "outl %eax, %dx",
  78. in("eax") data,
  79. in("dx") no,
  80. options(att_syntax, nomem, nostack)
  81. )
  82. };
  83. }