windows-nt/Source/XPSP1/NT/base/ntos/ke/alpha/irql.s
2020-09-26 16:20:57 +08:00

103 lines
1.8 KiB
ArmAsm
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// TITLE("Manipulate Interrupt Request Level")
//++
//
// Copyright (c) 1990 Microsoft Corporation
// Copyright (c) 1992 Microsoft Corporation
//
// Module Name:
//
// irql.s
//
// Abstract:
//
// This module implements the code necessary to lower and raise the current
// Interrupt Request Level (IRQL).
//
//
// Author:
//
// David N. Cutler (davec) 12-Aug-1990
// Joe Notarangelo 06-Apr-1992
//
// Environment:
//
// Kernel mode only.
//
// Revision History:
//
//--
#include "ksalpha.h"
//++
//
// VOID
// KeLowerIrql (
// KIRQL NewIrql
// )
//
// Routine Description:
//
// This function lowers the current IRQL to the specified value.
//
// Arguments:
//
// NewIrql (a0) - Supplies the new IRQL value.
//
// Return Value:
//
// None.
//
//--
LEAF_ENTRY(KeLowerIrql)
SWAP_IRQL // a0 = new, on return v0 = old irql
ret zero, (ra) // return
.end KeLowerIrql
//++
//
// VOID
// KeRaiseIrql (
// KIRQL NewIrql,
// PKIRQL OldIrql
// )
//
// Routine Description:
//
// This function raises the current IRQL to the specified value and returns
// the old IRQL value.
//
// Arguments:
//
// NewIrql (a0) - Supplies the new IRQL value.
//
// OldIrql (a1) - Supplies a pointer to a variable that recieves the old
// IRQL value.
//
// Return Value:
//
// None.
//
//--
LEAF_ENTRY(KeRaiseIrql)
bis a1, zero, t0 // save pointer to old irql
SWAP_IRQL // a0 = new, on return v0 = old irql
ldq_u t1, 0(t0) // get quadword around old irql
bic t0, 0x3, t3 // get containing longword address
insbl v0, t0, t2 // put destination byte into position
mskbl t1, t0, t1 // clear destination byte
bis t1, t2, t1 // merge destination byte
extll t1, t3, t1 // get appropriate longword
stl t1, 0(t3) // store byte
ret zero, (ra) // return
.end KeRaiseIrql