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)))
25 #define HAL_BUILD_TYPE (DBG ? PRCB_BUILD_DEBUG : 0)
27 #define HAL_BUILD_TYPE ((DBG ? PRCB_BUILD_DEBUG : 0) | PRCB_BUILD_UNIPROCESSOR)
30 typedef struct _HAL_BIOS_FRAME
37 PKTRAP_FRAME TrapFrame
;
45 } HAL_BIOS_FRAME
, *PHAL_BIOS_FRAME
;
49 (*PHAL_SW_INTERRUPT_HANDLER
)(
56 (FASTCALL
*PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY
)(
57 IN PKTRAP_FRAME TrapFrame
60 #define HAL_APC_REQUEST 0
61 #define HAL_DPC_REQUEST 1
63 /* CMOS Registers and Ports */
64 #define CMOS_CONTROL_PORT (PUCHAR)0x70
65 #define CMOS_DATA_PORT (PUCHAR)0x71
66 #define RTC_REGISTER_A 0x0A
67 #define RTC_REG_A_UIP 0x80
68 #define RTC_REGISTER_B 0x0B
69 #define RTC_REG_B_PI 0x40
70 #define RTC_REGISTER_C 0x0C
71 #define RTC_REG_C_IRQ 0x80
72 #define RTC_REGISTER_D 0x0D
73 #define RTC_REGISTER_CENTURY 0x32
76 #define IDT_REGISTERED 0x01
77 #define IDT_LATCHED 0x02
78 #define IDT_READ_ONLY 0x04
79 #define IDT_INTERNAL 0x11
80 #define IDT_DEVICE 0x21
82 /* Conversion functions */
83 #define BCD_INT(bcd) \
84 (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
85 #define INT_BCD(int) \
86 (UCHAR)(((int / 10) << 4) + (int % 10))
91 #define VIDEO_SERVICES 0x10
94 // Operations for INT 10h (in AH)
96 #define SET_VIDEO_MODE 0x00
99 // Video Modes for INT10h AH=00 (in AL)
101 #define GRAPHICS_MODE_12 0x12 /* 80x30 8x16 640x480 16/256K */
104 // Commonly stated as being 1.19318MHz
106 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
109 // However, the true value is closer to 1.19318181[...]81MHz since this is 1/3rd
110 // of the NTSC color subcarrier frequency which runs at 3.57954545[...]45MHz.
112 // Note that Windows uses 1.193167MHz which seems to have no basis. However, if
113 // one takes the NTSC color subcarrier frequency as being 3.579545 (trimming the
114 // infinite series) and divides it by three, one obtains 1.19318167.
116 // It may be that the original NT HAL source code introduced a typo and turned
117 // 119318167 into 1193167 by ommitting the "18". This is very plausible as the
118 // number is quite long.
120 #define PIT_FREQUENCY 1193182
123 // These ports are controlled by the i8254 Programmable Interrupt Timer (PIT)
125 #define TIMER_CHANNEL0_DATA_PORT 0x40
126 #define TIMER_CHANNEL1_DATA_PORT 0x41
127 #define TIMER_CHANNEL2_DATA_PORT 0x42
128 #define TIMER_CONTROL_PORT 0x43
131 // Mode 0 - Interrupt On Terminal Count
132 // Mode 1 - Hardware Re-triggerable One-Shot
133 // Mode 2 - Rate Generator
134 // Mode 3 - Square Wave Generator
135 // Mode 4 - Software Triggered Strobe
136 // Mode 5 - Hardware Triggered Strobe
138 typedef enum _TIMER_OPERATING_MODES
146 PitOperatingMode2Reserved
,
147 PitOperatingMode5Reserved
148 } TIMER_OPERATING_MODES
;
150 typedef enum _TIMER_ACCESS_MODES
152 PitAccessModeCounterLatch
,
156 } TIMER_ACCESS_MODES
;
158 typedef enum _TIMER_CHANNELS
166 typedef union _TIMER_CONTROL_PORT_REGISTER
171 UCHAR OperatingMode
:3;
176 } TIMER_CONTROL_PORT_REGISTER
, *PTIMER_CONTROL_PORT_REGISTER
;
179 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
182 // This port is controled by the i8255 Programmable Peripheral Interface (PPI)
184 #define SYSTEM_CONTROL_PORT_A 0x92
185 #define SYSTEM_CONTROL_PORT_B 0x61
186 typedef union _SYSTEM_CONTROL_PORT_B_REGISTER
190 UCHAR Timer2GateToSpeaker
:1;
191 UCHAR SpeakerDataEnable
:1;
192 UCHAR ParityCheckEnable
:1;
193 UCHAR ChannelCheckEnable
:1;
194 UCHAR RefreshRequest
:1;
195 UCHAR Timer2Output
:1;
196 UCHAR ChannelCheck
:1;
200 } SYSTEM_CONTROL_PORT_B_REGISTER
, *PSYSTEM_CONTROL_PORT_B_REGISTER
;
203 // See ISA System Architecture 3rd Edition (Tom Shanley, Don Anderson, John Swindle)
206 // These ports are controlled by the i8259 Programmable Interrupt Controller (PIC)
208 #define PIC1_CONTROL_PORT 0x20
209 #define PIC1_DATA_PORT 0x21
210 #define PIC2_CONTROL_PORT 0xA0
211 #define PIC2_DATA_PORT 0xA1
214 // Definitions for ICW/OCW Bits
216 typedef enum _I8259_ICW1_OPERATING_MODE
220 } I8259_ICW1_OPERATING_MODE
;
222 typedef enum _I8259_ICW1_INTERRUPT_MODE
226 } I8259_ICW1_INTERRUPT_MODE
;
228 typedef enum _I8259_ICW1_INTERVAL
232 } I8259_ICW1_INTERVAL
;
234 typedef enum _I8259_ICW4_SYSTEM_MODE
238 } I8259_ICW4_SYSTEM_MODE
;
240 typedef enum _I8259_ICW4_EOI_MODE
244 } I8259_ICW4_EOI_MODE
;
246 typedef enum _I8259_ICW4_BUFFERED_MODE
252 } I8259_ICW4_BUFFERED_MODE
;
254 typedef enum _I8259_READ_REQUEST
260 } I8259_READ_REQUEST
;
262 typedef enum _I8259_EOI_MODE
275 // Definitions for ICW Registers
277 typedef union _I8259_ICW1
282 UCHAR OperatingMode
:1;
284 UCHAR InterruptMode
:1;
286 UCHAR InterruptVectorAddress
:3;
289 } I8259_ICW1
, *PI8259_ICW1
;
291 typedef union _I8259_ICW2
296 UCHAR InterruptVector
:5;
299 } I8259_ICW2
, *PI8259_ICW2
;
301 typedef union _I8259_ICW3
323 } I8259_ICW3
, *PI8259_ICW3
;
325 typedef union _I8259_ICW4
331 UCHAR BufferedMode
:2;
332 UCHAR SpecialFullyNestedMode
:1;
336 } I8259_ICW4
, *PI8259_ICW4
;
338 typedef union _I8259_OCW2
347 } I8259_OCW2
, *PI8259_OCW2
;
349 typedef union _I8259_OCW3
357 UCHAR SpecialMaskMode
:2;
361 } I8259_OCW3
, *PI8259_OCW3
;
363 typedef union _I8259_ISR
380 } I8259_ISR
, *PI8259_ISR
;
382 typedef I8259_ISR I8259_IDR
, *PI8259_IDR
;
385 // See EISA System Architecture 2nd Edition (Tom Shanley, Don Anderson, John Swindle)
388 // These ports are controlled by the i8259A Programmable Interrupt Controller (PIC)
390 #define EISA_ELCR_MASTER 0x4D0
391 #define EISA_ELCR_SLAVE 0x4D1
393 typedef union _EISA_ELCR
421 } EISA_ELCR
, *PEISA_ELCR
;
423 typedef struct _PIC_MASK
434 } PIC_MASK
, *PPIC_MASK
;
438 ( REGISTERCALL
*PHAL_DISMISS_INTERRUPT
)(
446 HalpDismissIrqGeneric(
486 HalpDismissIrq15Level(
494 HalpDismissIrq13Level(
502 HalpDismissIrq07Level(
509 HalpHardwareInterruptLevel(
516 #define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)
517 #define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)
518 #define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
523 #define HALP_CARD_FEATURE_FULL_DECODE 0x0001
528 #define HALP_CHECK_CARD_REVISION_ID 0x10000
529 #define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000
530 #define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
533 // Mm PTE/PDE to Hal PTE/PDE
535 #define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)
536 #define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
538 typedef struct _IDTUsageFlags
546 UCHAR BusReleativeVector
;
549 typedef struct _HalAddressUsage
551 struct _HalAddressUsage
*Next
;
552 CM_RESOURCE_TYPE Type
;
559 } ADDRESS_USAGE
, *PADDRESS_USAGE
;
562 PADAPTER_OBJECT NTAPI
HalpAllocateAdapterEx(ULONG NumberOfMapRegisters
,BOOLEAN IsMaster
, BOOLEAN Dma32BitAddresses
);
567 HalpRegisterVector(IN UCHAR Flags
,
569 IN ULONG SystemVector
,
574 HalpEnableInterruptHandler(IN UCHAR Flags
,
576 IN ULONG SystemVector
,
579 IN KINTERRUPT_MODE Mode
);
582 VOID NTAPI
HalpInitializePICs(IN BOOLEAN EnableInterrupts
);
583 VOID
HalpApcInterrupt(VOID
);
584 VOID
HalpDispatchInterrupt(VOID
);
585 VOID
HalpDispatchInterrupt2(VOID
);
586 DECLSPEC_NORETURN VOID FASTCALL
HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
587 DECLSPEC_NORETURN VOID FASTCALL
HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame
);
590 extern BOOLEAN HalpProfilingStopped
;
593 VOID NTAPI
HalpInitializeClock(VOID
);
594 VOID
HalpClockInterrupt(VOID
);
595 VOID
HalpProfileInterrupt(VOID
);
599 HalpCalibrateStallExecution(VOID
);
602 VOID
HalpInitPciBus (VOID
);
605 VOID
HalpInitDma (VOID
);
607 /* Non-generic initialization */
608 VOID
HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock
);
609 VOID
HalpInitPhase1(VOID
);
620 HalpCheckPowerButton(
626 HalpRegisterKdSupportFunctions(
632 HalpSetupPciDeviceForDebugging(
633 IN PVOID LoaderBlock
,
634 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
639 HalpReleasePciDeviceForDebugging(
640 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
648 HalpAllocPhysicalMemory(
649 IN PLOADER_PARAMETER_BLOCK LoaderBlock
,
650 IN ULONG_PTR MaxAddress
,
651 IN PFN_NUMBER PageCount
,
657 HalpMapPhysicalMemory64(
658 IN PHYSICAL_ADDRESS PhysicalAddress
,
659 IN PFN_COUNT PageCount
664 HalpUnmapVirtualAddress(
665 IN PVOID VirtualAddress
,
666 IN PFN_COUNT NumberPages
672 HaliQuerySystemInformation(
673 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
676 OUT PULONG ReturnedLength
681 HaliSetSystemInformation(
682 IN HAL_SET_INFORMATION_CLASS InformationClass
,
692 HalpBiosDisplayReset(
699 PKTRAP_FRAME TrapFrame
709 // Processor Halt Routine
740 // Spinlock for protecting CMOS access
744 HalpAcquireCmosSpinLock(
750 HalpReleaseCmosSpinLock(
757 IN PHANDLE KeyHandle
,
759 IN PUNICODE_STRING KeyName
,
760 IN ACCESS_MASK DesiredAccess
,
772 HalpGetDebugPortTable(
778 HalpReportSerialNumber(
796 HalpReportResourceUsage(
797 IN PUNICODE_STRING HalName
,
798 IN INTERFACE_TYPE InterfaceType
803 HalpIs16BitPortDecodeSupported(
809 HalpQueryAcpiResourceRequirements(
810 OUT PIO_RESOURCE_REQUIREMENTS_LIST
*Requirements
816 IN PKTRAP_FRAME TrapFrame
,
839 IN PPCI_COMMON_CONFIG PciData
845 IN ULONG ProcessorNumber
,
846 IN PLOADER_PARAMETER_BLOCK LoaderBlock
850 #define KfLowerIrql KeLowerIrql
851 #define KiEnterInterruptTrap(TrapFrame) /* We do all neccessary in asm code */
852 #define KiEoiHelper(TrapFrame) return /* Just return to the caller */
853 #define HalBeginSystemInterrupt(Irql, Vector, OldIrql) ((*(OldIrql) = PASSIVE_LEVEL), TRUE)
855 /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
856 #define KiAcquireSpinLock(SpinLock)
857 #define KiReleaseSpinLock(SpinLock)
858 #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL);
859 #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql);
860 #endif // !CONFIG_SMP
863 extern BOOLEAN HalpNMIInProgress
;
865 extern ADDRESS_USAGE HalpDefaultIoSpace
;
867 extern KSPIN_LOCK HalpSystemHardwareLock
;
869 extern PADDRESS_USAGE HalpAddressUsageList
;
871 extern LARGE_INTEGER HalpPerfCounter
;
873 extern KAFFINITY HalpActiveProcessors
;
875 extern BOOLEAN HalDisableFirmwareMapper
;
876 extern PWCHAR HalHardwareIdString
;
877 extern PWCHAR HalName
;
879 extern KAFFINITY HalpDefaultInterruptAffinity
;
881 extern IDTUsageFlags HalpIDTUsageFlags
[MAXIMUM_IDTVECTOR
+1];
883 extern const USHORT HalpBuildType
;