NT4/private/ntos/ke/mips/xxirql.s
2020-09-30 17:12:29 +02:00

219 lines
4.9 KiB
ArmAsm
Raw 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
//
// Module Name:
//
// manpirql.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
//
// Environment:
//
// Kernel mode only.
//
// Revision History:
//
//--
#include "ksmips.h"
//
// Define external variables that can be addressed using GP.
//
.extern KiSynchIrql 4
SBTTL("Lower Interrupt Request Level")
//++
//
// 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)
and a0,a0,0xff // isolate new IRQL
lbu t0,KiPcr + PcIrqlTable(a0) // get translation table entry value
li t1,~(0xff << PSR_INTMASK) // get interrupt enable mask
sll t0,t0,PSR_INTMASK // shift table entry into position
DISABLE_INTERRUPTS(t2) // disable interrupts
and t2,t2,t1 // clear current interrupt enables
or t2,t2,t0 // set new interrupt enables
sb a0,KiPcr + PcCurrentIrql(zero) // set new IRQL
ENABLE_INTERRUPTS(t2) // enable interrupts
j ra // return
.end KeLowerIrql
SBTTL("Raise Interrupt Request Level")
//++
//
// 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)
and a0,a0,0xff // isolate new IRQL
lbu t0,KiPcr + PcIrqlTable(a0) // get translation table entry value
li t1,~(0xff << PSR_INTMASK) // get interrupt enable mask
sll t0,t0,PSR_INTMASK // shift table entry into position
lbu t2,KiPcr + PcCurrentIrql(zero) // get current IRQL
DISABLE_INTERRUPTS(t3) // disable interrupts
and t3,t3,t1 // clear current interrupt enables
or t3,t3,t0 // set new interrupt enables
sb a0,KiPcr + PcCurrentIrql(zero) // set new IRQL
ENABLE_INTERRUPTS(t3) // enable interrupts
sb t2,0(a1) // store old IRQL
j ra // return
.end KeRaiseIrql
SBTTL("Raise Interrupt Request Level to DPC Level")
//++
//
// KIRQL
// KeRaiseIrqlToDpcLevel (
// VOID
// )
//
// Routine Description:
//
// This function swaps the current IRQL with dispatch level.
//
// Arguments:
//
// None.
//
// Return Value:
//
// The previous IRQL is returned as the function value.
//
//--
LEAF_ENTRY(KiRaiseIrqlToXxxLevel)
ALTERNATE_ENTRY(KeRaiseIrqlToDpcLevel)
li a0,DISPATCH_LEVEL // set new IRQL value
b KeSwapIrql // finish in common code
SBTTL("Swap Interrupt Request Level")
//++
//
// KIRQL
// KeRaiseIrqlToSynchLevel (
// VOID
// )
//
// Routine Description:
//
// This function swaps the current IRQL with synchronization level.
//
// Arguments:
//
// None.
//
// Return Value:
//
// The previous IRQL is returned as the function value.
//
//--
ALTERNATE_ENTRY(KeRaiseIrqlToSynchLevel)
lbu a0,KiSynchIrql // set new IRQL level
//++
//
// KIRQL
// KeSwapIrql (
// IN KIRQL NewIrql
// )
//
// Routine Description:
//
// This function swaps the current IRQL with the specified IRQL.
//
// Arguments:
//
// NewIrql (a0) - supplies the new IRQL value.
//
// Return Value:
//
// The previous IRQL is returned as the function value.
//
//--
ALTERNATE_ENTRY(KeSwapIrql)
lbu t0,KiPcr + PcIrqlTable(a0) // get translation table entry
li t1,~(0xff << PSR_INTMASK) // get interrupt enable mask
sll t0,t0,PSR_INTMASK // shift table entry into position
lbu v0,KiPcr + PcCurrentIrql(zero) // get current IRQL
DISABLE_INTERRUPTS(t2) // disable interrupts
and t2,t2,t1 // clear current interrupt enables
or t2,t2,t0 // set new interrupt enables
sb a0,KiPcr + PcCurrentIrql(zero) // set new IRQL
ENABLE_INTERRUPTS(t2) // enable interrupts
j ra // return
.end KiRaiseIrqlToXxxLevel