Add helper to translate run level to software interrupt vector
All checks were successful
All checks were successful
This commit is contained in:
@@ -20,6 +20,7 @@ XTFASTCALL
|
|||||||
KRUNLEVEL
|
KRUNLEVEL
|
||||||
HL::RunLevel::GetRunLevel(VOID)
|
HL::RunLevel::GetRunLevel(VOID)
|
||||||
{
|
{
|
||||||
|
/* Read current run level */
|
||||||
return (KRUNLEVEL)AR::CpuFunc::ReadControlRegister(8);
|
return (KRUNLEVEL)AR::CpuFunc::ReadControlRegister(8);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,6 +38,7 @@ XTFASTCALL
|
|||||||
VOID
|
VOID
|
||||||
HL::RunLevel::SetRunLevel(IN KRUNLEVEL RunLevel)
|
HL::RunLevel::SetRunLevel(IN KRUNLEVEL RunLevel)
|
||||||
{
|
{
|
||||||
|
/* Set new run level */
|
||||||
AR::CpuFunc::WriteControlRegister(8, RunLevel);
|
AR::CpuFunc::WriteControlRegister(8, RunLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,6 +56,7 @@ XTFASTCALL
|
|||||||
KRUNLEVEL
|
KRUNLEVEL
|
||||||
HL::RunLevel::TransformApicTprToRunLevel(IN UCHAR Tpr)
|
HL::RunLevel::TransformApicTprToRunLevel(IN UCHAR Tpr)
|
||||||
{
|
{
|
||||||
|
/* Transform APIC TPR to run level */
|
||||||
return (KRUNLEVEL)(Tpr >> 4);
|
return (KRUNLEVEL)(Tpr >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,5 +74,25 @@ XTFASTCALL
|
|||||||
UCHAR
|
UCHAR
|
||||||
HL::RunLevel::TransformRunLevelToApicTpr(IN KRUNLEVEL RunLevel)
|
HL::RunLevel::TransformRunLevelToApicTpr(IN KRUNLEVEL RunLevel)
|
||||||
{
|
{
|
||||||
|
/* Transform run level to APIC TPR */
|
||||||
return (RunLevel << 4);
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ XTFASTCALL
|
|||||||
KRUNLEVEL
|
KRUNLEVEL
|
||||||
HL::RunLevel::GetRunLevel(VOID)
|
HL::RunLevel::GetRunLevel(VOID)
|
||||||
{
|
{
|
||||||
|
/* Read current run level */
|
||||||
return TransformApicTprToRunLevel(HL::Pic::ReadApicRegister(APIC_TPR));
|
return TransformApicTprToRunLevel(HL::Pic::ReadApicRegister(APIC_TPR));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,6 +38,7 @@ XTFASTCALL
|
|||||||
VOID
|
VOID
|
||||||
HL::RunLevel::SetRunLevel(IN KRUNLEVEL RunLevel)
|
HL::RunLevel::SetRunLevel(IN KRUNLEVEL RunLevel)
|
||||||
{
|
{
|
||||||
|
/* Set new run level */
|
||||||
HL::Pic::WriteApicRegister(APIC_TPR, TransformRunLevelToApicTpr(RunLevel));
|
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 the TPR corresponding to the run level from the transformation table. */
|
||||||
return TransformationTable[RunLevel];
|
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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ namespace HL
|
|||||||
public:
|
public:
|
||||||
STATIC XTFASTCALL KRUNLEVEL GetRunLevel(VOID);
|
STATIC XTFASTCALL KRUNLEVEL GetRunLevel(VOID);
|
||||||
STATIC XTFASTCALL VOID SetRunLevel(IN KRUNLEVEL RunLevel);
|
STATIC XTFASTCALL VOID SetRunLevel(IN KRUNLEVEL RunLevel);
|
||||||
|
STATIC XTFASTCALL UCHAR TransformRunLevelToSoftwareVector(IN KRUNLEVEL RunLevel);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
STATIC XTFASTCALL KRUNLEVEL TransformApicTprToRunLevel(IN UCHAR Tpr);
|
STATIC XTFASTCALL KRUNLEVEL TransformApicTprToRunLevel(IN UCHAR Tpr);
|
||||||
|
|||||||
Reference in New Issue
Block a user