26 int print_regs = 0) ->
void {
29 " ESR_EL1: {:#X}, ELR_EL1: {:#X}, SP_EL0: {:#X}, SP_EL1: {:#X}, "
31 context->esr_el1, context->elr_el1, context->sp_el0, context->sp_el1,
34 if (print_regs == 4) {
35 klog::Err(
" x0-x3: {:#X} {:#X} {:#X} {:#X}", context->x0, context->x1,
36 context->x2, context->x3);
37 }
else if (print_regs == 8) {
38 klog::Err(
" x0-x7: {:#X} {:#X} {:#X} {:#X} {:#X} {:#X} {:#X} {:#X}",
39 context->x0, context->x1, context->x2, context->x3, context->x4,
40 context->x5, context->x6, context->x7);
56 HandleException(
"Sync Exception at Current EL with SP0", context, 4);
62 klog::Err(
"IRQ Exception at Current EL with SP0");
70 klog::Err(
"FIQ Exception at Current EL with SP0");
78 HandleException(
"Error Exception at Current EL with SP0", context);
84 HandleException(
"Sync Exception at Current EL with SPx", context, 4);
90 auto cause = cpu_io::ICC_IAR1_EL1::INTID::Get();
91 InterruptSingleton::instance().Do(cause, context);
97 klog::Err(
"FIQ Exception at Current EL with SPx");
105 HandleException(
"Error Exception at Current EL with SPx", context);
111 HandleException(
"Sync Exception at Lower EL using AArch64", context, 8);
117 klog::Err(
"IRQ Exception at Lower EL using AArch64");
125 klog::Err(
"FIQ Exception at Lower EL using AArch64");
133 HandleException(
"Error Exception at Lower EL using AArch64", context);
139 HandleException(
"Sync Exception at Lower EL using AArch32", context);
145 klog::Err(
"IRQ Exception at Lower EL using AArch32");
153 klog::Err(
"FIQ Exception at Lower EL using AArch32");
161 HandleException(
"Error Exception at Lower EL using AArch32", context);
170 Pl011Singleton::instance().HandleInterrupt(
176 InterruptSingleton::create();
178 cpu_io::VBAR_EL1::Write(
reinterpret_cast<uint64_t
>(
vector_table));
181 KernelFdtSingleton::instance().GetAarch64Intid(
"arm,pl011").value() +
187 InterruptSingleton::instance()
189 InterruptDelegate::create<uart_handler>())
192 return std::unexpected(err);
201 cpu_io::VBAR_EL1::Write(
reinterpret_cast<uint64_t
>(
vector_table));
203 InterruptSingleton::instance().SetUp();
auto etl_putchar(int c) -> void
早期控制台字符输出
auto irq_lower_el_aarch64_handler(cpu_io::TrapContext *context) -> void
IRQ 异常处理 - Lower EL using AArch64.
auto fiq_current_el_sp0_handler(cpu_io::TrapContext *context) -> void
FIQ 异常处理 - Current EL with SP0.
auto fiq_lower_el_aarch32_handler(cpu_io::TrapContext *context) -> void
FIQ 异常处理 - Lower EL using AArch32.
auto vector_table() -> void
异常向量表入口
auto fiq_lower_el_aarch64_handler(cpu_io::TrapContext *context) -> void
FIQ 异常处理 - Lower EL using AArch64.
auto sync_lower_el_aarch64_handler(cpu_io::TrapContext *context) -> void
同步异常处理 - Lower EL using AArch64
auto fiq_current_el_spx_handler(cpu_io::TrapContext *context) -> void
FIQ 异常处理 - Current EL with SPx.
auto irq_current_el_sp0_handler(cpu_io::TrapContext *context) -> void
IRQ 异常处理 - Current EL with SP0.
auto InterruptInit(int, const char **) -> void
体系结构相关中断初始化
auto error_current_el_spx_handler(cpu_io::TrapContext *context) -> void
错误异常处理 - Current EL with SPx
auto sync_lower_el_aarch32_handler(cpu_io::TrapContext *context) -> void
同步异常处理 - Lower EL using AArch32
auto sync_current_el_spx_handler(cpu_io::TrapContext *context) -> void
同步异常处理 - Current EL with SPx
auto irq_current_el_spx_handler(cpu_io::TrapContext *context) -> void
IRQ 异常处理 - Current EL with SPx.
auto sync_current_el_sp0_handler(cpu_io::TrapContext *context) -> void
同步异常处理 - Current EL with SP0
auto irq_lower_el_aarch32_handler(cpu_io::TrapContext *context) -> void
IRQ 异常处理 - Lower EL using AArch32.
auto error_lower_el_aarch32_handler(cpu_io::TrapContext *context) -> void
错误异常处理 - Lower EL using AArch32
InterruptBase::InterruptDelegate InterruptDelegate
auto error_current_el_sp0_handler(cpu_io::TrapContext *context) -> void
错误异常处理 - Current EL with SP0
auto error_lower_el_aarch64_handler(cpu_io::TrapContext *context) -> void
错误异常处理 - Lower EL using AArch64
auto InterruptInitSMP(int, const char **) -> void
从核的体系结构相关中断初始化
auto uart_handler(uint64_t cause, cpu_io::TrapContext *) -> uint64_t
UART 中断处理函数
static constexpr size_t kSpiBase
etl::delegate< uint64_t(uint64_t, cpu_io::TrapContext *)> InterruptDelegate
类型安全的中断处理委托
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 *