stos/amd64: intr: Add IRQL management

Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
Chloe M.
2026-06-23 22:01:52 +00:00
parent 22beed638d
commit 114cc434d2
4 changed files with 88 additions and 2 deletions
+57
View File
@@ -8,6 +8,7 @@
#include <hal/intr.h>
#include <machine/idt.h>
#include <ke/knot.h>
#include <stdef.h>
/* Interrupt priority level shift */
@@ -16,6 +17,20 @@
/* Globals */
static INTR_HANDLER Handlers[256];
/*
* Set a new IRQL
*/
static inline VOID
SetIrql(IRQL Irql)
{
ASMV(
"mov %0, %%cr8"
:
: "r" ((UQUAD)Irql)
: "memory"
);
}
ST_STATUS
HalRegisterIntr(const INTR_HANDLER *Handler, BOOLEAN IsUser)
{
@@ -74,3 +89,45 @@ HalRegisterIntr(const INTR_HANDLER *Handler, BOOLEAN IsUser)
/* No entry found */
return STATUS_NOT_FOUND;
}
IRQL
HalGetIrql(VOID)
{
UQUAD CurrentIrql;
ASMV(
"mov %%cr8, %0"
: "=r" (CurrentIrql)
:
: "memory"
);
return (IRQL)CurrentIrql;
}
IRQL
HalRaiseIrql(IRQL Irql)
{
IRQL CurrentIrql;
CurrentIrql = HalGetIrql();
if (Irql < CurrentIrql) {
KeKnot(IRQL_NOT_GTE, "got bad irql\n");
}
SetIrql(Irql);
return CurrentIrql;
}
IRQL
HalLowerIrql(IRQL Irql)
{
IRQL CurrentIrql;
CurrentIrql = HalGetIrql();
if (Irql > CurrentIrql) {
KeKnot(IRQL_NOT_LTE, "got bad irql\n");
}
return CurrentIrql;
}
+23
View File
@@ -69,4 +69,27 @@ typedef struct {
*/
ST_STATUS HalRegisterIntr(const INTR_HANDLER *Handler, BOOLEAN IsUser);
/*
* Returns the current IRQL
*/
IRQL HalGetIrql(VOID);
/*
* Raise the IRQL level to a higher level
*
* @Irql: IRQL to raise to
*
* Returns the previous IRQL
*/
IRQL HalRaiseIrql(IRQL Irql);
/*
* Lower the IRQL level to a lower level
*
* @Irql: IRQL to lower to
*
* Returns the previous IRQL
*/
IRQL HalLowerIrql(IRQL Irql);
#endif /* !_HAL_INTR_H_ */
+5 -1
View File
@@ -19,13 +19,17 @@
* @KNOT_BAD_BOOT_PROTO: Bad boot protocol
* @KNOT_OOM: Fatal out of memory
* @KNOT_EXCEPTION: Fatal exception
* @IRQL_NOT_LTE: IRQL not less than or equal
* @IRQL_NOT_GTE: IRQL not greater than or equal
*/
typedef enum {
KNOT_MISC,
KNOT_UNBOUND_RSRC,
KNOT_BAD_BOOT_PROTO,
KNOT_OOM,
KNOT_EXCEPTION
KNOT_EXCEPTION,
IRQL_NOT_LTE,
IRQL_NOT_GTE
} KNOT_REASON;
/*
+3 -1
View File
@@ -22,7 +22,9 @@ static const CHAR *ReasonTable[] = {
[KNOT_UNBOUND_RSRC] = "unbounded resource",
[KNOT_BAD_BOOT_PROTO] = "bad boot protocol",
[KNOT_OOM] = "out of memory",
[KNOT_EXCEPTION] = "fatal exception"
[KNOT_EXCEPTION] = "fatal exception",
[IRQL_NOT_LTE] = "irql not less than or equal",
[IRQL_NOT_GTE] = "irql not greater than or equal"
};
/* Globals */