7 #define PLACE_IN_SECTION(s) __attribute__((section (s)))
10 #define PAGE_LOCKED_FUNCTION PLACE_IN_SECTION("pagelk")
11 #define PAGE_UNLOCKED_FUNCTION PLACE_IN_SECTION("pagepo")
14 #define PAGE_LOCKED_FUNCTION
15 #define PAGE_UNLOCKED_FUNCTION
19 #define REGISTERCALL FASTCALL
21 #define REGISTERCALL __attribute__((regparm(3)))
24 typedef struct _HAL_BIOS_FRAME
31 PKTRAP_FRAME TrapFrame
;
39 } HAL_BIOS_FRAME
, *PHAL_BIOS_FRAME
;
43 (*PHAL_SW_INTERRUPT_HANDLER
)(
50 (FASTCALL
*PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY
)(
51 IN PKTRAP_FRAME TrapFrame
54 #define HAL_APC_REQUEST 0
55 #define HAL_DPC_REQUEST 1
57 /* CMOS Registers and Ports */
58 #define CMOS_CONTROL_PORT (PUCHAR)0x70
59 #define CMOS_DATA_PORT (PUCHAR)0x71
60 #define RTC_REGISTER_A 0x0A
61 #define RTC_REG_A_UIP 0x80
62 #define RTC_REGISTER_B 0x0B
63 #define RTC_REG_B_PI 0x40
64 #define RTC_REGISTER_C 0x0C
65 #define RTC_REGISTER_D 0x0D
66 #define RTC_REGISTER_CENTURY 0x32
69 #define IDT_REGISTERED 0x01
70 #define IDT_LATCHED 0x02
71 #define IDT_READ_ONLY 0x04
72 #define IDT_INTERNAL 0x11
73 #define IDT_DEVICE 0x21
75 /* Conversion functions */
76 #define BCD_INT(bcd) \
77 (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
78 #define INT_BCD(int) \
79 (UCHAR)(((int / 10) << 4) + (int % 10))
84 #define VIDEO_SERVICES 0x10
87 // Operations for INT 10h (in AH)
89 #define SET_VIDEO_MODE 0x00
92 // Video Modes for INT10h AH=00 (in AL)
94 #define GRAPHICS_MODE_12 0x12 /* 80x30 8x16 640x480 16/256K */
97 // Commonly stated as being 1.19318MHz
99 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
102 // However, the true value is closer to 1.19318181[...]81MHz since this is 1/3rd
103 // of the NTSC color subcarrier frequency which runs at 3.57954545[...]45MHz.
105 // Note that Windows uses 1.193167MHz which seems to have no basis. However, if
106 // one takes the NTSC color subcarrier frequency as being 3.579545 (trimming the
107 // infinite series) and divides it by three, one obtains 1.19318167.
109 // It may be that the original NT HAL source code introduced a typo and turned
110 // 119318167 into 1193167 by ommitting the "18". This is very plausible as the
111 // number is quite long.
113 #define PIT_FREQUENCY 1193182
116 // These ports are controlled by the i8254 Programmable Interrupt Timer (PIT)
118 #define TIMER_CHANNEL0_DATA_PORT 0x40
119 #define TIMER_CHANNEL1_DATA_PORT 0x41
120 #define TIMER_CHANNEL2_DATA_PORT 0x42
121 #define TIMER_CONTROL_PORT 0x43
124 // Mode 0 - Interrupt On Terminal Count
125 // Mode 1 - Hardware Re-triggerable One-Shot
126 // Mode 2 - Rate Generator
127 // Mode 3 - Square Wave Generator
128 // Mode 4 - Software Triggered Strobe
129 // Mode 5 - Hardware Triggered Strobe
131 typedef enum _TIMER_OPERATING_MODES
139 PitOperatingMode2Reserved
,
140 PitOperatingMode5Reserved
141 } TIMER_OPERATING_MODES
;
143 typedef enum _TIMER_ACCESS_MODES
145 PitAccessModeCounterLatch
,
149 } TIMER_ACCESS_MODES
;
151 typedef enum _TIMER_CHANNELS
159 typedef union _TIMER_CONTROL_PORT_REGISTER
164 TIMER_OPERATING_MODES OperatingMode
:3;
165 TIMER_ACCESS_MODES AccessMode
:2;
166 TIMER_CHANNELS Channel
:2;
169 } TIMER_CONTROL_PORT_REGISTER
, *PTIMER_CONTROL_PORT_REGISTER
;
172 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
175 // This port is controled by the i8255 Programmable Peripheral Interface (PPI)
177 #define SYSTEM_CONTROL_PORT_A 0x92
178 #define SYSTEM_CONTROL_PORT_B 0x61
179 typedef union _SYSTEM_CONTROL_PORT_B_REGISTER
183 UCHAR Timer2GateToSpeaker
:1;
184 UCHAR SpeakerDataEnable
:1;
185 UCHAR ParityCheckEnable
:1;
186 UCHAR ChannelCheckEnable
:1;
187 UCHAR RefreshRequest
:1;
188 UCHAR Timer2Output
:1;
189 UCHAR ChannelCheck
:1;
193 } SYSTEM_CONTROL_PORT_B_REGISTER
, *PSYSTEM_CONTROL_PORT_B_REGISTER
;
196 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
199 // These ports are controlled by the i8259 Programmable Interrupt Controller (PIC)
201 #define PIC1_CONTROL_PORT 0x20
202 #define PIC1_DATA_PORT 0x21
203 #define PIC2_CONTROL_PORT 0xA0
204 #define PIC2_DATA_PORT 0xA1
207 // Definitions for ICW/OCW Bits
209 typedef enum _I8259_ICW1_OPERATING_MODE
213 } I8259_ICW1_OPERATING_MODE
;
215 typedef enum _I8259_ICW1_INTERRUPT_MODE
219 } I8259_ICW1_INTERRUPT_MODE
;
221 typedef enum _I8259_ICW1_INTERVAL
225 } I8259_ICW1_INTERVAL
;
227 typedef enum _I8259_ICW4_SYSTEM_MODE
231 } I8259_ICW4_SYSTEM_MODE
;
233 typedef enum _I8259_ICW4_EOI_MODE
237 } I8259_ICW4_EOI_MODE
;
239 typedef enum _I8259_ICW4_BUFFERED_MODE
245 } I8259_ICW4_BUFFERED_MODE
;
247 typedef enum _I8259_READ_REQUEST
253 } I8259_READ_REQUEST
;
255 typedef enum _I8259_EOI_MODE
268 // Definitions for ICW Registers
270 typedef union _I8259_ICW1
275 I8259_ICW1_OPERATING_MODE OperatingMode
:1;
276 I8259_ICW1_INTERVAL Interval
:1;
277 I8259_ICW1_INTERRUPT_MODE InterruptMode
:1;
279 UCHAR InterruptVectorAddress
:3;
282 } I8259_ICW1
, *PI8259_ICW1
;
284 typedef union _I8259_ICW2
289 UCHAR InterruptVector
:5;
292 } I8259_ICW2
, *PI8259_ICW2
;
294 typedef union _I8259_ICW3
316 } I8259_ICW3
, *PI8259_ICW3
;
318 typedef union _I8259_ICW4
322 I8259_ICW4_SYSTEM_MODE SystemMode
:1;
323 I8259_ICW4_EOI_MODE EoiMode
:1;
324 I8259_ICW4_BUFFERED_MODE BufferedMode
:2;
325 UCHAR SpecialFullyNestedMode
:1;
329 } I8259_ICW4
, *PI8259_ICW4
;
331 typedef union _I8259_OCW2
337 I8259_EOI_MODE EoiMode
:3;
340 } I8259_OCW2
, *PI8259_OCW2
;
342 typedef union _I8259_OCW3
346 I8259_READ_REQUEST ReadRequest
:2;
350 UCHAR SpecialMaskMode
:2;
354 } I8259_OCW3
, *PI8259_OCW3
;
356 typedef union _I8259_ISR
373 } I8259_ISR
, *PI8259_ISR
;
375 typedef I8259_ISR I8259_IDR
, *PI8259_IDR
;
378 // See EISA System Architecture 2nd Edition (Tom Shanley, Don Anderson, John Swindle)
381 // These ports are controlled by the i8259A Programmable Interrupt Controller (PIC)
383 #define EISA_ELCR_MASTER 0x4D0
384 #define EISA_ELCR_SLAVE 0x4D1
386 typedef union _EISA_ELCR
414 } EISA_ELCR
, *PEISA_ELCR
;
416 typedef struct _PIC_MASK
427 } PIC_MASK
, *PPIC_MASK
;
431 ( REGISTERCALL
*PHAL_DISMISS_INTERRUPT
)(
439 HalpDismissIrqGeneric(
479 HalpDismissIrq15Level(
487 HalpDismissIrq13Level(
495 HalpDismissIrq07Level(
502 HalpHardwareInterruptLevel(
509 #define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)
510 #define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)
511 #define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
516 #define HALP_CARD_FEATURE_FULL_DECODE 0x0001
521 #define HALP_CHECK_CARD_REVISION_ID 0x10000
522 #define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000
523 #define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
526 // Mm PTE/PDE to Hal PTE/PDE
528 #define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)
529 #define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
531 typedef struct _IDTUsageFlags
539 UCHAR BusReleativeVector
;
542 typedef struct _HalAddressUsage
544 struct _HalAddressUsage
*Next
;
545 CM_RESOURCE_TYPE Type
;
552 } ADDRESS_USAGE
, *PADDRESS_USAGE
;
555 PADAPTER_OBJECT NTAPI
HalpAllocateAdapterEx(ULONG NumberOfMapRegisters
,BOOLEAN IsMaster
, BOOLEAN Dma32BitAddresses
);
560 HalpRegisterVector(IN UCHAR Flags
,
562 IN ULONG SystemVector
,
567 HalpEnableInterruptHandler(IN UCHAR Flags
,
569 IN ULONG SystemVector
,
572 IN KINTERRUPT_MODE Mode
);
575 VOID NTAPI
HalpInitializePICs(IN BOOLEAN EnableInterrupts
);
576 VOID
HalpApcInterrupt(VOID
);
577 VOID
HalpDispatchInterrupt(VOID
);
578 VOID
HalpDispatchInterrupt2(VOID
);
579 DECLSPEC_NORETURN VOID FASTCALL
HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
580 DECLSPEC_NORETURN VOID FASTCALL
HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
583 VOID NTAPI
HalpInitializeClock(VOID
);
584 VOID
HalpClockInterrupt(VOID
);
585 VOID
HalpProfileInterrupt(VOID
);
589 HalpCalibrateStallExecution(VOID
);
592 VOID
HalpInitPciBus (VOID
);
595 VOID
HalpInitDma (VOID
);
597 /* Non-generic initialization */
598 VOID
HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock
);
599 VOID
HalpInitPhase1(VOID
);
610 HalpCheckPowerButton(
616 HalpRegisterKdSupportFunctions(
622 HalpSetupPciDeviceForDebugging(
623 IN PVOID LoaderBlock
,
624 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
629 HalpReleasePciDeviceForDebugging(
630 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
638 HalpMapPhysicalMemory64(
639 IN PHYSICAL_ADDRESS PhysicalAddress
,
645 HalpUnmapVirtualAddress(
646 IN PVOID VirtualAddress
,
653 HaliQuerySystemInformation(
654 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
657 OUT PULONG ReturnedLength
662 HaliSetSystemInformation(
663 IN HAL_SET_INFORMATION_CLASS InformationClass
,
673 HalpBiosDisplayReset(
680 PKTRAP_FRAME TrapFrame
690 // Processor Halt Routine
721 // Spinlock for protecting CMOS access
725 HalpAcquireSystemHardwareSpinLock(
731 HalpReleaseCmosSpinLock(
737 HalpAllocPhysicalMemory(
738 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
746 HalpMapPhysicalMemory64(
747 IN PHYSICAL_ADDRESS PhysicalAddress
,
754 IN PHANDLE KeyHandle
,
756 IN PUNICODE_STRING KeyName
,
757 IN ACCESS_MASK DesiredAccess
,
769 HalpGetDebugPortTable(
775 HalpReportSerialNumber(
793 HalpReportResourceUsage(
794 IN PUNICODE_STRING HalName
,
795 IN INTERFACE_TYPE InterfaceType
800 HalpIs16BitPortDecodeSupported(
806 HalpQueryAcpiResourceRequirements(
807 OUT PIO_RESOURCE_REQUIREMENTS_LIST
*Requirements
813 IN PKTRAP_FRAME TrapFrame
,
836 IN PPCI_COMMON_CONFIG PciData
840 #define KfLowerIrql KeLowerIrql
842 /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
843 #define KiAcquireSpinLock(SpinLock)
844 #define KiReleaseSpinLock(SpinLock)
845 #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL);
846 #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql);
847 #endif // !CONFIG_SMP
850 extern BOOLEAN HalpNMIInProgress
;
852 extern ADDRESS_USAGE HalpDefaultIoSpace
;
854 extern KSPIN_LOCK HalpSystemHardwareLock
;
856 extern PADDRESS_USAGE HalpAddressUsageList
;
858 extern LARGE_INTEGER HalpPerfCounter
;
860 extern KAFFINITY HalpActiveProcessors
;
862 extern BOOLEAN HalDisableFirmwareMapper
;
863 extern PWCHAR HalHardwareIdString
;
864 extern PWCHAR HalName
;
866 extern KAFFINITY HalpDefaultInterruptAffinity
;
868 extern IDTUsageFlags HalpIDTUsageFlags
[MAXIMUM_IDTVECTOR
];