SimpleKernel 1.17.0
Loading...
Searching...
No Matches
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#include "io_apic.h"
14#include "local_apic.h"
15
22class Apic {
23 public:
29 [[nodiscard]] auto InitCurrentCpuLocalApic() -> Expected<void>;
30
39 [[nodiscard]] auto SetIrqRedirection(uint8_t irq, uint8_t vector,
40 uint32_t destination_apic_id,
41 bool mask = false) -> Expected<void>;
42
48 [[nodiscard]] auto MaskIrq(uint8_t irq) -> Expected<void>;
49
55 [[nodiscard]] auto UnmaskIrq(uint8_t irq) -> Expected<void>;
56
63 [[nodiscard]] auto SendIpi(uint32_t target_apic_id, uint8_t vector) const
65
71 [[nodiscard]] auto BroadcastIpi(uint8_t vector) const -> Expected<void>;
72
82 [[nodiscard]] auto StartupAp(uint32_t apic_id, uint64_t ap_code_addr,
83 size_t ap_code_size, uint64_t target_addr) const
85
94 auto StartupAllAps(uint64_t ap_code_addr, size_t ap_code_size,
95 uint64_t target_addr) const -> void;
96
100 auto SendEoi() const -> void;
101
107 auto SetupPeriodicTimer(uint32_t frequency_hz, uint8_t vector) const -> void;
108
111 explicit Apic(const size_t cpu_count);
112 Apic() = default;
113 Apic(const Apic&) = delete;
114 Apic(Apic&&) = default;
115 auto operator=(const Apic&) -> Apic& = delete;
116 auto operator=(Apic&&) -> Apic& = default;
117 ~Apic() = default;
119
123 auto PrintInfo() const -> void;
124
125 private:
128
131
133 size_t cpu_count_{0};
134};
APIC 管理类,管理整个系统的 Local APIC 和 IO APIC.
Definition apic.h:22
auto InitCurrentCpuLocalApic() -> Expected< void >
初始化当前 CPU 的 Local APIC
Definition apic.cpp:19
auto BroadcastIpi(uint8_t vector) const -> Expected< void >
广播 IPI 到所有其他 CPU
Definition apic.cpp:78
auto PrintInfo() const -> void
打印所有 APIC 信息(调试用)
Definition apic.cpp:142
Apic(const Apic &)=delete
auto SendIpi(uint32_t target_apic_id, uint8_t vector) const -> Expected< void >
发送 IPI 到指定 CPU
Definition apic.cpp:73
auto SetupPeriodicTimer(uint32_t frequency_hz, uint8_t vector) const -> void
设置 Local APIC 定时器
Definition apic.cpp:137
auto operator=(Apic &&) -> Apic &=default
auto SendEoi() const -> void
发送 EOI 信号给当前 CPU 的 Local APIC
Definition apic.cpp:135
~Apic()=default
IoApic io_apic_
只支持一个 IO APIC
Definition apic.h:130
auto SetIrqRedirection(uint8_t irq, uint8_t vector, uint32_t destination_apic_id, bool mask=false) -> Expected< void >
设置 IRQ 重定向
Definition apic.cpp:34
auto StartupAllAps(uint64_t ap_code_addr, size_t ap_code_size, uint64_t target_addr) const -> void
唤醒所有应用处理器 (AP)
Definition apic.cpp:110
auto StartupAp(uint32_t apic_id, uint64_t ap_code_addr, size_t ap_code_size, uint64_t target_addr) const -> Expected< void >
启动 AP (Application Processor)
Definition apic.cpp:82
auto UnmaskIrq(uint8_t irq) -> Expected< void >
取消屏蔽 IRQ
Definition apic.cpp:61
Apic(Apic &&)=default
Apic()=default
size_t cpu_count_
系统 CPU 数量
Definition apic.h:133
auto MaskIrq(uint8_t irq) -> Expected< void >
屏蔽 IRQ
Definition apic.cpp:49
LocalApic local_apic_
Local APIC 操作接口(静态实例,用于当前 CPU)
Definition apic.h:127
auto operator=(const Apic &) -> Apic &=delete
IO APIC 驱动类
Definition io_apic.h:16
Local APIC 驱动类
Definition local_apic.h:18
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365