From 6a983fe33c9e9e0b841cde6e919792fd0e372a65 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Mon, 27 Apr 2026 20:17:57 +0200 Subject: [PATCH] Add helper to translate run level to software interrupt vector --- xtoskrnl/hl/amd64/runlevel.cc | 23 +++++++++++++++++++++++ xtoskrnl/hl/i686/runlevel.cc | 22 ++++++++++++++++++++++ xtoskrnl/includes/hl/runlevel.hh | 1 + 3 files changed, 46 insertions(+) diff --git a/xtoskrnl/hl/amd64/runlevel.cc b/xtoskrnl/hl/amd64/runlevel.cc index 8408c39..89eb510 100644 --- a/xtoskrnl/hl/amd64/runlevel.cc +++ b/xtoskrnl/hl/amd64/runlevel.cc @@ -20,6 +20,7 @@ XTFASTCALL KRUNLEVEL HL::RunLevel::GetRunLevel(VOID) { + /* Read current run level */ return (KRUNLEVEL)AR::CpuFunc::ReadControlRegister(8); } @@ -37,6 +38,7 @@ XTFASTCALL VOID HL::RunLevel::SetRunLevel(IN KRUNLEVEL RunLevel) { + /* Set new run level */ AR::CpuFunc::WriteControlRegister(8, RunLevel); } @@ -54,6 +56,7 @@ XTFASTCALL KRUNLEVEL HL::RunLevel::TransformApicTprToRunLevel(IN UCHAR Tpr) { + /* Transform APIC TPR to run level */ return (KRUNLEVEL)(Tpr >> 4); } @@ -71,5 +74,25 @@ XTFASTCALL UCHAR HL::RunLevel::TransformRunLevelToApicTpr(IN KRUNLEVEL RunLevel) { + /* Transform run level to APIC TPR */ return (RunLevel << 4); } + +/** + * Transforms a given execution run level into a corresponding hardware interrupt vector + * suitable for software interrupts. + * + * @param RunLevel + * Supplies the run level to be translated into a software interrupt vector. + * + * @return This routine returns the 8-bit APIC vector corresponding to the requested software interrupt level. + * + * @since XT 1.0 + */ +XTFASTCALL +UCHAR +HL::RunLevel::TransformRunLevelToSoftwareVector(IN KRUNLEVEL RunLevel) +{ + /* Transform run level to APIC interrupt vector */ + return TransformRunLevelToApicTpr(RunLevel) | 0xF; +} diff --git a/xtoskrnl/hl/i686/runlevel.cc b/xtoskrnl/hl/i686/runlevel.cc index da2f75e..6cdf6e4 100644 --- a/xtoskrnl/hl/i686/runlevel.cc +++ b/xtoskrnl/hl/i686/runlevel.cc @@ -20,6 +20,7 @@ XTFASTCALL KRUNLEVEL HL::RunLevel::GetRunLevel(VOID) { + /* Read current run level */ return TransformApicTprToRunLevel(HL::Pic::ReadApicRegister(APIC_TPR)); } @@ -37,6 +38,7 @@ XTFASTCALL VOID HL::RunLevel::SetRunLevel(IN KRUNLEVEL RunLevel) { + /* Set new run level */ HL::Pic::WriteApicRegister(APIC_TPR, TransformRunLevelToApicTpr(RunLevel)); } @@ -131,3 +133,23 @@ HL::RunLevel::TransformRunLevelToApicTpr(IN KRUNLEVEL RunLevel) /* Return the TPR corresponding to the run level from the transformation table. */ return TransformationTable[RunLevel]; } + +/** + * Transforms a given execution run level into a corresponding hardware interrupt vector + * suitable for software interrupts. + * + * @param RunLevel + * Supplies the run level to be translated into a software interrupt vector. + * + * @return This routine returns the 8-bit APIC vector corresponding to the requested software interrupt level. + * + * @since XT 1.0 + */ + +XTFASTCALL +UCHAR +HL::RunLevel::TransformRunLevelToSoftwareVector(IN KRUNLEVEL RunLevel) +{ + /* Transform run level to APIC interrupt vector */ + return TransformRunLevelToApicTpr(RunLevel); +} diff --git a/xtoskrnl/includes/hl/runlevel.hh b/xtoskrnl/includes/hl/runlevel.hh index 5283378..e17fb54 100644 --- a/xtoskrnl/includes/hl/runlevel.hh +++ b/xtoskrnl/includes/hl/runlevel.hh @@ -20,6 +20,7 @@ namespace HL public: STATIC XTFASTCALL KRUNLEVEL GetRunLevel(VOID); STATIC XTFASTCALL VOID SetRunLevel(IN KRUNLEVEL RunLevel); + STATIC XTFASTCALL UCHAR TransformRunLevelToSoftwareVector(IN KRUNLEVEL RunLevel); private: STATIC XTFASTCALL KRUNLEVEL TransformApicTprToRunLevel(IN UCHAR Tpr);