port.hpp 1.7 KB

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