SimpleKernel 1.17.0
Loading...
Searching...
No Matches
interrupt.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <cpu_io.h>
8#include <etl/singleton.h>
9
10#include <array>
11#include <cstdint>
12
13#include "apic.h"
14#include "interrupt_base.h"
15#include "sk_stdio.h"
16
17class Interrupt final : public InterruptBase {
18 public:
20 static constexpr uint8_t kExternalVectorBase = 0x20;
21
22 auto Do(uint64_t cause, cpu_io::TrapContext* context) -> void override;
23
24 auto RegisterInterruptFunc(uint64_t cause, InterruptDelegate func)
25 -> void override;
26
27 [[nodiscard]] auto SendIpi(uint64_t target_cpu_mask)
28 -> Expected<void> override;
29
30 [[nodiscard]] auto BroadcastIpi() -> Expected<void> override;
31
32 [[nodiscard]] auto RegisterExternalInterrupt(uint32_t irq, uint32_t cpu_id,
33 uint32_t priority,
34 InterruptDelegate handler)
35 -> Expected<void> override;
36
39 [[nodiscard]] __always_inline auto apic() -> Apic& { return apic_; }
40 [[nodiscard]] __always_inline auto apic() const -> const Apic& {
41 return apic_;
42 }
44
49 auto InitApic(size_t cpu_count) -> void;
50
54 auto SetUpIdtr() -> void;
55
59 Interrupt(const Interrupt&) = delete;
60 Interrupt(Interrupt&&) = delete;
61 auto operator=(const Interrupt&) -> Interrupt& = delete;
62 auto operator=(Interrupt&&) -> Interrupt& = delete;
63 ~Interrupt() override = default;
65
66 private:
68 alignas(4096)
69 std::array<InterruptDelegate,
70 cpu_io::IdtrInfo::kInterruptMaxCount> interrupt_handlers_{};
71
72 alignas(4096) std::array<cpu_io::IdtrInfo::Idt,
73 cpu_io::IdtrInfo::kInterruptMaxCount> idts_{};
74
77
82 template <uint8_t no = 0>
83 auto SetUpIdtr() -> void;
84};
85
86using InterruptSingleton = etl::singleton<Interrupt>;
etl::singleton< Interrupt > InterruptSingleton
Interrupt 单例类型别名
Definition interrupt.h:117
InterruptBase::InterruptDelegate InterruptDelegate
APIC 管理类,管理整个系统的 Local APIC 和 IO APIC.
Definition apic.h:22
中断子系统抽象基类
AArch64 中断控制器实现
Definition interrupt.h:19
auto operator=(const Interrupt &) -> Interrupt &=delete
auto SendIpi(uint64_t target_cpu_mask) -> Expected< void > override
发送 IPI 到指定核心
~Interrupt() override=default
__always_inline auto apic() const -> const Apic &
Definition interrupt.h:40
std::array< cpu_io::IdtrInfo::Idt, cpu_io::IdtrInfo::kInterruptMaxCount > idts_
Definition interrupt.h:73
auto SetUpIdtr() -> void
初始化 idtr
Definition interrupt.cpp:62
auto InitApic(size_t cpu_count) -> void
初始化 APIC
Interrupt(const Interrupt &)=delete
auto RegisterExternalInterrupt(uint32_t irq, uint32_t cpu_id, uint32_t priority, InterruptDelegate handler) -> Expected< void > override
注册外部中断处理函数
auto operator=(Interrupt &&) -> Interrupt &=delete
static constexpr uint8_t kExternalVectorBase
外部中断向量基址(IO APIC IRQ 到 IDT 向量的映射)
Definition interrupt.h:20
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 到所有其他核心
Interrupt(Interrupt &&)=delete
Apic apic_
APIC 中断控制器实例
Definition interrupt.h:76
__always_inline auto apic() -> Apic &
Definition interrupt.h:39
std::array< InterruptDelegate, kMaxInterrupt > interrupt_handlers_
中断处理函数数组
Definition interrupt.h:110
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365