summaryrefslogtreecommitdiffstats
path: root/private/ntos/nthals/halncr/i386/ncripi.asm
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/nthals/halncr/i386/ncripi.asm
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/ntos/nthals/halncr/i386/ncripi.asm')
-rw-r--r--private/ntos/nthals/halncr/i386/ncripi.asm362
1 files changed, 362 insertions, 0 deletions
diff --git a/private/ntos/nthals/halncr/i386/ncripi.asm b/private/ntos/nthals/halncr/i386/ncripi.asm
new file mode 100644
index 000000000..ebbea00d8
--- /dev/null
+++ b/private/ntos/nthals/halncr/i386/ncripi.asm
@@ -0,0 +1,362 @@
+
+ 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