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 REGISTERCALL FASTCALL
17 #define REGISTERCALL __attribute__((regparm(3)))
21 #define HAL_BUILD_TYPE (DBG ? PRCB_BUILD_DEBUG : 0)
23 #define HAL_BUILD_TYPE ((DBG ? PRCB_BUILD_DEBUG : 0) | PRCB_BUILD_UNIPROCESSOR)
26 typedef struct _HAL_BIOS_FRAME
33 PKTRAP_FRAME TrapFrame
;
41 } HAL_BIOS_FRAME
, *PHAL_BIOS_FRAME
;
45 (*PHAL_SW_INTERRUPT_HANDLER
)(
52 (FASTCALL
*PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY
)(
53 IN PKTRAP_FRAME TrapFrame
56 #define HAL_APC_REQUEST 0
57 #define HAL_DPC_REQUEST 1
59 /* CMOS Registers and Ports */
60 #define CMOS_CONTROL_PORT (PUCHAR)0x70
61 #define CMOS_DATA_PORT (PUCHAR)0x71
62 #define RTC_REGISTER_A 0x0A
63 #define RTC_REG_A_UIP 0x80
64 #define RTC_REGISTER_B 0x0B
65 #define RTC_REG_B_PI 0x40
66 #define RTC_REGISTER_C 0x0C
67 #define RTC_REG_C_IRQ 0x80
68 #define RTC_REGISTER_D 0x0D
69 #define RTC_REGISTER_CENTURY 0x32
72 #define IDT_REGISTERED 0x01
73 #define IDT_LATCHED 0x02
74 #define IDT_READ_ONLY 0x04
75 #define IDT_INTERNAL 0x11
76 #define IDT_DEVICE 0x21
78 /* Conversion functions */
79 #define BCD_INT(bcd) \
80 (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
81 #define INT_BCD(int) \
82 (UCHAR)(((int / 10) << 4) + (int % 10))
87 #define VIDEO_SERVICES 0x10
90 // Operations for INT 10h (in AH)
92 #define SET_VIDEO_MODE 0x00
95 // Video Modes for INT10h AH=00 (in AL)
97 #define GRAPHICS_MODE_12 0x12 /* 80x30 8x16 640x480 16/256K */
100 // Commonly stated as being 1.19318MHz
102 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
105 // However, the true value is closer to 1.19318181[...]81MHz since this is 1/3rd
106 // of the NTSC color subcarrier frequency which runs at 3.57954545[...]45MHz.
108 // Note that Windows uses 1.193167MHz which seems to have no basis. However, if
109 // one takes the NTSC color subcarrier frequency as being 3.579545 (trimming the
110 // infinite series) and divides it by three, one obtains 1.19318167.
112 // It may be that the original NT HAL source code introduced a typo and turned
113 // 119318167 into 1193167 by ommitting the "18". This is very plausible as the
114 // number is quite long.
116 #define PIT_FREQUENCY 1193182
119 // These ports are controlled by the i8254 Programmable Interrupt Timer (PIT)
121 #define TIMER_CHANNEL0_DATA_PORT 0x40
122 #define TIMER_CHANNEL1_DATA_PORT 0x41
123 #define TIMER_CHANNEL2_DATA_PORT 0x42
124 #define TIMER_CONTROL_PORT 0x43
127 // Mode 0 - Interrupt On Terminal Count
128 // Mode 1 - Hardware Re-triggerable One-Shot
129 // Mode 2 - Rate Generator
130 // Mode 3 - Square Wave Generator
131 // Mode 4 - Software Triggered Strobe
132 // Mode 5 - Hardware Triggered Strobe
134 typedef enum _TIMER_OPERATING_MODES
142 PitOperatingMode2Reserved
,
143 PitOperatingMode5Reserved
144 } TIMER_OPERATING_MODES
;
146 typedef enum _TIMER_ACCESS_MODES
148 PitAccessModeCounterLatch
,
152 } TIMER_ACCESS_MODES
;
154 typedef enum _TIMER_CHANNELS
162 typedef union _TIMER_CONTROL_PORT_REGISTER
167 UCHAR OperatingMode
:3;
172 } TIMER_CONTROL_PORT_REGISTER
, *PTIMER_CONTROL_PORT_REGISTER
;
175 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
178 // This port is controled by the i8255 Programmable Peripheral Interface (PPI)
180 #define SYSTEM_CONTROL_PORT_A 0x92
181 #define SYSTEM_CONTROL_PORT_B 0x61
182 typedef union _SYSTEM_CONTROL_PORT_B_REGISTER
186 UCHAR Timer2GateToSpeaker
:1;
187 UCHAR SpeakerDataEnable
:1;
188 UCHAR ParityCheckEnable
:1;
189 UCHAR ChannelCheckEnable
:1;
190 UCHAR RefreshRequest
:1;
191 UCHAR Timer2Output
:1;
192 UCHAR ChannelCheck
:1;
196 } SYSTEM_CONTROL_PORT_B_REGISTER
, *PSYSTEM_CONTROL_PORT_B_REGISTER
;
199 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
202 // These ports are controlled by the i8259 Programmable Interrupt Controller (PIC)
204 #define PIC1_CONTROL_PORT 0x20
205 #define PIC1_DATA_PORT 0x21
206 #define PIC2_CONTROL_PORT 0xA0
207 #define PIC2_DATA_PORT 0xA1
210 // Definitions for ICW/OCW Bits
212 typedef enum _I8259_ICW1_OPERATING_MODE
216 } I8259_ICW1_OPERATING_MODE
;
218 typedef enum _I8259_ICW1_INTERRUPT_MODE
222 } I8259_ICW1_INTERRUPT_MODE
;
224 typedef enum _I8259_ICW1_INTERVAL
228 } I8259_ICW1_INTERVAL
;
230 typedef enum _I8259_ICW4_SYSTEM_MODE
234 } I8259_ICW4_SYSTEM_MODE
;
236 typedef enum _I8259_ICW4_EOI_MODE
240 } I8259_ICW4_EOI_MODE
;
242 typedef enum _I8259_ICW4_BUFFERED_MODE
248 } I8259_ICW4_BUFFERED_MODE
;
250 typedef enum _I8259_READ_REQUEST
256 } I8259_READ_REQUEST
;
258 typedef enum _I8259_EOI_MODE
271 // Definitions for ICW Registers
273 typedef union _I8259_ICW1
278 UCHAR OperatingMode
:1;
280 UCHAR InterruptMode
:1;
282 UCHAR InterruptVectorAddress
:3;
285 } I8259_ICW1
, *PI8259_ICW1
;
287 typedef union _I8259_ICW2
292 UCHAR InterruptVector
:5;
295 } I8259_ICW2
, *PI8259_ICW2
;
297 typedef union _I8259_ICW3
319 } I8259_ICW3
, *PI8259_ICW3
;
321 typedef union _I8259_ICW4
327 UCHAR BufferedMode
:2;
328 UCHAR SpecialFullyNestedMode
:1;
332 } I8259_ICW4
, *PI8259_ICW4
;
334 typedef union _I8259_OCW2
343 } I8259_OCW2
, *PI8259_OCW2
;
345 typedef union _I8259_OCW3
353 UCHAR SpecialMaskMode
:2;
357 } I8259_OCW3
, *PI8259_OCW3
;
359 typedef union _I8259_ISR
376 } I8259_ISR
, *PI8259_ISR
;
378 typedef I8259_ISR I8259_IDR
, *PI8259_IDR
;
381 // See EISA System Architecture 2nd Edition (Tom Shanley, Don Anderson, John Swindle)
384 // These ports are controlled by the i8259A Programmable Interrupt Controller (PIC)
386 #define EISA_ELCR_MASTER 0x4D0
387 #define EISA_ELCR_SLAVE 0x4D1
389 typedef union _EISA_ELCR
417 } EISA_ELCR
, *PEISA_ELCR
;
419 typedef struct _PIC_MASK
430 } PIC_MASK
, *PPIC_MASK
;
434 ( REGISTERCALL
*PHAL_DISMISS_INTERRUPT
)(
442 HalpDismissIrqGeneric(
482 HalpDismissIrq15Level(
490 HalpDismissIrq13Level(
498 HalpDismissIrq07Level(
505 HalpHardwareInterruptLevel(
512 #define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)
513 #define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)
514 #define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
519 #define HALP_CARD_FEATURE_FULL_DECODE 0x0001
524 #define HALP_CHECK_CARD_REVISION_ID 0x10000
525 #define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000
526 #define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
529 // Mm PTE/PDE to Hal PTE/PDE
531 #define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)
532 #define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
534 typedef struct _IDTUsageFlags
542 UCHAR BusReleativeVector
;
545 typedef struct _HalAddressUsage
547 struct _HalAddressUsage
*Next
;
548 CM_RESOURCE_TYPE Type
;
555 } ADDRESS_USAGE
, *PADDRESS_USAGE
;
558 PADAPTER_OBJECT NTAPI
HalpAllocateAdapterEx(ULONG NumberOfMapRegisters
,BOOLEAN IsMaster
, BOOLEAN Dma32BitAddresses
);
563 HalpRegisterVector(IN UCHAR Flags
,
565 IN ULONG SystemVector
,
570 HalpEnableInterruptHandler(IN UCHAR Flags
,
572 IN ULONG SystemVector
,
575 IN KINTERRUPT_MODE Mode
);
578 VOID NTAPI
HalpInitializePICs(IN BOOLEAN EnableInterrupts
);
579 VOID
HalpApcInterrupt(VOID
);
580 VOID
HalpDispatchInterrupt(VOID
);
581 VOID
HalpDispatchInterrupt2(VOID
);
582 DECLSPEC_NORETURN VOID FASTCALL
HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
583 DECLSPEC_NORETURN VOID FASTCALL
HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
586 extern BOOLEAN HalpProfilingStopped
;
589 VOID NTAPI
HalpInitializeClock(VOID
);
590 VOID
HalpClockInterrupt(VOID
);
591 VOID
HalpProfileInterrupt(VOID
);
595 HalpCalibrateStallExecution(VOID
);
598 VOID
HalpInitPciBus (VOID
);
601 VOID
HalpInitDma (VOID
);
603 /* Non-generic initialization */
604 VOID
HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock
);
605 VOID
HalpInitPhase1(VOID
);
616 HalpCheckPowerButton(
622 HalpRegisterKdSupportFunctions(
628 HalpSetupPciDeviceForDebugging(
629 IN PVOID LoaderBlock
,
630 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
635 HalpReleasePciDeviceForDebugging(
636 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
644 HalpAllocPhysicalMemory(
645 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
646 IN ULONG_PTR MaxAddress
,
647 IN PFN_NUMBER PageCount
,
653 HalpMapPhysicalMemory64(
654 IN PHYSICAL_ADDRESS PhysicalAddress
,
655 IN PFN_COUNT PageCount
660 HalpUnmapVirtualAddress(
661 IN PVOID VirtualAddress
,
662 IN PFN_COUNT NumberPages
668 HaliQuerySystemInformation(
669 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
672 OUT PULONG ReturnedLength
677 HaliSetSystemInformation(
678 IN HAL_SET_INFORMATION_CLASS InformationClass
,
688 HalpBiosDisplayReset(
695 PKTRAP_FRAME TrapFrame
705 // Processor Halt Routine
736 // Spinlock for protecting CMOS access
740 HalpAcquireCmosSpinLock(
746 HalpReleaseCmosSpinLock(
753 IN PHANDLE KeyHandle
,
755 IN PUNICODE_STRING KeyName
,
756 IN ACCESS_MASK DesiredAccess
,
768 HalpGetDebugPortTable(
774 HalpReportSerialNumber(
792 HalpReportResourceUsage(
793 IN PUNICODE_STRING HalName
,
794 IN INTERFACE_TYPE InterfaceType
799 HalpIs16BitPortDecodeSupported(
805 HalpQueryAcpiResourceRequirements(
806 OUT PIO_RESOURCE_REQUIREMENTS_LIST
*Requirements
812 IN PKTRAP_FRAME TrapFrame
,
835 IN PPCI_COMMON_CONFIG PciData
841 IN ULONG ProcessorNumber
,
842 IN PLOADER_PARAMETER_BLOCK LoaderBlock
846 #define KfLowerIrql KeLowerIrql
847 #define KiEnterInterruptTrap(TrapFrame) /* We do all neccessary in asm code */
848 #define KiEoiHelper(TrapFrame) return /* Just return to the caller */
849 #define HalBeginSystemInterrupt(Irql, Vector, OldIrql) ((*(OldIrql) = PASSIVE_LEVEL), TRUE)
851 /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
852 #define KiAcquireSpinLock(SpinLock)
853 #define KiReleaseSpinLock(SpinLock)
854 #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL);
855 #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql);
856 #endif // !CONFIG_SMP
859 extern BOOLEAN HalpNMIInProgress
;
861 extern ADDRESS_USAGE HalpDefaultIoSpace
;
863 extern KSPIN_LOCK HalpSystemHardwareLock
;
865 extern PADDRESS_USAGE HalpAddressUsageList
;
867 extern LARGE_INTEGER HalpPerfCounter
;
869 extern KAFFINITY HalpActiveProcessors
;
871 extern BOOLEAN HalDisableFirmwareMapper
;
872 extern PWCHAR HalHardwareIdString
;
873 extern PWCHAR HalName
;
875 extern KAFFINITY HalpDefaultInterruptAffinity
;
877 extern IDTUsageFlags HalpIDTUsageFlags
[MAXIMUM_IDTVECTOR
+1];
879 extern const USHORT HalpBuildType
;