Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

123 lines
2.9 KiB

/*++
Copyright (c) 1995-1996 International Business Machines Corporation
Module Name:
pxidesup.c
Abstract:
The module provides IDE interrupt dispatching support
for Carolina and Delmar systems.
Author:
Jim Wooldridge ([email protected])
Revision History:
Chris Karamatas ([email protected])
5.19.95 - Moved clearing of Utah to before DD ISR is run
- Consolodated code path for setting IdeVector & IdeInterruptRequest
--*/
#include "halp.h"
#include "pxidesup.h"
typedef BOOLEAN (*PSECONDARY_DISPATCH)(
PVOID InterruptRoutine,
PVOID ServiceContext,
PVOID TrapFrame
);
BOOLEAN
HalpHandleIdeInterrupt(
IN PKINTERRUPT Interrupt,
IN PVOID ServiceContext,
IN PVOID TrapFrame
)
/*++
Routine Description:
This routine is entered as the result of an interrupt being generated
via the vector that is connected to an interrupt object that describes
the SIO device interrupts. Its function is to call the second
level interrupt dispatch routine and acknowledge the interrupt at the SIO
controller.
N.B. This routine in entered and left with external interrupts disabled.
Arguments:
Interrupt - Supplies a pointer to the interrupt object.
ServiceContext - Supplies a pointer to the SIO interrupt acknowledge
register.
None.
Return Value:
Returns the value returned from the second level routine.
--*/
{
PSECONDARY_DISPATCH SioHandler;
PKINTERRUPT SioInterrupt;
BOOLEAN returnValue;
UCHAR IdeInterruptRequest;
USHORT IdeVector;
IdeInterruptRequest = READ_REGISTER_UCHAR(
(PUCHAR)HalpIoControlBase +
IDE_INTERRUPT_REQUEST_REGISTER);
if (IdeInterruptRequest & IDE_PRIMARY_INTERRUPT_REQUEST){
IdeVector = PRIMARY_IDE_VECTOR;
IdeInterruptRequest = IDE_SECONDARY_INTERRUPT_REQUEST;
} else if (IdeInterruptRequest & IDE_SECONDARY_INTERRUPT_REQUEST ) {
IdeVector = SECONDARY_IDE_VECTOR;
IdeInterruptRequest = IDE_PRIMARY_INTERRUPT_REQUEST;
} else {
return ( FALSE);
}
//
// Clear the interrupt in the UTAH IDE interrupt request register.
//
WRITE_REGISTER_UCHAR((PUCHAR)HalpIoControlBase +
IDE_INTERRUPT_REQUEST_REGISTER,
IdeInterruptRequest);
//
// Dispatch to the IDE interrupt service routine.
//
SioHandler = (PSECONDARY_DISPATCH)
PCR->InterruptRoutine[DEVICE_VECTORS + IdeVector];
SioInterrupt = CONTAINING_RECORD(SioHandler,
KINTERRUPT,
DispatchCode[0]);
returnValue = SioHandler(SioInterrupt,
SioInterrupt->ServiceContext,
TrapFrame
);
return(returnValue);
}