8 #define HAL_BUILD_TYPE (DBG ? PRCB_BUILD_DEBUG : 0)
10 #define HAL_BUILD_TYPE ((DBG ? PRCB_BUILD_DEBUG : 0) | PRCB_BUILD_UNIPROCESSOR)
13 typedef struct _HAL_BIOS_FRAME
20 PKTRAP_FRAME TrapFrame
;
28 } HAL_BIOS_FRAME
, *PHAL_BIOS_FRAME
;
32 (__cdecl
*PHAL_SW_INTERRUPT_HANDLER
)(
38 (FASTCALL
*PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY
)(
39 IN PKTRAP_FRAME TrapFrame
42 #define HAL_APC_REQUEST 0
43 #define HAL_DPC_REQUEST 1
45 /* HAL profiling offsets in KeGetPcr()->HalReserved[] */
46 #define HAL_PROFILING_INTERVAL 0
47 #define HAL_PROFILING_MULTIPLIER 1
49 /* CMOS Registers and Ports */
50 #define CMOS_CONTROL_PORT (PUCHAR)0x70
51 #define CMOS_DATA_PORT (PUCHAR)0x71
52 #define RTC_REGISTER_A 0x0A
53 #define RTC_REG_A_UIP 0x80
54 #define RTC_REGISTER_B 0x0B
55 #define RTC_REG_B_PI 0x40
56 #define RTC_REGISTER_C 0x0C
57 #define RTC_REG_C_IRQ 0x80
58 #define RTC_REGISTER_D 0x0D
59 #define RTC_REGISTER_CENTURY 0x32
62 #define IDT_REGISTERED 0x01
63 #define IDT_LATCHED 0x02
64 #define IDT_READ_ONLY 0x04
65 #define IDT_INTERNAL 0x11
66 #define IDT_DEVICE 0x21
68 /* Conversion functions */
69 #define BCD_INT(bcd) \
70 (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
71 #define INT_BCD(int) \
72 (UCHAR)(((int / 10) << 4) + (int % 10))
77 #define VIDEO_SERVICES 0x10
80 // Operations for INT 10h (in AH)
82 #define SET_VIDEO_MODE 0x00
85 // Video Modes for INT10h AH=00 (in AL)
87 #define GRAPHICS_MODE_12 0x12 /* 80x30 8x16 640x480 16/256K */
90 // Commonly stated as being 1.19318MHz
92 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
95 // However, the true value is closer to 1.19318181[...]81MHz since this is 1/3rd
96 // of the NTSC color subcarrier frequency which runs at 3.57954545[...]45MHz.
98 // Note that Windows uses 1.193167MHz which seems to have no basis. However, if
99 // one takes the NTSC color subcarrier frequency as being 3.579545 (trimming the
100 // infinite series) and divides it by three, one obtains 1.19318167.
102 // It may be that the original NT HAL source code introduced a typo and turned
103 // 119318167 into 1193167 by ommitting the "18". This is very plausible as the
104 // number is quite long.
106 #define PIT_FREQUENCY 1193182
109 // These ports are controlled by the i8254 Programmable Interrupt Timer (PIT)
111 #define TIMER_CHANNEL0_DATA_PORT 0x40
112 #define TIMER_CHANNEL1_DATA_PORT 0x41
113 #define TIMER_CHANNEL2_DATA_PORT 0x42
114 #define TIMER_CONTROL_PORT 0x43
117 // Mode 0 - Interrupt On Terminal Count
118 // Mode 1 - Hardware Re-triggerable One-Shot
119 // Mode 2 - Rate Generator
120 // Mode 3 - Square Wave Generator
121 // Mode 4 - Software Triggered Strobe
122 // Mode 5 - Hardware Triggered Strobe
124 typedef enum _TIMER_OPERATING_MODES
132 PitOperatingMode2Reserved
,
133 PitOperatingMode5Reserved
134 } TIMER_OPERATING_MODES
;
136 typedef enum _TIMER_ACCESS_MODES
138 PitAccessModeCounterLatch
,
142 } TIMER_ACCESS_MODES
;
144 typedef enum _TIMER_CHANNELS
152 typedef union _TIMER_CONTROL_PORT_REGISTER
157 UCHAR OperatingMode
:3;
162 } TIMER_CONTROL_PORT_REGISTER
, *PTIMER_CONTROL_PORT_REGISTER
;
165 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
168 // This port is controled by the i8255 Programmable Peripheral Interface (PPI)
170 #define SYSTEM_CONTROL_PORT_A 0x92
171 #define SYSTEM_CONTROL_PORT_B 0x61
172 typedef union _SYSTEM_CONTROL_PORT_B_REGISTER
176 UCHAR Timer2GateToSpeaker
:1;
177 UCHAR SpeakerDataEnable
:1;
178 UCHAR ParityCheckEnable
:1;
179 UCHAR ChannelCheckEnable
:1;
180 UCHAR RefreshRequest
:1;
181 UCHAR Timer2Output
:1;
182 UCHAR ChannelCheck
:1;
186 } SYSTEM_CONTROL_PORT_B_REGISTER
, *PSYSTEM_CONTROL_PORT_B_REGISTER
;
189 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
192 // These ports are controlled by the i8259 Programmable Interrupt Controller (PIC)
194 #define PIC1_CONTROL_PORT 0x20
195 #define PIC1_DATA_PORT 0x21
196 #define PIC2_CONTROL_PORT 0xA0
197 #define PIC2_DATA_PORT 0xA1
200 // Definitions for ICW/OCW Bits
202 typedef enum _I8259_ICW1_OPERATING_MODE
206 } I8259_ICW1_OPERATING_MODE
;
208 typedef enum _I8259_ICW1_INTERRUPT_MODE
212 } I8259_ICW1_INTERRUPT_MODE
;
214 typedef enum _I8259_ICW1_INTERVAL
218 } I8259_ICW1_INTERVAL
;
220 typedef enum _I8259_ICW4_SYSTEM_MODE
224 } I8259_ICW4_SYSTEM_MODE
;
226 typedef enum _I8259_ICW4_EOI_MODE
230 } I8259_ICW4_EOI_MODE
;
232 typedef enum _I8259_ICW4_BUFFERED_MODE
238 } I8259_ICW4_BUFFERED_MODE
;
240 typedef enum _I8259_READ_REQUEST
246 } I8259_READ_REQUEST
;
248 typedef enum _I8259_EOI_MODE
261 // Definitions for ICW Registers
263 typedef union _I8259_ICW1
268 UCHAR OperatingMode
:1;
270 UCHAR InterruptMode
:1;
272 UCHAR InterruptVectorAddress
:3;
275 } I8259_ICW1
, *PI8259_ICW1
;
277 typedef union _I8259_ICW2
282 UCHAR InterruptVector
:5;
285 } I8259_ICW2
, *PI8259_ICW2
;
287 typedef union _I8259_ICW3
309 } I8259_ICW3
, *PI8259_ICW3
;
311 typedef union _I8259_ICW4
317 UCHAR BufferedMode
:2;
318 UCHAR SpecialFullyNestedMode
:1;
322 } I8259_ICW4
, *PI8259_ICW4
;
324 typedef union _I8259_OCW2
333 } I8259_OCW2
, *PI8259_OCW2
;
335 typedef union _I8259_OCW3
343 UCHAR SpecialMaskMode
:2;
347 } I8259_OCW3
, *PI8259_OCW3
;
349 typedef union _I8259_ISR
366 } I8259_ISR
, *PI8259_ISR
;
368 typedef I8259_ISR I8259_IDR
, *PI8259_IDR
;
371 // See EISA System Architecture 2nd Edition (Tom Shanley, Don Anderson, John Swindle)
374 // These ports are controlled by the i8259A Programmable Interrupt Controller (PIC)
376 #define EISA_ELCR_MASTER 0x4D0
377 #define EISA_ELCR_SLAVE 0x4D1
379 typedef union _EISA_ELCR
407 } EISA_ELCR
, *PEISA_ELCR
;
409 typedef struct _PIC_MASK
420 } PIC_MASK
, *PPIC_MASK
;
424 (NTAPI
*PHAL_DISMISS_INTERRUPT
)(
432 HalpDismissIrqGeneric(
472 HalpDismissIrq15Level(
480 HalpDismissIrq13Level(
488 HalpDismissIrq07Level(
496 HalpHardwareInterruptLevel(
503 #define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)
504 #define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)
505 #define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
510 #define HALP_CARD_FEATURE_FULL_DECODE 0x0001
515 #define HALP_CHECK_CARD_REVISION_ID 0x10000
516 #define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000
517 #define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
520 // Mm PTE/PDE to Hal PTE/PDE
522 #define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)
523 #define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
525 typedef struct _IDTUsageFlags
533 UCHAR BusReleativeVector
;
536 typedef struct _HalAddressUsage
538 struct _HalAddressUsage
*Next
;
539 CM_RESOURCE_TYPE Type
;
546 } ADDRESS_USAGE
, *PADDRESS_USAGE
;
549 PADAPTER_OBJECT NTAPI
HalpAllocateAdapterEx(ULONG NumberOfMapRegisters
,BOOLEAN IsMaster
, BOOLEAN Dma32BitAddresses
);
555 HalpRegisterVector(IN UCHAR Flags
,
557 IN ULONG SystemVector
,
563 HalpEnableInterruptHandler(IN UCHAR Flags
,
565 IN ULONG SystemVector
,
568 IN KINTERRUPT_MODE Mode
);
571 VOID NTAPI
HalpInitializePICs(IN BOOLEAN EnableInterrupts
);
572 VOID __cdecl
HalpApcInterrupt(VOID
);
573 VOID __cdecl
HalpDispatchInterrupt(VOID
);
574 PHAL_SW_INTERRUPT_HANDLER __cdecl
HalpDispatchInterrupt2(VOID
);
575 DECLSPEC_NORETURN VOID FASTCALL
HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
576 DECLSPEC_NORETURN VOID FASTCALL
HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
579 extern BOOLEAN HalpProfilingStopped
;
582 INIT_FUNCTION VOID NTAPI
HalpInitializeClock(VOID
);
583 VOID __cdecl
HalpClockInterrupt(VOID
);
584 VOID __cdecl
HalpProfileInterrupt(VOID
);
588 HalpCalibrateStallExecution(VOID
);
591 VOID
HalpInitPciBus (VOID
);
594 INIT_FUNCTION VOID
HalpInitDma (VOID
);
596 /* Non-generic initialization */
597 VOID
HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock
);
598 VOID
HalpInitPhase1(VOID
);
609 HalpCheckPowerButton(
616 HalpRegisterKdSupportFunctions(
623 HalpSetupPciDeviceForDebugging(
624 IN PVOID LoaderBlock
,
625 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
631 HalpReleasePciDeviceForDebugging(
632 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
640 HalpAllocPhysicalMemory(
641 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
642 IN ULONG64 MaxAddress
,
643 IN PFN_NUMBER PageCount
,
649 HalpMapPhysicalMemory64Vista(
650 IN PHYSICAL_ADDRESS PhysicalAddress
,
651 IN PFN_COUNT PageCount
,
652 IN BOOLEAN FlushCurrentTLB
657 HalpUnmapVirtualAddressVista(
658 IN PVOID VirtualAddress
,
659 IN PFN_COUNT NumberPages
,
660 IN BOOLEAN FlushCurrentTLB
665 HalpMapPhysicalMemory64(
666 IN PHYSICAL_ADDRESS PhysicalAddress
,
667 IN PFN_COUNT PageCount
672 HalpUnmapVirtualAddress(
673 IN PVOID VirtualAddress
,
674 IN PFN_COUNT NumberPages
680 HaliQuerySystemInformation(
681 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
684 OUT PULONG ReturnedLength
689 HaliSetSystemInformation(
690 IN HAL_SET_INFORMATION_CLASS InformationClass
,
700 HalpBiosDisplayReset(
707 PKTRAP_FRAME TrapFrame
717 // Processor Halt Routine
749 // Spinlock for protecting CMOS access
753 HalpAcquireCmosSpinLock(
759 HalpReleaseCmosSpinLock(
765 HalpInitializeLegacyPICs(
772 IN PHANDLE KeyHandle
,
774 IN PUNICODE_STRING KeyName
,
775 IN ACCESS_MASK DesiredAccess
,
789 HalpGetDebugPortTable(
796 HalpReportSerialNumber(
817 HalpReportResourceUsage(
818 IN PUNICODE_STRING HalName
,
819 IN INTERFACE_TYPE InterfaceType
825 HalpIs16BitPortDecodeSupported(
831 HalpQueryAcpiResourceRequirements(
832 OUT PIO_RESOURCE_REQUIREMENTS_LIST
*Requirements
838 IN PKTRAP_FRAME TrapFrame
,
863 IN PPCI_COMMON_CONFIG PciData
869 IN ULONG ProcessorNumber
,
870 IN PLOADER_PARAMETER_BLOCK LoaderBlock
874 #define KfLowerIrql KeLowerIrql
875 #define KiEnterInterruptTrap(TrapFrame) /* We do all neccessary in asm code */
876 #define KiEoiHelper(TrapFrame) return /* Just return to the caller */
877 #define HalBeginSystemInterrupt(Irql, Vector, OldIrql) ((*(OldIrql) = PASSIVE_LEVEL), TRUE)
879 /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
880 #define KiAcquireSpinLock(SpinLock)
881 #define KiReleaseSpinLock(SpinLock)
882 #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL);
883 #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql);
884 #endif // !CONFIG_SMP
887 extern BOOLEAN HalpNMIInProgress
;
889 extern ADDRESS_USAGE HalpDefaultIoSpace
;
891 extern KSPIN_LOCK HalpSystemHardwareLock
;
893 extern PADDRESS_USAGE HalpAddressUsageList
;
895 extern LARGE_INTEGER HalpPerfCounter
;
897 extern KAFFINITY HalpActiveProcessors
;
899 extern BOOLEAN HalDisableFirmwareMapper
;
900 extern PWCHAR HalHardwareIdString
;
901 extern PWCHAR HalName
;
903 extern KAFFINITY HalpDefaultInterruptAffinity
;
905 extern IDTUsageFlags HalpIDTUsageFlags
[MAXIMUM_IDTVECTOR
+1];
907 extern const USHORT HalpBuildType
;