apic.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. #define LOCAL_APIC_OFFSET_Local_APIC_ID 0x20
  10. #define LOCAL_APIC_OFFSET_Local_APIC_Version 0x30
  11. #define LOCAL_APIC_OFFSET_Local_APIC_TPR 0x80
  12. #define LOCAL_APIC_OFFSET_Local_APIC_APR 0x90
  13. #define LOCAL_APIC_OFFSET_Local_APIC_PPR 0xa0
  14. #define LOCAL_APIC_OFFSET_Local_APIC_EOI 0xb0
  15. #define LOCAL_APIC_OFFSET_Local_APIC_RRD 0xc0
  16. #define LOCAL_APIC_OFFSET_Local_APIC_LDR 0xd0
  17. #define LOCAL_APIC_OFFSET_Local_APIC_DFR 0xe0
  18. struct apic_IO_APIC_map
  19. {
  20. // 间接访问寄存器的物理基地址
  21. uint addr_phys;
  22. // 索引寄存器虚拟地址
  23. unsigned char* virtual_index_addr;
  24. // 数据寄存器虚拟地址
  25. uint* virtual_data_addr;
  26. // EOI寄存器虚拟地址
  27. uint* virtual_EOI_addr;
  28. }apic_ioapic_map;
  29. /**
  30. * @brief 中断服务程序
  31. *
  32. * @param rsp 中断栈指针
  33. * @param number 中断号
  34. */
  35. void do_IRQ(struct pt_regs* rsp, ul number);
  36. /**
  37. * @brief 读取RTE寄存器
  38. *
  39. * @param index 索引值
  40. * @return ul
  41. */
  42. ul apic_ioapic_read_rte(unsigned char index);
  43. /**
  44. * @brief 写入RTE寄存器
  45. *
  46. * @param index 索引值
  47. * @param value 要写入的值
  48. */
  49. void apic_ioapic_write_rte(unsigned char index, ul value);
  50. /**
  51. * @brief 初始化apic控制器
  52. *
  53. */
  54. void apic_init();