Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636/* * */
#pragma once
#ifdef CONFIG_SMP#define HAL_BUILD_TYPE (DBG ? PRCB_BUILD_DEBUG : 0)#else#define HAL_BUILD_TYPE ((DBG ? PRCB_BUILD_DEBUG : 0) | PRCB_BUILD_UNIPROCESSOR)#endif
/* Don't include this in freeloader */#ifndef _BLDR_extern KIRQL HalpIrqlSynchLevel;
#undef SYNCH_LEVEL#define SYNCH_LEVEL HalpIrqlSynchLevel#endif
typedef struct _HAL_BIOS_FRAME{ ULONG SegSs; ULONG Esp; ULONG EFlags; ULONG SegCs; ULONG Eip; PKTRAP_FRAME TrapFrame; ULONG CsLimit; ULONG CsBase; ULONG CsFlags; ULONG SsLimit; ULONG SsBase; ULONG SsFlags; ULONG Prefix;} HAL_BIOS_FRAME, *PHAL_BIOS_FRAME;
typedefVOID(__cdecl *PHAL_SW_INTERRUPT_HANDLER)( VOID);
typedefVOID(FASTCALL *PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY)( IN PKTRAP_FRAME TrapFrame);
#define HAL_APC_REQUEST 0#define HAL_DPC_REQUEST 1
/* HAL profiling offsets in KeGetPcr()->HalReserved[] */#define HAL_PROFILING_INTERVAL 0#define HAL_PROFILING_MULTIPLIER 1
/* Usage flags */#define IDT_REGISTERED 0x01#define IDT_LATCHED 0x02#define IDT_READ_ONLY 0x04#define IDT_INTERNAL 0x11#define IDT_DEVICE 0x21
#ifdef _M_AMD64#define HALP_LOW_STUB_SIZE_IN_PAGES 5#else#define HALP_LOW_STUB_SIZE_IN_PAGES 3#endif
FORCEINLINEUCHARBCD_INT( _In_ UCHAR Bcd){ return ((Bcd & 0xF0) >> 4) * 10 + (Bcd & 0x0F);}
FORCEINLINEUCHARINT_BCD( _In_ CSHORT Int){ return ((Int / 10) << 4) + (Int % 10);}
typedefBOOLEAN(NTAPI *PHAL_DISMISS_INTERRUPT)( IN KIRQL Irql, IN ULONG Irq, OUT PKIRQL OldIrql);
BOOLEANNTAPIHalpDismissIrqGeneric( IN KIRQL Irql, IN ULONG Irq, OUT PKIRQL OldIrql);
BOOLEANNTAPIHalpDismissIrq15( IN KIRQL Irql, IN ULONG Irq, OUT PKIRQL OldIrql);
BOOLEANNTAPIHalpDismissIrq13( IN KIRQL Irql, IN ULONG Irq, OUT PKIRQL OldIrql);
BOOLEANNTAPIHalpDismissIrq07( IN KIRQL Irql, IN ULONG Irq, OUT PKIRQL OldIrql);
BOOLEANNTAPIHalpDismissIrqLevel( IN KIRQL Irql, IN ULONG Irq, OUT PKIRQL OldIrql);
BOOLEANNTAPIHalpDismissIrq15Level( IN KIRQL Irql, IN ULONG Irq, OUT PKIRQL OldIrql);
BOOLEANNTAPIHalpDismissIrq13Level( IN KIRQL Irql, IN ULONG Irq, OUT PKIRQL OldIrql);
BOOLEANNTAPIHalpDismissIrq07Level( IN KIRQL Irql, IN ULONG Irq, OUT PKIRQL OldIrql);
VOID__cdeclHalpHardwareInterruptLevel( VOID);
//// Hack Flags//#define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)#define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)#define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
//// Feature flags//#define HALP_CARD_FEATURE_FULL_DECODE 0x0001
//// Match Flags//#define HALP_CHECK_CARD_REVISION_ID 0x10000#define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000#define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
//// Mm PTE/PDE to Hal PTE/PDE//#define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)#define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
typedef struct _IDTUsageFlags{ UCHAR Flags;} IDTUsageFlags;
typedef struct{ KIRQL Irql; UCHAR BusReleativeVector;} IDTUsage;
typedef struct _HalAddressUsage{ struct _HalAddressUsage *Next; CM_RESOURCE_TYPE Type; UCHAR Flags; struct { ULONG Start; ULONG Length; } Element[];} ADDRESS_USAGE, *PADDRESS_USAGE;
/* adapter.c */PADAPTER_OBJECT NTAPI HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses);
/* sysinfo.c */CODE_SEG("INIT")VOIDNTAPIHalpRegisterVector(IN UCHAR Flags, IN ULONG BusVector, IN ULONG SystemVector, IN KIRQL Irql);
CODE_SEG("INIT")VOIDNTAPIHalpEnableInterruptHandler(IN UCHAR Flags, IN ULONG BusVector, IN ULONG SystemVector, IN KIRQL Irql, IN PVOID Handler, IN KINTERRUPT_MODE Mode);
/* pic.c */VOID NTAPI HalpInitializePICs(IN BOOLEAN EnableInterrupts);VOID __cdecl HalpApcInterrupt(VOID);VOID __cdecl HalpDispatchInterrupt(VOID);PHAL_SW_INTERRUPT_HANDLER __cdecl HalpDispatchInterrupt2(VOID);DECLSPEC_NORETURN VOID FASTCALL HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame);DECLSPEC_NORETURN VOID FASTCALL HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame);
/* profil.c */extern BOOLEAN HalpProfilingStopped;
/* timer.c */CODE_SEG("INIT") VOID NTAPI HalpInitializeClock(VOID);VOID __cdecl HalpClockInterrupt(VOID);VOID __cdecl HalpClockIpi(VOID);VOID __cdecl HalpProfileInterrupt(VOID);
typedef struct _HALP_ROLLOVER{ ULONG RollOver; ULONG Increment;} HALP_ROLLOVER, *PHALP_ROLLOVER;
VOIDNTAPIHalpCalibrateStallExecution(VOID);
/* pci.c */VOID HalpInitPciBus (VOID);
/* dma.c */CODE_SEG("INIT") VOID HalpInitDma (VOID);
/* Non-generic initialization */VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock);VOID HalpInitPhase1(VOID);
VOIDNTAPIHalpFlushTLB(VOID);
//// KD Support//VOIDNTAPIHalpCheckPowerButton( VOID);
CODE_SEG("INIT")VOIDNTAPIHalpRegisterKdSupportFunctions( VOID);
CODE_SEG("INIT")NTSTATUSNTAPIHalpSetupPciDeviceForDebugging( IN PVOID LoaderBlock, IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
CODE_SEG("INIT")NTSTATUSNTAPIHalpReleasePciDeviceForDebugging( IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
//// Memory routines//ULONG64NTAPIHalpAllocPhysicalMemory( IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN ULONG64 MaxAddress, IN PFN_NUMBER PageCount, IN BOOLEAN Aligned);
PVOIDNTAPIHalpMapPhysicalMemory64Vista( IN PHYSICAL_ADDRESS PhysicalAddress, IN PFN_COUNT PageCount, IN BOOLEAN FlushCurrentTLB);
VOIDNTAPIHalpUnmapVirtualAddressVista( IN PVOID VirtualAddress, IN PFN_COUNT NumberPages, IN BOOLEAN FlushCurrentTLB);
PVOIDNTAPIHalpMapPhysicalMemory64( IN PHYSICAL_ADDRESS PhysicalAddress, IN PFN_COUNT PageCount);
VOIDNTAPIHalpUnmapVirtualAddress( IN PVOID VirtualAddress, IN PFN_COUNT NumberPages);
/* sysinfo.c */NTSTATUSNTAPIHaliHandlePCIConfigSpaceAccess( _In_ BOOLEAN IsRead, _In_ ULONG Port, _In_ ULONG Length, _Inout_ PULONG Buffer);
NTSTATUSNTAPIHaliQuerySystemInformation( IN HAL_QUERY_INFORMATION_CLASS InformationClass, IN ULONG BufferSize, IN OUT PVOID Buffer, OUT PULONG ReturnedLength);
NTSTATUSNTAPIHaliSetSystemInformation( IN HAL_SET_INFORMATION_CLASS InformationClass, IN ULONG BufferSize, IN OUT PVOID Buffer);
//// BIOS Routines//BOOLEANNTAPIHalpBiosDisplayReset( VOID);
VOIDFASTCALLHalpExitToV86( PKTRAP_FRAME TrapFrame);
VOID__cdeclHalpRealModeStart( VOID);
//// Processor Halt Routine//VOIDNTAPIHaliHaltSystem( VOID);
//// CMOS Routines//CODE_SEG("INIT")VOIDNTAPIHalpInitializeCmos( VOID);
_Requires_lock_held_(HalpSystemHardwareLock)UCHARNTAPIHalpReadCmos( IN UCHAR Reg);
_Requires_lock_held_(HalpSystemHardwareLock)VOIDNTAPIHalpWriteCmos( IN UCHAR Reg, IN UCHAR Value);
//// Spinlock for protecting CMOS access//_Acquires_lock_(HalpSystemHardwareLock)VOIDNTAPIHalpAcquireCmosSpinLock( VOID);
_Releases_lock_(HalpSystemHardwareLock)VOIDNTAPIHalpReleaseCmosSpinLock( VOID);
VOIDNTAPIHalpInitializeLegacyPICs( VOID);
NTSTATUSNTAPIHalpOpenRegistryKey( IN PHANDLE KeyHandle, IN HANDLE RootKey, IN PUNICODE_STRING KeyName, IN ACCESS_MASK DesiredAccess, IN BOOLEAN Create);
CODE_SEG("INIT")VOIDNTAPIHalpGetNMICrashFlag( VOID);
CODE_SEG("INIT")BOOLEANNTAPIHalpGetDebugPortTable( VOID);
CODE_SEG("INIT")VOIDNTAPIHalpReportSerialNumber( VOID);
CODE_SEG("INIT")NTSTATUSNTAPIHalpMarkAcpiHal( VOID);
CODE_SEG("INIT")VOIDNTAPIHalpBuildAddressMap( VOID);
CODE_SEG("INIT")VOIDNTAPIHalpReportResourceUsage( IN PUNICODE_STRING HalName, IN INTERFACE_TYPE InterfaceType);
CODE_SEG("INIT")ULONGNTAPIHalpIs16BitPortDecodeSupported( VOID);
NTSTATUSNTAPIHalpQueryAcpiResourceRequirements( OUT PIO_RESOURCE_REQUIREMENTS_LIST *Requirements);
VOIDFASTCALLKeUpdateSystemTime( IN PKTRAP_FRAME TrapFrame, IN ULONG Increment, IN KIRQL OldIrql);
VOIDNTAPIKeUpdateRunTime( _In_ PKTRAP_FRAME TrapFrame, _In_ KIRQL Irql);
CODE_SEG("INIT")VOIDNTAPIHalpInitBusHandlers( VOID);
NTSTATUSNTAPIHaliInitPnpDriver( VOID);
CODE_SEG("INIT")VOIDNTAPIHalpDebugPciDumpBus( IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER PciSlot, IN ULONG i, IN ULONG j, IN ULONG k, IN PPCI_COMMON_CONFIG PciData);
VOIDNTAPIHalpInitProcessor( IN ULONG ProcessorNumber, IN PLOADER_PARAMETER_BLOCK LoaderBlock);
#if defined(SARCH_PC98)BOOLEANNTAPIHalpDismissIrq08( _In_ KIRQL Irql, _In_ ULONG Irq, _Out_ PKIRQL OldIrql);
BOOLEANNTAPIHalpDismissIrq08Level( _In_ KIRQL Irql, _In_ ULONG Irq, _Out_ PKIRQL OldIrql);
VOIDNTAPIHalpInitializeClockPc98(VOID);
extern ULONG PIT_FREQUENCY;#endif /* SARCH_PC98 */
VOIDNTAPIHalInitializeBios( _In_ ULONG Phase, _In_ PLOADER_PARAMETER_BLOCK LoaderBlock);
#ifdef _M_AMD64#define KfLowerIrql KeLowerIrql#define KiEnterInterruptTrap(TrapFrame) /* We do all neccessary in asm code */#endif // _M_AMD64
#ifdef _MINIHAL_#if defined(_M_IX86) || defined(_M_AMD64)/* Use intrinsics for IA-32 and amd64 */#include <ioaccess.h>
#define READ_PORT_BUFFER_UCHAR(port, buffer, count) __inbytestring(H2I(port), buffer, count)#define READ_PORT_BUFFER_USHORT(port, buffer, count) __inwordstring(H2I(port), buffer, count)#define READ_PORT_BUFFER_ULONG(port, buffer, count) __indwordstring(H2I(port), buffer, count)#define WRITE_PORT_BUFFER_UCHAR(port, buffer, count) __outbytestring(H2I(port), buffer, count)#define WRITE_PORT_BUFFER_USHORT(port, buffer, count) __outwordstring(H2I(port), buffer, count)#define WRITE_PORT_BUFFER_ULONG(port, buffer, count) __outdwordstring(H2I(port), buffer, count)#endif#endif
extern BOOLEAN HalpNMIInProgress;
extern ADDRESS_USAGE HalpDefaultIoSpace;
extern KSPIN_LOCK HalpSystemHardwareLock;
extern PADDRESS_USAGE HalpAddressUsageList;
extern LARGE_INTEGER HalpPerfCounter;
extern KAFFINITY HalpActiveProcessors;
extern BOOLEAN HalDisableFirmwareMapper;extern PWCHAR HalHardwareIdString;extern PWCHAR HalName;
extern KAFFINITY HalpDefaultInterruptAffinity;
extern IDTUsageFlags HalpIDTUsageFlags[MAXIMUM_IDTVECTOR+1];
extern const USHORT HalpBuildType;