windows-nt/Source/XPSP1/NT/base/hals/halx86/i386/ix8259.inc
2020-09-26 16:20:57 +08:00

251 lines
5.7 KiB
PHP

;/*
;++
;
; Copyright (c) 1989 Microsoft Corporation
;
; Module Name:
;
; ix8259.inc
;
; Abstract:
;
; This module contains the definitions used by HAL to manipulate
; 8259 interrupt controller and 8259-specific constants.
;
; WARNING: This file is included by both ASM and C files.
;
; Author:
;
; John Vert (jvert) 31-Dec-1991
;
; (Moved from ke\i386\kimacro.inc)
;
;--
if 0 ; Begin C only code */
//
// 8259 defines for C code
// BE SURE TO CHANGE THESE VALUES IN BOTH TABLES!
//
#define HIGHEST_LEVEL_FOR_8259 27 // Highest level for standard 8259
#define PRIMARY_VECTOR_BASE 0x30 // Vector base for standard 8259
#if defined(NEC_98)
#if defined(NT_UP_98)
#define PROFILE_VECTOR (PRIMARY_VECTOR_BASE + 0) // standard profile
#else
#define PROFILE_VECTOR (PRIMARY_VECTOR_BASE + 15) // standard profile
#endif
#else // defined(NEC_98)
#define PROFILE_VECTOR (PRIMARY_VECTOR_BASE + 8) // standard profile
#endif // defined(NEC_98)
#define CLOCK_VECTOR (PRIMARY_VECTOR_BASE + 0) // standard clock
#define I386_80387_IRQ 0x0d // standard npx
#define I386_80387_IRQL (HIGHEST_LEVEL_FOR_8259 - I386_80387_IRQ)
#define I386_80387_VECTOR (PRIMARY_VECTOR_BASE + I386_80387_IRQ)
#define PIC_VECTORS 16
#define V2I(a) (a-PRIMARY_VECTOR_BASE) // Vector to interrupt macro
#define I386_80387_BUSY_PORT (PUCHAR)0xF0
#ifndef NEC_98
#define PIC_SLAVE_IRQ 2
#define PIC_SLAVE_REDIRECT 9
#else
#define PIC_SLAVE_IRQ 7
#define PIC_SLAVE_REDIRECT 8
#endif
#define EISA_EDGE_LEVEL0 0x4D0
#define EISA_EDGE_LEVEL1 0x4D1
/*
endif
;
; Same 8259 defines for assemble code
; BE SURE TO CHANGE THESE VALUES IN BOTH TABLES!
;
HIGHEST_LEVEL_FOR_8259 equ 27
PRIMARY_VECTOR_BASE equ 30h
ifdef NEC_98
ifdef NT_UP_98
PROFILE_VECTOR equ (PRIMARY_VECTOR_BASE + 0)
else
PROFILE_VECTOR equ (PRIMARY_VECTOR_BASE + 15)
endif
else ; NEC_98
PROFILE_VECTOR equ (PRIMARY_VECTOR_BASE + 8)
endif ; NEC_98
CLOCK_VECTOR equ (PRIMARY_VECTOR_BASE + 0)
I386_80387_IRQ equ 0dh
I386_80387_IRQL equ (HIGHEST_LEVEL_FOR_8259 - I386_80387_IRQ)
I386_80387_VECTOR equ (PRIMARY_VECTOR_BASE + I386_80387_IRQ)
I386_80387_BUSY_PORT equ 0f0h ; port to dismiss busy error line
ifdef NEC_98
PIC_SLAVE_IRQ equ 7
else
PIC_SLAVE_IRQ equ 2
endif
;
; The rest of the file are macros used in assemble only.
;
;++
;
; SET_8259_MASK
;
; Macro Description:
;
; This macro sets 8259 interrupt mask register with the mask
; passed from eax register.
;
; Note: Currently, only two 8259s are support. As a result,
; only ax contains valid mask.
;
; Arguments:
;
; (eax) = mask for setting 8259 interrupt mask register
;
;--
SET_8259_MASK macro
local a ; define local labels
out PIC1_PORT1, al ; set master 8259 mask
shr eax, 8 ; shift slave 8259 mask to al
out PIC2_PORT1, al ; set slave 8259 mask
a:
endm
;
; Interrupt controller register addresses
;
ifdef NEC_98
PIC1_PORT0 equ 00H
PIC1_PORT1 equ 02H
PIC2_PORT0 equ 08H
PIC2_PORT1 equ 0AH
else ; NEC_98
PIC1_PORT0 equ 020H
PIC1_PORT1 equ 021H
PIC2_PORT0 equ 0A0H
PIC2_PORT1 equ 0A1H
endif ; NEC_98
EISA_EDGE_LEVEL0 EQU 4D0h
EISA_EDGE_LEVEL1 EQU 4D1h
;
; Commands for Interrupt controller
;
PIC1_EOI_MASK equ 060H
ifdef NEC_98
PIC2_EOI equ 067H ; special EOI
else ; NEC_98
PIC2_EOI equ 062H
endif ; NEC_98
OCW2_NON_SPECIFIC_EOI equ 020H
OCW2_SPECIFIC_EOI equ 060H
OCW3_READ_ISR equ 0BH
OCW3_READ_IRR equ 0AH
;++
;
; IODELAY
;
; Macro Description:
;
; This macro simply does a jmp to next instruction to synchronize
; IO port access.
;
; Arguments:
;
; None
;
;--
IODELAY macro
ifdef NEC_98
out 5fh,al ; same effect with "stdcall IODelay8259"
else ; NEC_98
jmp $+2
endif ; NEC_98
endm
;++
;
; PICDELAY
;
; Macro Description:
;
; This macro does an inb on interrupt mask register to provide the
; time for 8259 to get stabled.
;
; Why do we need this?
;
; This is because:
; . The 80386 has a delayed write to memory and delayed output to IO
; capability and
; . 8259 needs some time to settle
;
; It is possible for the actual output cycle to 8259 to occur after
; the completion of instructions following the out instruction. For
; example, the STI instruction after SET_MASK and dismiss interrupt
; macros may complete before 8259 actually drops the interrupt. We don't
; want this happen in MCA system.
;
; You may argue that most OEMS add about 450ns delay to solve the
; back-to-back IO (delay) problem. But, remember that STI is not an IO
; instruction.
;
; Arguments:
;
; None
;
; NOTE: * The content of AL will be destroyed on return.
;
;--
PIC1DELAY macro
in al, PIC1_PORT1
endm
PIC2DELAY macro
in al, PIC2_PORT1
endm
;++
;
; SOFT_INTERRUPT_EXIT
;
; Macro Description:
;
; This macro is executed on return from the soft interrupt
; service routine. Its function is to restore privileged processor
; state, and continue thread execution.
;
; Arguments:
;
; (TOS) = previous irql
; (TOS+4 ...) = machine_state frame
;
;--
SOFT_INTERRUPT_EXIT macro
EXTRNP _HalpEndSoftwareInterrupt,1
cli
call _HalpEndSoftwareInterrupt@4 ; restore irql
SPURIOUS_INTERRUPT_EXIT ; exit interrupt without EOI
endm
;*/