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 <hal/intr.h>
#include <machine/idt.h> #include <machine/idt.h>
#include <ke/knot.h>
#include <stdef.h> #include <stdef.h>
/* Interrupt priority level shift */ /* Interrupt priority level shift */
@@ -16,6 +17,20 @@
/* Globals */ /* Globals */
static INTR_HANDLER Handlers[256]; 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 ST_STATUS
HalRegisterIntr(const INTR_HANDLER *Handler, BOOLEAN IsUser) HalRegisterIntr(const INTR_HANDLER *Handler, BOOLEAN IsUser)
{ {
@@ -74,3 +89,45 @@ HalRegisterIntr(const INTR_HANDLER *Handler, BOOLEAN IsUser)
/* No entry found */ /* No entry found */
return STATUS_NOT_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); 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_ */ #endif /* !_HAL_INTR_H_ */
+5 -1
View File
@@ -19,13 +19,17 @@
* @KNOT_BAD_BOOT_PROTO: Bad boot protocol * @KNOT_BAD_BOOT_PROTO: Bad boot protocol
* @KNOT_OOM: Fatal out of memory * @KNOT_OOM: Fatal 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
*/ */
typedef enum { typedef enum {
KNOT_MISC, KNOT_MISC,
KNOT_UNBOUND_RSRC, KNOT_UNBOUND_RSRC,
KNOT_BAD_BOOT_PROTO, KNOT_BAD_BOOT_PROTO,
KNOT_OOM, KNOT_OOM,
KNOT_EXCEPTION KNOT_EXCEPTION,
IRQL_NOT_LTE,
IRQL_NOT_GTE
} KNOT_REASON; } KNOT_REASON;
/* /*
+3 -1
View File
@@ -22,7 +22,9 @@ static const CHAR *ReasonTable[] = {
[KNOT_UNBOUND_RSRC] = "unbounded resource", [KNOT_UNBOUND_RSRC] = "unbounded resource",
[KNOT_BAD_BOOT_PROTO] = "bad boot protocol", [KNOT_BAD_BOOT_PROTO] = "bad boot protocol",
[KNOT_OOM] = "out of memory", [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 */ /* Globals */