363 lines
7.7 KiB
NASM
363 lines
7.7 KiB
NASM
|
|
title "Interprocessor Interrupt"
|
|
;++
|
|
;
|
|
;Copyright (c) 1992 NCR Corporation
|
|
;
|
|
;Module Name:
|
|
;
|
|
; ncripi.asm
|
|
;
|
|
;Abstract:
|
|
;
|
|
; Provides the HAL support for Interprocessor Interrupts.
|
|
;
|
|
;Author:
|
|
;
|
|
; Richard Barton (o-richb) 24-Jan-1992
|
|
;
|
|
;Revision History:
|
|
;
|
|
;--
|
|
.386p
|
|
.xlist
|
|
include i386\kimacro.inc
|
|
include callconv.inc ; calling convention macros
|
|
include hal386.inc
|
|
include i386\ncr.inc
|
|
include i386\ix8259.inc
|
|
|
|
|
|
EXTRNP Kei386EoiHelper,0,IMPORT
|
|
EXTRNP _KiCoprocessorError,0,IMPORT
|
|
EXTRNP _KeRaiseIrql,2
|
|
EXTRNP _HalBeginSystemInterrupt,3
|
|
EXTRNP _HalEndSystemInterrupt,2
|
|
EXTRNP _KiIpiServiceRoutine,2,IMPORT
|
|
EXTRNP _HalEnableSystemInterrupt,3
|
|
EXTRNP _NCRClearQicIpi,1
|
|
extrn _NCRLogicalNumberToPhysicalMask:DWORD
|
|
|
|
page ,132
|
|
subttl "Post InterProcessor Interrupt"
|
|
_TEXT SEGMENT DWORD USE32 PUBLIC 'CODE'
|
|
ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
|
|
|
|
|
|
|
|
;++
|
|
;
|
|
; VOID
|
|
; NCR3360EnableNmiButtoni(
|
|
; VOID
|
|
; );
|
|
;
|
|
;Routine Description:
|
|
;
|
|
; Programs the recessed button on the 3360 to generate an NMI.
|
|
;
|
|
; 3360 SPECIFIC CODE ONLY !!!!!
|
|
;
|
|
;Arguments:
|
|
;
|
|
; Mask - Supplies a mask of the processors to interrupt
|
|
;
|
|
;Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
;
|
|
; in NMI handler, if you are interested in making sure button was source of
|
|
; NMI, check bit 6 (of 0 thru 7) of IO port 0xf820. If 0, button was pressed,
|
|
; 1 means NMI came from somewhere else.
|
|
;
|
|
; Also, in NMI interrupt handler, if NMI came fo...
|
|
|
|
|
|
cPublicProc _NCR3360EnableNmiButton, 0
|
|
|
|
mov ah, 41h ; start with processor ASIC 0 (FRED ASIC)
|
|
mov cx, 2 ; loop through 2 processor cards
|
|
|
|
PollAsics:
|
|
mov al, ah ; get ASIC select data
|
|
out 97h, al ; select ASIC through CAT Access port
|
|
mov dx, 0f800h ; read CAT ID
|
|
in al, dx ;
|
|
cmp al, 0ffh ; 0xff means no processor card is present
|
|
je @f
|
|
|
|
; setup processor ASICs for g_nmi
|
|
|
|
mov dx, 0f80dh ; turn on GNMI in FRED ASIC
|
|
in al, dx
|
|
or al, 1
|
|
out dx, al
|
|
|
|
@@:
|
|
add ah, 20h ; go to next processor card
|
|
|
|
loop PollAsics ; loop 'til done
|
|
|
|
|
|
mov al, 0c1h ; select arbiter ASIC
|
|
out 97h, al
|
|
|
|
mov dx, 0f80bh ; enable EXP_FALCON_NMI (pushbutton NMI)
|
|
in al, dx
|
|
or al, 8
|
|
out dx, al
|
|
|
|
mov al, 0ffh ; take CAT subsystem out of setup
|
|
out 97h, al
|
|
|
|
|
|
mov dx, 0f823h ; enable pushbutton NMI by disabling, then
|
|
in al, dx ; reenable
|
|
and al, 11011111b ; disable by setting MEM_DIS_L to 0
|
|
out dx, al
|
|
or al, 00100000b ; enable by setting MEM_DIS_L to 0
|
|
out dx, al
|
|
|
|
stdRET _NCR3360EnableNmiButton
|
|
stdENDP _NCR3360EnableNmiButton
|
|
|
|
|
|
|
|
;++
|
|
;
|
|
; VOID
|
|
; HalVicRequestIpi(
|
|
; IN ULONG Mask
|
|
; );
|
|
;
|
|
;Routine Description:
|
|
;
|
|
; Requests an interprocessor interrupt using the VIC
|
|
;
|
|
;Arguments:
|
|
;
|
|
; Mask - Supplies a mask of the processors to interrupt
|
|
;
|
|
;Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
cPublicProc _HalVicRequestIpi ,1
|
|
mov eax, dword ptr 4[esp]
|
|
TRANSLATE_LOGICAL_TO_VIC
|
|
VIC_WRITE CpiLevel0Reg, al
|
|
stdRET _HalVicRequestIpi
|
|
stdENDP _HalVicRequestIpi
|
|
|
|
|
|
page ,132
|
|
subttl "80387 Irq13 Interrupt Handler"
|
|
|
|
;++
|
|
;
|
|
; VOID
|
|
; HalpIrq13Handler (
|
|
; );
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; When the 80387 detects an error, it raises its error line. This
|
|
; was supposed to be routed directly to the 386 to cause a trap 16
|
|
; (which would actually occur when the 386 encountered the next FP
|
|
; instruction).
|
|
;
|
|
; However, the ISA design routes the error line to IRQ13 on the
|
|
; slave 8259. So an interrupt will be generated whenever the 387
|
|
; discovers an error.
|
|
;
|
|
; This routine handles that interrupt and passes control to the kernel
|
|
; coprocessor error handler.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; None.
|
|
; Interrupt is disabled.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
ENTER_DR_ASSIST Hi13_a, Hi13_t
|
|
|
|
cPublicProc _HalpIrq13Handler ,0
|
|
|
|
;
|
|
; Save machine state in trap frame
|
|
;
|
|
|
|
ENTER_INTERRUPT Hi13_a, Hi13_t ; (ebp) -> Trap frame
|
|
|
|
;
|
|
; HalBeginSystemInterrupt will save previous IRQL
|
|
;
|
|
cli
|
|
push 13 + PRIMARY_VECTOR_BASE
|
|
sub esp, 4 ; placeholder for OldIrql
|
|
|
|
stdCall _HalBeginSystemInterrupt, <I386_80387_IRQL,13 + PRIMARY_VECTOR_BASE,esp>
|
|
|
|
or al,al ; check for spurious interrupt
|
|
jz SpuriousIrq13
|
|
|
|
stdCall _KiCoprocessorError ; call CoprocessorError handler
|
|
|
|
;
|
|
; Clear the busy latch so that the 386 doesn't mistakenly think
|
|
; that the 387 is still busy.
|
|
;
|
|
|
|
xor al,al
|
|
out I386_80387_BUSY_PORT, al
|
|
|
|
INTERRUPT_EXIT ; will return to caller
|
|
|
|
SpuriousIrq13:
|
|
add esp, 8 ; spurious, no EndOfInterrupt
|
|
SPURIOUS_INTERRUPT_EXIT ; exit interrupt without eoi
|
|
|
|
stdENDP _HalpIrq13Handler
|
|
|
|
|
|
page ,132
|
|
subttl "Interprocessor Interrupt Handler"
|
|
|
|
;++
|
|
;
|
|
; VOID
|
|
; NCRVicIPIHandler (
|
|
; );
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This routine handles an incoming cross-processor interrupt.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; None.
|
|
; Interrupt is disabled.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
ENTER_DR_ASSIST Ipi_a, Ipi_t
|
|
|
|
cPublicProc _NCRVicIPIHandler,0
|
|
|
|
;
|
|
; Save machine state in trap frame
|
|
;
|
|
|
|
ENTER_INTERRUPT Ipi_a, Ipi_t ; (ebp) -> Trap frame
|
|
|
|
;
|
|
; HalBeginSystemInterrupt will save previous IRQL
|
|
;
|
|
|
|
push NCR_CPI_VECTOR_BASE+NCR_IPI_LEVEL_CPI
|
|
sub esp, 4 ; placeholder for OldIrql
|
|
|
|
stdCall _HalBeginSystemInterrupt, <IPI_LEVEL,NCR_CPI_VECTOR_BASE+NCR_IPI_LEVEL_CPI,esp>
|
|
|
|
or al,al ; check for spurious interrupt
|
|
jz short SpuriousIpi
|
|
|
|
; Pass TrapFrame to Ipi service rtn
|
|
; Pass Null ExceptionFrame
|
|
|
|
stdCall _KiIpiServiceRoutine, <ebp,0>
|
|
|
|
; BUGBUG shielint ignore returncode
|
|
|
|
NCRIpiisDone:
|
|
INTERRUPT_EXIT ; will return to caller
|
|
|
|
align 4
|
|
SpuriousIpi:
|
|
add esp, 8 ; spurious, no EndOfInterrupt
|
|
SPURIOUS_INTERRUPT_EXIT ; exit interrupt without eoi
|
|
|
|
stdENDP _NCRVicIPIHandler
|
|
|
|
|
|
;++
|
|
;
|
|
; VOID
|
|
; NCRQicIPIHandler (
|
|
; );
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This routine handles an incoming cross-processor interrupt for the Quad Processor.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; None.
|
|
; Interrupt is disabled.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
ENTER_DR_ASSIST QicIpi_a, QicIpi_t
|
|
|
|
cPublicProc _NCRQicIPIHandler,0
|
|
|
|
;
|
|
; Save machine state in trap frame
|
|
;
|
|
|
|
ENTER_INTERRUPT QicIpi_a, QicIpi_t ; (ebp) -> Trap frame
|
|
|
|
;
|
|
; HalBeginSystemInterrupt will save previous IRQL
|
|
;
|
|
|
|
push NCR_QIC_CPI_VECTOR_BASE+NCR_IPI_LEVEL_CPI
|
|
sub esp, 4 ; placeholder for OldIrql
|
|
|
|
stdCall _HalBeginSystemInterrupt, <IPI_LEVEL,NCR_QIC_CPI_VECTOR_BASE+NCR_IPI_LEVEL_CPI,esp>
|
|
|
|
or al,al ; check for spurious interrupt
|
|
jz short SpuriousQicIpi
|
|
|
|
; Pass TrapFrame to Ipi service rtn
|
|
; Pass Null ExceptionFrame
|
|
|
|
stdCall _KiIpiServiceRoutine, <ebp,0>
|
|
|
|
; BUGBUG shielint ignore returncode
|
|
|
|
NCRQicIpiisDone:
|
|
INTERRUPT_EXIT ; will return to caller
|
|
|
|
align 4
|
|
SpuriousQicIpi:
|
|
add esp, 8 ; spurious, no EndOfInterrupt
|
|
SPURIOUS_INTERRUPT_EXIT ; exit interrupt without eoi
|
|
|
|
stdENDP _NCRQicIPIHandler
|
|
|
|
|
|
|
|
|
|
_TEXT ENDS
|
|
|
|
END
|