windows-nt/Source/XPSP1/NT/base/hals/halacpi/amd64/mpirql.c
2020-09-26 16:20:57 +08:00

115 lines
2 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
mpirql.c
Abstract:
This module implements support for int<->vector translation.
Author:
Forrest Foltz (forrestf) 1-Dec-2000
Environment:
Kernel mode only.
Revision History:
--*/
#include "halcmn.h"
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
#define NUM_VECTORS 0x100
typedef struct _VECTOR_INIT {
ULONG Vector;
KIRQL Irql;
} VECTOR_INIT, *PVECTOR_INIT;
VECTOR_INIT HalpVectorInit[] = {
{ ZERO_VECTOR, 0 },
{ APC_VECTOR, APC_LEVEL },
{ DPC_VECTOR, DISPATCH_LEVEL },
{ APIC_GENERIC_VECTOR, PROFILE_LEVEL },
{ APIC_CLOCK_VECTOR, CLOCK_LEVEL },
{ APIC_IPI_VECTOR, IPI_LEVEL },
{ POWERFAIL_VECTOR, POWER_LEVEL }
};
//
// HalpVectorToIRQL maps interrupt vectors to NT IRQLs
//
KIRQL HalpVectorToIRQL[NUM_VECTORS];
//
// HalpVectorToINTI maps interrupt vector to EISA interrupt level
// on a per-node (cluster) basis. This can be thought of as a
// two-dimensional array.
//
USHORT HalpVectorToINTI[MAX_NODES * NUM_VECTORS];
VOID
HalpInitializeIrqlTables (
VOID
)
/*++
Routine Description:
This routine is responsible for initializing the HalpVectorToINTI[] and
HalpVectorToIRQL[] tables, based on the contents of the HalpVectorInit[]
array.
Arguments:
None.
Return Value:
None.
--*/
{
ULONG count;
PVECTOR_INIT vectorInit;
//
// Initialize every element of HalpVectorToINTI to 0xFFFF
//
for (count = 0; count < ARRAY_SIZE(HalpVectorToINTI); count++) {
HalpVectorToINTI[count] = 0xFFFF;
}
//
// Build HalpVectorToIrql based on the contents of HalpVectorInit.
// Any unused entries are initialized to (KIRQL)0xFF.
//
for (count = 0; count < ARRAY_SIZE(HalpVectorToIRQL); count++) {
HalpVectorToIRQL[count] = (KIRQL)0xFF;
}
for (count = 0; count < ARRAY_SIZE(HalpVectorInit); count++) {
vectorInit = &HalpVectorInit[count];
HalpVectorToIRQL[vectorInit->Vector] = vectorInit->Irql;
}
}