From 53a8b57a965e8f68df6deb86d32690706476953c Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Fri, 26 Jun 2026 10:22:18 +0200 Subject: [PATCH] Register APC interrupt handler --- xtoskrnl/includes/ke/apc.hh | 1 + xtoskrnl/ke/amd64/krnlinit.cc | 1 + xtoskrnl/ke/apc.cc | 21 +++++++++++++++++++++ xtoskrnl/ke/i686/krnlinit.cc | 1 + 4 files changed, 24 insertions(+) diff --git a/xtoskrnl/includes/ke/apc.hh b/xtoskrnl/includes/ke/apc.hh index c324289..8f82892 100644 --- a/xtoskrnl/includes/ke/apc.hh +++ b/xtoskrnl/includes/ke/apc.hh @@ -22,6 +22,7 @@ namespace KE STATIC XTAPI VOID DeliverApc(IN KPROCESSOR_MODE ProcessorMode, IN PKEXCEPTION_FRAME ExceptionFrame, IN PKTRAP_FRAME TrapFrame); + STATIC XTCDECL VOID HandleApcInterrupt(IN PKTRAP_FRAME TrapFrame); STATIC XTAPI VOID InitializeApc(IN PKAPC Apc, IN PKTHREAD Thread, IN KAPC_ENVIRONMENT Environment, diff --git a/xtoskrnl/ke/amd64/krnlinit.cc b/xtoskrnl/ke/amd64/krnlinit.cc index e97b48d..d1d680c 100644 --- a/xtoskrnl/ke/amd64/krnlinit.cc +++ b/xtoskrnl/ke/amd64/krnlinit.cc @@ -142,6 +142,7 @@ VOID KE::KernelInit::InitializeInterruptHandlers(VOID) { /* Register interrupt handlers */ + HL::Irq::RegisterSystemInterruptHandler(APIC_VECTOR_APC, KE::Apc::HandleApcInterrupt); HL::Irq::RegisterSystemInterruptHandler(APIC_VECTOR_DPC, KE::Dispatcher::HandleDispatchInterrupt); HL::Irq::RegisterSystemInterruptHandler(APIC_VECTOR_IPI, KE::Ipi::HandleIpiInterrupt); } diff --git a/xtoskrnl/ke/apc.cc b/xtoskrnl/ke/apc.cc index 574cf68..9faf647 100644 --- a/xtoskrnl/ke/apc.cc +++ b/xtoskrnl/ke/apc.cc @@ -76,6 +76,27 @@ KE::Apc::DeliverApc(IN KPROCESSOR_MODE ProcessorMode, Thread->ApcState.KernelApcPending = FALSE; } +/** + * Handles the Asynchronous Procedure Call (APC) interrupt. + * + * @param TrapFrame + * Supplies a pointer to the hardware trap frame representing the interrupted context. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTCDECL +VOID +KE::Apc::HandleApcInterrupt(IN PKTRAP_FRAME TrapFrame) +{ + /* Raise runlevel to APC level */ + KE::RaiseRunLevel RunLevel(APC_LEVEL); + + /* Deliver the APC */ + DeliverApc(TrapFrame->PreviousMode, NULLPTR, TrapFrame); +} + /** * Initializes an APC object. * diff --git a/xtoskrnl/ke/i686/krnlinit.cc b/xtoskrnl/ke/i686/krnlinit.cc index 54a0d11..7e6be4f 100644 --- a/xtoskrnl/ke/i686/krnlinit.cc +++ b/xtoskrnl/ke/i686/krnlinit.cc @@ -142,6 +142,7 @@ VOID KE::KernelInit::InitializeInterruptHandlers(VOID) { /* Register interrupt handlers */ + HL::Irq::RegisterSystemInterruptHandler(APIC_VECTOR_APC, KE::Apc::HandleApcInterrupt); HL::Irq::RegisterSystemInterruptHandler(APIC_VECTOR_DPC, KE::Dispatcher::HandleDispatchInterrupt); HL::Irq::RegisterSystemInterruptHandler(APIC_VECTOR_IPI, KE::Ipi::HandleIpiInterrupt); }