/*++ Copyright (c) 2000 Microsoft Corporation Module Name: halcmn.h Abstract: This module contains a variety of constants, function prototypes, inline functions and external data declarations used by the AMD64 hal code. Author: Forrest Foltz (forrestf) 24-Oct-2000 --*/ #ifndef _HALCMN_H_ #define _HALCMN_H_ #include #include #include #include #include "io_cmos.h" #include "8259.h" #include "mp8254.inc" typedef VOID (*PHALP_SOFTWARE_INTERRUPT)(VOID); extern PHALP_SOFTWARE_INTERRUPT HalpSoftwareInterruptTable[]; extern KIRQL SWInterruptLookupTable[]; extern USHORT Halp8259MaskTable[]; extern LARGE_INTEGER (*QueryTimer)(VOID); extern KAFFINITY HalpDefaultInterruptAffinity; extern KAFFINITY HalpActiveProcessors; extern ULONG HalpTimerWatchdogEnabled; // // Number of 100nS units in one second // #define TIME_UNITS_PER_SECOND 10000000 #if defined(DBG) #define AMD64_IMPLEMENT DbgPrint("AMD64: Not implemented\n"); DbgBreakPoint() #else #define AMD64_IMPLEMENT #endif #if !defined(RTL_FIELD_SIZE) #define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) #endif VOID HalpAcquireSystemHardwareSpinLock( VOID ); VOID HalpReleaseSystemHardwareSpinLock( VOID ); __forceinline VOID KPcrReadData ( IN ULONG Offset, IN ULONG Length, OUT PVOID Buffer ) /*++ Routine Description: Used to read data from the current processor's KPCR. This is a support function for KPCR_READ_FIELD Arguments: Offset - Supplies the offset within the KPCR to begin the read Length - Supplies the length of the data to read from the KPCR. Must be one of 1, 2, 4 or 8. Buffer - Supplies the target buffer that contains the data to read from the KPCR. Return value: None --*/ { switch (Length) { case 1: *(PUCHAR)Buffer = __readgsbyte(Offset); break; case 2: *(PUSHORT)Buffer = __readgsword(Offset); break; case 4: *(PULONG)Buffer = __readgsdword(Offset); break; case 8: *(PULONG64)Buffer = __readgsqword(Offset); break; } } __forceinline VOID KPcrWriteData ( IN ULONG Offset, IN ULONG Length, IN PVOID Buffer ) /*++ Routine Description: Used to write data to the current processor's KPCR. This is a support function for KPCR_WRITE_FIELD Arguments: Offset - Supplies the offset within the KPCR to begin the write Length - Supplies the length of the data to write within the KPCR. Must be one of 1, 2, 4 or 8 Buffer - Supplies the source buffer that contains the data to write into the KPCR. Return value: None --*/ { switch (Length) { case 1: __writegsbyte(Offset,*(PUCHAR)Buffer); break; case 2: __writegsword(Offset,*(PUSHORT)Buffer); break; case 4: __writegsdword(Offset,*(PULONG)Buffer); break; case 8: __writegsqword(Offset,*(PULONG64)Buffer); break; } } #define KPCR_READ_FIELD(field,value) \ KPcrReadData(FIELD_OFFSET(KPCR,field), \ RTL_FIELD_SIZE(KPCR,field), \ value); #define KPCR_WRITE_FIELD(field,value) \ KPcrWriteData(FIELD_OFFSET(KPCR,field), \ RTL_FIELD_SIZE(KPCR,field), \ value); NTSTATUS HalpConnectInterrupt ( IN ULONG SystemInterruptVector, IN KIRQL SystemIrql, IN PHAL_INTERRUPT_SERVICE_ROUTINE HalInterruptServiceRoutine, IN KINTERRUPT_MODE InterruptMode ); BOOLEAN PicSpuriousService37 ( IN struct _KINTERRUPT *Interrupt, IN PVOID ServiceContext ); BOOLEAN HalpApicSpuriousService ( IN struct _KINTERRUPT *Interrupt, IN PVOID ServiceContext ); VOID HalpMarkProcessorStarted( ULONG ApicID, ULONG NtNumber ); VOID HalpPmTimerSpecialStall( IN ULONG Ticks ); VOID HalpWasteTime ( ULONG Ticks ); #endif // _HALCMN_H_