i386.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-07-14 JasonHu first version
  9. */
  10. #ifndef __I386_H__
  11. #define __I386_H__
  12. #include <rtdef.h>
  13. #define EFLAGS_MBS (1 << 1)
  14. #define EFLAGS_IF_1 (1 << 9)
  15. #define EFLAGS_IF_0 0
  16. #define EFLAGS_IOPL_3 (3 << 12)
  17. #define EFLAGS_IOPL_1 (1 << 12)
  18. #define EFLAGS_IOPL_0 (0 << 12)
  19. #define EFLAGS_IF (EFLAGS_IF_1)
  20. /* cr0 bit 31 is page enable bit, 1: enable MMU, 0: disable MMU */
  21. #define CR0_PG (1 << 31)
  22. rt_inline rt_uint8_t inb(int port)
  23. {
  24. rt_uint8_t data;
  25. __asm__ __volatile__("inb %w1,%0" : "=a" (data) : "d" (port));
  26. return data;
  27. }
  28. rt_inline rt_uint16_t inw(int port)
  29. {
  30. rt_uint16_t data;
  31. __asm__ __volatile__("inw %w1,%0" : "=a" (data) : "d" (port));
  32. return data;
  33. }
  34. rt_inline rt_uint32_t inl(int port)
  35. {
  36. rt_uint32_t data;
  37. __asm__ __volatile__("inl %w1,%0" : "=a" (data) : "d" (port));
  38. return data;
  39. }
  40. rt_inline void outb(int port, rt_uint8_t data)
  41. {
  42. __asm__ __volatile__("outb %0,%w1" : : "a" (data), "d" (port));
  43. }
  44. rt_inline void outw(int port, rt_uint16_t data)
  45. {
  46. __asm__ __volatile__("outw %0,%w1" : : "a" (data), "d" (port));
  47. }
  48. rt_inline void outl(int port, rt_uint32_t data)
  49. {
  50. __asm__ __volatile__("outl %0,%w1" : : "a" (data), "d" (port));
  51. }
  52. rt_inline rt_uint8_t read_cmos(int reg)
  53. {
  54. outb(0x70, reg);
  55. return (rt_uint8_t) inb(0x71);
  56. }
  57. #define io_delay() \
  58. __asm__ __volatile__ ("pushal \n\t"\
  59. "mov $0x3F6, %dx \n\t" \
  60. "inb %dx, %al \n\t" \
  61. "inb %dx, %al \n\t" \
  62. "inb %dx, %al \n\t" \
  63. "inb %dx, %al \n\t" \
  64. "popal")
  65. rt_inline void ltr(rt_uint32_t selector)
  66. {
  67. __asm__ __volatile__("ltr %w0" : : "q" (selector));
  68. }
  69. rt_uint32_t read_cr0(void);
  70. rt_uint32_t read_cr2(void);
  71. void write_cr0(rt_uint32_t value);
  72. void write_cr3(rt_uint32_t pgdir);
  73. rt_inline void rt_hw_cpu_pause(void)
  74. {
  75. __asm__ __volatile__ ("pause");
  76. }
  77. #endif /* __I386_H__ */