SimpleKernel 1.17.0
Loading...
Searching...
No Matches
IoApic Class Reference

IO APIC 驱动类 More...

#include <io_apic.h>

Collaboration diagram for IoApic:
Collaboration graph

Public Member Functions

auto SetIrqRedirection (uint8_t irq, uint8_t vector, uint32_t destination_apic_id, bool mask=false) const -> void
 设置 IO APIC 重定向表项
 
auto MaskIrq (uint8_t irq) const -> void
 屏蔽 IRQ
 
auto UnmaskIrq (uint8_t irq) const -> void
 取消屏蔽 IRQ
 
auto GetId () const -> uint32_t
 获取 IO APIC ID
 
auto GetVersion () const -> uint32_t
 获取 IO APIC 版本
 
auto GetMaxRedirectionEntries () const -> uint32_t
 获取 IO APIC 最大重定向条目数
 
auto PrintInfo () const -> void
 打印 IO APIC 信息(调试用)
 
构造/析构函数
 IoApic ()
 
 IoApic (const IoApic &)=delete
 
 IoApic (IoApic &&)=default
 
auto operator= (const IoApic &) -> IoApic &=delete
 
auto operator= (IoApic &&) -> IoApic &=default
 
 ~IoApic ()=default
 

Private Member Functions

auto Read (uint32_t reg) const -> uint32_t
 读取 IO APIC 寄存器
 
auto Write (uint32_t reg, uint32_t value) const -> void
 写入 IO APIC 寄存器
 
auto ReadRedirectionEntry (uint8_t irq) const -> uint64_t
 读取 IO APIC 重定向表项
 
auto WriteRedirectionEntry (uint8_t irq, uint64_t value) const -> void
 写入 IO APIC 重定向表项
 

Private Attributes

uint64_t base_address_ {kDefaultIoApicBase}
 IO APIC 基地址
 

Static Private Attributes

IO APIC 寄存器偏移常数

寄存器选择偏移

static constexpr uint32_t kRegSel = 0x00
 
static constexpr uint32_t kRegWin = 0x10
 寄存器窗口偏移
 
IO APIC 寄存器索引常数

IO APIC ID 寄存器索引

static constexpr uint32_t kRegId = 0x00
 
static constexpr uint32_t kRegVer = 0x01
 IO APIC 版本寄存器索引
 
static constexpr uint32_t kRegArb = 0x02
 IO APIC 仲裁寄存器索引
 
static constexpr uint32_t kRedTblBase = 0x10
 重定向表基址索引
 
重定向表项位字段常数

中断向量位掩码 (位 0-7)

static constexpr uint64_t kVectorMask = 0xFF
 
static constexpr uint32_t kDeliveryModeShift = 8
 传递模式位移 (位 8-10)
 
static constexpr uint64_t kDestModeBit = 1ULL << 11
 目标模式位 (位 11)
 
static constexpr uint64_t kDeliveryStatusBit = 1ULL << 12
 传递状态位 (位 12)
 
static constexpr uint64_t kPolarityBit = 1ULL << 13
 极性位 (位 13)
 
static constexpr uint64_t kRemoteIrrBit = 1ULL << 14
 远程 IRR 位 (位 14)
 
static constexpr uint64_t kTriggerModeBit = 1ULL << 15
 触发模式位 (位 15)
 
static constexpr uint64_t kMaskBit = 1ULL << 16
 屏蔽位 (位 16)
 
static constexpr uint32_t kDestApicIdShift = 56
 目标 APIC ID 位移 (位 56-63)
 
static constexpr uint64_t kDestApicIdMask = 0xFF
 目标 APIC ID 掩码
 
传递模式常数

固定传递模式

static constexpr uint32_t kDeliveryModeFixed = 0x0
 
static constexpr uint32_t kDeliveryModeLowestPriority = 0x1
 最低优先级传递模式
 
static constexpr uint32_t kDeliveryModeSmi = 0x2
 SMI 传递模式
 
static constexpr uint32_t kDeliveryModeNmi = 0x4
 NMI 传递模式
 
static constexpr uint32_t kDeliveryModeInit = 0x5
 INIT 传递模式
 
static constexpr uint32_t kDeliveryModeExtInt = 0x7
 ExtINT 传递模式
 
IO APIC 基地址相关常数

默认 IO APIC 基地址

static constexpr uint64_t kDefaultIoApicBase = 0xFEC00000
 

Detailed Description

IO APIC 驱动类

Note
IO APIC 是系统级别的中断控制器,负责处理外部设备中断

Definition at line 16 of file io_apic.h.

Constructor & Destructor Documentation

◆ IoApic() [1/3]

IoApic::IoApic ( )

Definition at line 11 of file io_apic.cpp.

11 {
12 // 禁用所有重定向条目(设置为屏蔽状态)
13 for (uint32_t i = 0; i < GetMaxRedirectionEntries(); i++) {
14 auto entry = ReadRedirectionEntry(i);
15 entry |= kMaskBit;
16 WriteRedirectionEntry(i, entry);
17 }
18
19 klog::Info("IO APIC initialization completed");
20}
auto GetMaxRedirectionEntries() const -> uint32_t
获取 IO APIC 最大重定向条目数
Definition io_apic.cpp:83
auto WriteRedirectionEntry(uint8_t irq, uint64_t value) const -> void
写入 IO APIC 重定向表项
Definition io_apic.cpp:124
static constexpr uint64_t kMaskBit
屏蔽位 (位 16)
Definition io_apic.h:112
auto ReadRedirectionEntry(uint8_t irq) const -> uint64_t
读取 IO APIC 重定向表项
Definition io_apic.cpp:114
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
Here is the call graph for this function:

◆ IoApic() [2/3]

IoApic::IoApic ( const IoApic )
delete

◆ IoApic() [3/3]

IoApic::IoApic ( IoApic &&  )
default

◆ ~IoApic()

IoApic::~IoApic ( )
default

Member Function Documentation

◆ GetId()

auto IoApic::GetId ( ) const -> uint32_t

获取 IO APIC ID

Returns
uint32_t IO APIC ID

Definition at line 73 of file io_apic.cpp.

73 {
74 // ID 位于位 24-27
75 return (Read(kRegId) >> 24) & 0x0F;
76}
auto Read(uint32_t reg) const -> uint32_t
读取 IO APIC 寄存器
Definition io_apic.cpp:96
static constexpr uint32_t kRegId
Definition io_apic.h:86
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetMaxRedirectionEntries()

auto IoApic::GetMaxRedirectionEntries ( ) const -> uint32_t

获取 IO APIC 最大重定向条目数

Returns
uint32_t 最大重定向条目数

Definition at line 83 of file io_apic.cpp.

83 {
84 // MRE 位于位 16-23,实际数量需要 +1
85 return ((Read(kRegVer) >> 16) & 0xFF) + 1;
86}
static constexpr uint32_t kRegVer
IO APIC 版本寄存器索引
Definition io_apic.h:88
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetVersion()

auto IoApic::GetVersion ( ) const -> uint32_t

获取 IO APIC 版本

Returns
uint32_t IO APIC 版本

Definition at line 78 of file io_apic.cpp.

78 {
79 // 版本位于位 0-7
80 return Read(kRegVer) & 0xFF;
81}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ MaskIrq()

auto IoApic::MaskIrq ( uint8_t  irq) const -> void

屏蔽 IRQ

Parameters
irqIRQ 号

Definition at line 49 of file io_apic.cpp.

49 {
50 auto max_entries = GetMaxRedirectionEntries();
51 if (irq >= max_entries) {
52 klog::Err("IRQ {} exceeds maximum entries {}", irq, max_entries);
53 return;
54 }
55
56 auto entry = ReadRedirectionEntry(irq);
57 entry |= kMaskBit;
58 WriteRedirectionEntry(irq, entry);
59}
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
Here is the call graph for this function:

◆ operator=() [1/2]

auto IoApic::operator= ( const IoApic ) -> IoApic &=delete
delete

◆ operator=() [2/2]

auto IoApic::operator= ( IoApic &&  ) -> IoApic &=default
default

◆ PrintInfo()

auto IoApic::PrintInfo ( ) const -> void

打印 IO APIC 信息(调试用)

Definition at line 88 of file io_apic.cpp.

88 {
89 klog::Info("IO APIC Information");
90 klog::Info("Base Address: {:#x}", base_address_);
91 klog::Info("ID: {:#x}", GetId());
92 klog::Info("Version: {:#x}", GetVersion());
93 klog::Info("Max Redirection Entries: {}", GetMaxRedirectionEntries());
94}
uint64_t base_address_
IO APIC 基地址
Definition io_apic.h:142
auto GetId() const -> uint32_t
获取 IO APIC ID
Definition io_apic.cpp:73
auto GetVersion() const -> uint32_t
获取 IO APIC 版本
Definition io_apic.cpp:78
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Read()

auto IoApic::Read ( uint32_t  reg) const -> uint32_t
private

读取 IO APIC 寄存器

Parameters
reg寄存器索引
Returns
uint32_t 寄存器值

Definition at line 96 of file io_apic.cpp.

96 {
97 etl::io_port_wo<uint32_t> sel{
98 reinterpret_cast<void*>(base_address_ + kRegSel)};
99 sel.write(reg);
100 etl::io_port_ro<uint32_t> win{
101 reinterpret_cast<void*>(base_address_ + kRegWin)};
102 return win.read();
103}
static constexpr uint32_t kRegSel
Definition io_apic.h:78
static constexpr uint32_t kRegWin
寄存器窗口偏移
Definition io_apic.h:80
Here is the caller graph for this function:

◆ ReadRedirectionEntry()

auto IoApic::ReadRedirectionEntry ( uint8_t  irq) const -> uint64_t
private

读取 IO APIC 重定向表项

Parameters
irqIRQ 号
Returns
uint64_t 重定向表项值

Definition at line 114 of file io_apic.cpp.

114 {
115 auto low_reg = kRedTblBase + (irq * 2);
116 auto high_reg = low_reg + 1;
117
118 auto low = Read(low_reg);
119 auto high = Read(high_reg);
120
121 return (static_cast<uint64_t>(high) << 32) | low;
122}
static constexpr uint32_t kRedTblBase
重定向表基址索引
Definition io_apic.h:92
Here is the caller graph for this function:

◆ SetIrqRedirection()

auto IoApic::SetIrqRedirection ( uint8_t  irq,
uint8_t  vector,
uint32_t  destination_apic_id,
bool  mask = false 
) const -> void

设置 IO APIC 重定向表项

Parameters
irqIRQ 号
vector中断向量
destination_apic_id目标 APIC ID
mask是否屏蔽中断

Definition at line 22 of file io_apic.cpp.

24 {
25 // 检查 IRQ 是否在有效范围内
26 auto max_entries = GetMaxRedirectionEntries();
27 if (irq >= max_entries) {
28 klog::Err("IRQ {} exceeds maximum entries {}", irq, max_entries);
29 return;
30 }
31
32 // 构造重定向表项
33 uint64_t entry = 0;
34
35 // 设置中断向量 (位 0-7)
36 entry |= vector & kVectorMask;
37 // 设置屏蔽位 (位 16)
38 if (mask) {
39 entry |= kMaskBit;
40 }
41
42 // 设置目标 APIC ID (位 56-63)
43 entry |= (static_cast<uint64_t>(destination_apic_id & kDestApicIdMask)
45
46 WriteRedirectionEntry(irq, entry);
47}
static constexpr uint64_t kDestApicIdMask
目标 APIC ID 掩码
Definition io_apic.h:116
static constexpr uint64_t kVectorMask
Definition io_apic.h:98
static constexpr uint32_t kDestApicIdShift
目标 APIC ID 位移 (位 56-63)
Definition io_apic.h:114
Here is the call graph for this function:

◆ UnmaskIrq()

auto IoApic::UnmaskIrq ( uint8_t  irq) const -> void

取消屏蔽 IRQ

Parameters
irqIRQ 号

Definition at line 61 of file io_apic.cpp.

61 {
62 auto max_entries = GetMaxRedirectionEntries();
63 if (irq >= max_entries) {
64 klog::Err("IRQ {} exceeds maximum entries {}", irq, max_entries);
65 return;
66 }
67
68 auto entry = ReadRedirectionEntry(irq);
69 entry &= ~kMaskBit;
70 WriteRedirectionEntry(irq, entry);
71}
Here is the call graph for this function:

◆ Write()

auto IoApic::Write ( uint32_t  reg,
uint32_t  value 
) const -> void
private

写入 IO APIC 寄存器

Parameters
reg寄存器索引
value要写入的值

Definition at line 105 of file io_apic.cpp.

105 {
106 etl::io_port_wo<uint32_t> sel{
107 reinterpret_cast<void*>(base_address_ + kRegSel)};
108 sel.write(reg);
109 etl::io_port_wo<uint32_t> win{
110 reinterpret_cast<void*>(base_address_ + kRegWin)};
111 win.write(value);
112}

◆ WriteRedirectionEntry()

auto IoApic::WriteRedirectionEntry ( uint8_t  irq,
uint64_t  value 
) const -> void
private

写入 IO APIC 重定向表项

Parameters
irqIRQ 号
value重定向表项值

Definition at line 124 of file io_apic.cpp.

124 {
125 auto low_reg = kRedTblBase + (irq * 2);
126 auto high_reg = low_reg + 1;
127
128 auto low = static_cast<uint32_t>(value & 0xFFFFFFFF);
129 auto high = static_cast<uint32_t>((value >> 32) & 0xFFFFFFFF);
130
131 Write(low_reg, low);
132 Write(high_reg, high);
133}
auto Write(uint32_t reg, uint32_t value) const -> void
写入 IO APIC 寄存器
Definition io_apic.cpp:105
Here is the caller graph for this function:

Member Data Documentation

◆ base_address_

uint64_t IoApic::base_address_ {kDefaultIoApicBase}
private

IO APIC 基地址

Definition at line 142 of file io_apic.h.

static constexpr uint64_t kDefaultIoApicBase
Definition io_apic.h:138

◆ kDefaultIoApicBase

constexpr uint64_t IoApic::kDefaultIoApicBase = 0xFEC00000
staticconstexprprivate

Definition at line 138 of file io_apic.h.

◆ kDeliveryModeExtInt

constexpr uint32_t IoApic::kDeliveryModeExtInt = 0x7
staticconstexprprivate

ExtINT 传递模式

Definition at line 132 of file io_apic.h.

◆ kDeliveryModeFixed

constexpr uint32_t IoApic::kDeliveryModeFixed = 0x0
staticconstexprprivate

Definition at line 122 of file io_apic.h.

◆ kDeliveryModeInit

constexpr uint32_t IoApic::kDeliveryModeInit = 0x5
staticconstexprprivate

INIT 传递模式

Definition at line 130 of file io_apic.h.

◆ kDeliveryModeLowestPriority

constexpr uint32_t IoApic::kDeliveryModeLowestPriority = 0x1
staticconstexprprivate

最低优先级传递模式

Definition at line 124 of file io_apic.h.

◆ kDeliveryModeNmi

constexpr uint32_t IoApic::kDeliveryModeNmi = 0x4
staticconstexprprivate

NMI 传递模式

Definition at line 128 of file io_apic.h.

◆ kDeliveryModeShift

constexpr uint32_t IoApic::kDeliveryModeShift = 8
staticconstexprprivate

传递模式位移 (位 8-10)

Definition at line 100 of file io_apic.h.

◆ kDeliveryModeSmi

constexpr uint32_t IoApic::kDeliveryModeSmi = 0x2
staticconstexprprivate

SMI 传递模式

Definition at line 126 of file io_apic.h.

◆ kDeliveryStatusBit

constexpr uint64_t IoApic::kDeliveryStatusBit = 1ULL << 12
staticconstexprprivate

传递状态位 (位 12)

Definition at line 104 of file io_apic.h.

◆ kDestApicIdMask

constexpr uint64_t IoApic::kDestApicIdMask = 0xFF
staticconstexprprivate

目标 APIC ID 掩码

Definition at line 116 of file io_apic.h.

◆ kDestApicIdShift

constexpr uint32_t IoApic::kDestApicIdShift = 56
staticconstexprprivate

目标 APIC ID 位移 (位 56-63)

Definition at line 114 of file io_apic.h.

◆ kDestModeBit

constexpr uint64_t IoApic::kDestModeBit = 1ULL << 11
staticconstexprprivate

目标模式位 (位 11)

Definition at line 102 of file io_apic.h.

◆ kMaskBit

constexpr uint64_t IoApic::kMaskBit = 1ULL << 16
staticconstexprprivate

屏蔽位 (位 16)

Definition at line 112 of file io_apic.h.

◆ kPolarityBit

constexpr uint64_t IoApic::kPolarityBit = 1ULL << 13
staticconstexprprivate

极性位 (位 13)

Definition at line 106 of file io_apic.h.

◆ kRedTblBase

constexpr uint32_t IoApic::kRedTblBase = 0x10
staticconstexprprivate

重定向表基址索引

Definition at line 92 of file io_apic.h.

◆ kRegArb

constexpr uint32_t IoApic::kRegArb = 0x02
staticconstexprprivate

IO APIC 仲裁寄存器索引

Definition at line 90 of file io_apic.h.

◆ kRegId

constexpr uint32_t IoApic::kRegId = 0x00
staticconstexprprivate

Definition at line 86 of file io_apic.h.

◆ kRegSel

constexpr uint32_t IoApic::kRegSel = 0x00
staticconstexprprivate

Definition at line 78 of file io_apic.h.

◆ kRegVer

constexpr uint32_t IoApic::kRegVer = 0x01
staticconstexprprivate

IO APIC 版本寄存器索引

Definition at line 88 of file io_apic.h.

◆ kRegWin

constexpr uint32_t IoApic::kRegWin = 0x10
staticconstexprprivate

寄存器窗口偏移

Definition at line 80 of file io_apic.h.

◆ kRemoteIrrBit

constexpr uint64_t IoApic::kRemoteIrrBit = 1ULL << 14
staticconstexprprivate

远程 IRR 位 (位 14)

Definition at line 108 of file io_apic.h.

◆ kTriggerModeBit

constexpr uint64_t IoApic::kTriggerModeBit = 1ULL << 15
staticconstexprprivate

触发模式位 (位 15)

Definition at line 110 of file io_apic.h.

◆ kVectorMask

constexpr uint64_t IoApic::kVectorMask = 0xFF
staticconstexprprivate

Definition at line 98 of file io_apic.h.


The documentation for this class was generated from the following files: