SimpleKernel 1.17.0
Loading...
Searching...
No Matches
local_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
12#include "expected.hpp"
13
18class LocalApic {
19 public:
24 [[nodiscard]] auto Init() -> Expected<void>;
25
30 [[nodiscard]] auto GetApicVersion() const -> uint32_t;
31
35 auto SendEoi() const -> void;
36
43 [[nodiscard]] auto SendIpi(uint32_t destination_apic_id, uint8_t vector) const
45
51 [[nodiscard]] auto BroadcastIpi(uint8_t vector) const -> Expected<void>;
52
57 auto SetTaskPriority(uint8_t priority) const -> void;
58
63 [[nodiscard]] auto GetTaskPriority() const -> uint8_t;
64
72 auto EnableTimer(uint32_t initial_count, uint32_t divide_value,
73 uint8_t vector, bool periodic = true) const -> void;
74
78 auto DisableTimer() const -> void;
79
84 [[nodiscard]] auto GetTimerCurrentCount() const -> uint32_t;
85
91 auto SetupPeriodicTimer(uint32_t frequency_hz, uint8_t vector) const -> void;
92
98 auto SetupOneShotTimer(uint32_t microseconds, uint8_t vector) const -> void;
99
104 auto SendInitIpi(uint32_t destination_apic_id) const -> void;
105
111 auto SendStartupIpi(uint32_t destination_apic_id, uint8_t start_page) const
112 -> void;
113
121 auto WakeupAp(uint32_t destination_apic_id, uint8_t start_vector) const
122 -> void;
123
127 auto ConfigureLvtEntries() const -> void;
128
133 [[nodiscard]] auto ReadErrorStatus() const -> uint32_t;
134
138 auto PrintInfo() const -> void;
139
142 LocalApic() = default;
143 LocalApic(const LocalApic&) = delete;
144 LocalApic(LocalApic&&) = default;
145 auto operator=(const LocalApic&) -> LocalApic& = delete;
146 auto operator=(LocalApic&&) -> LocalApic& = default;
147 ~LocalApic() = default;
149
150 private:
154 static constexpr uint32_t kXApicIdOffset = 0x20;
156 static constexpr uint32_t kXApicVersionOffset = 0x30;
158 static constexpr uint32_t kXApicTprOffset = 0x80;
160 static constexpr uint32_t kXApicEoiOffset = 0xB0;
162 static constexpr uint32_t kXApicSivrOffset = 0xF0;
164 static constexpr uint32_t kXApicEsrOffset = 0x280;
166 static constexpr uint32_t kXApicIcrLowOffset = 0x300;
168 static constexpr uint32_t kXApicIcrHighOffset = 0x310;
170 static constexpr uint32_t kXApicLvtTimerOffset = 0x320;
172 static constexpr uint32_t kXApicLvtLint0Offset = 0x350;
174 static constexpr uint32_t kXApicLvtLint1Offset = 0x360;
176 static constexpr uint32_t kXApicLvtErrorOffset = 0x370;
178 static constexpr uint32_t kXApicTimerInitCountOffset = 0x380;
180 static constexpr uint32_t kXApicTimerCurrCountOffset = 0x390;
182 static constexpr uint32_t kXApicTimerDivideOffset = 0x3E0;
184
188 static constexpr uint32_t kApicIdShift = 24;
190 static constexpr uint32_t kApicIdMask = 0xFF;
192 static constexpr uint32_t kApicSoftwareEnableBit = 0x100;
194 static constexpr uint32_t kSpuriousVector = 0xFF;
196 static constexpr uint32_t kLvtMaskBit = 0x10000;
198 static constexpr uint32_t kLvtPeriodicMode = 0x20000;
200 static constexpr uint32_t kIcrDeliveryStatusBit = 0x1000;
202 static constexpr uint32_t kIcrDestShift = 24;
204 static constexpr uint32_t kIcrBroadcastMode = 0xC0000;
206 static constexpr uint32_t kInitIpiMode = 0x500;
208 static constexpr uint32_t kSipiMode = 0x600;
210 static constexpr uint32_t kExtIntMode = 0x700;
212 static constexpr uint32_t kNmiMode = 0x400;
214 static constexpr uint8_t kErrorVector = 0xEF;
216
220 static constexpr uint32_t kDefaultApicClockHz = 100000000;
222 static constexpr uint32_t kTimerDivideBy1 = 0x0B;
224 static constexpr uint32_t kTimerDivideBy16 = 0x03;
226 static constexpr uint32_t kCalibrationCount = 0xFFFFFFFF;
228 static constexpr uint32_t kCalibrationDelayLoop = 1000000;
230 static constexpr uint32_t kCalibrationMultiplier = 100;
232 static constexpr uint32_t kMicrosecondsPerSecond = 1000000;
234
238 static constexpr uint64_t kDefaultApicBase = 0xFEE00000;
240 static constexpr uint64_t kApicBaseMask = 0xFFFFF000ULL;
242 static constexpr uint64_t kApicGlobalEnableBit = 1ULL << 11;
244 static constexpr uint64_t kX2ApicEnableBit = 1ULL << 10;
246 static constexpr uint64_t kApicBaseControlMask = 0xFFF;
248
250 bool is_x2apic_mode_{false};
251
254
260 [[nodiscard]] auto CheckX2ApicSupport() const -> bool;
261
267 [[nodiscard]] auto EnableXApic() const -> bool;
268
274 [[nodiscard]] auto DisableXApic() const -> bool;
275
281 [[nodiscard]] auto IsXApicEnabled() const -> bool;
282
288 [[nodiscard]] auto EnableX2Apic() const -> bool;
289
295 [[nodiscard]] auto DisableX2Apic() const -> bool;
296
302 [[nodiscard]] auto IsX2ApicEnabled() const -> bool;
303};
Local APIC 驱动类
Definition local_apic.h:18
auto IsXApicEnabled() const -> bool
检查传统 xAPIC 是否启用
static constexpr uint32_t kXApicLvtLint0Offset
LVT LINT0 寄存器偏移
Definition local_apic.h:172
auto SetupOneShotTimer(uint32_t microseconds, uint8_t vector) const -> void
设置单次定时器
static constexpr uint32_t kIcrBroadcastMode
ICR 广播模式位
Definition local_apic.h:204
static constexpr uint32_t kIcrDestShift
ICR 目标位移
Definition local_apic.h:202
auto EnableXApic() const -> bool
启用传统 xAPIC 模式
static constexpr uint32_t kXApicEoiOffset
EOI 寄存器偏移
Definition local_apic.h:160
LocalApic(LocalApic &&)=default
uint64_t apic_base_
APIC 基地址(仅用于 xAPIC 模式)
Definition local_apic.h:253
static constexpr uint64_t kX2ApicEnableBit
x2APIC 启用位
Definition local_apic.h:244
static constexpr uint64_t kDefaultApicBase
Definition local_apic.h:238
static constexpr uint32_t kXApicTimerCurrCountOffset
定时器当前计数寄存器偏移
Definition local_apic.h:180
static constexpr uint32_t kApicSoftwareEnableBit
APIC 软件启用位
Definition local_apic.h:192
static constexpr uint32_t kTimerDivideBy1
定时器分频 1
Definition local_apic.h:222
static constexpr uint32_t kXApicVersionOffset
版本寄存器偏移
Definition local_apic.h:156
static constexpr uint32_t kXApicSivrOffset
虚假中断向量寄存器偏移
Definition local_apic.h:162
static constexpr uint32_t kXApicEsrOffset
错误状态寄存器偏移
Definition local_apic.h:164
auto DisableTimer() const -> void
禁用 Local APIC 定时器
static constexpr uint32_t kCalibrationDelayLoop
校准延时循环次数
Definition local_apic.h:228
static constexpr uint32_t kSipiMode
SIPI 模式
Definition local_apic.h:208
static constexpr uint32_t kXApicIcrLowOffset
ICR 低位寄存器偏移
Definition local_apic.h:166
static constexpr uint32_t kXApicLvtLint1Offset
LVT LINT1 寄存器偏移
Definition local_apic.h:174
auto DisableXApic() const -> bool
禁用传统 xAPIC 模式
auto GetApicVersion() const -> uint32_t
获取 APIC 版本信息
static constexpr uint64_t kApicBaseControlMask
APIC 基地址控制位掩码
Definition local_apic.h:246
static constexpr uint32_t kCalibrationCount
校准用的计数值
Definition local_apic.h:226
static constexpr uint32_t kMicrosecondsPerSecond
每秒微秒数
Definition local_apic.h:232
bool is_x2apic_mode_
当前 APIC 模式(true = x2APIC, false = xAPIC)
Definition local_apic.h:250
auto SendEoi() const -> void
发送中断结束信号 (EOI)
static constexpr uint32_t kExtIntMode
ExtINT 传递模式
Definition local_apic.h:210
LocalApic()=default
auto DisableX2Apic() const -> bool
禁用 x2APIC 模式
static constexpr uint32_t kXApicTprOffset
任务优先级寄存器偏移
Definition local_apic.h:158
auto ReadErrorStatus() const -> uint32_t
读取错误状态
static constexpr uint32_t kApicIdMask
xAPIC ID 掩码
Definition local_apic.h:190
static constexpr uint32_t kSpuriousVector
虚假中断向量
Definition local_apic.h:194
auto SendStartupIpi(uint32_t destination_apic_id, uint8_t start_page) const -> void
发送 SIPI (Startup IPI)
static constexpr uint32_t kNmiMode
NMI 传递模式
Definition local_apic.h:212
auto GetTaskPriority() const -> uint8_t
获取任务优先级
auto SetupPeriodicTimer(uint32_t frequency_hz, uint8_t vector) const -> void
设置周期性定时器
static constexpr uint32_t kXApicTimerDivideOffset
定时器分频寄存器偏移
Definition local_apic.h:182
static constexpr uint32_t kLvtMaskBit
LVT 掩码位
Definition local_apic.h:196
auto EnableTimer(uint32_t initial_count, uint32_t divide_value, uint8_t vector, bool periodic=true) const -> void
启用 Local APIC 定时器
auto BroadcastIpi(uint8_t vector) const -> Expected< void >
广播 IPI 到所有其他 CPU
auto GetTimerCurrentCount() const -> uint32_t
获取定时器当前计数值
static constexpr uint32_t kIcrDeliveryStatusBit
ICR 传递状态位
Definition local_apic.h:200
auto SendIpi(uint32_t destination_apic_id, uint8_t vector) const -> Expected< void >
发送处理器间中断 (IPI)
static constexpr uint32_t kCalibrationMultiplier
校准倍数 (10ms -> 1s)
Definition local_apic.h:230
static constexpr uint32_t kTimerDivideBy16
定时器分频 16
Definition local_apic.h:224
auto ConfigureLvtEntries() const -> void
配置 Local Vector Table 条目
static constexpr uint32_t kXApicTimerInitCountOffset
定时器初始计数寄存器偏移
Definition local_apic.h:178
static constexpr uint32_t kXApicLvtErrorOffset
LVT 错误寄存器偏移
Definition local_apic.h:176
auto IsX2ApicEnabled() const -> bool
检查 x2APIC 是否启用
static constexpr uint64_t kApicGlobalEnableBit
APIC 全局启用位
Definition local_apic.h:242
static constexpr uint64_t kApicBaseMask
APIC 基地址掩码
Definition local_apic.h:240
auto PrintInfo() const -> void
打印 Local APIC 信息(调试用)
auto operator=(const LocalApic &) -> LocalApic &=delete
static constexpr uint32_t kXApicIcrHighOffset
ICR 高位寄存器偏移
Definition local_apic.h:168
auto operator=(LocalApic &&) -> LocalApic &=default
static constexpr uint32_t kInitIpiMode
INIT IPI 模式
Definition local_apic.h:206
auto CheckX2ApicSupport() const -> bool
检查 CPU 是否支持 x2APIC
auto EnableX2Apic() const -> bool
启用 x2APIC 模式
static constexpr uint32_t kDefaultApicClockHz
Definition local_apic.h:220
static constexpr uint8_t kErrorVector
错误中断向量
Definition local_apic.h:214
~LocalApic()=default
LocalApic(const LocalApic &)=delete
auto Init() -> Expected< void >
初始化 Local APIC
static constexpr uint32_t kLvtPeriodicMode
LVT 周期模式位
Definition local_apic.h:198
static constexpr uint32_t kXApicLvtTimerOffset
LVT 定时器寄存器偏移
Definition local_apic.h:170
auto SendInitIpi(uint32_t destination_apic_id) const -> void
发送 INIT IPI
static constexpr uint32_t kApicIdShift
Definition local_apic.h:188
auto WakeupAp(uint32_t destination_apic_id, uint8_t start_vector) const -> void
唤醒应用处理器 (AP)
auto SetTaskPriority(uint8_t priority) const -> void
设置任务优先级
static constexpr uint32_t kXApicIdOffset
Definition local_apic.h:154
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365