1 /* 2 * 3 */ 4 5 #pragma once 6 7 #ifdef CONFIG_SMP 8 #define HAL_BUILD_TYPE (DBG ? PRCB_BUILD_DEBUG : 0) 9 #else 10 #define HAL_BUILD_TYPE ((DBG ? PRCB_BUILD_DEBUG : 0) | PRCB_BUILD_UNIPROCESSOR) 11 #endif 12 13 typedef struct _HAL_BIOS_FRAME 14 { 15 ULONG SegSs; 16 ULONG Esp; 17 ULONG EFlags; 18 ULONG SegCs; 19 ULONG Eip; 20 PKTRAP_FRAME TrapFrame; 21 ULONG CsLimit; 22 ULONG CsBase; 23 ULONG CsFlags; 24 ULONG SsLimit; 25 ULONG SsBase; 26 ULONG SsFlags; 27 ULONG Prefix; 28 } HAL_BIOS_FRAME, *PHAL_BIOS_FRAME; 29 30 typedef 31 VOID 32 (__cdecl *PHAL_SW_INTERRUPT_HANDLER)( 33 VOID 34 ); 35 36 typedef 37 VOID 38 (FASTCALL *PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY)( 39 IN PKTRAP_FRAME TrapFrame 40 ); 41 42 #define HAL_APC_REQUEST 0 43 #define HAL_DPC_REQUEST 1 44 45 /* HAL profiling offsets in KeGetPcr()->HalReserved[] */ 46 #define HAL_PROFILING_INTERVAL 0 47 #define HAL_PROFILING_MULTIPLIER 1 48 49 /* Usage flags */ 50 #define IDT_REGISTERED 0x01 51 #define IDT_LATCHED 0x02 52 #define IDT_READ_ONLY 0x04 53 #define IDT_INTERNAL 0x11 54 #define IDT_DEVICE 0x21 55 56 /* Conversion functions */ 57 #define BCD_INT(bcd) \ 58 (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F)) 59 #define INT_BCD(int) \ 60 (UCHAR)(((int / 10) << 4) + (int % 10)) 61 62 typedef 63 BOOLEAN 64 (NTAPI *PHAL_DISMISS_INTERRUPT)( 65 IN KIRQL Irql, 66 IN ULONG Irq, 67 OUT PKIRQL OldIrql 68 ); 69 70 BOOLEAN 71 NTAPI 72 HalpDismissIrqGeneric( 73 IN KIRQL Irql, 74 IN ULONG Irq, 75 OUT PKIRQL OldIrql 76 ); 77 78 BOOLEAN 79 NTAPI 80 HalpDismissIrq15( 81 IN KIRQL Irql, 82 IN ULONG Irq, 83 OUT PKIRQL OldIrql 84 ); 85 86 BOOLEAN 87 NTAPI 88 HalpDismissIrq13( 89 IN KIRQL Irql, 90 IN ULONG Irq, 91 OUT PKIRQL OldIrql 92 ); 93 94 BOOLEAN 95 NTAPI 96 HalpDismissIrq07( 97 IN KIRQL Irql, 98 IN ULONG Irq, 99 OUT PKIRQL OldIrql 100 ); 101 102 BOOLEAN 103 NTAPI 104 HalpDismissIrqLevel( 105 IN KIRQL Irql, 106 IN ULONG Irq, 107 OUT PKIRQL OldIrql 108 ); 109 110 BOOLEAN 111 NTAPI 112 HalpDismissIrq15Level( 113 IN KIRQL Irql, 114 IN ULONG Irq, 115 OUT PKIRQL OldIrql 116 ); 117 118 BOOLEAN 119 NTAPI 120 HalpDismissIrq13Level( 121 IN KIRQL Irql, 122 IN ULONG Irq, 123 OUT PKIRQL OldIrql 124 ); 125 126 BOOLEAN 127 NTAPI 128 HalpDismissIrq07Level( 129 IN KIRQL Irql, 130 IN ULONG Irq, 131 OUT PKIRQL OldIrql 132 ); 133 134 VOID 135 __cdecl 136 HalpHardwareInterruptLevel( 137 VOID 138 ); 139 140 // 141 // Hack Flags 142 // 143 #define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24) 144 #define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12) 145 #define HALP_HACK_FLAGS(x) ((x) & 0xFFF) 146 147 // 148 // Feature flags 149 // 150 #define HALP_CARD_FEATURE_FULL_DECODE 0x0001 151 152 // 153 // Match Flags 154 // 155 #define HALP_CHECK_CARD_REVISION_ID 0x10000 156 #define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000 157 #define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000 158 159 // 160 // Mm PTE/PDE to Hal PTE/PDE 161 // 162 #define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x) 163 #define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x) 164 165 typedef struct _IDTUsageFlags 166 { 167 UCHAR Flags; 168 } IDTUsageFlags; 169 170 typedef struct 171 { 172 KIRQL Irql; 173 UCHAR BusReleativeVector; 174 } IDTUsage; 175 176 typedef struct _HalAddressUsage 177 { 178 struct _HalAddressUsage *Next; 179 CM_RESOURCE_TYPE Type; 180 UCHAR Flags; 181 struct 182 { 183 ULONG Start; 184 ULONG Length; 185 } Element[]; 186 } ADDRESS_USAGE, *PADDRESS_USAGE; 187 188 /* adapter.c */ 189 PADAPTER_OBJECT NTAPI HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses); 190 191 /* sysinfo.c */ 192 INIT_FUNCTION 193 VOID 194 NTAPI 195 HalpRegisterVector(IN UCHAR Flags, 196 IN ULONG BusVector, 197 IN ULONG SystemVector, 198 IN KIRQL Irql); 199 200 INIT_FUNCTION 201 VOID 202 NTAPI 203 HalpEnableInterruptHandler(IN UCHAR Flags, 204 IN ULONG BusVector, 205 IN ULONG SystemVector, 206 IN KIRQL Irql, 207 IN PVOID Handler, 208 IN KINTERRUPT_MODE Mode); 209 210 /* pic.c */ 211 VOID NTAPI HalpInitializePICs(IN BOOLEAN EnableInterrupts); 212 VOID __cdecl HalpApcInterrupt(VOID); 213 VOID __cdecl HalpDispatchInterrupt(VOID); 214 PHAL_SW_INTERRUPT_HANDLER __cdecl HalpDispatchInterrupt2(VOID); 215 DECLSPEC_NORETURN VOID FASTCALL HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame); 216 DECLSPEC_NORETURN VOID FASTCALL HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame); 217 218 /* profil.c */ 219 extern BOOLEAN HalpProfilingStopped; 220 221 /* timer.c */ 222 INIT_FUNCTION VOID NTAPI HalpInitializeClock(VOID); 223 VOID __cdecl HalpClockInterrupt(VOID); 224 VOID __cdecl HalpProfileInterrupt(VOID); 225 226 VOID 227 NTAPI 228 HalpCalibrateStallExecution(VOID); 229 230 /* pci.c */ 231 VOID HalpInitPciBus (VOID); 232 233 /* dma.c */ 234 INIT_FUNCTION VOID HalpInitDma (VOID); 235 236 /* Non-generic initialization */ 237 VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock); 238 VOID HalpInitPhase1(VOID); 239 240 VOID 241 NTAPI 242 HalpFlushTLB(VOID); 243 244 // 245 // KD Support 246 // 247 VOID 248 NTAPI 249 HalpCheckPowerButton( 250 VOID 251 ); 252 253 INIT_FUNCTION 254 VOID 255 NTAPI 256 HalpRegisterKdSupportFunctions( 257 VOID 258 ); 259 260 INIT_FUNCTION 261 NTSTATUS 262 NTAPI 263 HalpSetupPciDeviceForDebugging( 264 IN PVOID LoaderBlock, 265 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice 266 ); 267 268 INIT_FUNCTION 269 NTSTATUS 270 NTAPI 271 HalpReleasePciDeviceForDebugging( 272 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice 273 ); 274 275 // 276 // Memory routines 277 // 278 ULONG64 279 NTAPI 280 HalpAllocPhysicalMemory( 281 IN PLOADER_PARAMETER_BLOCK LoaderBlock, 282 IN ULONG64 MaxAddress, 283 IN PFN_NUMBER PageCount, 284 IN BOOLEAN Aligned 285 ); 286 287 PVOID 288 NTAPI 289 HalpMapPhysicalMemory64Vista( 290 IN PHYSICAL_ADDRESS PhysicalAddress, 291 IN PFN_COUNT PageCount, 292 IN BOOLEAN FlushCurrentTLB 293 ); 294 295 VOID 296 NTAPI 297 HalpUnmapVirtualAddressVista( 298 IN PVOID VirtualAddress, 299 IN PFN_COUNT NumberPages, 300 IN BOOLEAN FlushCurrentTLB 301 ); 302 303 PVOID 304 NTAPI 305 HalpMapPhysicalMemory64( 306 IN PHYSICAL_ADDRESS PhysicalAddress, 307 IN PFN_COUNT PageCount 308 ); 309 310 VOID 311 NTAPI 312 HalpUnmapVirtualAddress( 313 IN PVOID VirtualAddress, 314 IN PFN_COUNT NumberPages 315 ); 316 317 /* sysinfo.c */ 318 NTSTATUS 319 NTAPI 320 HaliQuerySystemInformation( 321 IN HAL_QUERY_INFORMATION_CLASS InformationClass, 322 IN ULONG BufferSize, 323 IN OUT PVOID Buffer, 324 OUT PULONG ReturnedLength 325 ); 326 327 NTSTATUS 328 NTAPI 329 HaliSetSystemInformation( 330 IN HAL_SET_INFORMATION_CLASS InformationClass, 331 IN ULONG BufferSize, 332 IN OUT PVOID Buffer 333 ); 334 335 // 336 // BIOS Routines 337 // 338 BOOLEAN 339 NTAPI 340 HalpBiosDisplayReset( 341 VOID 342 ); 343 344 VOID 345 FASTCALL 346 HalpExitToV86( 347 PKTRAP_FRAME TrapFrame 348 ); 349 350 VOID 351 __cdecl 352 HalpRealModeStart( 353 VOID 354 ); 355 356 // 357 // Processor Halt Routine 358 // 359 VOID 360 NTAPI 361 HaliHaltSystem( 362 VOID 363 ); 364 365 // 366 // CMOS Routines 367 // 368 INIT_FUNCTION 369 VOID 370 NTAPI 371 HalpInitializeCmos( 372 VOID 373 ); 374 375 UCHAR 376 NTAPI 377 HalpReadCmos( 378 IN UCHAR Reg 379 ); 380 381 VOID 382 NTAPI 383 HalpWriteCmos( 384 IN UCHAR Reg, 385 IN UCHAR Value 386 ); 387 388 // 389 // Spinlock for protecting CMOS access 390 // 391 VOID 392 NTAPI 393 HalpAcquireCmosSpinLock( 394 VOID 395 ); 396 397 VOID 398 NTAPI 399 HalpReleaseCmosSpinLock( 400 VOID 401 ); 402 403 VOID 404 NTAPI 405 HalpInitializeLegacyPICs( 406 VOID 407 ); 408 409 NTSTATUS 410 NTAPI 411 HalpOpenRegistryKey( 412 IN PHANDLE KeyHandle, 413 IN HANDLE RootKey, 414 IN PUNICODE_STRING KeyName, 415 IN ACCESS_MASK DesiredAccess, 416 IN BOOLEAN Create 417 ); 418 419 INIT_FUNCTION 420 VOID 421 NTAPI 422 HalpGetNMICrashFlag( 423 VOID 424 ); 425 426 INIT_FUNCTION 427 BOOLEAN 428 NTAPI 429 HalpGetDebugPortTable( 430 VOID 431 ); 432 433 INIT_FUNCTION 434 VOID 435 NTAPI 436 HalpReportSerialNumber( 437 VOID 438 ); 439 440 INIT_FUNCTION 441 NTSTATUS 442 NTAPI 443 HalpMarkAcpiHal( 444 VOID 445 ); 446 447 INIT_FUNCTION 448 VOID 449 NTAPI 450 HalpBuildAddressMap( 451 VOID 452 ); 453 454 INIT_FUNCTION 455 VOID 456 NTAPI 457 HalpReportResourceUsage( 458 IN PUNICODE_STRING HalName, 459 IN INTERFACE_TYPE InterfaceType 460 ); 461 462 INIT_FUNCTION 463 ULONG 464 NTAPI 465 HalpIs16BitPortDecodeSupported( 466 VOID 467 ); 468 469 NTSTATUS 470 NTAPI 471 HalpQueryAcpiResourceRequirements( 472 OUT PIO_RESOURCE_REQUIREMENTS_LIST *Requirements 473 ); 474 475 VOID 476 FASTCALL 477 KeUpdateSystemTime( 478 IN PKTRAP_FRAME TrapFrame, 479 IN ULONG Increment, 480 IN KIRQL OldIrql 481 ); 482 483 INIT_FUNCTION 484 VOID 485 NTAPI 486 HalpInitBusHandlers( 487 VOID 488 ); 489 490 NTSTATUS 491 NTAPI 492 HaliInitPnpDriver( 493 VOID 494 ); 495 496 INIT_FUNCTION 497 VOID 498 NTAPI 499 HalpDebugPciDumpBus( 500 IN ULONG i, 501 IN ULONG j, 502 IN ULONG k, 503 IN PPCI_COMMON_CONFIG PciData 504 ); 505 506 VOID 507 NTAPI 508 HalpInitProcessor( 509 IN ULONG ProcessorNumber, 510 IN PLOADER_PARAMETER_BLOCK LoaderBlock 511 ); 512 513 #ifdef _M_AMD64 514 515 VOID 516 NTAPI 517 HalInitializeBios( 518 _In_ ULONG Unknown, 519 _In_ PLOADER_PARAMETER_BLOCK LoaderBlock 520 ); 521 522 #define KfLowerIrql KeLowerIrql 523 #define KiEnterInterruptTrap(TrapFrame) /* We do all neccessary in asm code */ 524 #define KiEoiHelper(TrapFrame) return /* Just return to the caller */ 525 #define HalBeginSystemInterrupt(Irql, Vector, OldIrql) ((*(OldIrql) = PASSIVE_LEVEL), TRUE) 526 #ifndef CONFIG_SMP 527 /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */ 528 #define KiAcquireSpinLock(SpinLock) 529 #define KiReleaseSpinLock(SpinLock) 530 #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL); 531 #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql); 532 #endif // !CONFIG_SMP 533 #endif // _M_AMD64 534 535 extern BOOLEAN HalpNMIInProgress; 536 537 extern ADDRESS_USAGE HalpDefaultIoSpace; 538 539 extern KSPIN_LOCK HalpSystemHardwareLock; 540 541 extern PADDRESS_USAGE HalpAddressUsageList; 542 543 extern LARGE_INTEGER HalpPerfCounter; 544 545 extern KAFFINITY HalpActiveProcessors; 546 547 extern BOOLEAN HalDisableFirmwareMapper; 548 extern PWCHAR HalHardwareIdString; 549 extern PWCHAR HalName; 550 551 extern KAFFINITY HalpDefaultInterruptAffinity; 552 553 extern IDTUsageFlags HalpIDTUsageFlags[MAXIMUM_IDTVECTOR+1]; 554 555 extern const USHORT HalpBuildType; 556