diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index f24a455..175a3e6 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -31,6 +31,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/ke/semphore.c ${XTOSKRNL_SOURCE_DIR}/ke/spinlock.c ${XTOSKRNL_SOURCE_DIR}/ke/timer.c + ${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/irqs.c ${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/krnlinit.c ${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/kthread.c ${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/proc.c diff --git a/xtoskrnl/ar/amd64/procsup.c b/xtoskrnl/ar/amd64/procsup.c index 417368e..778d1d9 100644 --- a/xtoskrnl/ar/amd64/procsup.c +++ b/xtoskrnl/ar/amd64/procsup.c @@ -539,8 +539,8 @@ ArpSetIdtGate(IN PKIDTENTRY Idt, IN USHORT Access) { /* Setup the gate */ - Idt[Vector].OffsetLow = (ULONG_PTR)Handler; - Idt[Vector].OffsetMiddle = ((ULONG_PTR)Handler >> 16); + Idt[Vector].OffsetLow = ((ULONG_PTR)Handler & 0xFFFF); + Idt[Vector].OffsetMiddle = (((ULONG_PTR)Handler >> 16) & 0xFFFF); Idt[Vector].OffsetHigh = (ULONG_PTR)Handler >> 32; Idt[Vector].Dpl = Access; Idt[Vector].IstIndex = Ist; diff --git a/xtoskrnl/hl/pic.c b/xtoskrnl/hl/pic.c index 85b932f..e1c5b09 100644 --- a/xtoskrnl/hl/pic.c +++ b/xtoskrnl/hl/pic.c @@ -176,7 +176,7 @@ HlpInitializeApic() HlWriteApicRegister(APIC_LDR, (1UL << CpuNumber) << 24); } - /* Set the spurious interrupt vector and register interrupt handlers */ + /* Set the spurious interrupt vector */ SpuriousRegister.Long = HlReadApicRegister(APIC_SIVR); SpuriousRegister.Vector = APIC_VECTOR_SPURIOUS; SpuriousRegister.SoftwareEnable = 1; @@ -217,4 +217,8 @@ HlpInitializeApic() /* Clear errors after enabling vectors */ HlWriteApicRegister(APIC_ESR, 0); + + /* Register interrupt handlers once the APIC initialization is done */ + KeSetInterruptHandler(APIC_VECTOR_SPURIOUS, HlpHandleApicSpuriousService); + KeSetInterruptHandler(PIC1_VECTOR_SPURIOUS, HlpHandlePicSpuriousService); } diff --git a/xtoskrnl/includes/ke.h b/xtoskrnl/includes/ke.h index 39fab33..0b49d99 100644 --- a/xtoskrnl/includes/ke.h +++ b/xtoskrnl/includes/ke.h @@ -77,6 +77,11 @@ KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait); +XTAPI +VOID +KeSetInterruptHandler(IN ULONG Vector, + IN PVOID Handler); + XTAPI VOID KeStartThread(IN PKTHREAD Thread); diff --git a/xtoskrnl/ke/amd64/irqs.c b/xtoskrnl/ke/amd64/irqs.c new file mode 100644 index 0000000..8fbf992 --- /dev/null +++ b/xtoskrnl/ke/amd64/irqs.c @@ -0,0 +1,39 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/ke/amd64/irqs.c + * DESCRIPTION: Kernel interrupts support for amd64 architecture + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Sets new interrupt handler for the existing IDT entry. + * + * @param HalVector + * Supplies the HAL vector number. + * + * @param Handler + * Supplies the new interrupt handler. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +KeSetInterruptHandler(IN ULONG Vector, + IN PVOID Handler) +{ + PKPROCESSOR_BLOCK ProcessorBlock; + + /* Get current processor block */ + ProcessorBlock = KeGetCurrentProcessorBlock(); + + /* Update interrupt handler */ + ProcessorBlock->IdtBase[(UCHAR) Vector].OffsetLow = ((ULONG_PTR)Handler & 0xFFFF); + ProcessorBlock->IdtBase[(UCHAR) Vector].OffsetMiddle = (((ULONG_PTR)Handler >> 16) & 0xFFFF); + ProcessorBlock->IdtBase[(UCHAR) Vector].OffsetHigh = (ULONG_PTR)Handler >> 32; +} diff --git a/xtoskrnl/ke/i686/irqs.c b/xtoskrnl/ke/i686/irqs.c new file mode 100644 index 0000000..20aa214 --- /dev/null +++ b/xtoskrnl/ke/i686/irqs.c @@ -0,0 +1,38 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/ke/i686/irqs.c + * DESCRIPTION: Kernel interrupts support for i686 architecture + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Sets new interrupt handler for the existing IDT entry. + * + * @param HalVector + * Supplies the HAL vector number. + * + * @param Handler + * Supplies the new interrupt handler. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +KeSetInterruptHandler(IN ULONG Vector, + IN PVOID Handler) +{ + PKPROCESSOR_BLOCK ProcessorBlock; + + /* Get current processor block */ + ProcessorBlock = KeGetCurrentProcessorBlock(); + + /* Update interrupt handler */ + ProcessorBlock->IdtBase[(UCHAR) Vector].Offset = (USHORT)((ULONG)Handler & 0xFFFF); + ProcessorBlock->IdtBase[(UCHAR) Vector].ExtendedOffset = (USHORT)((ULONG)Handler >> 16); +}