124 lines
1.7 KiB
C
124 lines
1.7 KiB
C
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
mpswint.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"
|
|
|
|
extern UCHAR HalpIRQLtoTPR[];
|
|
|
|
//
|
|
// Array used to look up the correct ICR command based on the requested
|
|
// software interrupt
|
|
//
|
|
|
|
const
|
|
ULONG
|
|
HalpIcrCommandArray[3] = {
|
|
0,
|
|
APC_VECTOR | DELIVER_FIXED | ICR_SELF, // APC_LEVEL
|
|
DPC_VECTOR | DELIVER_FIXED | ICR_SELF // DISPATCH_LEVEL
|
|
};
|
|
|
|
C_ASSERT(APC_LEVEL == 1);
|
|
C_ASSERT(DISPATCH_LEVEL == 2);
|
|
|
|
|
|
VOID
|
|
FASTCALL
|
|
HalRequestSoftwareInterrupt (
|
|
IN KIRQL RequestIrql
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine is used to request a software interrupt of
|
|
the system.
|
|
|
|
Arguments:
|
|
|
|
RequestIrql - Supplies the request IRQL value
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
ULONG icrCommand;
|
|
ULONG flags;
|
|
|
|
ASSERT(RequestIrql == APC_LEVEL || RequestIrql == DISPATCH_LEVEL);
|
|
|
|
icrCommand = HalpIcrCommandArray[RequestIrql];
|
|
|
|
flags = HalpDisableInterrupts();
|
|
HalpStallWhileApicBusy();
|
|
|
|
LOCAL_APIC(LU_INT_CMD_LOW) = icrCommand;
|
|
|
|
HalpStallWhileApicBusy();
|
|
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.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|