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 "interrupt_base.h"
14#include "plic.h"
15#include "sk_stdio.h"
16
17class Interrupt final : public InterruptBase {
18 public:
24 auto Do(uint64_t cause, cpu_io::TrapContext* context) -> void override;
30 auto RegisterInterruptFunc(uint64_t cause, InterruptDelegate func)
31 -> void override;
37 [[nodiscard]] auto SendIpi(uint64_t target_cpu_mask)
38 -> Expected<void> override;
43 [[nodiscard]] auto BroadcastIpi() -> Expected<void> override;
52 [[nodiscard]] auto RegisterExternalInterrupt(uint32_t irq, uint32_t cpu_id,
53 uint32_t priority,
54 InterruptDelegate handler)
55 -> Expected<void> override;
56
59
63 [[nodiscard]] __always_inline auto plic() -> Plic& { return plic_; }
68 [[nodiscard]] __always_inline auto plic() const -> const Plic& {
69 return plic_;
70 }
71
78 auto InitPlic(uint64_t dev_addr, size_t ndev, size_t context_count) -> void;
80
84 Interrupt(const Interrupt&) = delete;
85 Interrupt(Interrupt&&) = delete;
86 auto operator=(const Interrupt&) -> Interrupt& = delete;
87 auto operator=(Interrupt&&) -> Interrupt& = delete;
88 ~Interrupt() = default;
90
91 private:
93 std::array<InterruptDelegate, cpu_io::ScauseInfo::kInterruptMaxCount>
96 std::array<InterruptDelegate, cpu_io::ScauseInfo::kExceptionMaxCount>
99};
100
101using InterruptSingleton = etl::singleton<Interrupt>;
etl::singleton< Interrupt > InterruptSingleton
Interrupt 单例类型别名
Definition interrupt.h:117
InterruptBase::InterruptDelegate InterruptDelegate
中断子系统抽象基类
AArch64 中断控制器实现
Definition interrupt.h:19
auto operator=(const Interrupt &) -> Interrupt &=delete
auto SendIpi(uint64_t target_cpu_mask) -> Expected< void > override
发送 IPI 到指定核心
Plic plic_
Definition interrupt.h:98
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
auto Do(uint64_t cause, cpu_io::TrapContext *context) -> void override
执行中断处理
auto RegisterInterruptFunc(uint64_t cause, InterruptDelegate func) -> void override
注册中断处理函数
auto InitPlic(uint64_t dev_addr, size_t ndev, size_t context_count) -> void
初始化 PLIC
auto BroadcastIpi() -> Expected< void > override
广播 IPI 到所有其他核心
std::array< InterruptDelegate, cpu_io::ScauseInfo::kExceptionMaxCount > exception_handlers_
异常处理函数数组
Definition interrupt.h:97
__always_inline auto plic() const -> const Plic &
获取 PLIC 的只读引用
Definition interrupt.h:68
Interrupt(Interrupt &&)=delete
~Interrupt()=default
__always_inline auto plic() -> Plic &
获取 PLIC 引用
Definition interrupt.h:63
std::array< InterruptDelegate, kMaxInterrupt > interrupt_handlers_
中断处理函数数组
Definition interrupt.h:110
Plic 驱动
Definition plic.h:20
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365