reactos/hal/halx86/mp/mpsirql.c

359 lines
7 KiB
C
Raw Normal View History

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: hal/halx86/mp/mpsirql.c
* PURPOSE: Implements IRQLs for multiprocessor systems
* PROGRAMMERS: David Welch (welch@cwcom.net)
* Casper S. Hornstrup (chorns@users.sourceforge.net)
* UPDATE HISTORY:
* 12/04/2001 CSH Created
*/
/* INCLUDES *****************************************************************/
#include <hal.h>
#define NDEBUG
#include <debug.h>
/* GLOBALS ******************************************************************/
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
/* FUNCTIONS ****************************************************************/
#undef KeGetCurrentIrql
KIRQL NTAPI KeGetCurrentIrql (VOID)
/*
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
* PURPOSE: Returns the current irq level
* RETURNS: The current irq level
*/
{
KIRQL irql;
ULONG Flags;
Flags = __readeflags();
_disable();
irql = __readfsbyte(FIELD_OFFSET(KPCR, Irql));
if (irql > HIGH_LEVEL)
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
{
DPRINT1 ("CurrentIrql %x\n", irql);
ASSERT(FALSE);
}
if (Flags & EFLAGS_INTERRUPT_MASK)
{
_enable();
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
}
return irql;
}
#undef KeSetCurrentIrql
VOID KeSetCurrentIrql (KIRQL NewIrql)
/*
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
* PURPOSE: Sets the current irq level without taking any action
*/
{
ULONG Flags;
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
if (NewIrql > HIGH_LEVEL)
{
DPRINT1 ("NewIrql %x\n", NewIrql);
ASSERT(FALSE);
}
Flags = __readeflags();
_disable();
__writefsbyte(FIELD_OFFSET(KPCR, Irql), NewIrql);
if (Flags & EFLAGS_INTERRUPT_MASK)
{
_enable();
}
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
}
VOID
HalpLowerIrql(KIRQL NewIrql, BOOLEAN FromHalEndSystemInterrupt)
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
{
ULONG Flags;
UCHAR DpcRequested;
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
if (NewIrql >= DISPATCH_LEVEL)
{
KeSetCurrentIrql (NewIrql);
APICWrite(APIC_TPR, IRQL2TPR (NewIrql) & APIC_TPR_PRI);
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
return;
}
Flags = __readeflags();
if (KeGetCurrentIrql() > APC_LEVEL)
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
{
KeSetCurrentIrql (DISPATCH_LEVEL);
APICWrite(APIC_TPR, IRQL2TPR (DISPATCH_LEVEL) & APIC_TPR_PRI);
DpcRequested = __readfsbyte(FIELD_OFFSET(KPCR, HalReserved[HAL_DPC_REQUEST]));
if (FromHalEndSystemInterrupt || DpcRequested)
{
__writefsbyte(FIELD_OFFSET(KPCR, HalReserved[HAL_DPC_REQUEST]), 0);
_enable();
KiDispatchInterrupt();
if (!(Flags & EFLAGS_INTERRUPT_MASK))
{
_disable();
}
}
KeSetCurrentIrql (APC_LEVEL);
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
}
if (NewIrql == APC_LEVEL)
{
return;
}
if (KeGetCurrentThread () != NULL &&
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
KeGetCurrentThread ()->ApcState.KernelApcPending)
{
_enable();
KiDeliverApc(KernelMode, NULL, NULL);
if (!(Flags & EFLAGS_INTERRUPT_MASK))
{
_disable();
}
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
}
KeSetCurrentIrql (PASSIVE_LEVEL);
}
/**********************************************************************
* NAME EXPORTED
* KfLowerIrql
*
* DESCRIPTION
* Restores the irq level on the current processor
*
* ARGUMENTS
* NewIrql = Irql to lower to
*
* RETURN VALUE
* None
*
* NOTES
* Uses fastcall convention
*/
VOID FASTCALL
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
KfLowerIrql (KIRQL NewIrql)
{
KIRQL oldIrql = KeGetCurrentIrql();
if (NewIrql > oldIrql)
{
DPRINT1 ("NewIrql %x CurrentIrql %x\n", NewIrql, oldIrql);
ASSERT(FALSE);
}
HalpLowerIrql (NewIrql, FALSE);
}
/**********************************************************************
* NAME EXPORTED
* KfRaiseIrql
*
* DESCRIPTION
* Raises the hardware priority (irql)
*
* ARGUMENTS
* NewIrql = Irql to raise to
*
* RETURN VALUE
* previous irq level
*
* NOTES
* Uses fastcall convention
*/
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
KIRQL FASTCALL
KfRaiseIrql (KIRQL NewIrql)
{
KIRQL OldIrql;
ULONG Flags;
Flags = __readeflags();
_disable();
OldIrql = KeGetCurrentIrql ();
if (NewIrql < OldIrql)
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
{
DPRINT1 ("CurrentIrql %x NewIrql %x\n", KeGetCurrentIrql (), NewIrql);
ASSERT(FALSE);
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
}
if (NewIrql > DISPATCH_LEVEL)
{
APICWrite (APIC_TPR, IRQL2TPR(NewIrql) & APIC_TPR_PRI);
}
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
KeSetCurrentIrql (NewIrql);
if (Flags & EFLAGS_INTERRUPT_MASK)
{
_enable();
}
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
return OldIrql;
}
/**********************************************************************
* NAME EXPORTED
* KeRaiseIrqlToDpcLevel
*
* DESCRIPTION
* Raises the hardware priority (irql) to DISPATCH level
*
* ARGUMENTS
* None
*
* RETURN VALUE
* Previous irq level
*
* NOTES
* Calls KfRaiseIrql
*/
KIRQL NTAPI
KeRaiseIrqlToDpcLevel (VOID)
{
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
return KfRaiseIrql (DISPATCH_LEVEL);
}
/**********************************************************************
* NAME EXPORTED
* KeRaiseIrqlToSynchLevel
*
* DESCRIPTION
* Raises the hardware priority (irql) to CLOCK2 level
*
* ARGUMENTS
* None
*
* RETURN VALUE
* Previous irq level
*
* NOTES
* Calls KfRaiseIrql
*/
KIRQL NTAPI
KeRaiseIrqlToSynchLevel (VOID)
{
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
return KfRaiseIrql (CLOCK2_LEVEL);
}
BOOLEAN NTAPI
HalBeginSystemInterrupt (KIRQL Irql,
ULONG Vector,
PKIRQL OldIrql)
{
ULONG Flags;
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
DPRINT("Vector (0x%X) Irql (0x%X)\n", Vector, Irql);
if (KeGetCurrentIrql () >= Irql)
{
DPRINT1("current irql %d, new irql %d\n", KeGetCurrentIrql(), Irql);
ASSERT(FALSE);
}
Flags = __readeflags();
if (Flags & EFLAGS_INTERRUPT_MASK)
{
DPRINT1("HalBeginSystemInterrupt was called with interrupt's enabled\n");
ASSERT(FALSE);
}
APICWrite (APIC_TPR, IRQL2TPR (Irql) & APIC_TPR_PRI);
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
*OldIrql = KeGetCurrentIrql ();
KeSetCurrentIrql (Irql);
return(TRUE);
}
VOID NTAPI
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
HalEndSystemInterrupt (KIRQL Irql,
IN PKTRAP_FRAME TrapFrame)
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
/*
* FUNCTION: Finish a system interrupt and restore the specified irq level.
*/
{
ULONG Flags;
Flags = __readeflags();
if (Flags & EFLAGS_INTERRUPT_MASK)
{
DPRINT1("HalEndSystemInterrupt was called with interrupt's enabled\n");
ASSERT(FALSE);
}
APICSendEOI();
HalpLowerIrql (Irql, TRUE);
}
VOID
NTAPI
HalDisableSystemInterrupt(ULONG Vector,
KIRQL Irql)
{
ULONG irq;
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
DPRINT ("Vector (0x%X)\n", Vector);
if (Vector < FIRST_DEVICE_VECTOR ||
Vector >= FIRST_DEVICE_VECTOR + NUMBER_DEVICE_VECTORS)
{
DPRINT1("Not a device interrupt, vector=%x\n", Vector);
ASSERT(FALSE);
return;
}
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
irq = VECTOR2IRQ (Vector);
IOAPICMaskIrq (irq);
return;
}
BOOLEAN NTAPI
HalEnableSystemInterrupt (ULONG Vector,
KIRQL Irql,
KINTERRUPT_MODE InterruptMode)
{
ULONG irq;
if (Vector < FIRST_DEVICE_VECTOR ||
Vector >= FIRST_DEVICE_VECTOR + NUMBER_DEVICE_VECTORS)
{
DPRINT("Not a device interrupt\n");
return FALSE;
}
/* FIXME: We must check if the requested and the assigned interrupt mode is the same */
2003-04-06 Casper S. Hornstrup <chorns@users.sourceforge.net> * drivers/storage/atapi/atapi.c (AtapiReadWrite): Expect an interrupt a bit sooner. * hal/halx86/isa.c (HalpGetIsaInterruptVector): Compute vector for MP. * hal/halx86/pci.c (HalpGetPciInterruptVector): Ditto. * hal/halx86/sysbus.c (HalpGetSystemInterruptVector): Ditto. * hal/halx86/mp.c (AssignIrqVector): Rewrite. (MpsTimerHandler): Disable for now. (MpsSpuriousHandler): Do not acknowledge interrupt. (HalAllProcessorsStarted): Only boot 1 CPU for now. (RescheduleDpcRoutine): New function. (RescheduleDpc): New variable. (HalpInitMPS): Initialize RescheduleDpc. Fix bug in call to memset. * hal/halx86/mpsirql.c: Rewrite. * hal/halx86/include/mps.h (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL, IRQL2VECTOR): New macros. * ntoskrnl/ntoskrnl.def: Add KeRescheduleThread@0. * ntoskrnl/ntoskrnl.edf: Ditto. * ntoskrnl/include/internal/ke.h (KeRescheduleThread): Prototype. * ntoskrnl/ke/kthread.c (KeRescheduleThread): New function. * ntoskrnl/ke/i386/exp.c (KeInitExceptions): Remove unneeded call to set_trap_gate(). * ntoskrnl/ke/i386/irq.c (VECTOR2IRQ, IRQ2VECTOR, VECTOR2IRQL): Correct. (IRQ_BASE): Define as FIRST_DEVICE_VECTOR. (NR_IRQS): Define using IRQ_BASE. (KeInitInterrupts): Use IRQ_BASE. (KiInterruptDispatch2): Rewrite. (KiInterruptDispatch): Ditto. (KeConnectInterrupt): Pass Vector to HalEnableSystemInterrupt() for MP. (KeDisconnectInterrupt): Pass Vector to HalDisableSystemInterrupt() for MP. * ntoskrnl/ke/i386/trap.s (_KiTrapProlog): Change 0x124 to KPCR_CURRENT_THREAD. svn path=/trunk/; revision=4505
2003-04-06 10:45:16 +00:00
irq = VECTOR2IRQ (Vector);
IOAPICUnmaskIrq (irq);
return TRUE;
}
VOID FASTCALL
HalRequestSoftwareInterrupt(IN KIRQL Request)
{
switch (Request)
{
case APC_LEVEL:
__writefsbyte(FIELD_OFFSET(KPCR, HalReserved[HAL_APC_REQUEST]), 1);
break;
case DISPATCH_LEVEL:
__writefsbyte(FIELD_OFFSET(KPCR, HalReserved[HAL_DPC_REQUEST]), 1);
break;
default:
ASSERT(FALSE);
}
}
VOID FASTCALL
HalClearSoftwareInterrupt(
IN KIRQL Request)
{
UNIMPLEMENTED;
}