Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
ixswint.c
Abstract:
This module implements the software interrupt handlers for x86 machines
Author:
John Vert (jvert) 2-Jan-1992
Environment:
Kernel mode only.
Revision History:
Forrest Foltz (forrestf) 23-Oct-2000 Ported from ixswint.asm to ixswint.c
--*/
#include "halcmn.h"
VOID HalRequestSoftwareInterrupt ( IN KIRQL RequestIrql )
/*++
Routine Description:
This routine is used to request a software interrupt to the system. Also, this routine checks to see if any software interrupt should be generated. The following condition will cause software interrupt to be simulated: any software interrupt which has higher priority than current IRQL's is pending.
NOTE: This routine simulates software interrupt as long as any pending SW interrupt level is higher than the current IRQL, even when interrupts are disabled.
Arguments:
RequestIrql - Supplies the request IRQL value
Return Value:
None.
--*/
{ PHALP_SOFTWARE_INTERRUPT vector; ULONG mask; ULONG flags; PKPCR pcr; KIRQL highestPending;
mask = (1 << RequestIrql);
//
// Clear the interrupt flag, set the pending interrupt bit, dispatch any
// appropriate software interrupts and restore the interrupt flag.
//
flags = HalpDisableInterrupts();
pcr = KeGetPcr(); pcr->Irr |= mask; mask = (pcr->Irr) & ((1 << DISPATCH_LEVEL) - 1); highestPending = SWInterruptLookupTable[mask];
if (highestPending > pcr->Irql) { vector = HalpSoftwareInterruptTable[RequestIrql]; vector(); }
HalpRestoreInterrupts(flags); }
VOID HalClearSoftwareInterrupt ( IN KIRQL RequestIrql )
/*++
Routine Description:
This routine is used to clear a possible pending software interrupt. Support for this function is optional, and allows the kernel to reduce the number of spurious software interrupts it receives.
Arguments:
RequestIrql - Supplies the request IRQL value
Return Value:
None.
--*/
{ ULONG mask; ULONG irr;
mask = ~(1 << RequestIrql);
KPCR_READ_FIELD(Irr,&irr); irr &= mask; KPCR_WRITE_FIELD(Irr,&irr); }
|