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.
 
 
 
 
 
 

1227 lines
45 KiB

;
;~~~
; 06/16/92 Added an error message and few equates to help
; with the UPS LED translation.
;
;~~~
; 06/08/92 Updating EBI II to meet the 2.8 EBI II specification.
; Adding Multi-threading support for EBI II
;
;~~~
; 5/21/92 Reved version of EBI implementation to 2.8
; Support for specific EOI.
; A number of new equates.
;
;~~~
; 4/28/92 MPX updates.
;
; Added IRQ0_Vector and IRQ8_Vector to EBI 2 memory
; structure.
;
; created a macro EDI_EBI_MEM_ADD
;
; Added an IPI_ID_Valid_Mask
;
;~~~
;
; 4/17/92
;
; Added Bios Time out Bit mask in NMICR
; Added SMEARRegister entry to the EBI 2 memory structure.
;
;~~~
; 4/15/92 Coding OEM0 function to help NMI generation and
; debugging.
;
;~~~
; 4/13/92 Updating this module to reflect the new EBI II Spec rel
; 2.7.
; All functions will be re-arranged. This file will
; contain all EBI II functions need for the SCO EFS
; Implementation. Refer to EBI2STAT.DOC for a
; condensed list of these functions.
;
;~~~
; 4/2/92 Added more equates, new error messages.
;
;~~~
; 3/20/92 Added new equates and MemTable_To_Edi macro
;
;~~~
; 3/16/92 Adding more EBI 2 functionality to support the SCO
; EFS implementation.
;~~~
;*****************************************************************************
; Compilation debugging switches
;*****************************************************************************
;SIMULATE_MANHATTAN EQU 1
;SIMULATE_MPSYSTEM EQU 1
;FAKE_MMIOTABLE EQU 1
DELETED_FUNCTIONS EQU 1 ;a flag to not compile the functions
;that were in an older rev of the
;EBI II spec but no longer are
;needed.
;UGLY EQU 1
;*****************************************************************************
; Declare Equates
;*****************************************************************************
;
;Equates for the AST OEM call Set_Irq13_Latch
;
SET_IRQ13_LATCH equ 6 ;subfunc#
IRQ13_LATCH_ON equ 1
IRQ13_LATCH_OFF equ 0
;
; The structure and the definitions for the new local int mask call
;
PORT_TYPE_MASK equ 3
PORT_TYPE_MEMORY equ 0
PORT_TYPE_IO equ 1
PORT_WIDTH_MASK equ 01CH
EIGHT_BIT_PORTS equ 000H
SIXTEEN_BIT_PORTS equ 004H
THIRTY_TWO_BIT_PORT equ 008H
;Function return successfull codes.
OK equ 0
PROC_RUNNING equ 1
PROC_STOPPED equ 2
PROC_NO_CACHE equ 3
NO_MEMORY_ERRORS EQU 4 ;No RAM errors were found
MEMORY_ERRORS_FOUND EQU 5 ;Hardware detected a RAM error.
WRONG_GRAPH_MODE EQU 6 ;can not write to Graph Mode in this mode.
;Function return ERROR codes
ERR_BAD EQU 0FFFFFFFFH ;-1
ERR_NOT_SUPPORTED EQU 0FFFFFFFEH ;-2
ERR_NONESUCH EQU 0FFFFFFFDH ;-3
ERR_BAD_PROC_ID EQU 0FFFFFFFCH ;-4
ERR_PROC_ABSENT EQU 0FFFFFFFBH ;-5
ERR_PROC_BAD EQU 0FFFFFFFAH ;-6
ERR_UNKNOWN_INT EQU 0FFFFFFF9H ;-7
ERR_DISPLAY_OVERFLOW EQU 0FFFFFFF8H ;-8
ERR_BAD_CHARS EQU 0FFFFFFF7H ;-9
ERR_BAD_SELECTOR EQU 0FFFFFFF6H ;-10
ERR_BAD_CACHE_MODE EQU 0FFFFFFF5H ;-11
ERR_BAD_VECTOR EQU 0FFFFFFF4H ;-12
ERR_BAD_COLOR EQU 0FFFFFFF3H ;-13
ERR_BAD_GRAPH_MODE EQU 0FFFFFFF2H ;-14
ERR_BAD_BOARD_NUM EQU 0FFFFFFF1H ;-15
ERR_BAD_MODULE_NUM EQU 0FFFFFFF0H ;-16
ERR_BAD_IRQ_NUM EQU 0FFFFFFEFH ;-17
ERR_BAD_OFFSWITCH EQU 0FFFFFFEEH ;-18
ERR_BAD_PHYS_ADDR EQU 0FFFFFFEDH ;-19
ERR_BAD_LENGTH EQU 0FFFFFFECH ;-20
ERR_BAD_BLOCK_NUM EQU 0FFFFFFEBH ;-21
ERR_BAD_GLOB_MASK_IRQ EQU 0FFFFFFEAH ;-22
ERR_BAD_LOC_MASK_IRQ EQU 0FFFFFFE9H ;-23
ERR_CANT_CANCEL_INT EQU 0FFFFFFE8H ;-24
ERR_PROC_STILL_RUNNING EQU 0FFFFFFE7H ;-25
ERR_BAD_POWER_SUPPLY_NUM EQU 0FFFFFFE6H ;-26
ERR_BAD_FRONT_PANEL_MODE EQU 0FFFFFFE5H ;-27
ERR_MULTI_TIME_OUT EQU 0FFFFFFE4H ;-28
ERR_FRONT_PANEL_DISABLED EQU 0FFFFFFE3H ;-29
;OEM function error return codes
OEM0_ERR_BAD_EISA_REF EQU 0FFFF0000H ; 0
OEM0_ERR_BAD_COM2_OVERRIDE EQU 0FFFEFFFFH ; 1
OEM0_ERR_BAD_GEN_MULTIBIT EQU 0FFFEFFFEH ; 2
OEM0_ERR_BAD_GEN_SINGLEBIT EQU 0FFFEFFFDH ; 3
OEM0_ERR_BAD_IRQ13_LATCH EQU 0FFFEFFFCH ; 4
OEM0_ERR_BAD_CACHE_MODE EQU 0FFFEFFFBH ; 5
;OEM completion codes.
OEM0_INFO_BANK_ABSENT EQU 10000 ;0
;ERR_BAD EQU 0FFFFFFFFH ;-1
;ERR_NOT_SUPPORTED EQU 0FFFFFFFEH ;-2
;ERR_NONESUCH EQU 0FFFFFFFDH ;-3
;ERR_INVALID_PROC_ID EQU 0FFFFFFFCH ;-4
;ERR_PROC_ABSENT EQU 0FFFFFFFBH ;-5
;ERR_PROC_BAD EQU 0FFFFFFFAH ;-6
;ERR_UNKNOWN_NMI EQU 0FFFFFFF9H ;-7
;ERR_DISPLAY_OVERFLOW EQU 0FFFFFFF8H ;-8
;ERR_BAD_CHARS EQU 0FFFFFFF7H ;-9
;ERR_BAD_SELECTOR EQU 0FFFFFFF6H ;-10
;ERR_BAD_CACHE_MODE EQU 0FFFFFFF5H ;-11
;ERR_BAD_VECTOR EQU 0FFFFFFF4H ;-12
;ERR_BAD_COLOR EQU 0FFFFFFF3H ;-13
;ERR_BAD_GRAPH_MODE EQU 0FFFFFFF2H ;-14
;ERR_INVALID_BOARD_NUM EQU 0FFFFFFF1H ;-15
;ERR_INVALID_MODULE_NUM EQU 0FFFFFFF0H ;-16
;ERR_INVALID_IRQ_NUM EQU 0FFFFFFEFH ;-17
;ERR_INVALID_OFFSWITCH_MODE EQU 0FFFFFFEEH ;-18
;ERR_INVALID_PHYS_ADR EQU 0FFFFFFEDH ;-19
;ERR_INVALID_LENGTH EQU 0FFFFFFECH ;-20
;ERR_INVALID_BLOCK_NUM EQU 0FFFFFFEBH ;-21
;ERR_INVALID_GLOB_MASK_IRQ EQU 0FFFFFFEAH ;-22
;ERR_INVALID_LOC_MASK_IRQ EQU 0FFFFFFE9H ;-23
;ERR_CANT_CANCEL_INT EQU 0FFFFFFE8H ;-24
;ERR_INVALID_EISA_REF EQU 0FFFFFFE7H ;-25
;ERR_INVALID_COM2_OVER EQU 0FFFFFFE6H ;-26
;ERR_INVALID_GEN_MULTI EQU 0FFFFFFE5H ;-27
;ERR_INVALID_GEN_SINGLE EQU 0FFFFFFE4H ;-28
;ERR_INVALID_IRQ13_LATCH EQU 0FFFFFFE3H ;-29
;NMI and SPI SOURCE equates
NMI_SRC_NONE EQU 0 ;No source was found
;1 is reserved.
NMI_SRC_LOCALSOFTNMI EQU 2 ;Software generated NMI
NMI_SRC_MEM EQU 3 ;Memory Double bit ECC error
NMI_SRC_PROCESSOR EQU 4 ;PROCESSOR error.
;5 is reserved.
NMI_SRC_SYS_PARITY EQU 6 ;System bus Parity, address or data
NMI_SRC_SYS_TIMEOUT EQU 7 ;System bus timeout.
NMI_SRC_SHUTDOWN EQU 8 ;Shutdown Button.
NMI_SRC_ATTENTION EQU 9 ;Attention Button.
NMI_SRC_POWERFAIL EQU 0AH ;Power Fail.
NMI_SRC_EISA_FAIL_SAFE EQU 0BH ;Eisa Fail safe timer error
NMI_SRC_EISA_BUSTIMEOUT EQU 0CH ;EISA Bus timeout
NMI_SRC_EISA_IOCHECK EQU 0DH ;EISA IO Check
NMI_SRC_EISA_SWGEN EQU 0EH ;EISA software generated NMI
NMI_SRC_SYS_IO EQU 0FH ;System I/O error
NMI_SRC_MASK EQU 7 ;Mask for bits 0 - 2.
;Interrupt Subsystem Type
INT_SUBSYS_EISA EQU 0 ;EISA interrupt subsystem type.
INT_SUBSYS_ISA EQU 1 ;ISA interrupt subsystem type.
INT_SUBSYS_ADI EQU 2 ;ADI interrupt subsystem type.
INT_SUBSYS_MPIC EQU 3 ;MPIC interrupt subsystem type.
INT_MODE_BYPASS EQU 1 ;Bypass mode flag.
INT_MODE_ADI EQU 2 ;Advanced Distributed int. mode
IVR_0_ADR EQU 20H ;I/O port for 8259 Init. Master.
IVR_8_ADR EQU 0A0H ;I/O port for 8259 Init. Slave.
IVR_0_EISA_ADR EQU 4D0H ;EISA 8259 I/O port for Master.
IVR_8_EISA_ADR EQU 4D1H ;EISA 8259 I/O port for Slave.
IMR_0_ADR EQU 21H ;I/O port address for IRQ 0 - 7
IMR_8_ADR EQU 0A1H ;I/O prot address for IRQ 8 - 15
IRQ_MAX EQU 15 ;Highest IRQ number supported.
ICW1_MASK EQU 11H ;8259 ICW1 settings. Cascade Mode
ICW3_MASK_MASTER EQU 4 ;8259 ICW3 settings. Slave is on IRQ2
ICW3_MASK_SLAVE EQU 2 ;8259 ICW3 settings. Slave ID
ICW4_MASK EQU 1 ;8259 ICW4 settings. 8086 mode, Normal
;EOI, fully nested mode, non buffered.
OCW2_MASK EQU 60H ;Specific EOI Mask, bit 0-2 should
;be the irq number.
IRQ2_EOI_MASK EQU 62H ;Mask command to EOI IRQ 2.
READ_ISR_COM EQU 0BH ;command to 8259 to read ISR
READ_IRR_COM EQU 0AH ;command to 8259 to read IRR
MAX_SPI_VECTOR EQU 255 ;Maximum SPI Vector number currently
;supported by our hardware.
MAX_IPI_VECTOR EQU 255 ;Maximum IPI Vector number currently
;supported by our hardware.
;EISA EOI registers
NMISTATUSREG EQU 61H
MIENABLEREG EQU 70H
EXTENDEDNMIREG EQU 461H
;
;Bit positions.
BIT_0 EQU 01H
BIT_1 EQU 02H
BIT_2 EQU 04H
BIT_3 EQU 08H
BIT_4 EQU 10H
BIT_5 EQU 20H
BIT_6 EQU 40H
BIT_7 EQU 80H
BIT_8 EQU 0100H
BIT_9 EQU 0200H
BIT_10 EQU 0400H
BIT_11 EQU 0800H
BIT_12 EQU 1000H
BIT_13 EQU 2000H
BIT_14 EQU 4000H
BIT_15 EQU 8000H
;The Bits that are set(1) indicated that such an interrupt
;is supported in the Interrupt Mask Bitmap Definition.
LOCAL_INT_VALID_MASK EQU 0700FFFFH
GLOBAL_INT_VALID_MASK EQU 0000FFFFH
CANCEL_INT_VALID_MASK EQU 0100FFFFH
IRQ0_IRQ15_MASK EQU 0000FFFFH
IPI_ID_VALID_MASK EQU 0FFFFFF00H
SPI_INT_MASK EQU 01000000H
LSI_INT_MASK EQU 02000000H
IPI_INT_MASK EQU 04000000H
CLRSPI EQU BIT_2 ;clear SPI bit in ICR regs.
;bit definition in the ADI for ISR and IRR for following Interrupts.
LSI_ADI_IR_BIT EQU BIT_5
LSI_ADI_IS_BIT EQU BIT_5
IPI_ADI_IR_BIT EQU BIT_6
IPI_ADI_IS_BIT EQU BIT_6
SPI_ADI_IR_BIT EQU BIT_7
SPI_ADI_IS_BIT EQU BIT_7
TRUE EQU 01H ;Boolean True.
FALSE EQU 00H ;Boolean False.
ADIEOI_MASK EQU 40h ;bit 6 of ICR
IGN_IPI EQU 08h ;IPI ignore bit in the ICR
SWNMI EQU BIT_0 ;Software NMI bit in NMICR
SIOEM EQU BIT_1 ;SIOEM in NMICR
BTEM_BIT EQU BIT_2 ;BTEM in NMICR
IOI_IR EQU BIT_3 ;in IRR register.
BYP_BIT EQU BIT_7 ;in CMCR
MASTER_BIT EQU BIT_7 ;in ICR
ENABLE_INT EQU BIT_2 ;in CMCR
;Type of ECC error from a memory board. This will be the values
;returned to the caller in the memErrFlags.
MEM_ERR_PARITY EQU 1 ;memory parity error.
MEM_ERR_SINGLE_BIT EQU 2 ;memory single bit ECC error.
MEM_ERR_MULTI_BIT EQU 3 ;memory Multi bit ECC error.
MEM_ERR_INDETERMINTE EQU 0FFFFFFFFH ;-1 Info requested in indeterminate.
INDETERMINITE EQU 0FFFFFFFFH ;-1
ZERO EQU 0
ONE EQU 1 ;Decimal One.
TWO EQU 2
THREE EQU 3
FOUR EQU 4
SIXTY4_KB EQU 10000H ;64 K Bytes.
Sixteen_KB EQU 4000H ;16 KB bytes
ONE_MB EQU 100000H ;1 MB.
Eight_MB EQU 800000H ;8 MB.
Sixteen_MB EQU 1000000H ;16 MB.
Thirty2_MB EQU 2000000H ;32 MB.
NEGONE EQU 0FFFFFFFFH ;-1
CPUBOARD_SETABLEREGS EQU 10000H ;Offset to the CPU board
;settable registers from
;the base address for the
;slot it currently occupies.
MEMBOARD_SETABLEREGS EQU 10100H ;Offset to the memory board
;settable registers from the base
;of DISTC address.
VALID_UPS_LEDCOLORS EQU 3 ;highest color setting
VALID_OFFSWITCH_MODES EQU 1 ;highest off switch mode setting
VALID_CACHE_CONTROL_MODES EQU 1 ;highest cache control mode setting
VALID_FRONT_PANEL_MODES EQU 1 ;highest valid front panel modes.
ENABLE_FRONT_PANEL_INT EQU 1 ;enable front panel mode command.
FIRST_PAIR_SIMMS EQU 10H ;Mem Config mask indicating
SECOND_PAIR_SIMMS EQU 20H ;which pair of SIMMS are
THIRD_PAIR_SIMMS EQU 40H ;present on the current
FOURTH_PAIR_SIMMS EQU 80H ;memory board.
MEM_BOARD_RESERVED EQU 0 ;reseved equate for mem board
CACHE_READ_ONLY equ 1 ; Selectable cache modes.
CACHE_WRITE_THRU equ 2 ; Mode 0 is default, which
CACHE_WRITE_BACK equ 3 ; is NOT readonly and write
CACHE_READ_WRITE equ 4 ; back.
ASCII_ALPHA_NUM_DISP equ 1 ; Code for full ASCII display.
ASCII_ALPHA_NUM_WID equ 4 ; Number of chars on FP disp.
ATTENTION_MASK equ 20h ; Mask for attention button.
CACHE_MASK equ 0ch ; Mask for bits 2,3.
CACHE_RDONLY_MASK equ 4 ; Mask for bit 2 of CMMS reg.
CACHE_WR_THRU_MASK equ 8 ; Mask for bit 3 of CMMS reg.
DISABLE_CACHE equ 60000000h ; Set bits 29, 30 of CR0.
CACHE_MODE_VALID EQU 07H ; valid mode masks.
CACHE_MODE_MASK EQU 1CH ; CMMS cache mode mask.
EBI_2_MAJOR equ 02h ; Revision 02.08.01
EBI_2_MINOR equ 08h ; of the EBI II Specification.
EBI_2_ZZ equ 01h
FLUSH_MODE_MASK equ 3 ; Mask for bits 0,1.
FP_MODE_MASK equ 1 ; Mask for bit 0.
FP_SHUTDWN equ 80h ; Bit position for shutdown.
FP_ENABLE_SHUTDOWN EQU 40h ;bit possition for enabling shutdown
FP_THERMAL_MASK equ 10h ; Mask for bit 4.
MAX_FP_DIGITS equ 4 ; 4-digit ASCII display.
MEM_MAP_IO_BASE_ADDR equ 0d0000000h ; Start of hw i/o addresses.
MEM_MAP_IO_SIZE equ 10000000h ; Size used for hw i/o.
MEM_MAX_BANKS equ 4 ;max # of banks per mem board.
MP_SPECIFIC_EOI equ 60h ; Sends specific EOI to PIC.
FP_INTMODE_DISABLED EQU 0 ;indicates front panel interr
;mode is disabled.
KEYLOCK_LOCKED_HW EQU 6
KEYLOCK_SERVICE_HW EQU 5
KEYLOCK_UNLOCK_HW EQU 3
KEYLOCK_OFF_HW EQU 7
KEYLOCK_LOCKED_SW EQU 0
KEYLOCK_SERVICE_SW EQU 1
KEYLOCK_UNLOCK_SW EQU 2
KEYLOCK_OFF_SW EQU 3
NUM_KEY_POSITIONS equ 4 ; FP has 4 key positions.
KEYLOCK_MASK equ 7 ; KEYLOCK POSITION MASK
SHUTDOWN_MASK equ 8 ; Mask for bit 3.
SHUTDOWN_NMI_SRC equ 8 ; Numerical equiv for OFF btn.
TIMER_FREQ equ 1000 ; Hard code to 1000 KHz.
UPS_LED_MASK equ 30h ; Mask for bits 4,5.
NULL equ 0
;hardware led setting.
UPS_HARD_DARK EQU 0
UPS_HARD_RED EQU 2
UPS_HARD_GREEN EQU 1
UPS_HARD_AMBER EQU 3
;EBI II specified led setting.
UPS_EBI_DARK EQU 0
UPS_EBI_RED EQU 1
UPS_EBI_GREEN EQU 2
UPS_EBI_AMBER EQU 3
REGIONAL_CACHE_CONTROL_ENABLED EQU 1 ;Cache control flag.
CACHE_CONTROL_GRANULARITY EQU 100000H;Current granularity is 1MB
EBI2_MEM_ENTRY EQU 16 ;This is the entry number for
;EBI II memory in the MMIO
;Table. 0 based table.
EBI2_MEM_LENGTH EQU 400H ;1KB of RAM
VALID_GRAPH_MODES EQU 2 ;highest graph mode setting
FP_HISTOGRAM EQU 0H ;currently definied Front
FP_STATUS EQU 1H ;panel Graph Modes.
FP_OVERRIDE EQU 2H ;
IRQ_0 EQU 0 ;PIC #1 (Master)
IRQ_1 EQU 1 ;PIC #1 (Master)
IRQ_2 EQU 2 ;Inaccessable in cascaded PIC system
IRQ_3 EQU 3 ;PIC #1 (Master)
IRQ_4 EQU 4 ;PIC #1 (Master)
IRQ_5 EQU 5 ;PIC #1 (Master)
IRQ_6 EQU 6 ;PIC #1 (Master)
IRQ_7 EQU 7 ;PIC #1 (Master)
IRQ_8 EQU 8 ;PIC #2 (1st slave)
IRQ_9 EQU 9 ;PIC #2 (1st slave)
IRQ_10 EQU 10 ;PIC #2 (1st slave)
IRQ_11 EQU 11 ;PIC #2 (1st slave)
IRQ_12 EQU 12 ;PIC #2 (1st slave)
IRQ_13 EQU 13 ;PIC #2 (1st slave)
IRQ_14 EQU 14 ;PIC #2 (1st slave)
IRQ_15 EQU 15 ;PIC #2 (1st slave)
IRQ_16 EQU 16 ;Unused.
IRQ_17 EQU 17 ;Unused.
IRQ_18 EQU 18 ;Unused.
IRQ_19 EQU 19 ;Unused.
IRQ_20 EQU 20 ;Unused.
IRQ_21 EQU 21 ;Unused.
IRQ_22 EQU 22 ;Unused.
IRQ_23 EQU 23 ;Unused.
IRQ_24 EQU 24 ;SPI (See below)
IRQ_25 EQU 25 ;LSI (See below)
IRQ_26 EQU 26 ;IPI (See below)
IRQ_27 EQU 27 ;Unused.
IRQ_28 EQU 28 ;Unused.
IRQ_29 EQU 29 ;Unused.
IRQ_30 EQU 30 ;Unused.
IRQ_31 EQU 31 ;Unused.
IRQ_SPI EQU IRQ_24
IRQ_LSI EQU IRQ_25
IRQ_IPI EQU IRQ_26
NUM_POWER_SUPPLIES_SUPPORTED EQU 2 ;Current # of power supplies
;supported on a Manhattan.
PS_0_OK EQU BIT_6 ;Power supply 0 OK
PS_1_OK EQU BIT_7 ;Power Supply 1 OK
PS_0_INSTALLED EQU BIT_8 ;Power Supply 0 Installed
PS_1_INSTALLED EQU BIT_9 ;Power Supply 1 Installed.
;BIT definitions for the EBI_SEM, a semaphore dword to control
;access to EBI II multi-threadable functions.
SEM_EnableRAMCache EQU 1 ;bit 1 of EBI_SEM
SEM_DisableRAMCache EQU 2
SEM_FlushRAMCache EQU 3
SEM_LogProcIdle EQU 4
SEM_LogProcBusy EQU 5
SEM_GetPanellAttnSwitch EQU 6
SEM_GetPanelOffSwitch EQU 7
SEM_GetNMISource EQU 8
SEM_NonMaskableIntEOI EQU 9
SEM_GetSPISource EQU 10
SEM_MaskableIntEOI EQU 11
SEM_GetLocalIRQStatus EQU 12
SEM_GetGLobalIRQStatus EQU 13
;*****************************************************************************
; Declare Structure Templates
;*****************************************************************************
;
;Interrupt Mask Info.
;
EBI2maskInfo struc
numPorts dd 0
flags dd 0
portAddress0 dd 0
portAddress1 dd 0
portAddress2 dd 0
portAddress3 dd 0
reserved0 dd 0
reserved1 dd 0
EBI2maskInfo ends
EBI2_Mstruc struc
FP_GraphMode DD ? ;Front Panel Graph Mode
FP_IntMode DD ? ;Front Panel Interrupt Mode
IntSubSysMode DD ? ;Interrupt subsystem mode
SMEARRegister DD ? ;storage for SMEAR
IRQ0_Vector DD ? ;Vector number for IRQ0-7
IRQ8_Vector DD ? ;and IRQ8-15
EBI_SEM DD ? ;Semaphor for Multi-threadable
;functions.
EBI_2TEMP DD ? ;temporary location for debug
CPU_Activity DB ? ;CPU Activity value.
SimPowerFail DB ? ;Set if we are simulate a PFI
EBI2_Mstruc ends
parm_list struc
ebp_reg dd ? ;EBP register
ret_addr_off dd ? ;32 bit function return add.
MMIOPtr dd ? ;MMIOPtr
parm1dd dd ? ;1st 32 bit parameter
parm2dd dd ? ;2nd 32 bit parameter
parm3dd dd ? ;3RD 32 bit parameter
parm4dd dd ? ;4th 32 bit parameter
parm_list ends
;real mode parameter list.
RMparm_list struc
RMebp_reg dw ? ;EBP register
RMret_addr dd ? ;32 bit function return add.
RMparm1 dd ? ;1st 32 bit parameter
RMparm2 dd ? ;2nd 32 bit parameter
RMparm_list ends
procConfigData struc
processorStatus db ?
processorType db ?
coprocessorType db ?
serialNum DD ?
boardRev db ?
board_Type db ?
manufacturing_1 DB ?
manufacturing_2 DB ?
manufacturing_3 DB ?
manufacturing_4 DB ?
manufacturing_5 DB ?
manufacturing_6 DB ?
manufacturing_7 DB ?
manufacturing_8 DB ?
board_Info_1 DB ?
board_Info_2 DB ?
board_Info_3 DB ?
board_Info_4 DB ?
board_Info_5 DB ?
board_Info_6 DB ?
board_Info_7 DB ?
board_Info_8 DB ?
board_Info_9 DB ?
board_Info_10 DB ?
board_Info_11 DB ?
board_Info_12 DB ?
board_Info_13 DB ?
board_Info_14 DB ?
board_Info_15 DB ?
board_Info_16 DB ?
board_Info_17 DB ?
board_Info_18 DB ?
board_Info_19 DB ?
board_Info_20 DB ?
slotNumber DD ?
procConfigData ends
SIZE_OF_MEMDESCE EQU 4 ;number of DD entries in MemDescEntry
SIZE_OF_MMIO_TE EQU 4 ;number of DD in MMIO_Table_Entry
MMIO_Table_Entry struc
slot_add_low DD ? ;physical slot address, lower 32 bits
slot_add_high DD ? ;physical slot address, upper 32 bits
slot_length DD ? ;length of address space required
slot_reserved DD ? ;reserved
MMIO_Table_Entry ends
memBankInfo struc
bankStartAddr_low DD ?
bankStartAddr_high DD ?
bankSize DD ?
bankECCSoftErrors DD ?
bankECCHardErrors DD ?
memBankInfoReserved DD ?
memBankInfo ends
memBoardInfo struc
attributes DD ?
numBanks DD ?
slotNum DD ?
mBI_Reserved DD ?
memBoardInfo ends
memoryErrorInfo struc
mEI_StartAddr_low DD ?
mEI_StartAddr_high DD ?
mEI_Length DD ? ;Length of block containing error.
mEI_Count DD ? ;Number of errors in this block
mEI_memErrFlags DD ? ;Additional info.
mEI_slotNumber DD ? ;Physical slot number of board
mEI_moduleNumber DD ? ;Module on board experiencing error.
memoryErrorInfo ends
cacheContInfo struc
cCI_Flags DD ? ;type of regional cache control
;available by this hardware
cCI_Granularity DD ? ;Granularity of control region
cCI_Reserved DD ? ; ???NULL???
cacheContInfo ends
PhysicalAddress struc
PhsyAddrLow DD ? ;Lower 32 bits of a 64 Bit
;physical address
PhsyAddrHi DD ? ;Upper 32 bits of a 64 bit
;physical address.
PhysicalAddress ends
OEM0ParmPacket Struc
OEM0_subfunc DD ?
OEM0_parm1dd DD ?
OEM0_parm2dd DD ?
OEM0_parm3dd DD ?
OEM0_parm4dd DD ?
OEM0ParmPacket ends
revisionCode struc
major db ? ;revision number of
minor db ? ;EBI II in accordance with
ZZ db ? ;AST Revision number specification.
revisionCode ends
powerSupplyInfo struc
present DD ? ;1 - Supply installed,
;0 - not present
onLine DD ? ;1- Supply providing nominal
;power, 0 - no power
PSI_Reserved DD ? ;AST reserved.
powerSupplyInfo ends
;*****************************************************************************
; Declare Macros
;*****************************************************************************
;*****************************************************************************
; Macro: ProcTable_To_ESI
;*****************************************************************************
; We need to determine the offset to the begining of proc table.
; It is a requirement for DS and SS to be the same becuase we are
; running in a flat model addressing system.
;
; we need to determine the current address.
; we need to determine the difference between the current
; address and the begining of ProcTable. Keep in mind ProcTable
; is in a different segment.
; Then we subtract the difference from the current address and
; we have an offset that is pointing to the begining of ProcTable.
;
; Inputs : name of a near label
;
; Outputs : ESI will point to the begining of ProcTableLen
;
;
; Register Usage : ESI
;
;-----------------------------------------------------------------------------
ProcTable_To_ESI MACRO
LOCAL current_add
call current_add
current_add:
pop esi ;esi contains the address of the
;current instruciton.
push eax
mov eax,offset current_add
sub eax,offset ProcTableLen ;eax contains the difference between
;our address and begining of PorcTableLen
sub esi,eax ;esi is pointing to start of ProcTableLen
pop eax
;sub esi,(offset addres- offset ProcTableLen) ;this does not work.
ENDM
;*****************************************************************************
; Macro: MemDesc_To_ESI
;*****************************************************************************
; We need to determine the offset to the begining of Memory Description table.
; It is a requirement for DS and SS to be the same becuase we are
; running in a flat model addressing system.
;
; we need to determine the current address.
; we need to determine the difference between the current
; address and the begining of MemDescTable. Keep in mind MemDescTable
; is in a different segment.
; Then we subtract the difference from the current address and
; we have an offset that is pointing to the begining of MemDescLen
;
; Inputs : name of a near label
;
; Outputs : ESI will point to the begining of MemDescLen
;
;
; Register Usage : ESI
;
;-----------------------------------------------------------------------------
MemDesc_To_ESI MACRO
LOCAL MemDesc_add
call MemDesc_add
MemDesc_add:
pop esi ;esi contains the address of the
;current instruciton.
push eax
mov eax,offset MemDesc_add
sub eax,offset MemDescLen ;eax contains the difference between
;our address and begining of MemDescLen
sub esi,eax ;esi is pointing to start of MemDescLen
pop eax
ENDM
;*****************************************************************************
; Macro: MemDesc_To_SI_16
;*****************************************************************************
;
; Only in Real Mode or 16 bit protected mode.
;
; We need to determine the offset to the begining of Memory Description table.
; It is a requirement for DS and SS to be the same becuase we are
; running in a flat model addressing system.
;
; we need to determine the current address.
; we need to determine the difference between the current
; address and the begining of MemDescTable. Keep in mind MemDescTable
; is in a different segment.
; Then we subtract the difference from the current address and
; we have an offset that is pointing to the begining of MemDescLen
;
; Inputs : name of a near label
;
; Outputs : SI will point to the begining of MemDescLen
;
;
; Register Usage : SI
;
;-----------------------------------------------------------------------------
MemDesc_To_SI_16 MACRO
LOCAL MemDesc_add_16
call MemDesc_add_16
MemDesc_add_16:
pop si ;si contains the address of the
;current instruciton.
push eax
mov eax,offset MemDesc_add_16
sub eax,offset MemDescLen ;ax contains the difference between
;our address and begining of MemDescLen
sub si,ax ;si is pointing to start of MemDescLen
pop eax
ENDM
;*****************************************************************************
; Macro: MemTable_To_ESI
;*****************************************************************************
; We need to determine the offset to the begining of Memoryc table.
; It is a requirement for DS and SS to be the same becuase we are
; running in a flat model addressing system.
;
; we need to determine the current address.
; we need to determine the difference between the current
; address and the begining of MemTable. Keep in mind MemTable
; is in a different segment.
; Then we subtract the difference from the current address and
; we have an offset that is pointing to the begining of MemTable.
;
; Inputs : name of a near label
;
; Outputs : ESI will point to the begining of MemTableLen
;
;
; Register Usage : ESI
;
;-----------------------------------------------------------------------------
MemTable_To_ESI MACRO
LOCAL MemTable_add
call MemTable_add
MemTable_add:
pop esi ;esi contains the address of the
;current instruciton.
push eax
mov eax,offset MemTable_add
sub eax,offset MemTableLen ;eax contains the difference between
;our address and begining of MemTableLen
sub esi,eax ;esi is pointing to start of MemTableLen
pop eax
ENDM
MemTable_To_EDI MACRO
LOCAL MemTable_add_edi
call MemTable_add_edi
MemTable_add_edi:
pop edi ;edi contains the address of the
;current instruciton.
push eax
mov eax,offset MemTable_add_edi
sub eax,offset MemTableLen ;eax contains the difference between
;our address and begining of MemTableLen
sub edi,eax ;edi is pointing to start of MemTableLen
pop eax
ENDM
;*****************************************************************************
; Macro: MMIO_Table_To_ESI
;*****************************************************************************
; We need to determine the offset to the begining of MMIO_Table
; It is a requirement for DS and SS to be the same becuase we are
; running in a flat model addressing system.
;
; we need to determine the current address.
; we need to determine the difference between the current
; address and the begining of MMIO_Table. Keep in mind MMIO_Table
; is in a different segment.
; Then we subtract the difference from the current address and
; we have an offset that is pointing to the begining of MMIO_TableLen.
;
; Inputs : name of a near label
;
; Outputs : ESI will point to the begining of MMIO_TableLen
;
;
; Register Usage : ESI
;
;-----------------------------------------------------------------------------
MMIOTable_To_ESI MACRO
LOCAL MMIOTable_add
call MMIOTable_add
MMIOTable_add:
pop esi ;esi contains the address of the
;current instruciton.
push eax
mov eax,offset MMIOTable_add
sub eax,offset MMIO_TableLen ;eax contains the difference between
;our address and begining of MMIO_TableLen
sub esi,eax ;esi is pointing to start of MMIO_TableLen
pop eax
ENDM
;*****************************************************************************
; Macro: OEM0_SubFuncStart_To_ESI
;*****************************************************************************
;
;-----------------------------------------------------------------------------
OEM0_SubFuncStart_To_ESI MACRO
LOCAL OEM0_SubFuncStart_add
call OEM0_SubFuncStart_add
OEM0_SubFuncStart_add:
pop esi ;esi contains the address of the
;current instruciton.
push eax
mov eax,offset OEM0_SubFuncStart_add
sub eax,offset OEM0_SubFuncLen
;eax contains the difference between
;our address and begining of OEM0_SubFuncLen
sub esi,eax ;esi is pointing to start of OEM0_SubFuncLen
pop eax
ENDM
;*****************************************************************************
; Macro: BaseofROM_To_ESI
;*****************************************************************************
;
;-----------------------------------------------------------------------------
BaseofROM_To_ESI MACRO
LOCAL BaseofROM_add
call BaseofROM_add
BaseofROM_add:
pop esi ;esi contains the address of the
;current instruciton.
sub esi,offset BaseofROM_add;esi contains the virtual address
;to base of ROM.
ENDM
;*****************************************************************************
; Macro: ESI_MMIO_NUM_SLOT
;*****************************************************************************
;
; The following Macro will determine the virtual memory mapped I/O address
; for a certain slot number.
; The slot number is passed in EAX, and the virtual address is returned
; in ESI.
;
; Inputs : EBP.parm_list.MMIOPTR
; EAX slot number.
;
; Outputs : ESI will contain the virtual memory mapped I/O address for
; the specificed slot.
;
; Register Usage : ESI and EAX
;
; NOTE : For future enhancements or requirements, this macro should
; only use ESI and EAX and NO OTHER REGISTERS.
;
;
;-----------------------------------------------------------------------------
ESI_MMIO_NUM_SLOT MACRO
;Since MMIOPtr passed by the EBI II caller is a pointer to a
;table containing the virtual address created by the OS for
;the Manhattan memory mapped I/O address space.
;
;The first entry in the table is the virtual address for the
;global (IOSM) MM I/O virtual address.
;setup ESI to point to the MM IO Table provide to us by the
;EBI II caller.
mov esi, dword ptr [ebp.parm_list.MMIOPtr]
;eax is now the offset in to the MM IO Table to the virtual
;address of memory mapped I/O for this slot.
;update ESI to containing the virtual address of the memory
;mapped I/O for the callers slot.
mov esi,[esi][eax*4]
ENDM
;*****************************************************************************
; Macro: ESI_MMIO_CURR_SLOT
;*****************************************************************************
;
; The following Macro will determine the current CPU slot memory
; mapped I/O address. This value will be returned in ESI.
;
;
; Inputs : EBP.parm_list.MMIOPTR
;
; Outputs : ESI will point to the begining of the current slots
; MM I/O address
;
;
; Register Usage : ESI and EAX
;
; NOTE : For future enhancements or requirements, this macro should
; only use ESI and EAX and NO OTHER REGISTERS.
;
;
;-----------------------------------------------------------------------------
ESI_MMIO_CURR_SLOT MACRO
;Since MMIOPtr passed by the EBI II caller is a pointer to a
;table containing the virtual address created by the OS for
;the Manhattan memory mapped I/O address space.
;
;The first entry in the table is the virtual address for the
;global (IOSM) MM I/O virtual address.
;setup ESI to point to the MM IO Table provide to us by the
;EBI II caller.
push eax ;save eax
mov esi, dword ptr [ebp.parm_list.MMIOPtr]
;get the first entry from the table, which is the virtual address
;for the global MM IO address space, also known as Slot 0
mov eax, [esi]
;determine the caller SLOT number.
mov al, byte ptr [eax].G_SlotID
NOT al ;invert it back to 1 based.
and al,0FH ;clear upper nibble.
;clear the upper 24 bits of eax.
and eax,0ffH
;eax is now the offset in to the MM IO Table to the virtual
;address of memory mapped I/O for this slot.
;update ESI to containing the virtual address of the memory
;mapped I/O for the callers slot.
mov esi,[esi][eax*4]
pop eax
ENDM
;*****************************************************************************
; Macro: ESI_MMIO_GLOBAL
;*****************************************************************************
;
; The following Macro will determine the Global memory
; mapped I/O address. This value will be returned in ESI.
;
;
; Inputs : EBP.parm_list.MMIOPTR
;
; Outputs : ESI will point to the begining of the Global memory
; mapped I/O address
;
;
; Register Usage : ESI
;
; NOTE : For future enhancements or requirements, this macro should
; only use ESI and NO OTHER REGISTERS.
;
;-----------------------------------------------------------------------------
ESI_MMIO_GLOBAL MACRO
;Since MMIOPtr passed by the EBI II caller is a pointer to a
;table containing the virtual address created by the OS for
;the Manhattan memory mapped I/O address space.
;
;The first entry in the table is the virtual address for the
;global (IOSM) MM I/O virtual address.
;setup ESI to point to the MM IO Table provide to us by the
;EBI II caller.
mov esi, dword ptr [ebp.parm_list.MMIOPtr]
;get the first entry from the table, which is the virtual address
;for the global MM IO address space, also known as Slot 0
mov esi, [esi]
ENDM
;*****************************************************************************
; Macro: ESI_EBI_MEM_ADD
;*****************************************************************************
;
; The following Macro will determine the virtual memory mapped I/O address
; for the memory reserved for EBI II.
;
; Inputs : EBP.parm_list.MMIOPTR
;
; Outputs : ESI will contain the virtual memory mapped I/O address for
; the memory reserved for EBI II.
;
; Register Usage : ESI
;
; NOTE : For future enhancements or requirements, this macro should
; only use ESI NO OTHER REGISTERS.
;
;
;-----------------------------------------------------------------------------
ESI_EBI_MEM_ADD MACRO
;Since MMIOPtr passed by the EBI II caller is a pointer to a
;table containing the virtual address created by the OS for
;the Manhattan memory mapped I/O address space.
;
;The first entry in the table is the virtual address for the
;global (IOSM) MM I/O virtual address.
;setup ESI to point to the MM IO Table provide to us by the
;EBI II caller.
mov esi, dword ptr [ebp.parm_list.MMIOPtr]
;eax is now the offset in to the MM IO Table to the virtual
;address of memory mapped I/O for this slot.
;update ESI to containing the virtual address of the memory
;mapped I/O for the memory reserved for EBI II.
mov esi,dword ptr [esi][EBI2_MEM_ENTRY*4]
ENDM
EDI_EBI_MEM_ADD MACRO
mov edi, dword ptr [ebp.parm_list.MMIOPtr]
;eax is now the offset in to the MM IO Table to the virtual
;address of memory mapped I/O for this slot.
;update ESI to containing the virtual address of the memory
;mapped I/O for the memory reserved for EBI II.
mov edi,dword ptr [edi][EBI2_MEM_ENTRY*4]
ENDM
;*****************************************************************************
; Macro: LOCK_SEMAPHORE
;*****************************************************************************
;
;-----------------------------------------------------------------------------
LOCK_SEMAPHORE MACRO SEM_NUM
LOCAL LS_CheckSem,LS_QuickCheck,LS_ProbableSucess
LOCAL LS_Sucess
push esi ;save esi
ESI_EBI_MEM_ADD ;point esi to EBI II memory space.
LS_CheckSem:
lock bts dword ptr [esi].EBI2_Mstruc.EBI_SEM,SEM_NUM
jnc LS_Sucess ;the semaphore was previously not set
;Some one has already locked this semaphore, do a quick check
;hoping for it to free, if we time out then we return with the
;carry set and an error code in eax.
push ecx
mov ecx, NEGONE
LS_QuickCheck:
bt dword ptr [esi].EBI2_Mstruc.EBI_SEM,SEM_NUM
jnc LS_ProbableSucess ;it must have clear, make sure it is so
loop LS_QuickCheck ;do another quick check, until ecx is 0
;we must have timeout, in order to prevent a dead lock
;return an error code.
pop ecx
mov eax, ERR_MULTI_TIME_OUT
stc ;set the carry indicating a problem with the macro
jmp LS_Sucess ;exit macro.
LS_ProbableSucess:
;the Semaphore seems to have cleared, but we need to make
;sure by doing a lock bts
pop ecx
jmp LS_CheckSem
LS_Sucess:
pop esi
ENDM
;*****************************************************************************
; Macro: UNLOCK_SEMAPHORE
;*****************************************************************************
;
;-----------------------------------------------------------------------------
UNLOCK_SEMAPHORE MACRO UN_SEM_NUM
push esi ;save esi
ESI_EBI_MEM_ADD ;point esi to EBI II memory space.
;clear the semaphore in question.
LOCK btr dword ptr [esi].EBI2_Mstruc.EBI_SEM,UN_SEM_NUM
pop esi
ENDM
;*****************************************************************************
; Macro: IODELAY
;*****************************************************************************
IODELAY MACRO
jmp Short $+2
jmp Short $+2
jmp Short $+2
jmp Short $+2
ENDM