22__attribute__((target(
"general-regs-only"))) __attribute__((interrupt)) auto
23TarpEntry(
cpu_io::TrapContext* interrupt_context) ->
void {
24 InterruptSingleton::instance().Do(no, interrupt_context);
29 klog::Info(
"Default Interrupt handler [{}] {:#X}, {:#x}",
30 cpu_io::IdtrInfo::kInterruptNames[cause], cause,
31 reinterpret_cast<uintptr_t
>(context));
41 i = InterruptDelegate::create<DefaultInterruptHandler>();
48 if (cause < cpu_io::IdtrInfo::kInterruptMaxCount) {
49 interrupt_handlers_[cause](cause, context);
55 if (cause < cpu_io::IdtrInfo::kInterruptMaxCount) {
56 interrupt_handlers_[cause] = func;
58 cpu_io::IdtrInfo::kInterruptNames[cause], cause);
66 if constexpr (no < cpu_io::IdtrInfo::kInterruptMaxCount - 1) {
67 idts_[no] = cpu_io::IdtrInfo::Idt(
68 reinterpret_cast<uint64_t
>(TarpEntry<no>), 8, 0x0,
69 cpu_io::IdtrInfo::Idt::Type::k64BitInterruptGate,
70 cpu_io::IdtrInfo::Idt::DPL::kRing0, cpu_io::IdtrInfo::Idt::P::kPresent);
74 static auto idtr = cpu_io::IdtrInfo::Idtr{
75 .limit =
sizeof(cpu_io::IdtrInfo::Idt) *
76 cpu_io::IdtrInfo::kInterruptMaxCount -
80 cpu_io::Idtr::Write(idtr);
84 i < (cpu_io::Idtr::Read().limit + 1) /
sizeof(cpu_io::IdtrInfo::Idtr);
87 reinterpret_cast<uintptr_t
>(cpu_io::Idtr::Read().base + i));
107 auto vector =
static_cast<uint64_t
>(kExternalVectorBase + irq);
108 if (vector >= cpu_io::IdtrInfo::kInterruptMaxCount) {
113 RegisterInterruptFunc(vector, handler);
117 auto result = apic_.SetIrqRedirection(
118 static_cast<uint8_t
>(irq),
static_cast<uint8_t
>(vector), cpu_id,
false);
119 if (!result.has_value()) {
120 return std::unexpected(result.error());
123 klog::Info(
"RegisterExternalInterrupt: IRQ {} -> vector {:#X}, cpu {}", irq,
InterruptBase::InterruptDelegate InterruptDelegate
APIC 管理类,管理整个系统的 Local APIC 和 IO APIC.
auto SendIpi(uint64_t target_cpu_mask) -> Expected< void > override
发送 IPI 到指定 CPU
auto SetUpIdtr() -> void
初始化 idtr
auto InitApic(size_t cpu_count) -> void
初始化 APIC
auto RegisterExternalInterrupt(uint32_t irq, uint32_t cpu_id, uint32_t priority, InterruptDelegate handler) -> Expected< void > override
注册外部中断
auto Do(uint64_t cause, cpu_io::TrapContext *context) -> void override
执行中断处理
auto RegisterInterruptFunc(uint64_t cause, InterruptDelegate func) -> void override
注册中断处理函数
auto BroadcastIpi() -> Expected< void > override
广播 IPI 到所有 CPU
std::array< InterruptDelegate, kMaxInterrupt > interrupt_handlers_
中断处理函数数组
std::expected< T, Error > Expected
std::expected 别名模板
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
auto Debug(etl::format_string< Args... > fmt, Args &&... args) -> void
以 DEBUG 级别记录日志(SIMPLEKERNEL_MIN_LOG_LEVEL > 0 时编译期消除)
struct per_cpu::PerCpu __attribute__((aligned(SIMPLEKERNEL_PER_CPU_ALIGN_SIZE)))