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 <cstdint>
11
12#include "gic.h"
13#include "interrupt_base.h"
14#include "sk_stdio.h"
15
19class Interrupt final : public InterruptBase {
20 public:
22 static constexpr size_t kMaxInterrupt = 128;
23
29 auto Do(uint64_t cause, cpu_io::TrapContext* context) -> void override;
30
36 auto RegisterInterruptFunc(uint64_t cause, InterruptDelegate func)
37 -> void override;
38
44 [[nodiscard]] auto SendIpi(uint64_t target_cpu_mask)
45 -> Expected<void> override;
46
51 [[nodiscard]] auto BroadcastIpi() -> Expected<void> override;
52
61 [[nodiscard]] auto RegisterExternalInterrupt(uint32_t irq, uint32_t cpu_id,
62 uint32_t priority,
63 InterruptDelegate handler)
64 -> Expected<void> override;
65
69 __always_inline auto SetUp() const -> void { gic_.SetUp(); }
70
76 __always_inline auto Spi(uint32_t intid, uint32_t cpuid) const -> void {
77 gic_.Spi(intid, cpuid);
78 }
79
85 __always_inline auto Ppi(uint32_t intid, uint32_t cpuid) const -> void {
86 gic_.Ppi(intid, cpuid);
87 }
88
94 __always_inline auto Sgi(uint32_t intid, uint32_t cpuid) const -> void {
95 gic_.Sgi(intid, cpuid);
96 }
97
100 Interrupt();
101 Interrupt(const Interrupt&) = delete;
102 Interrupt(Interrupt&&) = delete;
103 auto operator=(const Interrupt&) -> Interrupt& = delete;
104 auto operator=(Interrupt&&) -> Interrupt& = delete;
105 ~Interrupt() = default;
107
108 private:
110 std::array<InterruptDelegate, kMaxInterrupt> interrupt_handlers_{};
111
114};
115
117using InterruptSingleton = etl::singleton<Interrupt>;
etl::singleton< Interrupt > InterruptSingleton
Interrupt 单例类型别名
Definition interrupt.h:117
InterruptBase::InterruptDelegate InterruptDelegate
GIC 中断控制器驱动
Definition gic.h:17
auto Spi(uint32_t intid, uint32_t cpuid) const -> void
配置共享外设中断 (SPI)
Definition gic.cpp:31
auto Sgi(uint32_t intid, uint32_t cpuid) const -> void
配置软件生成中断 (SGI)
Definition gic.cpp:39
auto SetUp() const -> void
初始化当前 CPU 的 GIC 配置
Definition gic.cpp:23
auto Ppi(uint32_t intid, uint32_t cpuid) const -> void
配置私有外设中断 (PPI)
Definition gic.cpp:35
中断子系统抽象基类
AArch64 中断控制器实现
Definition interrupt.h:19
auto operator=(const Interrupt &) -> Interrupt &=delete
auto SendIpi(uint64_t target_cpu_mask) -> Expected< void > override
发送 IPI 到指定 CPU
Definition interrupt.cpp:75
__always_inline auto SetUp() const -> void
设置 GIC
Definition interrupt.h:69
__always_inline auto Ppi(uint32_t intid, uint32_t cpuid) const -> void
设置 PPI 中断
Definition interrupt.h:85
__always_inline auto Sgi(uint32_t intid, uint32_t cpuid) const -> void
设置 SGI 中断
Definition interrupt.h:94
static constexpr size_t kMaxInterrupt
最大中断号
Definition interrupt.h:22
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
Gic gic_
GIC 中断控制器实例
Definition interrupt.h:113
auto Do(uint64_t cause, cpu_io::TrapContext *context) -> void override
执行中断处理
Definition interrupt.cpp:63
__always_inline auto Spi(uint32_t intid, uint32_t cpuid) const -> void
设置 SPI 中断
Definition interrupt.h:76
auto RegisterInterruptFunc(uint64_t cause, InterruptDelegate func) -> void override
注册中断处理函数
Definition interrupt.cpp:68
auto BroadcastIpi() -> Expected< void > override
广播 IPI 到所有 CPU
Definition interrupt.cpp:93
Interrupt(Interrupt &&)=delete
~Interrupt()=default
std::array< InterruptDelegate, kMaxInterrupt > interrupt_handlers_
中断处理函数数组
Definition interrupt.h:110
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365