summaryrefslogtreecommitdiffstats
path: root/private/ntos/nthals/halcbus/i386/cbus.inc
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/nthals/halcbus/i386/cbus.inc')
-rw-r--r--private/ntos/nthals/halcbus/i386/cbus.inc277
1 files changed, 277 insertions, 0 deletions
diff --git a/private/ntos/nthals/halcbus/i386/cbus.inc b/private/ntos/nthals/halcbus/i386/cbus.inc
new file mode 100644
index 000000000..11484238e
--- /dev/null
+++ b/private/ntos/nthals/halcbus/i386/cbus.inc
@@ -0,0 +1,277 @@
+;++
+;
+; Copyright (c) 1992, 1993, 1994 Corollary Inc
+;
+; Module Name:
+;
+; cbus.inc
+;
+; Abstract:
+;
+; Corollary MP include file
+;
+; Author:
+;
+; Landy Wang (landy@corollary.com) 26-Mar-1992
+;--
+
+
+
+;*****************************
+;
+; Corollary MP defines
+;
+; this should be built from a C header file to minimize
+; the possiblity of falling out of sync.
+;
+;*****************************
+
+
+;
+; Well known virtual address of the task priority register
+;
+
+LOCALAPIC equ 0fffe0000h
+APIC equ ds:[LOCALAPIC]
+
+;
+; The SPURIOUS task priority varies depending on Cbus platform.
+; It is set when we initialize the platform and cannot be declared
+; here. APC and DPC vectors are the same for Cbus1 and Cbus2
+; so they can be inlined here.
+;
+
+APC_TASKPRI equ 01Fh ; Hardware priority of APCs
+DPC_TASKPRI equ 02Fh ; Hardware priority of DPCs
+
+CBUS2_LEVEL_TRIGGERED_INTERRUPT equ 1
+CBUS2_EDGE_TRIGGERED_INTERRUPT equ 2
+
+;
+; Here is the assembly version of the CBUS_NTHAL structure declared in cbus_nt.h
+;
+
+RequestIPI equ 000h
+HalRequestSWIntr equ 004h
+HalQueryPerformanceCounter equ 008h
+HalBootCPU equ 00ch
+
+HalInitializePlatform equ 010h
+HalInitializeCPU equ 014h
+EnableNonDeviceInterrupt equ 018h
+EnableDeviceInterrupt equ 01ch
+
+DisableInterrupt equ 020h
+LinkInterrupt equ 024h
+MapVector equ 028h
+ParseRRD equ 02ch
+
+ResolveNMI equ 030h
+HalInitInterrupts equ 034h
+HalResetAllOtherProcessors equ 038h
+HalInitOtherBuses equ 03ch
+
+HalSetTimeIncrement equ 040h
+HalTranslateAddress equ 044h
+
+;
+; The kernel leaves some space in the PCR for the HAL to use
+; as it needs. Currently this space is used for some efficiency in
+; some of the MP specific code and is highly implementation
+; dependent. this order MUST match the definitions in cbus_nt.h.
+;
+
+PcrE struc
+ PcrNumber dd 0 ; this CPU's logical CPU number
+ PcrBit dd 0 ; this CPU's logical bit number
+ PcrCSR dd 0 ; pointer to this CPU's CSR
+ PcrTaskpri dd 0 ; taskpri reg ptr
+ PcrBroadcast dd 0 ; interrupt everyone but this CPU
+ PcrAllOthers dd 0 ; all other CPUs but this one
+ PcrLEDOn dd 0 ; pointer to this CPU's LED ON
+ PcrLEDOff dd 0 ; pointer to this CPU's LED OFF
+ PcrTickOffset dd 0 ; nsec left before calling
+ ; KeUpdateRunTime on CPU1 or above
+PcrE ends
+
+;
+; Offsets of various registers needed for the context switch when
+; a system reboot is initiated by an additional processor.
+; the space for this array is declared in cbus.c - so bump it there
+; if you need more...
+;
+
+REBOOT_EIP equ 0
+REBOOT_ESP equ 4
+REBOOT_EBP equ 8
+REBOOT_EBX equ 12
+REBOOT_ESI equ 16
+REBOOT_EDI equ 20
+REBOOT_EFL equ 24
+REBOOT_CR3 equ 28
+
+
+;
+; ack the interrupt controller (CBC or APIC).
+;
+; we must derive the bus number so we know which bus' interrupt
+; controller to EOI for systems with multiple I/O busses.
+; so translate the vector to a bus/irqline pair for the EOI...
+;
+; WARNING: for the APIC, this will automatically lower the
+; internal priority register to the level it was prior to
+; receipt of the interrupt.
+;
+; the caller must initialize scratchreg to the interrupting vector.
+;
+
+CBUS_EOI macro reg1, reg2
+local fix_level
+local check_cpu
+local do_eoi
+local no_eoi
+ ;
+ ; reg1 holds the vector that originally interrupted execution,
+ ; now translate the vector to the correct bridge-based EOI address.
+ ;
+ cmp reg1, [_Cbus2ClockVector]
+ je short check_cpu
+ cmp [_Cbus2FixLevelInterrupts], 1
+ jne short do_eoi
+ ;
+ ; first check the polarity of the interrupt (ie. level or edge)
+ ; to determine whether the level-triggered interrupt hardware
+ ; work-around need be applied. need to ensure that no interrupts
+ ; occur while we're performing the workaround for the level-triggered
+ ; interrupt fix. the fix consists of clearing and resetting the
+ ; hardware interrupt map entry for this vector. this will cause
+ ; an internal latch in the CBC to be cleared. this problem will
+ ; be fixed with the PCIB, at which time, RRD will pass a bit in
+ ; the configuration table which will cause this code to no longer
+ ; be executed.
+ ;
+fix_level:
+ movzx reg2, byte ptr [_Cbus2InterruptPolarity + reg1]
+ cmp reg2, CBUS2_LEVEL_TRIGGERED_INTERRUPT
+ jne short do_eoi
+ mov reg2, dword ptr [_CbusVectorToEoi+4*reg1]
+ sub reg2, [_Cbus2EoiToHwmap]
+ mov reg1, dword ptr [_CbusVectorToHwmap+4*reg1]
+ pushfd
+ cli
+ mov dword ptr [reg2], 0
+ mov dword ptr [reg2], reg1 ; must _write_ EOI
+ popfd
+ jmp short no_eoi
+check_cpu:
+ ;
+ ; on C-bus II, the clock interrupt must only be EOI'd by
+ ; a single CPU. make it the boot CPU so that this code
+ ; will work when only 1 CPU is present.
+ ;
+ cmp dword ptr PCR[PcHal.PcrNumber], 0
+ jne short no_eoi
+ cmp [_Cbus2FixLevelInterrupts], 1
+ je short fix_level
+do_eoi:
+ mov reg2, dword ptr [_CbusVectorToEoi+4*reg1]
+ mov dword ptr dword ptr [reg2], reg1 ; must _write_ EOI
+no_eoi:
+endm
+
+POKE_LEDS macro reg1, reg2
+local ledset
+ mov reg1, PCR[PcPrcb] ; point at Prcb
+ mov reg2, [reg1].PbCurrentThread ; Current thread
+ cmp reg2, [reg1].PbIdleThread ; Idle Thread
+ je short @f
+
+ mov reg1, PCR[PcHal.PcrLEDOn] ; get my LED ON address
+ mov dword ptr [reg1], 1 ; set it
+ jmp short ledset
+
+@@:
+ mov reg1, PCR[PcHal.PcrLEDOff] ; get my LED OFF address
+ mov dword ptr [reg1], 0 ; set it
+ledset:
+ endm
+
+;
+; Declare all the externs that most of our MASM code will be using
+;
+
+ extrn _CbusLocalApic: DWORD
+ extrn _CbusApicRedirPort: DWORD
+ extrn _CbusIOApic: DWORD
+
+ extrn _ProfileVector: DWORD
+
+ ;
+ ; vectors used to communicate reboot and redirection table requested
+ ; changes to the boot processor. also the global interprocessor ; interrupt vector that any processor can use to interrupt any other
+ ; processor(s).
+ ;
+ extrn _CbusIpiVector: DWORD
+ extrn _CbusRebootVector: DWORD
+ extrn _CbusRedirVector: DWORD
+
+ extrn _CbusClockVector: DWORD
+ extrn _CbusQueryPerformanceCounter: DWORD
+ extrn _CbusVectorToIrql: DWORD
+ extrn _CbusIrqlToVector: DWORD
+ extrn _CbusBackend: DWORD
+ extrn _CbusRequestIPI: DWORD
+ extrn _CbusRequestSoftwareInterrupt: DWORD
+ extrn _CbusProcessorMask: DWORD
+ extrn _CbusBootedProcessors: DWORD
+ extrn _CbusRebootRegs: DWORD
+
+ extrn _Cbus2BridgesFound: DWORD
+ extrn _Cbus2SendIPI: DWORD
+ extrn _Cbus2Poke8042: DWORD
+ extrn _Cbus2IrqlToCbus2Addr: DWORD
+ extrn _Cbus2FixLevelInterrupts: DWORD
+ extrn _Cbus2CheckSpuriousClock: DWORD
+ extrn _Cbus2EnableBroadcast: DWORD
+ extrn _Cbus2ClockVector: DWORD
+ extrn _Cbus2InterruptPolarity: DWORD
+ extrn _Cbus2EoiToHwmap: DWORD
+ extrn _CbusTimeStamp: DWORD
+ extrn _Cbus2TimeStamp0: DWORD
+ extrn _CbusVectorToEoi: DWORD
+ extrn _CbusVectorToHwmap: DWORD
+ extrn _CbusProcessors: DWORD
+
+ extrn _HalpFindFirstSetRight: BYTE
+ extrn _Halp8254Lock: DWORD
+ extrn _MppIDT: DWORD
+ extrn _MpLowStub: DWORD
+ extrn _MpLowStubPhysicalAddress: DWORD
+ extrn _MpCount: DWORD
+
+;
+; Declare all the functions that our MASM code will be calling
+;
+
+ EXTRNP _DbgBreakPoint,0,IMPORT
+
+ EXTRNP _HalEnableSystemInterrupt, 3
+ EXTRNP _HalDisableSystemInterrupt, 2
+ EXTRNP _HalpAcquireCmosSpinLock, 0
+ EXTRNP _HalpReleaseCmosSpinLock, 0
+
+ EXTRNP _KeBugCheck,1,IMPORT
+ EXTRNP _KeSetTimeIncrement,2,IMPORT
+ EXTRNP _KeUpdateRunTime,1,IMPORT
+ EXTRNP _KeUpdateSystemTime,0
+ EXTRNP Kei386EoiHelper,0,IMPORT
+
+ EXTRNP _KiIpiServiceRoutine,2,IMPORT
+ EXTRNP _KiDeliverApc,3,IMPORT
+ EXTRNP _KiDispatchInterrupt,0,IMPORT
+
+ EXTRNP _ExAllocatePool,2,IMPORT
+
+ EXTRNP _HalpBuildTiledCR3,1
+ EXTRNP _HalpFreeTiledCR3,0
+ EXTRNP _HalpProfileInterrupt2ndEntry,0