SimpleKernel 1.17.0
Loading...
Searching...
No Matches
io_apic.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <cpu_io.h>
8
9#include <array>
10#include <cstdint>
11
16class IoApic {
17 public:
25 auto SetIrqRedirection(uint8_t irq, uint8_t vector,
26 uint32_t destination_apic_id, bool mask = false) const
27 -> void;
28
33 auto MaskIrq(uint8_t irq) const -> void;
34
39 auto UnmaskIrq(uint8_t irq) const -> void;
40
45 [[nodiscard]] auto GetId() const -> uint32_t;
46
51 [[nodiscard]] auto GetVersion() const -> uint32_t;
52
57 [[nodiscard]] auto GetMaxRedirectionEntries() const -> uint32_t;
58
62 auto PrintInfo() const -> void;
63
66 IoApic();
67 IoApic(const IoApic&) = delete;
68 IoApic(IoApic&&) = default;
69 auto operator=(const IoApic&) -> IoApic& = delete;
70 auto operator=(IoApic&&) -> IoApic& = default;
71 ~IoApic() = default;
73
74 private:
78 static constexpr uint32_t kRegSel = 0x00;
80 static constexpr uint32_t kRegWin = 0x10;
82
86 static constexpr uint32_t kRegId = 0x00;
88 static constexpr uint32_t kRegVer = 0x01;
90 static constexpr uint32_t kRegArb = 0x02;
92 static constexpr uint32_t kRedTblBase = 0x10;
94
98 static constexpr uint64_t kVectorMask = 0xFF;
100 static constexpr uint32_t kDeliveryModeShift = 8;
102 static constexpr uint64_t kDestModeBit = 1ULL << 11;
104 static constexpr uint64_t kDeliveryStatusBit = 1ULL << 12;
106 static constexpr uint64_t kPolarityBit = 1ULL << 13;
108 static constexpr uint64_t kRemoteIrrBit = 1ULL << 14;
110 static constexpr uint64_t kTriggerModeBit = 1ULL << 15;
112 static constexpr uint64_t kMaskBit = 1ULL << 16;
114 static constexpr uint32_t kDestApicIdShift = 56;
116 static constexpr uint64_t kDestApicIdMask = 0xFF;
118
122 static constexpr uint32_t kDeliveryModeFixed = 0x0;
124 static constexpr uint32_t kDeliveryModeLowestPriority = 0x1;
126 static constexpr uint32_t kDeliveryModeSmi = 0x2;
128 static constexpr uint32_t kDeliveryModeNmi = 0x4;
130 static constexpr uint32_t kDeliveryModeInit = 0x5;
132 static constexpr uint32_t kDeliveryModeExtInt = 0x7;
134
138 static constexpr uint64_t kDefaultIoApicBase = 0xFEC00000;
140
143
149 [[nodiscard]] auto Read(uint32_t reg) const -> uint32_t;
150
156 auto Write(uint32_t reg, uint32_t value) const -> void;
157
163 [[nodiscard]] auto ReadRedirectionEntry(uint8_t irq) const -> uint64_t;
164
170 auto WriteRedirectionEntry(uint8_t irq, uint64_t value) const -> void;
171};
IO APIC 驱动类
Definition io_apic.h:16
static constexpr uint64_t kDestApicIdMask
目标 APIC ID 掩码
Definition io_apic.h:116
uint64_t base_address_
IO APIC 基地址
Definition io_apic.h:142
static constexpr uint32_t kRegVer
IO APIC 版本寄存器索引
Definition io_apic.h:88
static constexpr uint64_t kVectorMask
Definition io_apic.h:98
static constexpr uint32_t kRegSel
Definition io_apic.h:78
~IoApic()=default
static constexpr uint64_t kDefaultIoApicBase
Definition io_apic.h:138
static constexpr uint32_t kRegWin
寄存器窗口偏移
Definition io_apic.h:80
static constexpr uint64_t kDestModeBit
目标模式位 (位 11)
Definition io_apic.h:102
auto Read(uint32_t reg) const -> uint32_t
读取 IO APIC 寄存器
Definition io_apic.cpp:96
static constexpr uint64_t kPolarityBit
极性位 (位 13)
Definition io_apic.h:106
static constexpr uint64_t kTriggerModeBit
触发模式位 (位 15)
Definition io_apic.h:110
IoApic(IoApic &&)=default
IoApic(const IoApic &)=delete
static constexpr uint32_t kDeliveryModeFixed
Definition io_apic.h:122
static constexpr uint32_t kDeliveryModeLowestPriority
最低优先级传递模式
Definition io_apic.h:124
auto UnmaskIrq(uint8_t irq) const -> void
取消屏蔽 IRQ
Definition io_apic.cpp:61
auto GetId() const -> uint32_t
获取 IO APIC ID
Definition io_apic.cpp:73
static constexpr uint32_t kDeliveryModeShift
传递模式位移 (位 8-10)
Definition io_apic.h:100
static constexpr uint32_t kDeliveryModeExtInt
ExtINT 传递模式
Definition io_apic.h:132
static constexpr uint32_t kDeliveryModeInit
INIT 传递模式
Definition io_apic.h:130
auto GetMaxRedirectionEntries() const -> uint32_t
获取 IO APIC 最大重定向条目数
Definition io_apic.cpp:83
auto GetVersion() const -> uint32_t
获取 IO APIC 版本
Definition io_apic.cpp:78
static constexpr uint32_t kDeliveryModeNmi
NMI 传递模式
Definition io_apic.h:128
static constexpr uint64_t kRemoteIrrBit
远程 IRR 位 (位 14)
Definition io_apic.h:108
auto SetIrqRedirection(uint8_t irq, uint8_t vector, uint32_t destination_apic_id, bool mask=false) const -> void
设置 IO APIC 重定向表项
Definition io_apic.cpp:22
IoApic()
Definition io_apic.cpp:11
static constexpr uint32_t kRegArb
IO APIC 仲裁寄存器索引
Definition io_apic.h:90
auto Write(uint32_t reg, uint32_t value) const -> void
写入 IO APIC 寄存器
Definition io_apic.cpp:105
static constexpr uint32_t kRegId
Definition io_apic.h:86
static constexpr uint64_t kDeliveryStatusBit
传递状态位 (位 12)
Definition io_apic.h:104
auto PrintInfo() const -> void
打印 IO APIC 信息(调试用)
Definition io_apic.cpp:88
auto WriteRedirectionEntry(uint8_t irq, uint64_t value) const -> void
写入 IO APIC 重定向表项
Definition io_apic.cpp:124
auto operator=(const IoApic &) -> IoApic &=delete
static constexpr uint64_t kMaskBit
屏蔽位 (位 16)
Definition io_apic.h:112
static constexpr uint32_t kRedTblBase
重定向表基址索引
Definition io_apic.h:92
static constexpr uint32_t kDestApicIdShift
目标 APIC ID 位移 (位 56-63)
Definition io_apic.h:114
auto ReadRedirectionEntry(uint8_t irq) const -> uint64_t
读取 IO APIC 重定向表项
Definition io_apic.cpp:114
auto operator=(IoApic &&) -> IoApic &=default
static constexpr uint32_t kDeliveryModeSmi
SMI 传递模式
Definition io_apic.h:126
auto MaskIrq(uint8_t irq) const -> void
屏蔽 IRQ
Definition io_apic.cpp:49