port.hpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #pragma once
  2. #include <stdint.h>
  3. namespace kernel::hw {
  4. inline uint32_t inl(uint16_t pn)
  5. {
  6. uint32_t ret;
  7. asm volatile("inl %1, %0"
  8. : "=a"(ret)
  9. : "d"(pn));
  10. return ret;
  11. }
  12. inline uint32_t outl(uint16_t pn, uint32_t n)
  13. {
  14. asm volatile("outl %1, %0"
  15. :
  16. : "d"(pn), "a"(n));
  17. return n;
  18. }
  19. inline uint16_t inw(uint16_t pn)
  20. {
  21. uint16_t ret;
  22. asm volatile("inw %1, %0"
  23. : "=a"(ret)
  24. : "d"(pn));
  25. return ret;
  26. }
  27. inline uint16_t outw(uint16_t pn, uint16_t n)
  28. {
  29. asm volatile("outw %1, %0"
  30. :
  31. : "d"(pn), "a"(n));
  32. return n;
  33. }
  34. inline uint8_t inb(uint16_t pn)
  35. {
  36. uint8_t ret;
  37. asm volatile("inb %1, %0"
  38. : "=a"(ret)
  39. : "d"(pn));
  40. return ret;
  41. }
  42. inline uint8_t outb(uint16_t pn, uint8_t n)
  43. {
  44. asm volatile("outb %1, %0"
  45. :
  46. : "d"(pn), "a"(n));
  47. return n;
  48. }
  49. struct p32 {
  50. uint16_t mp;
  51. explicit constexpr p32(uint16_t p) : mp(p) { }
  52. inline uint32_t operator*() const { return inl(mp); }
  53. inline uint32_t operator=(uint32_t n) const { return outl(mp, n); }
  54. };
  55. struct p16 {
  56. uint16_t mp;
  57. explicit constexpr p16(uint16_t p) : mp(p) { }
  58. inline uint16_t operator*() const { return inw(mp); }
  59. inline uint16_t operator=(uint16_t n) const { return outw(mp, n); }
  60. };
  61. struct p8 {
  62. uint16_t mp;
  63. explicit constexpr p8(uint16_t p) : mp(p) { }
  64. inline uint8_t operator*() const { return inb(mp); }
  65. inline uint8_t operator=(uint8_t n) const { return outb(mp, n); }
  66. };
  67. } // namespace kernel::hw
  68. namespace hw {
  69. // for backward compatibility
  70. using p8 = kernel::hw::p8;
  71. using p8r = kernel::hw::p8;
  72. using p8w = kernel::hw::p8;
  73. using p16 = kernel::hw::p16;
  74. using p16r = kernel::hw::p16;
  75. using p16w = kernel::hw::p16;
  76. } // namespace hw