7#include <etl/io_port.h>
19 klog::Info(
"IO APIC initialization completed");
23 uint32_t destination_apic_id,
bool mask)
const
26 auto max_entries = GetMaxRedirectionEntries();
27 if (irq >= max_entries) {
28 klog::Err(
"IRQ {} exceeds maximum entries {}", irq, max_entries);
36 entry |= vector & kVectorMask;
43 entry |= (
static_cast<uint64_t
>(destination_apic_id & kDestApicIdMask)
46 WriteRedirectionEntry(irq, entry);
50 auto max_entries = GetMaxRedirectionEntries();
51 if (irq >= max_entries) {
52 klog::Err(
"IRQ {} exceeds maximum entries {}", irq, max_entries);
56 auto entry = ReadRedirectionEntry(irq);
58 WriteRedirectionEntry(irq, entry);
62 auto max_entries = GetMaxRedirectionEntries();
63 if (irq >= max_entries) {
64 klog::Err(
"IRQ {} exceeds maximum entries {}", irq, max_entries);
68 auto entry = ReadRedirectionEntry(irq);
70 WriteRedirectionEntry(irq, entry);
97 etl::io_port_wo<uint32_t> sel{
98 reinterpret_cast<void*
>(base_address_ + kRegSel)};
100 etl::io_port_ro<uint32_t> win{
101 reinterpret_cast<void*
>(base_address_ + kRegWin)};
106 etl::io_port_wo<uint32_t> sel{
107 reinterpret_cast<void*
>(base_address_ + kRegSel)};
109 etl::io_port_wo<uint32_t> win{
110 reinterpret_cast<void*
>(base_address_ + kRegWin)};
115 auto low_reg = kRedTblBase + (irq * 2);
116 auto high_reg = low_reg + 1;
118 auto low = Read(low_reg);
119 auto high = Read(high_reg);
121 return (
static_cast<uint64_t
>(high) << 32) | low;
125 auto low_reg = kRedTblBase + (irq * 2);
126 auto high_reg = low_reg + 1;
128 auto low =
static_cast<uint32_t
>(value & 0xFFFFFFFF);
129 auto high =
static_cast<uint32_t
>((value >> 32) & 0xFFFFFFFF);
132 Write(high_reg, high);
uint64_t base_address_
IO APIC 基地址
static constexpr uint32_t kRegVer
IO APIC 版本寄存器索引
auto Read(uint32_t reg) const -> uint32_t
读取 IO APIC 寄存器
auto UnmaskIrq(uint8_t irq) const -> void
取消屏蔽 IRQ
auto GetId() const -> uint32_t
获取 IO APIC ID
auto GetMaxRedirectionEntries() const -> uint32_t
获取 IO APIC 最大重定向条目数
auto GetVersion() const -> uint32_t
获取 IO APIC 版本
auto SetIrqRedirection(uint8_t irq, uint8_t vector, uint32_t destination_apic_id, bool mask=false) const -> void
设置 IO APIC 重定向表项
auto Write(uint32_t reg, uint32_t value) const -> void
写入 IO APIC 寄存器
static constexpr uint32_t kRegId
auto PrintInfo() const -> void
打印 IO APIC 信息(调试用)
auto WriteRedirectionEntry(uint8_t irq, uint64_t value) const -> void
写入 IO APIC 重定向表项
static constexpr uint64_t kMaskBit
屏蔽位 (位 16)
auto ReadRedirectionEntry(uint8_t irq) const -> uint64_t
读取 IO APIC 重定向表项
auto MaskIrq(uint8_t irq) const -> void
屏蔽 IRQ
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志