21 klog::Info(
"Default Interrupt handler {:#X}, {:#x}", cause,
22 reinterpret_cast<uintptr_t
>(context));
28 auto [dist_base_addr, dist_size, redist_base_addr, redist_size] =
29 KernelFdtSingleton::instance().GetGIC().value();
30 VirtualMemorySingleton::instance()
31 .MapMMIO(dist_base_addr, dist_size)
37 return std::unexpected(err);
39 VirtualMemorySingleton::instance()
40 .MapMMIO(redist_base_addr, redist_size)
46 return std::unexpected(err);
49 gic_ = std::move(
Gic(dist_base_addr, redist_base_addr));
53 i = InterruptDelegate::create<DefaultInterruptHandler>();
64 interrupt_handlers_[cause](cause, context);
65 cpu_io::ICC_EOIR1_EL1::Write(cause);
71 interrupt_handlers_[cause] = func;
77 static constexpr uint64_t kIPISGI = 0;
79 uint64_t sgi_value = 0;
82 sgi_value |= (kIPISGI & 0xF) << 24;
85 sgi_value |= (target_cpu_mask & 0xFFFF);
88 cpu_io::ICC_SGI1R_EL1::Write(sgi_value);
95 static constexpr uint64_t kIPISGI = 0;
98 uint64_t sgi_value = 0;
101 sgi_value |= (kIPISGI & 0xF) << 24;
104 sgi_value |= (1ULL << 40);
107 cpu_io::ICC_SGI1R_EL1::Write(sgi_value);
117 if (irq >= kMaxInterrupt) {
122 RegisterInterruptFunc(irq, handler);
125 gic_.Spi(irq, cpu_id);
127 klog::Info(
"RegisterExternalInterrupt: INTID {}, cpu {}, priority {}", irq,
InterruptBase::InterruptDelegate InterruptDelegate
auto Sgi(uint32_t intid, uint32_t cpuid) const -> void
配置软件生成中断 (SGI)
auto SendIpi(uint64_t target_cpu_mask) -> Expected< void > override
发送 IPI 到指定 CPU
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 GetCurrentCoreId() -> size_t
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
constexpr auto message() const -> const char *