apic.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #pragma once
  2. #include "../../../common/asm.h"
  3. #include "../../../process/ptrace.h"
  4. #include "../../../exception/irq.h"
  5. #include "../../../mm/mm.h"
  6. #define APIC_IO_APIC_VIRT_BASE_ADDR SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE + IO_APIC_MAPPING_OFFSET
  7. #define APIC_LOCAL_APIC_VIRT_BASE_ADDR SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE + LOCAL_APIC_MAPPING_OFFSET
  8. // ======== local apic 寄存器地址偏移量表 =======
  9. // 0x00~0x10 Reserved.
  10. #define LOCAL_APIC_OFFSET_Local_APIC_ID 0x20
  11. #define LOCAL_APIC_OFFSET_Local_APIC_Version 0x30
  12. // 0x40~0x70 Reserved.
  13. #define LOCAL_APIC_OFFSET_Local_APIC_TPR 0x80
  14. #define LOCAL_APIC_OFFSET_Local_APIC_APR 0x90
  15. #define LOCAL_APIC_OFFSET_Local_APIC_PPR 0xa0
  16. #define LOCAL_APIC_OFFSET_Local_APIC_EOI 0xb0
  17. #define LOCAL_APIC_OFFSET_Local_APIC_RRD 0xc0
  18. #define LOCAL_APIC_OFFSET_Local_APIC_LDR 0xd0
  19. #define LOCAL_APIC_OFFSET_Local_APIC_DFR 0xe0
  20. #define LOCAL_APIC_OFFSET_Local_APIC_SVR 0xf0
  21. #define LOCAL_APIC_OFFSET_Local_APIC_ISR_31_0 0x100
  22. #define LOCAL_APIC_OFFSET_Local_APIC_ISR_63_32 0x110
  23. #define LOCAL_APIC_OFFSET_Local_APIC_ISR_95_64 0x120
  24. #define LOCAL_APIC_OFFSET_Local_APIC_ISR_127_96 0x130
  25. #define LOCAL_APIC_OFFSET_Local_APIC_ISR_159_128 0x140
  26. #define LOCAL_APIC_OFFSET_Local_APIC_ISR_191_160 0x150
  27. #define LOCAL_APIC_OFFSET_Local_APIC_ISR_223_192 0x160
  28. #define LOCAL_APIC_OFFSET_Local_APIC_ISR_255_224 0x170
  29. #define LOCAL_APIC_OFFSET_Local_APIC_TMR_31_0 0x180
  30. #define LOCAL_APIC_OFFSET_Local_APIC_TMR_63_32 0x190
  31. #define LOCAL_APIC_OFFSET_Local_APIC_TMR_95_64 0x1a0
  32. #define LOCAL_APIC_OFFSET_Local_APIC_TMR_127_96 0x1b0
  33. #define LOCAL_APIC_OFFSET_Local_APIC_TMR_159_128 0x1c0
  34. #define LOCAL_APIC_OFFSET_Local_APIC_TMR_191_160 0x1d0
  35. #define LOCAL_APIC_OFFSET_Local_APIC_TMR_223_192 0x1e0
  36. #define LOCAL_APIC_OFFSET_Local_APIC_TMR_255_224 0x1f0
  37. #define LOCAL_APIC_OFFSET_Local_APIC_IRR_31_0 0x200
  38. #define LOCAL_APIC_OFFSET_Local_APIC_IRR_63_32 0x210
  39. #define LOCAL_APIC_OFFSET_Local_APIC_IRR_95_64 0x220
  40. #define LOCAL_APIC_OFFSET_Local_APIC_IRR_127_96 0x230
  41. #define LOCAL_APIC_OFFSET_Local_APIC_IRR_159_128 0x240
  42. #define LOCAL_APIC_OFFSET_Local_APIC_IRR_191_160 0x250
  43. #define LOCAL_APIC_OFFSET_Local_APIC_IRR_223_192 0x260
  44. #define LOCAL_APIC_OFFSET_Local_APIC_IRR_255_224 0x270
  45. #define LOCAL_APIC_OFFSET_Local_APIC_ESR 0x280
  46. // 0x290~0x2e0 Reserved.
  47. #define LOCAL_APIC_OFFSET_Local_APIC_LVT_CMCI 0x2f0
  48. #define LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0 0x300
  49. #define LOCAL_APIC_OFFSET_Local_APIC_ICR_63_32 0x310
  50. #define LOCAL_APIC_OFFSET_Local_APIC_LVT_TIMER 0x320
  51. #define LOCAL_APIC_OFFSET_Local_APIC_LVT_THERMAL 0x330
  52. #define LOCAL_APIC_OFFSET_Local_APIC_LVT_PERFORMANCE_MONITOR 0x340
  53. #define LOCAL_APIC_OFFSET_Local_APIC_LVT_LINT0 0x350
  54. #define LOCAL_APIC_OFFSET_Local_APIC_LVT_LINT1 0x360
  55. #define LOCAL_APIC_OFFSET_Local_APIC_LVT_ERROR 0x370
  56. // 初始计数寄存器(定时器专用)
  57. #define LOCAL_APIC_OFFSET_Local_APIC_INITIAL_COUNT_REG 0x380
  58. // 当前计数寄存器(定时器专用)
  59. #define LOCAL_APIC_OFFSET_Local_APIC_CURRENT_COUNT_REG 0x390
  60. // 0x3A0~0x3D0 Reserved.
  61. // 分频配置寄存器(定时器专用)
  62. #define LOCAL_APIC_OFFSET_Local_APIC_CLKDIV 0x3e0
  63. struct apic_IO_APIC_map
  64. {
  65. // 间接访问寄存器的物理基地址
  66. uint addr_phys;
  67. // 索引寄存器虚拟地址
  68. unsigned char *virtual_index_addr;
  69. // 数据寄存器虚拟地址
  70. uint *virtual_data_addr;
  71. // EOI寄存器虚拟地址
  72. uint *virtual_EOI_addr;
  73. } apic_ioapic_map;
  74. /**
  75. * @brief 中断服务程序
  76. *
  77. * @param rsp 中断栈指针
  78. * @param number 中断号
  79. */
  80. void do_IRQ(struct pt_regs *rsp, ul number);
  81. /**
  82. * @brief 读取RTE寄存器
  83. *
  84. * @param index 索引值
  85. * @return ul
  86. */
  87. ul apic_ioapic_read_rte(unsigned char index);
  88. /**
  89. * @brief 写入RTE寄存器
  90. *
  91. * @param index 索引值
  92. * @param value 要写入的值
  93. */
  94. void apic_ioapic_write_rte(unsigned char index, ul value);
  95. /**
  96. * @brief 初始化apic控制器
  97. *
  98. */
  99. void apic_init();