7 #if defined(__GNUC__) && !defined(_MINIHAL_)
8 #define INIT_SECTION __attribute__((section ("INIT")))
10 #define INIT_SECTION /* Done via alloc_text for MSC */
15 #define HAL_BUILD_TYPE (DBG ? PRCB_BUILD_DEBUG : 0)
17 #define HAL_BUILD_TYPE ((DBG ? PRCB_BUILD_DEBUG : 0) | PRCB_BUILD_UNIPROCESSOR)
20 typedef struct _HAL_BIOS_FRAME
27 PKTRAP_FRAME TrapFrame
;
35 } HAL_BIOS_FRAME
, *PHAL_BIOS_FRAME
;
39 (__cdecl
*PHAL_SW_INTERRUPT_HANDLER
)(
45 (FASTCALL
*PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY
)(
46 IN PKTRAP_FRAME TrapFrame
49 #define HAL_APC_REQUEST 0
50 #define HAL_DPC_REQUEST 1
52 /* CMOS Registers and Ports */
53 #define CMOS_CONTROL_PORT (PUCHAR)0x70
54 #define CMOS_DATA_PORT (PUCHAR)0x71
55 #define RTC_REGISTER_A 0x0A
56 #define RTC_REG_A_UIP 0x80
57 #define RTC_REGISTER_B 0x0B
58 #define RTC_REG_B_PI 0x40
59 #define RTC_REGISTER_C 0x0C
60 #define RTC_REG_C_IRQ 0x80
61 #define RTC_REGISTER_D 0x0D
62 #define RTC_REGISTER_CENTURY 0x32
65 #define IDT_REGISTERED 0x01
66 #define IDT_LATCHED 0x02
67 #define IDT_READ_ONLY 0x04
68 #define IDT_INTERNAL 0x11
69 #define IDT_DEVICE 0x21
71 /* Conversion functions */
72 #define BCD_INT(bcd) \
73 (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
74 #define INT_BCD(int) \
75 (UCHAR)(((int / 10) << 4) + (int % 10))
80 #define VIDEO_SERVICES 0x10
83 // Operations for INT 10h (in AH)
85 #define SET_VIDEO_MODE 0x00
88 // Video Modes for INT10h AH=00 (in AL)
90 #define GRAPHICS_MODE_12 0x12 /* 80x30 8x16 640x480 16/256K */
93 // Commonly stated as being 1.19318MHz
95 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
98 // However, the true value is closer to 1.19318181[...]81MHz since this is 1/3rd
99 // of the NTSC color subcarrier frequency which runs at 3.57954545[...]45MHz.
101 // Note that Windows uses 1.193167MHz which seems to have no basis. However, if
102 // one takes the NTSC color subcarrier frequency as being 3.579545 (trimming the
103 // infinite series) and divides it by three, one obtains 1.19318167.
105 // It may be that the original NT HAL source code introduced a typo and turned
106 // 119318167 into 1193167 by ommitting the "18". This is very plausible as the
107 // number is quite long.
109 #define PIT_FREQUENCY 1193182
112 // These ports are controlled by the i8254 Programmable Interrupt Timer (PIT)
114 #define TIMER_CHANNEL0_DATA_PORT 0x40
115 #define TIMER_CHANNEL1_DATA_PORT 0x41
116 #define TIMER_CHANNEL2_DATA_PORT 0x42
117 #define TIMER_CONTROL_PORT 0x43
120 // Mode 0 - Interrupt On Terminal Count
121 // Mode 1 - Hardware Re-triggerable One-Shot
122 // Mode 2 - Rate Generator
123 // Mode 3 - Square Wave Generator
124 // Mode 4 - Software Triggered Strobe
125 // Mode 5 - Hardware Triggered Strobe
127 typedef enum _TIMER_OPERATING_MODES
135 PitOperatingMode2Reserved
,
136 PitOperatingMode5Reserved
137 } TIMER_OPERATING_MODES
;
139 typedef enum _TIMER_ACCESS_MODES
141 PitAccessModeCounterLatch
,
145 } TIMER_ACCESS_MODES
;
147 typedef enum _TIMER_CHANNELS
155 typedef union _TIMER_CONTROL_PORT_REGISTER
160 UCHAR OperatingMode
:3;
165 } TIMER_CONTROL_PORT_REGISTER
, *PTIMER_CONTROL_PORT_REGISTER
;
168 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
171 // This port is controled by the i8255 Programmable Peripheral Interface (PPI)
173 #define SYSTEM_CONTROL_PORT_A 0x92
174 #define SYSTEM_CONTROL_PORT_B 0x61
175 typedef union _SYSTEM_CONTROL_PORT_B_REGISTER
179 UCHAR Timer2GateToSpeaker
:1;
180 UCHAR SpeakerDataEnable
:1;
181 UCHAR ParityCheckEnable
:1;
182 UCHAR ChannelCheckEnable
:1;
183 UCHAR RefreshRequest
:1;
184 UCHAR Timer2Output
:1;
185 UCHAR ChannelCheck
:1;
189 } SYSTEM_CONTROL_PORT_B_REGISTER
, *PSYSTEM_CONTROL_PORT_B_REGISTER
;
192 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
195 // These ports are controlled by the i8259 Programmable Interrupt Controller (PIC)
197 #define PIC1_CONTROL_PORT 0x20
198 #define PIC1_DATA_PORT 0x21
199 #define PIC2_CONTROL_PORT 0xA0
200 #define PIC2_DATA_PORT 0xA1
203 // Definitions for ICW/OCW Bits
205 typedef enum _I8259_ICW1_OPERATING_MODE
209 } I8259_ICW1_OPERATING_MODE
;
211 typedef enum _I8259_ICW1_INTERRUPT_MODE
215 } I8259_ICW1_INTERRUPT_MODE
;
217 typedef enum _I8259_ICW1_INTERVAL
221 } I8259_ICW1_INTERVAL
;
223 typedef enum _I8259_ICW4_SYSTEM_MODE
227 } I8259_ICW4_SYSTEM_MODE
;
229 typedef enum _I8259_ICW4_EOI_MODE
233 } I8259_ICW4_EOI_MODE
;
235 typedef enum _I8259_ICW4_BUFFERED_MODE
241 } I8259_ICW4_BUFFERED_MODE
;
243 typedef enum _I8259_READ_REQUEST
249 } I8259_READ_REQUEST
;
251 typedef enum _I8259_EOI_MODE
264 // Definitions for ICW Registers
266 typedef union _I8259_ICW1
271 UCHAR OperatingMode
:1;
273 UCHAR InterruptMode
:1;
275 UCHAR InterruptVectorAddress
:3;
278 } I8259_ICW1
, *PI8259_ICW1
;
280 typedef union _I8259_ICW2
285 UCHAR InterruptVector
:5;
288 } I8259_ICW2
, *PI8259_ICW2
;
290 typedef union _I8259_ICW3
312 } I8259_ICW3
, *PI8259_ICW3
;
314 typedef union _I8259_ICW4
320 UCHAR BufferedMode
:2;
321 UCHAR SpecialFullyNestedMode
:1;
325 } I8259_ICW4
, *PI8259_ICW4
;
327 typedef union _I8259_OCW2
336 } I8259_OCW2
, *PI8259_OCW2
;
338 typedef union _I8259_OCW3
346 UCHAR SpecialMaskMode
:2;
350 } I8259_OCW3
, *PI8259_OCW3
;
352 typedef union _I8259_ISR
369 } I8259_ISR
, *PI8259_ISR
;
371 typedef I8259_ISR I8259_IDR
, *PI8259_IDR
;
374 // See EISA System Architecture 2nd Edition (Tom Shanley, Don Anderson, John Swindle)
377 // These ports are controlled by the i8259A Programmable Interrupt Controller (PIC)
379 #define EISA_ELCR_MASTER 0x4D0
380 #define EISA_ELCR_SLAVE 0x4D1
382 typedef union _EISA_ELCR
410 } EISA_ELCR
, *PEISA_ELCR
;
412 typedef struct _PIC_MASK
423 } PIC_MASK
, *PPIC_MASK
;
427 (NTAPI
*PHAL_DISMISS_INTERRUPT
)(
435 HalpDismissIrqGeneric(
475 HalpDismissIrq15Level(
483 HalpDismissIrq13Level(
491 HalpDismissIrq07Level(
499 HalpHardwareInterruptLevel(
506 #define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)
507 #define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)
508 #define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
513 #define HALP_CARD_FEATURE_FULL_DECODE 0x0001
518 #define HALP_CHECK_CARD_REVISION_ID 0x10000
519 #define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000
520 #define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
523 // Mm PTE/PDE to Hal PTE/PDE
525 #define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)
526 #define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
528 typedef struct _IDTUsageFlags
536 UCHAR BusReleativeVector
;
539 typedef struct _HalAddressUsage
541 struct _HalAddressUsage
*Next
;
542 CM_RESOURCE_TYPE Type
;
549 } ADDRESS_USAGE
, *PADDRESS_USAGE
;
552 PADAPTER_OBJECT NTAPI
HalpAllocateAdapterEx(ULONG NumberOfMapRegisters
,BOOLEAN IsMaster
, BOOLEAN Dma32BitAddresses
);
557 HalpRegisterVector(IN UCHAR Flags
,
559 IN ULONG SystemVector
,
564 HalpEnableInterruptHandler(IN UCHAR Flags
,
566 IN ULONG SystemVector
,
569 IN KINTERRUPT_MODE Mode
);
572 VOID NTAPI
HalpInitializePICs(IN BOOLEAN EnableInterrupts
);
573 VOID __cdecl
HalpApcInterrupt(VOID
);
574 VOID __cdecl
HalpDispatchInterrupt(VOID
);
575 VOID __cdecl
HalpDispatchInterrupt2(VOID
);
576 DECLSPEC_NORETURN VOID FASTCALL
HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
577 DECLSPEC_NORETURN VOID FASTCALL
HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
580 extern BOOLEAN HalpProfilingStopped
;
583 VOID NTAPI
HalpInitializeClock(VOID
);
584 VOID __cdecl
HalpClockInterrupt(VOID
);
585 VOID __cdecl
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 HalpAllocPhysicalMemory(
639 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
640 IN ULONG_PTR MaxAddress
,
641 IN PFN_NUMBER PageCount
,
647 HalpMapPhysicalMemory64(
648 IN PHYSICAL_ADDRESS PhysicalAddress
,
649 IN PFN_COUNT PageCount
654 HalpUnmapVirtualAddress(
655 IN PVOID VirtualAddress
,
656 IN PFN_COUNT NumberPages
662 HaliQuerySystemInformation(
663 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
666 OUT PULONG ReturnedLength
671 HaliSetSystemInformation(
672 IN HAL_SET_INFORMATION_CLASS InformationClass
,
682 HalpBiosDisplayReset(
689 PKTRAP_FRAME TrapFrame
699 // Processor Halt Routine
730 // Spinlock for protecting CMOS access
734 HalpAcquireCmosSpinLock(
740 HalpReleaseCmosSpinLock(
747 IN PHANDLE KeyHandle
,
749 IN PUNICODE_STRING KeyName
,
750 IN ACCESS_MASK DesiredAccess
,
762 HalpGetDebugPortTable(
768 HalpReportSerialNumber(
786 HalpReportResourceUsage(
787 IN PUNICODE_STRING HalName
,
788 IN INTERFACE_TYPE InterfaceType
793 HalpIs16BitPortDecodeSupported(
799 HalpQueryAcpiResourceRequirements(
800 OUT PIO_RESOURCE_REQUIREMENTS_LIST
*Requirements
806 IN PKTRAP_FRAME TrapFrame
,
829 IN PPCI_COMMON_CONFIG PciData
835 IN ULONG ProcessorNumber
,
836 IN PLOADER_PARAMETER_BLOCK LoaderBlock
840 #define KfLowerIrql KeLowerIrql
841 #define KiEnterInterruptTrap(TrapFrame) /* We do all neccessary in asm code */
842 #define KiEoiHelper(TrapFrame) return /* Just return to the caller */
843 #define HalBeginSystemInterrupt(Irql, Vector, OldIrql) ((*(OldIrql) = PASSIVE_LEVEL), TRUE)
845 /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
846 #define KiAcquireSpinLock(SpinLock)
847 #define KiReleaseSpinLock(SpinLock)
848 #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL);
849 #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql);
850 #endif // !CONFIG_SMP
853 extern BOOLEAN HalpNMIInProgress
;
855 extern ADDRESS_USAGE HalpDefaultIoSpace
;
857 extern KSPIN_LOCK HalpSystemHardwareLock
;
859 extern PADDRESS_USAGE HalpAddressUsageList
;
861 extern LARGE_INTEGER HalpPerfCounter
;
863 extern KAFFINITY HalpActiveProcessors
;
865 extern BOOLEAN HalDisableFirmwareMapper
;
866 extern PWCHAR HalHardwareIdString
;
867 extern PWCHAR HalName
;
869 extern KAFFINITY HalpDefaultInterruptAffinity
;
871 extern IDTUsageFlags HalpIDTUsageFlags
[MAXIMUM_IDTVECTOR
+1];
873 extern const USHORT HalpBuildType
;