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