apic_timer.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #pragma once
  2. #include <common/unistd.h>
  3. #include "apic.h"
  4. extern uint64_t apic_timer_ticksIn1ms;
  5. /**
  6. * @brief 设置apic定时器的分频计数
  7. *
  8. * @param divider 分频除数
  9. */
  10. #define apic_timer_set_div(divider) \
  11. do \
  12. { \
  13. wrmsr(0x83e, divider); \
  14. } while (0)
  15. /**
  16. * @brief 设置apic定时器的初始计数值
  17. *
  18. * @param init_cnt 初始计数值
  19. */
  20. #define apic_timer_set_init_cnt(init_cnt) \
  21. do \
  22. { \
  23. wrmsr(0x838, init_cnt); \
  24. } while (0)
  25. /**
  26. * @brief 停止apic定时器
  27. *
  28. */
  29. #define apic_timer_stop() \
  30. do \
  31. { \
  32. wrmsr(0x832, APIC_LVT_INT_MASKED); \
  33. } while (0)
  34. /**
  35. * @brief 设置apic定时器的lvt,并启动定时器
  36. *
  37. */
  38. #define apic_timer_set_LVT(vector, mode) \
  39. do \
  40. { \
  41. wrmsr(0x832, (mode << 17) | vector); \
  42. io_mfence(); \
  43. } while (0)
  44. /**
  45. * @brief 获取apic定时器的LVT的值
  46. *
  47. */
  48. #define apic_timer_get_LVT() (rdmsr(0x832))
  49. /**
  50. * @brief 获取apic定时器当前计数值
  51. *
  52. */
  53. #define apic_timer_get_current() (rdmsr(0x839))