9 #define REGISTERCALL FASTCALL
11 #define REGISTERCALL __attribute__((regparm(3)))
14 typedef struct _HAL_BIOS_FRAME
21 PKTRAP_FRAME TrapFrame
;
29 } HAL_BIOS_FRAME
, *PHAL_BIOS_FRAME
;
33 (*PHAL_SW_INTERRUPT_HANDLER
)(
40 (FASTCALL
*PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY
)(
41 IN PKTRAP_FRAME TrapFrame
44 #define HAL_APC_REQUEST 0
45 #define HAL_DPC_REQUEST 1
47 /* CMOS Registers and Ports */
48 #define CMOS_CONTROL_PORT (PUCHAR)0x70
49 #define CMOS_DATA_PORT (PUCHAR)0x71
50 #define RTC_REGISTER_A 0x0A
51 #define RTC_REGISTER_B 0x0B
52 #define RTC_REG_A_UIP 0x80
53 #define RTC_REGISTER_CENTURY 0x32
56 #define IDT_REGISTERED 0x01
57 #define IDT_LATCHED 0x02
58 #define IDT_READ_ONLY 0x04
59 #define IDT_INTERNAL 0x11
60 #define IDT_DEVICE 0x21
62 /* Conversion functions */
63 #define BCD_INT(bcd) \
64 (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
65 #define INT_BCD(int) \
66 (UCHAR)(((int / 10) << 4) + (int % 10))
71 #define VIDEO_SERVICES 0x10
74 // Operations for INT 10h (in AH)
76 #define SET_VIDEO_MODE 0x00
79 // Video Modes for INT10h AH=00 (in AL)
81 #define GRAPHICS_MODE_12 0x12 /* 80x30 8x16 640x480 16/256K */
84 // Commonly stated as being 1.19318MHz
86 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
89 // However, the true value is closer to 1.19318181[...]81MHz since this is 1/3rd
90 // of the NTSC color subcarrier frequency which runs at 3.57954545[...]45MHz.
92 // Note that Windows uses 1.193167MHz which seems to have no basis. However, if
93 // one takes the NTSC color subcarrier frequency as being 3.579545 (trimming the
94 // infinite series) and divides it by three, one obtains 1.19318167.
96 // It may be that the original NT HAL source code introduced a typo and turned
97 // 119318167 into 1193167 by ommitting the "18". This is very plausible as the
98 // number is quite long.
100 #define PIT_FREQUENCY 1193182
103 // These ports are controlled by the i8254 Programmable Interrupt Timer (PIT)
105 #define TIMER_CHANNEL0_DATA_PORT 0x40
106 #define TIMER_CHANNEL1_DATA_PORT 0x41
107 #define TIMER_CHANNEL2_DATA_PORT 0x42
108 #define TIMER_CONTROL_PORT 0x43
111 // Mode 0 - Interrupt On Terminal Count
112 // Mode 1 - Hardware Re-triggerable One-Shot
113 // Mode 2 - Rate Generator
114 // Mode 3 - Square Wave Generator
115 // Mode 4 - Software Triggered Strobe
116 // Mode 5 - Hardware Triggered Strobe
118 typedef enum _TIMER_OPERATING_MODES
126 PitOperatingMode2Reserved
,
127 PitOperatingMode5Reserved
128 } TIMER_OPERATING_MODES
;
130 typedef enum _TIMER_ACCESS_MODES
132 PitAccessModeCounterLatch
,
136 } TIMER_ACCESS_MODES
;
138 typedef enum _TIMER_CHANNELS
146 typedef union _TIMER_CONTROL_PORT_REGISTER
151 TIMER_OPERATING_MODES OperatingMode
:3;
152 TIMER_ACCESS_MODES AccessMode
:2;
153 TIMER_CHANNELS Channel
:2;
156 } TIMER_CONTROL_PORT_REGISTER
, *PTIMER_CONTROL_PORT_REGISTER
;
159 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
162 // This port is controled by the i8255 Programmable Peripheral Interface (PPI)
164 #define SYSTEM_CONTROL_PORT_A 0x92
165 #define SYSTEM_CONTROL_PORT_B 0x61
166 typedef union _SYSTEM_CONTROL_PORT_B_REGISTER
170 UCHAR Timer2GateToSpeaker
:1;
171 UCHAR SpeakerDataEnable
:1;
172 UCHAR ParityCheckEnable
:1;
173 UCHAR ChannelCheckEnable
:1;
174 UCHAR RefreshRequest
:1;
175 UCHAR Timer2Output
:1;
176 UCHAR ChannelCheck
:1;
180 } SYSTEM_CONTROL_PORT_B_REGISTER
, *PSYSTEM_CONTROL_PORT_B_REGISTER
;
183 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
186 // These ports are controlled by the i8259 Programmable Interrupt Controller (PIC)
188 #define PIC1_CONTROL_PORT 0x20
189 #define PIC1_DATA_PORT 0x21
190 #define PIC2_CONTROL_PORT 0xA0
191 #define PIC2_DATA_PORT 0xA1
194 // Definitions for ICW/OCW Bits
196 typedef enum _I8259_ICW1_OPERATING_MODE
200 } I8259_ICW1_OPERATING_MODE
;
202 typedef enum _I8259_ICW1_INTERRUPT_MODE
206 } I8259_ICW1_INTERRUPT_MODE
;
208 typedef enum _I8259_ICW1_INTERVAL
212 } I8259_ICW1_INTERVAL
;
214 typedef enum _I8259_ICW4_SYSTEM_MODE
218 } I8259_ICW4_SYSTEM_MODE
;
220 typedef enum _I8259_ICW4_EOI_MODE
224 } I8259_ICW4_EOI_MODE
;
226 typedef enum _I8259_ICW4_BUFFERED_MODE
232 } I8259_ICW4_BUFFERED_MODE
;
234 typedef enum _I8259_READ_REQUEST
240 } I8259_READ_REQUEST
;
242 typedef enum _I8259_EOI_MODE
255 // Definitions for ICW Registers
257 typedef union _I8259_ICW1
262 I8259_ICW1_OPERATING_MODE OperatingMode
:1;
263 I8259_ICW1_INTERVAL Interval
:1;
264 I8259_ICW1_INTERRUPT_MODE InterruptMode
:1;
266 UCHAR InterruptVectorAddress
:3;
269 } I8259_ICW1
, *PI8259_ICW1
;
271 typedef union _I8259_ICW2
276 UCHAR InterruptVector
:5;
279 } I8259_ICW2
, *PI8259_ICW2
;
281 typedef union _I8259_ICW3
303 } I8259_ICW3
, *PI8259_ICW3
;
305 typedef union _I8259_ICW4
309 I8259_ICW4_SYSTEM_MODE SystemMode
:1;
310 I8259_ICW4_EOI_MODE EoiMode
:1;
311 I8259_ICW4_BUFFERED_MODE BufferedMode
:2;
312 UCHAR SpecialFullyNestedMode
:1;
316 } I8259_ICW4
, *PI8259_ICW4
;
318 typedef union _I8259_OCW2
324 I8259_EOI_MODE EoiMode
:3;
327 } I8259_OCW2
, *PI8259_OCW2
;
329 typedef union _I8259_OCW3
333 I8259_READ_REQUEST ReadRequest
:2;
337 UCHAR SpecialMaskMode
:2;
341 } I8259_OCW3
, *PI8259_OCW3
;
343 typedef union _I8259_ISR
360 } I8259_ISR
, *PI8259_ISR
;
362 typedef I8259_ISR I8259_IDR
, *PI8259_IDR
;
365 // See EISA System Architecture 2nd Edition (Tom Shanley, Don Anderson, John Swindle)
368 // These ports are controlled by the i8259A Programmable Interrupt Controller (PIC)
370 #define EISA_ELCR_MASTER 0x4D0
371 #define EISA_ELCR_SLAVE 0x4D1
373 typedef union _EISA_ELCR
401 } EISA_ELCR
, *PEISA_ELCR
;
403 typedef struct _PIC_MASK
414 } PIC_MASK
, *PPIC_MASK
;
418 ( REGISTERCALL
*PHAL_DISMISS_INTERRUPT
)(
426 HalpDismissIrqGeneric(
466 HalpDismissIrq15Level(
474 HalpDismissIrq13Level(
482 HalpDismissIrq07Level(
489 HalpHardwareInterruptLevel(
496 #define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)
497 #define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)
498 #define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
503 #define HALP_CARD_FEATURE_FULL_DECODE 0x0001
508 #define HALP_CHECK_CARD_REVISION_ID 0x10000
509 #define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000
510 #define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
513 // Mm PTE/PDE to Hal PTE/PDE
515 #define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)
516 #define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
518 typedef struct _IDTUsageFlags
526 UCHAR BusReleativeVector
;
529 typedef struct _HalAddressUsage
531 struct _HalAddressUsage
*Next
;
532 CM_RESOURCE_TYPE Type
;
539 } ADDRESS_USAGE
, *PADDRESS_USAGE
;
542 PADAPTER_OBJECT NTAPI
HalpAllocateAdapterEx(ULONG NumberOfMapRegisters
,BOOLEAN IsMaster
, BOOLEAN Dma32BitAddresses
);
547 HalpRegisterVector(IN UCHAR Flags
,
549 IN ULONG SystemVector
,
554 HalpEnableInterruptHandler(IN UCHAR Flags
,
556 IN ULONG SystemVector
,
559 IN KINTERRUPT_MODE Mode
);
562 VOID NTAPI
HalpInitializePICs(IN BOOLEAN EnableInterrupts
);
563 VOID
HalpApcInterrupt(VOID
);
564 VOID
HalpDispatchInterrupt(VOID
);
565 VOID
HalpDispatchInterrupt2(VOID
);
566 DECLSPEC_NORETURN VOID FASTCALL
HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
567 DECLSPEC_NORETURN VOID FASTCALL
HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
570 VOID NTAPI
HalpInitializeClock(VOID
);
571 VOID
HalpClockInterrupt(VOID
);
572 VOID
HalpProfileInterrupt(VOID
);
576 HalpCalibrateStallExecution(VOID
);
579 VOID
HalpInitPciBus (VOID
);
582 VOID
HalpInitDma (VOID
);
584 /* Non-generic initialization */
585 VOID
HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock
);
586 VOID
HalpInitPhase1(VOID
);
597 HalpCheckPowerButton(
603 HalpRegisterKdSupportFunctions(
609 HalpSetupPciDeviceForDebugging(
610 IN PVOID LoaderBlock
,
611 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
616 HalpReleasePciDeviceForDebugging(
617 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
625 HalpMapPhysicalMemory64(
626 IN PHYSICAL_ADDRESS PhysicalAddress
,
632 HalpUnmapVirtualAddress(
633 IN PVOID VirtualAddress
,
640 HaliQuerySystemInformation(
641 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
644 OUT PULONG ReturnedLength
649 HaliSetSystemInformation(
650 IN HAL_SET_INFORMATION_CLASS InformationClass
,
660 HalpBiosDisplayReset(
667 PKTRAP_FRAME TrapFrame
677 // Processor Halt Routine
686 // CMOS initialization
695 // Spinlock for protecting CMOS access
699 HalpAcquireSystemHardwareSpinLock(
705 HalpReleaseCmosSpinLock(
711 HalpAllocPhysicalMemory(
712 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
720 HalpMapPhysicalMemory64(
721 IN PHYSICAL_ADDRESS PhysicalAddress
,
728 IN PHANDLE KeyHandle
,
730 IN PUNICODE_STRING KeyName
,
731 IN ACCESS_MASK DesiredAccess
,
743 HalpGetDebugPortTable(
749 HalpReportSerialNumber(
767 HalpReportResourceUsage(
768 IN PUNICODE_STRING HalName
,
769 IN INTERFACE_TYPE InterfaceType
774 HalpIs16BitPortDecodeSupported(
780 HalpQueryAcpiResourceRequirements(
781 OUT PIO_RESOURCE_REQUIREMENTS_LIST
*Requirements
787 IN PKTRAP_FRAME TrapFrame
,
810 IN PPCI_COMMON_CONFIG PciData
814 #define KfLowerIrql KeLowerIrql
816 /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
817 #define KiAcquireSpinLock(SpinLock)
818 #define KiReleaseSpinLock(SpinLock)
819 #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL);
820 #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql);
821 #endif // !CONFIG_SMP
824 extern BOOLEAN HalpNMIInProgress
;
826 extern ADDRESS_USAGE HalpDefaultIoSpace
;
828 extern KSPIN_LOCK HalpSystemHardwareLock
;
830 extern PADDRESS_USAGE HalpAddressUsageList
;
832 extern LARGE_INTEGER HalpPerfCounter
;
834 extern KAFFINITY HalpActiveProcessors
;
836 extern BOOLEAN HalDisableFirmwareMapper
;
837 extern PWCHAR HalHardwareIdString
;
838 extern PWCHAR HalName
;
840 extern KAFFINITY HalpDefaultInterruptAffinity
;
842 extern IDTUsageFlags HalpIDTUsageFlags
[MAXIMUM_IDTVECTOR
];