18static constexpr uint8_t kApicTimerVector{0xF0};
19static constexpr uint32_t kApicTimerFrequencyHz{100};
30 static uint64_t tick_count = 0;
34 if (tick_count % 100 == 0) {
35 klog::Info(
"APIC Timer interrupt {}, vector {:#x}", tick_count,
36 static_cast<uint32_t
>(cause));
40 InterruptSingleton::instance().apic().SendEoi();
51 klog::Info(
"Keyboard interrupt received, vector {:#x}",
52 static_cast<uint32_t
>(cause));
55 uint8_t scancode = cpu_io::In<uint8_t>(0x60);
58 if (!(scancode & 0x80)) {
59 klog::Info(
"Key pressed: scancode {:#x}", scancode);
62 static constexpr char scancode_to_ascii[] = {
63 0, 27,
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
64 '-',
'=',
'\b',
'\t',
'q',
'w',
'e',
'r',
't',
'y',
'u',
'i',
65 'o',
'p',
'[',
']',
'\n', 0,
'a',
's',
'd',
'f',
'g',
'h',
66 'j',
'k',
'l',
';',
'\'',
'`', 0,
'\\',
'z',
'x',
'c',
'v',
67 'b',
'n',
'm',
',',
'.',
'/', 0,
'*', 0,
' '};
69 if (scancode <
sizeof(scancode_to_ascii) && scancode_to_ascii[scancode]) {
70 char ascii_char = scancode_to_ascii[scancode];
76 InterruptSingleton::instance().apic().SendEoi();
83 InterruptSingleton::create();
86 InterruptSingleton::instance().InitApic(
87 BasicInfoSingleton::instance().core_count);
88 InterruptSingleton::instance().apic().InitCurrentCpuLocalApic().or_else(
94 return std::unexpected(err);
97 InterruptSingleton::instance().SetUpIdtr();
100 InterruptSingleton::instance().RegisterInterruptFunc(
101 kApicTimerVector, InterruptDelegate::create<ApicTimerHandler>());
105 static constexpr uint8_t kKeyboardIrq = 1;
106 InterruptSingleton::instance()
108 InterruptDelegate::create<KeyboardHandler>())
111 return std::unexpected(err);
115 InterruptSingleton::instance().apic().SetupPeriodicTimer(
116 kApicTimerFrequencyHz, kApicTimerVector);
118 cpu_io::Rflags::If::Set();
124 InterruptSingleton::instance().SetUpIdtr();
127 InterruptSingleton::instance().apic().InitCurrentCpuLocalApic().or_else(
133 return std::unexpected(err);
137 InterruptSingleton::instance().apic().SetupPeriodicTimer(
138 kApicTimerFrequencyHz, kApicTimerVector);
139 cpu_io::Rflags::If::Set();
auto InterruptInit(int, const char **) -> void
体系结构相关中断初始化
InterruptBase::InterruptDelegate InterruptDelegate
auto InterruptInitSMP(int, const char **) -> void
从核的体系结构相关中断初始化
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 *