apic_timer.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #pragma once
  2. #include <common/unistd.h>
  3. #include "apic.h"
  4. extern uint64_t apic_timer_ticks_result;
  5. // 5ms产生一次中断
  6. #define APIC_TIMER_INTERVAL 5
  7. #define APIC_TIMER_DIVISOR 3
  8. #define APIC_TIMER_IRQ_NUM 151
  9. /**
  10. * @brief 设置apic定时器的分频计数
  11. *
  12. * @param divider 分频除数
  13. */
  14. #define apic_timer_set_div(divider) \
  15. do \
  16. { \
  17. wrmsr(0x83e, divider); \
  18. } while (0)
  19. /**
  20. * @brief 设置apic定时器的初始计数值
  21. *
  22. * @param init_cnt 初始计数值
  23. */
  24. #define apic_timer_set_init_cnt(init_cnt) \
  25. do \
  26. { \
  27. wrmsr(0x838, init_cnt); \
  28. } while (0)
  29. /**
  30. * @brief 设置apic定时器的lvt,并启动定时器
  31. *
  32. * @param vector 中断向量号
  33. * @param mask 是否屏蔽(1:屏蔽, 0:不屏蔽)
  34. * @param mode 计时模式
  35. */
  36. #define apic_timer_set_LVT(vector, mask, mode) \
  37. do \
  38. { \
  39. wrmsr(0x832, (mode << 17) | vector | (mask ? (APIC_LVT_INT_MASKED) : 0)); \
  40. } while (0)
  41. #define apic_timer_write_LVT(value) \
  42. do \
  43. { \
  44. wrmsr(0x832, value); \
  45. } while (0)
  46. /**
  47. * @brief 获取apic定时器的LVT的值
  48. *
  49. */
  50. #define apic_timer_get_LVT() (rdmsr(0x832))
  51. /**
  52. * @brief 获取apic定时器当前计数值
  53. *
  54. */
  55. #define apic_timer_get_current() (rdmsr(0x839))
  56. /**
  57. * @brief 停止apic定时器
  58. *
  59. */
  60. #define apic_timer_stop() \
  61. do \
  62. { \
  63. uint64_t val = apic_timer_get_LVT(); \
  64. val |= APIC_LVT_INT_MASKED; \
  65. apic_timer_write_LVT(val); \
  66. } while (0)
  67. /**
  68. * @brief 初始化local APIC定时器
  69. *
  70. */
  71. void apic_timer_init();