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_REG_A_UIP 0x80
52 #define RTC_REGISTER_B 0x0B
53 #define RTC_REG_B_PI 0x40
54 #define RTC_REGISTER_C 0x0C
55 #define RTC_REGISTER_D 0x0D
56 #define RTC_REGISTER_CENTURY 0x32
59 #define IDT_REGISTERED 0x01
60 #define IDT_LATCHED 0x02
61 #define IDT_READ_ONLY 0x04
62 #define IDT_INTERNAL 0x11
63 #define IDT_DEVICE 0x21
65 /* Conversion functions */
66 #define BCD_INT(bcd) \
67 (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
68 #define INT_BCD(int) \
69 (UCHAR)(((int / 10) << 4) + (int % 10))
74 #define VIDEO_SERVICES 0x10
77 // Operations for INT 10h (in AH)
79 #define SET_VIDEO_MODE 0x00
82 // Video Modes for INT10h AH=00 (in AL)
84 #define GRAPHICS_MODE_12 0x12 /* 80x30 8x16 640x480 16/256K */
87 // Commonly stated as being 1.19318MHz
89 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
92 // However, the true value is closer to 1.19318181[...]81MHz since this is 1/3rd
93 // of the NTSC color subcarrier frequency which runs at 3.57954545[...]45MHz.
95 // Note that Windows uses 1.193167MHz which seems to have no basis. However, if
96 // one takes the NTSC color subcarrier frequency as being 3.579545 (trimming the
97 // infinite series) and divides it by three, one obtains 1.19318167.
99 // It may be that the original NT HAL source code introduced a typo and turned
100 // 119318167 into 1193167 by ommitting the "18". This is very plausible as the
101 // number is quite long.
103 #define PIT_FREQUENCY 1193182
106 // These ports are controlled by the i8254 Programmable Interrupt Timer (PIT)
108 #define TIMER_CHANNEL0_DATA_PORT 0x40
109 #define TIMER_CHANNEL1_DATA_PORT 0x41
110 #define TIMER_CHANNEL2_DATA_PORT 0x42
111 #define TIMER_CONTROL_PORT 0x43
114 // Mode 0 - Interrupt On Terminal Count
115 // Mode 1 - Hardware Re-triggerable One-Shot
116 // Mode 2 - Rate Generator
117 // Mode 3 - Square Wave Generator
118 // Mode 4 - Software Triggered Strobe
119 // Mode 5 - Hardware Triggered Strobe
121 typedef enum _TIMER_OPERATING_MODES
129 PitOperatingMode2Reserved
,
130 PitOperatingMode5Reserved
131 } TIMER_OPERATING_MODES
;
133 typedef enum _TIMER_ACCESS_MODES
135 PitAccessModeCounterLatch
,
139 } TIMER_ACCESS_MODES
;
141 typedef enum _TIMER_CHANNELS
149 typedef union _TIMER_CONTROL_PORT_REGISTER
154 TIMER_OPERATING_MODES OperatingMode
:3;
155 TIMER_ACCESS_MODES AccessMode
:2;
156 TIMER_CHANNELS Channel
:2;
159 } TIMER_CONTROL_PORT_REGISTER
, *PTIMER_CONTROL_PORT_REGISTER
;
162 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
165 // This port is controled by the i8255 Programmable Peripheral Interface (PPI)
167 #define SYSTEM_CONTROL_PORT_A 0x92
168 #define SYSTEM_CONTROL_PORT_B 0x61
169 typedef union _SYSTEM_CONTROL_PORT_B_REGISTER
173 UCHAR Timer2GateToSpeaker
:1;
174 UCHAR SpeakerDataEnable
:1;
175 UCHAR ParityCheckEnable
:1;
176 UCHAR ChannelCheckEnable
:1;
177 UCHAR RefreshRequest
:1;
178 UCHAR Timer2Output
:1;
179 UCHAR ChannelCheck
:1;
183 } SYSTEM_CONTROL_PORT_B_REGISTER
, *PSYSTEM_CONTROL_PORT_B_REGISTER
;
186 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
189 // These ports are controlled by the i8259 Programmable Interrupt Controller (PIC)
191 #define PIC1_CONTROL_PORT 0x20
192 #define PIC1_DATA_PORT 0x21
193 #define PIC2_CONTROL_PORT 0xA0
194 #define PIC2_DATA_PORT 0xA1
197 // Definitions for ICW/OCW Bits
199 typedef enum _I8259_ICW1_OPERATING_MODE
203 } I8259_ICW1_OPERATING_MODE
;
205 typedef enum _I8259_ICW1_INTERRUPT_MODE
209 } I8259_ICW1_INTERRUPT_MODE
;
211 typedef enum _I8259_ICW1_INTERVAL
215 } I8259_ICW1_INTERVAL
;
217 typedef enum _I8259_ICW4_SYSTEM_MODE
221 } I8259_ICW4_SYSTEM_MODE
;
223 typedef enum _I8259_ICW4_EOI_MODE
227 } I8259_ICW4_EOI_MODE
;
229 typedef enum _I8259_ICW4_BUFFERED_MODE
235 } I8259_ICW4_BUFFERED_MODE
;
237 typedef enum _I8259_READ_REQUEST
243 } I8259_READ_REQUEST
;
245 typedef enum _I8259_EOI_MODE
258 // Definitions for ICW Registers
260 typedef union _I8259_ICW1
265 I8259_ICW1_OPERATING_MODE OperatingMode
:1;
266 I8259_ICW1_INTERVAL Interval
:1;
267 I8259_ICW1_INTERRUPT_MODE InterruptMode
:1;
269 UCHAR InterruptVectorAddress
:3;
272 } I8259_ICW1
, *PI8259_ICW1
;
274 typedef union _I8259_ICW2
279 UCHAR InterruptVector
:5;
282 } I8259_ICW2
, *PI8259_ICW2
;
284 typedef union _I8259_ICW3
306 } I8259_ICW3
, *PI8259_ICW3
;
308 typedef union _I8259_ICW4
312 I8259_ICW4_SYSTEM_MODE SystemMode
:1;
313 I8259_ICW4_EOI_MODE EoiMode
:1;
314 I8259_ICW4_BUFFERED_MODE BufferedMode
:2;
315 UCHAR SpecialFullyNestedMode
:1;
319 } I8259_ICW4
, *PI8259_ICW4
;
321 typedef union _I8259_OCW2
327 I8259_EOI_MODE EoiMode
:3;
330 } I8259_OCW2
, *PI8259_OCW2
;
332 typedef union _I8259_OCW3
336 I8259_READ_REQUEST ReadRequest
:2;
340 UCHAR SpecialMaskMode
:2;
344 } I8259_OCW3
, *PI8259_OCW3
;
346 typedef union _I8259_ISR
363 } I8259_ISR
, *PI8259_ISR
;
365 typedef I8259_ISR I8259_IDR
, *PI8259_IDR
;
368 // See EISA System Architecture 2nd Edition (Tom Shanley, Don Anderson, John Swindle)
371 // These ports are controlled by the i8259A Programmable Interrupt Controller (PIC)
373 #define EISA_ELCR_MASTER 0x4D0
374 #define EISA_ELCR_SLAVE 0x4D1
376 typedef union _EISA_ELCR
404 } EISA_ELCR
, *PEISA_ELCR
;
406 typedef struct _PIC_MASK
417 } PIC_MASK
, *PPIC_MASK
;
421 ( REGISTERCALL
*PHAL_DISMISS_INTERRUPT
)(
429 HalpDismissIrqGeneric(
469 HalpDismissIrq15Level(
477 HalpDismissIrq13Level(
485 HalpDismissIrq07Level(
492 HalpHardwareInterruptLevel(
499 #define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)
500 #define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)
501 #define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
506 #define HALP_CARD_FEATURE_FULL_DECODE 0x0001
511 #define HALP_CHECK_CARD_REVISION_ID 0x10000
512 #define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000
513 #define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
516 // Mm PTE/PDE to Hal PTE/PDE
518 #define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)
519 #define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
521 typedef struct _IDTUsageFlags
529 UCHAR BusReleativeVector
;
532 typedef struct _HalAddressUsage
534 struct _HalAddressUsage
*Next
;
535 CM_RESOURCE_TYPE Type
;
542 } ADDRESS_USAGE
, *PADDRESS_USAGE
;
545 PADAPTER_OBJECT NTAPI
HalpAllocateAdapterEx(ULONG NumberOfMapRegisters
,BOOLEAN IsMaster
, BOOLEAN Dma32BitAddresses
);
550 HalpRegisterVector(IN UCHAR Flags
,
552 IN ULONG SystemVector
,
557 HalpEnableInterruptHandler(IN UCHAR Flags
,
559 IN ULONG SystemVector
,
562 IN KINTERRUPT_MODE Mode
);
565 VOID NTAPI
HalpInitializePICs(IN BOOLEAN EnableInterrupts
);
566 VOID
HalpApcInterrupt(VOID
);
567 VOID
HalpDispatchInterrupt(VOID
);
568 VOID
HalpDispatchInterrupt2(VOID
);
569 DECLSPEC_NORETURN VOID FASTCALL
HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
570 DECLSPEC_NORETURN VOID FASTCALL
HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
573 VOID NTAPI
HalpInitializeClock(VOID
);
574 VOID
HalpClockInterrupt(VOID
);
575 VOID
HalpProfileInterrupt(VOID
);
579 HalpCalibrateStallExecution(VOID
);
582 VOID
HalpInitPciBus (VOID
);
585 VOID
HalpInitDma (VOID
);
587 /* Non-generic initialization */
588 VOID
HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock
);
589 VOID
HalpInitPhase1(VOID
);
600 HalpCheckPowerButton(
606 HalpRegisterKdSupportFunctions(
612 HalpSetupPciDeviceForDebugging(
613 IN PVOID LoaderBlock
,
614 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
619 HalpReleasePciDeviceForDebugging(
620 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
628 HalpMapPhysicalMemory64(
629 IN PHYSICAL_ADDRESS PhysicalAddress
,
635 HalpUnmapVirtualAddress(
636 IN PVOID VirtualAddress
,
643 HaliQuerySystemInformation(
644 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
647 OUT PULONG ReturnedLength
652 HaliSetSystemInformation(
653 IN HAL_SET_INFORMATION_CLASS InformationClass
,
663 HalpBiosDisplayReset(
670 PKTRAP_FRAME TrapFrame
680 // Processor Halt Routine
711 // Spinlock for protecting CMOS access
715 HalpAcquireSystemHardwareSpinLock(
721 HalpReleaseCmosSpinLock(
727 HalpAllocPhysicalMemory(
728 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
736 HalpMapPhysicalMemory64(
737 IN PHYSICAL_ADDRESS PhysicalAddress
,
744 IN PHANDLE KeyHandle
,
746 IN PUNICODE_STRING KeyName
,
747 IN ACCESS_MASK DesiredAccess
,
759 HalpGetDebugPortTable(
765 HalpReportSerialNumber(
783 HalpReportResourceUsage(
784 IN PUNICODE_STRING HalName
,
785 IN INTERFACE_TYPE InterfaceType
790 HalpIs16BitPortDecodeSupported(
796 HalpQueryAcpiResourceRequirements(
797 OUT PIO_RESOURCE_REQUIREMENTS_LIST
*Requirements
803 IN PKTRAP_FRAME TrapFrame
,
826 IN PPCI_COMMON_CONFIG PciData
830 #define KfLowerIrql KeLowerIrql
832 /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
833 #define KiAcquireSpinLock(SpinLock)
834 #define KiReleaseSpinLock(SpinLock)
835 #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL);
836 #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql);
837 #endif // !CONFIG_SMP
840 extern BOOLEAN HalpNMIInProgress
;
842 extern ADDRESS_USAGE HalpDefaultIoSpace
;
844 extern KSPIN_LOCK HalpSystemHardwareLock
;
846 extern PADDRESS_USAGE HalpAddressUsageList
;
848 extern LARGE_INTEGER HalpPerfCounter
;
850 extern KAFFINITY HalpActiveProcessors
;
852 extern BOOLEAN HalDisableFirmwareMapper
;
853 extern PWCHAR HalHardwareIdString
;
854 extern PWCHAR HalName
;
856 extern KAFFINITY HalpDefaultInterruptAffinity
;
858 extern IDTUsageFlags HalpIDTUsageFlags
[MAXIMUM_IDTVECTOR
];