116 lines
2.1 KiB
C
116 lines
2.1 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
mpcsysint.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements the HAL routines to enable/disable system
|
||
|
interrupts on an MPS system.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
John Vert (jvert) 22-Jul-1991
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Forrest Foltz (forrestf) 27-Oct-2000
|
||
|
Ported from mcsysint.asm to mcsysint.c
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "halcmn.h"
|
||
|
|
||
|
VOID
|
||
|
HalEndSystemInterrupt (
|
||
|
IN KIRQL NewIrql,
|
||
|
IN ULONG Vector
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine is used to send an EOI to the local APIC.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
NewIrql - the new irql to be set.
|
||
|
|
||
|
Vector - Vector number of the interrupt
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
UNREFERENCED_PARAMETER(NewIrql);
|
||
|
UNREFERENCED_PARAMETER(Vector);
|
||
|
|
||
|
//
|
||
|
// Send EOI to APIC local unit
|
||
|
//
|
||
|
|
||
|
LOCAL_APIC(LU_EOI) = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOLEAN
|
||
|
HalBeginSystemInterrupt (
|
||
|
IN KIRQL Irql,
|
||
|
IN ULONG Vector,
|
||
|
OUT PKIRQL OldIrql
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine raises the IRQL to the level of the specified
|
||
|
interrupt vector. It is called by the hardware interrupt
|
||
|
handler before any other interrupt service routine code is
|
||
|
executed. The CPU interrupt flag is set on exit.
|
||
|
|
||
|
On APIC-based systems we do not need to check for spurious
|
||
|
interrupts since they now have their own vector. We also
|
||
|
no longer need to check whether or not the incoming priority
|
||
|
is higher than the current priority that is guaranteed by
|
||
|
the priority mechanism of the APIC.
|
||
|
|
||
|
SO
|
||
|
|
||
|
All BeginSystemInterrupt needs to do is set the APIC TPR
|
||
|
appropriate for the IRQL, and return TRUE. Note that to
|
||
|
use the APIC ISR priority we are not going issue EOI until
|
||
|
EndSystemInterrupt is called.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Irql - Supplies the IRQL to raise to
|
||
|
|
||
|
Vector - Supplies the vector of the interrupt to be
|
||
|
handled
|
||
|
|
||
|
OldIrql- Location to return OldIrql
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE - Interrupt successfully dismissed and Irql raised.
|
||
|
This routine can not fail.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
KeRaiseIrql(Irql,OldIrql);
|
||
|
HalpEnableInterrupts();
|
||
|
|
||
|
return TRUE;
|
||
|
}
|