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:
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; }
}
|