stos/amd64: intr: Add IRQL management
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_ */
|
||||
|
||||
@@ -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
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user