|
|
/**
*** Copyright (C) 1996-97 Intel Corporation. All rights reserved. *** *** The information and source code contained herein is the exclusive *** property of Intel Corporation and may not be disclosed, examined *** or reproduced in whole or in part without explicit written authorization *** from the company. **/
/*++ BUILD Version: 0001 // Increment this if a change has global effects
Copyright (c) 1991 Microsoft Corporation
Module Name:
halp.h
Abstract:
This header file defines the private Hardware Architecture Layer (HAL) interfaces, defines and structures.
Author:
John Vert (jvert) 11-Feb-92
Revision History:
--*/ #ifndef _HALP_H_
#define _HALP_H_
//
// ignore some warning for public headers.
//
#pragma warning(disable:4214) // bit field types other than int
#pragma warning(disable:4201) // nameless struct/union
#pragma warning(disable:4115) // named type definition in parentheses
#include "nthal.h"
#include "hal.h"
#define IPI_VECTOR 0xE1
#include "halnls.h"
#if 0
#ifndef _HALI_
#include "..\inc\hali.h"
#endif
#endif
#define HAL_MAXIMUM_PROCESSOR 0x20
/*
* Default clock and profile timer intervals (in 100ns-unit) */ #define DEFAULT_CLOCK_INTERVAL 100000 // 10 ms
#define MINIMUM_CLOCK_INTERVAL 10000 // 1 ms
#define MAXIMUM_CLOCK_INTERVAL 100000 // 10 ms
//
// Define Realtime Clock register numbers.
//
#define RTC_SECOND 0 // second of minute [0..59]
#define RTC_SECOND_ALARM 1 // seconds to alarm
#define RTC_MINUTE 2 // minute of hour [0..59]
#define RTC_MINUTE_ALARM 3 // minutes to alarm
#define RTC_HOUR 4 // hour of day [0..23]
#define RTC_HOUR_ALARM 5 // hours to alarm
#define RTC_DAY_OF_WEEK 6 // day of week [1..7]
#define RTC_DAY_OF_MONTH 7 // day of month [1..31]
#define RTC_MONTH 8 // month of year [1..12]
#define RTC_YEAR 9 // year [00..99]
#define RTC_CONTROL_REGISTERA 10 // control register A
#define RTC_CONTROL_REGISTERB 11 // control register B
#define RTC_CONTROL_REGISTERC 12 // control register C
#define RTC_CONTROL_REGISTERD 13 // control register D
#define RTC_REGNUMBER_RTC_CR1 0x6A // control register 1
#define RTC_ISA_ADDRESS_PORT 0x070
#define RTC_ISA_DATA_PORT 0x071
extern PVOID HalpRtcAddressPort;
extern PVOID HalpRtcDataPort;
extern PLOADER_PARAMETER_BLOCK KeLoaderBlock;
//
// Define Control Register A structure.
//
typedef struct _RTC_CONTROL_REGISTER_A { UCHAR RateSelect : 4; UCHAR TimebaseDivisor : 3; UCHAR UpdateInProgress : 1; } RTC_CONTROL_REGISTER_A, *PRTC_CONTROL_REGISTER_A;
//
// Define Control Register B structure.
//
typedef struct _RTC_CONTROL_REGISTER_B { UCHAR DayLightSavingsEnable : 1; UCHAR HoursFormat : 1; UCHAR DataMode : 1; UCHAR SquareWaveEnable : 1; UCHAR UpdateInterruptEnable : 1; UCHAR AlarmInterruptEnable : 1; UCHAR TimerInterruptEnable : 1; UCHAR SetTime : 1; } RTC_CONTROL_REGISTER_B, *PRTC_CONTROL_REGISTER_B;
//
// Define Control Register C structure.
//
typedef struct _RTC_CONTROL_REGISTER_C { UCHAR Fill : 4; UCHAR UpdateInterruptFlag : 1; UCHAR AlarmInterruptFlag : 1; UCHAR TimeInterruptFlag : 1; UCHAR InterruptRequest : 1; } RTC_CONTROL_REGISTER_C, *PRTC_CONTROL_REGISTER_C;
//
// Define Control Register D structure.
//
typedef struct _RTC_CONTROL_REGISTER_D { UCHAR Fill : 7; UCHAR ValidTime : 1; } RTC_CONTROL_REGISTER_D, *PRTC_CONTROL_REGISTER_D;
#define EISA_DMA_CHANNELS 8
extern UCHAR HalpDmaChannelMasks[];
//
// HalpOwnedDisplayBeforeSleep is defined in mpdat.c
//
extern BOOLEAN HalpOwnedDisplayBeforeSleep;
#define PIC_VECTORS 16
#define PRIMARY_VECTOR_BASE 0x30
#ifndef NEC_98
#define PIC_SLAVE_IRQ 2
#define PIC_SLAVE_REDIRECT 9
#else
#define PIC_SLAVE_IRQ 7
#define PIC_SLAVE_REDIRECT 8
#endif //NEC_98
extern PVOID HalpSleepPageLock; KIRQL KfAcquireSpinLock ( PKSPIN_LOCK SpinLock );
VOID KfReleaseSpinLock ( IN PKSPIN_LOCK SpinLock, IN KIRQL NewIrql );
VOID KeSetAffinityThread ( PKTHREAD Thread, KAFFINITY HalpActiveProcessors );
KIRQL KfRaiseIrql ( KIRQL NewIrql );
VOID KfLowerIrql ( KIRQL NewIrql );
extern BOOLEAN KdPollBreakIn ( VOID );
VOID HalpSavePicState ( VOID );
VOID HalpSaveDmaControllerState ( VOID );
NTSTATUS HalAllocateAdapterChannel ( IN PADAPTER_OBJECT AdapterObject, IN PWAIT_CONTEXT_BLOCK Wcb, IN ULONG NumberOfMapRegisters, IN PDRIVER_CONTROL ExecutionRoutine );
ULONG HalReadDmaCounter ( IN PADAPTER_OBJECT AdapterObject );
VOID HalpSaveTimerState ( VOID );
VOID HalpRestorePicState ( VOID );
VOID HalpRestoreDmaControllerState ( VOID );
VOID HalpRestoreTimerState ( VOID );
BOOLEAN HalpIoSapicInitialize ( VOID );
BOOLEAN IsPsrDtOn ( VOID );
BOOLEAN HalpIoSapicConnectInterrupt ( KIRQL Irql, IN ULONG Vector );
NTSTATUS HalacpiGetInterruptTranslator( IN INTERFACE_TYPE ParentInterfaceType, IN ULONG ParentBusNumber, IN INTERFACE_TYPE BridgeInterfaceType, IN USHORT Size, IN USHORT Version, OUT PTRANSLATOR_INTERFACE Translator, OUT PULONG BridgeBusNumber );
#ifdef notyet
typedef struct { UCHAR MasterMask; UCHAR SlaveMask; UCHAR MasterEdgeLevelControl; UCHAR SlaveEdgeLevelControl; } PIC_CONTEXT, *PPIC_CONTEXT;
#define EISA_DMA_CHANNELS 8
typedef struct { UCHAR Dma1ExtendedModePort; UCHAR Dma2ExtendedModePort; DMA1_CONTROL Dma1Control; DMA2_CONTROL Dma2Control; } DMA_CONTEXT, *PDMA_CONTEXT;
typedef struct { UCHAR nothing; } TIMER_CONTEXT, *PTIMER_CONTEXT;
typedef struct { PIC_CONTEXT PicState; DMA_CONTEXT DmaState; } MOTHERBOARD_CONTEXT, *PMOTHERBOARD_CONTEXT;
extern MOTHERBOARD_CONTEXT HalpMotherboardState; extern UCHAR HalpDmaChannelModes[]; extern PVOID HalpSleepPageLock; extern UCHAR HalpDmaChannelMasks[]; extern BOOLEAN HalpOwnedDisplayBeforeSleep;
#endif //notyet
VOID HalpGetProcessorIDs ( VOID );
VOID HalpInitializeInterrupts ( VOID );
VOID HalInitializeProcessor ( ULONG Number, PLOADER_PARAMETER_BLOCK LoaderBlock );
VOID HalpGetParameters ( IN PLOADER_PARAMETER_BLOCK LoaderBlock );
VOID HalpClearClock ( VOID );
VOID HalpClockInterrupt ( IN PKINTERRUPT_ROUTINE Interrupt, IN PKTRAP_FRAME TrapFrame );
VOID HalpClockInterruptPn( IN PKINTERRUPT_ROUTINE Interrupt, IN PKTRAP_FRAME TrapFrame );
UCHAR HalpReadClockRegister ( UCHAR Register );
VOID HalpWriteClockRegister ( UCHAR Register, UCHAR Value );
// extern VOID
// HalpProfileInterrupt (
// IN PKTRAP_FRAME TrapFrame
// );
ULONGLONG HalpReadIntervalTimeCounter ( VOID );
VOID HalpProgramIntervalTimerVector( ULONGLONG IntervalTimerVector );
VOID HalpClearITC ( VOID );
VOID HalpInitializeClock ( VOID );
VOID HalpInitializeClockPn ( VOID );
VOID HalpInitializeClockInterrupts( VOID );
VOID HalpSetInitialClockRate ( VOID );
VOID HalpInitializeTimerResolution ( ULONG Rate );
VOID HalpUpdateITM ( IN ULONGLONG NewITMValue );
VOID HalpSendIPI ( IN USHORT ProcessorID, IN ULONGLONG Data );
VOID HalpOSRendez ( IN USHORT ProcessorID );
//
// Prototype for system bus handlers
//
NTSTATUS HalpQuerySimBusSlots ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN ULONG BufferSize, OUT PULONG SlotNumbers, OUT PULONG ReturnedLength );
ULONG HalpGetSimBusInterruptVector ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN ULONG BusInterruptLevel, IN ULONG BusInterruptVector, OUT PKIRQL Irql, OUT PKAFFINITY Affinity );
BOOLEAN HalpTranslateSimBusAddress ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress );
VOID HalpRegisterSimBusHandler ( VOID );
ULONG HalpGetSimBusData( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length );
ULONG HalpSetSimBusData( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length );
NTSTATUS HalpAssignSimBusSlotResources ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources );
NTSTATUS HalpAdjustSimBusResourceList ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList );
PDEVICE_HANDLER_OBJECT HalpReferenceSimDeviceHandler ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN ULONG SlotNumber );
NTSTATUS HalpSimDeviceControl ( IN PHAL_DEVICE_CONTROL_CONTEXT Context );
ULONG HalGetDeviceData ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PDEVICE_HANDLER_OBJECT DeviceHandler, IN ULONG DataType, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length );
ULONG HalSetDeviceData ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN PDEVICE_HANDLER_OBJECT DeviceHandler, IN ULONG DataType, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length );
NTSTATUS HalpHibernateHal ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler );
NTSTATUS HalpResumeHal ( IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler );
ULONG HalpGetFeatureBits ( VOID );
VOID HalpInitMP( IN ULONG Phase, IN PLOADER_PARAMETER_BLOCK LoaderBlock );
#ifdef RtlMoveMemory
#undef RtlMoveMemory
#undef RtlCopyMemory
#undef RtlFillMemory
#undef RtlZeroMemory
#define RtlCopyMemory(Destination,Source,Length) RtlMoveMemory((Destination),(Source),(Length))
VOID RtlMoveMemory ( PVOID Destination, CONST VOID *Source, ULONG Length );
VOID RtlFillMemory ( PVOID Destination, ULONG Length, UCHAR Fill );
VOID RtlZeroMemory ( PVOID Destination, ULONG Length );
#endif
#if 0
#include "ixisa.h"
#endif
//
// Define map register translation entry structure.
//
typedef struct _TRANSLATION_ENTRY { PVOID VirtualAddress; ULONG PhysicalAddress; ULONG Index; } TRANSLATION_ENTRY, *PTRANSLATION_ENTRY;
//
//
typedef struct _PcMpIoApicEntry { UCHAR EntryType; UCHAR IoApicId; UCHAR IoApicVersion; UCHAR IoApicFlag; PVOID IoApicAddress; } PCMPIOAPIC, *PPCMPIOAPIC;
//
// MP_INFO is defined in pcmp_nt.inc
//
// typedef struct _MP_INFO {
// ULONG ApicVersion; // 82489Dx or Not
// ULONG ProcessorCount; // Number of Enabled Processors
// ULONG NtProcessors; // Number of Running Processors
// ULONG BusCount; // Number of buses in system
// ULONG IOApicCount; // Number of Io Apics in system
// ULONG IntiCount; // Number of Io Apic interrupt input entries
// ULONG LintiCount; // Number of Local Apic interrupt input entries
// ULONG IMCRPresent; // Indicates if the IMCR is present
// ULONG LocalApicBase; // Base of local APIC
// PULONG IoApicBase; // The virtual addresses of the IoApic
// PPCMPIOAPIC IoApicEntryPtr; // Ptr to 1st PC+MP IoApic entry
// ULONG IoApicPhys[]; // The physical addresses of the IoApi
//}MP_INFO, *PMP_INFO;
extern USHORT LOCAL_ID[];
#define VECTOR_SIZE 8
#define IPI_ID_SHIFT 4
#define IpiTOKEN_SHIFT 20
#define IpiTOKEN 0xFFE
#define EID_MASK 0xFF00
#define OS_RENDEZ_VECTOR 0x11
#define RENDEZ_TIME_OUT 0X0FFFFFFFF
//
// Some devices require a phyicially contiguous data buffers for DMA transfers.
// Map registers are used give the appearance that all data buffers are
// contiguous. In order to pool all of the map registers a master
// adapter object is used. This object is allocated and saved internal to this
// file. It contains a bit map for allocation of the registers and a queue
// for requests which are waiting for more map registers. This object is
// allocated during the first request to allocate an adapter which requires
// map registers.
//
// In this system, the map registers are translation entries which point to
// map buffers. Map buffers are physically contiguous and have physical memory
// addresses less than 0x01000000. All of the map registers are allocated
// initialially; however, the map buffers are allocated base in the number of
// adapters which are allocated.
//
// If the master adapter is NULL in the adapter object then device does not
// require any map registers.
//
extern PADAPTER_OBJECT MasterAdapterObject;
extern POBJECT_TYPE *IoAdapterObjectType;
extern BOOLEAN LessThan16Mb;
extern BOOLEAN HalpEisaDma;
//
// Map buffer prameters. These are initialized in HalInitSystem
//
extern PHYSICAL_ADDRESS HalpMapBufferPhysicalAddress; extern ULONG HalpMapBufferSize;
extern ULONG HalpBusType; extern ULONG HalpCpuType; extern UCHAR HalpSerialLen; extern UCHAR HalpSerialNumber[];
//
// The following macros are taken from mm\ia64\miia64.h. We need them here
// so the HAL can map its own memory before memory-management has been
// initialized, or during a BugCheck.
//
// MiGetPdeAddress returns the address of the PDE which maps the
// given virtual address.
//
#if defined(_WIN64)
#define ADDRESS_BITS 64
#define NT_ADDRESS_BITS 32
#define NT_ADDRESS_MASK (((UINT_PTR)1 << NT_ADDRESS_BITS) -1)
#define MiGetPdeAddress(va) \
((PHARDWARE_PTE)(((((UINT_PTR)(va) & NT_ADDRESS_MASK) >> PDI_SHIFT) << PTE_SHIFT) + PDE_BASE))
#define MiGetPteAddress(va) \
((PHARDWARE_PTE)(((((UINT_PTR)(va) & NT_ADDRESS_MASK) >> PAGE_SHIFT) << PTE_SHIFT) + PTE_BASE))
#else
#define MiGetPdeAddress(va) ((PHARDWARE_PTE)(((((ULONG)(va)) >> 22) << 2) + PDE_BASE))
//
// MiGetPteAddress returns the address of the PTE which maps the
// given virtual address.
//
#define MiGetPteAddress(va) ((PHARDWARE_PTE)(((((ULONG)(va)) >> 12) << 2) + PTE_BASE))
#endif // defined(_WIN64)
//
// Resource usage information
//
#pragma pack(1)
typedef struct { UCHAR Flags; KIRQL Irql; UCHAR BusReleativeVector; } IDTUsage;
typedef struct _HalAddressUsage{ struct _HalAddressUsage *Next; CM_RESOURCE_TYPE Type; // Port or Memory
UCHAR Flags; // same as IDTUsage.Flags
struct { ULONG Start; ULONG Length; } Element[]; } ADDRESS_USAGE; #pragma pack()
//
// Added the following line
//
#define MAXIMUM_IDTVECTOR 0x0FF
//
// The following 3 lines are lifted from halp.h of halia64 directory
// to clear the build error from i64timer.c
//
#define DEFAULT_CLOCK_INTERVAL 100000 // 10 ms
#define MINIMUM_CLOCK_INTERVAL 10000 // 1 ms
#define MAXIMUM_CLOCK_INTERVAL 100000 // 10 ms
// IO Port emulation defines
#define IO_PORT_MASK 0x0FFFF;
#define BYTE_ADDRESS_MASK 0x00FFF;
#define BYTE_ADDRESS_CLEAR 0x0FFFC;
// #define ExtVirtualIOBase 0xFFFFFFFFFFC00000
// #define VirtualIOBase 0xFFFFFFFFFFC00000i64
#define VirtualIOBase (UINT_PTR)(KADDRESS_BASE+0xFFC00000)
// extern VOID *VirtualIOBase;
// #define PhysicalIOBase 0x80000000FFC00000i64
#define PhysicalIOBase 0x00000FFFFC000000i64
#define IDTOwned 0x01 // IDT is not available for others
#define InterruptLatched 0x02 // Level or Latched
#define InternalUsage 0x11 // Report usage on internal bus
#define DeviceUsage 0x21 // Report usage on device bus
extern IDTUsage HalpIDTUsage[]; extern ADDRESS_USAGE *HalpAddressUsageList;
#define HalpRegisterAddressUsage(a) \
(a)->Next = HalpAddressUsageList, HalpAddressUsageList = (a);
VOID HalpInsertTranslationRegister ( IN UINT_PTR IFA, IN ULONG SlotNumber, IN ULONGLONG Attribute, IN ULONGLONG ITIR );
VOID HalpFillTbForIOPortSpace ( ULONGLONG PhysicalAddress, UINT_PTR VirtualAddress, ULONG SlotNumber );
//
// Temp definitions to thunk into supporting new bus extension format
//
VOID HalpRegisterInternalBusHandlers ( VOID );
PBUS_HANDLER HalpAllocateBusHandler ( IN INTERFACE_TYPE InterfaceType, IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN INTERFACE_TYPE ParentBusDataType, IN ULONG ParentBusNumber, IN ULONG BusSpecificData );
#define HalpHandlerForBus HaliHandlerForBus
#define HalpSetBusHandlerParent(c,p) (c)->ParentHandler = p;
//
// Define function prototypes.
//
VOID HalInitSystemPhase2( VOID );
KIRQL HaliRaiseIrqlToDpcLevel ( VOID );
BOOLEAN HalpGrowMapBuffers( PADAPTER_OBJECT AdapterObject, ULONG Amount );
PADAPTER_OBJECT HalpAllocateAdapter( IN ULONG MapRegistersPerChannel, IN PVOID AdapterBaseVa, IN PVOID MapRegisterBase );
VOID HalpDisableAllInterrupts ( VOID );
VOID HalpProfileInterrupt( IN PKTRAP_FRAME TrapFrame );
VOID HalpInitializeClock( VOID );
VOID HalpInitializeDisplay( VOID );
VOID HalpInitializeStallExecution( IN CCHAR ProcessorNumber );
VOID HalpRemoveFences ( VOID );
VOID HalpInitializePICs( VOID );
VOID HalpIrq13Handler ( VOID );
VOID HalpFlushTLB ( VOID );
VOID HalpSerialize ( VOID );
PVOID HalMapPhysicalMemory( IN PHYSICAL_ADDRESS PhysicalAddress, IN ULONG NumberPages );
PVOID HalpMapPhysicalMemory( IN PVOID PhysicalAddress, IN ULONG NumberPages );
PVOID HalpMapPhysicalMemoryWriteThrough( IN PVOID PhysicalAddress, IN ULONG NumberPages );
ULONG HalpAllocPhysicalMemory( IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN ULONG MaxPhysicalAddress, IN ULONG NoPages, IN BOOLEAN bAlignOn64k );
BOOLEAN HalpBiosDisplayReset( IN VOID );
HAL_DISPLAY_BIOS_INFORMATION HalpGetDisplayBiosInformation ( VOID );
VOID HalpDisplayDebugStatus( IN PUCHAR Status, IN ULONG Length );
VOID HalpInitializeCmos ( VOID );
VOID HalpReadCmosTime ( PTIME_FIELDS TimeFields );
VOID HalpWriteCmosTime ( PTIME_FIELDS TimeFields );
VOID HalpAcquireCmosSpinLock ( VOID );
VOID HalpReleaseCmosSpinLock ( VOID );
VOID HalpResetAllProcessors ( VOID );
VOID HalpCpuID ( ULONG InEax, PULONG OutEax, PULONG OutEbx, PULONG OutEcx, PULONG OutEdx );
ULONGLONG FASTCALL RDMSR ( IN ULONG MsrAddress );
VOID WRMSR ( IN ULONG MsrAddress, IN ULONGLONG MsrValue );
VOID HalpEnableInterruptHandler ( IN UCHAR ReportFlags, IN ULONG BusInterruptVector, IN ULONG SystemInterruptVector, IN KIRQL SystemIrql, IN VOID (*HalInterruptServiceRoutine)(VOID), IN KINTERRUPT_MODE InterruptMode );
VOID HalpRegisterVector ( IN UCHAR ReportFlags, IN ULONG BusInterruptVector, IN ULONG SystemInterruptVector, IN KIRQL SystemIrql );
VOID HalpReportResourceUsage ( IN PUNICODE_STRING HalName, IN INTERFACE_TYPE DeviceInterfaceToUse );
VOID HalpYearIs( IN ULONG Year );
VOID HalpRecordEisaInterruptVectors( VOID );
NTSTATUS HalIrqTranslateResourcesRoot( IN PVOID Context, IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, IN RESOURCE_TRANSLATION_DIRECTION Direction, IN ULONG AlternativesCount, OPTIONAL IN IO_RESOURCE_DESCRIPTOR Alternatives[], OPTIONAL IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target );
NTSTATUS HalIrqTranslateResourceRequirementsRoot( IN PVOID Context, IN PIO_RESOURCE_DESCRIPTOR Source, IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PULONG TargetCount, OUT PIO_RESOURCE_DESCRIPTOR *Target );
NTSTATUS HalIrqTranslateResourceRequirementsIsa( IN PVOID Context, IN PIO_RESOURCE_DESCRIPTOR Source, IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PULONG TargetCount, OUT PIO_RESOURCE_DESCRIPTOR *Target );
NTSTATUS HalIrqTranslateResourcesIsa( IN PVOID Context, IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, IN RESOURCE_TRANSLATION_DIRECTION Direction, IN ULONG AlternativesCount, OPTIONAL IN IO_RESOURCE_DESCRIPTOR Alternatives[], OPTIONAL IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target );
//
// Defines for HalpFeatureBits
//
#define HAL_PERF_EVENTS 0x00000001
#define HAL_NO_SPECULATION 0x00000002
#define HAL_MCA_PRESENT 0x00000004 // Intel MCA Available
#define HAL_MCE_PRESENT 0x00000008 // ONLY Pentium style MCE available
extern ULONG HalpFeatureBits;
//
// Added HalpPciIrqMask
//
extern USHORT HalpPciIrqMask; //
// Defines for Processor Features returned from CPUID instruction
//
#define CPUID_MCA_MASK 0x4000
#define CPUID_MCE_MASK 0x0080
// Added ITIR bit field masks
//
#define ITIR_PPN_MASK 0x7FFF000000000000
#define IoSpaceSize 0x14
#define Attribute_PPN_Mask 0x0000FFFFFFFFF000
#define IoSpaceAttribute 0x0010000000000473
NTSTATUS HalpGetMcaLog( OUT PMCA_EXCEPTION Exception, OUT PULONG ReturnedLength );
NTSTATUS HalpMcaRegisterDriver( IN PMCA_DRIVER_INFO pMcaDriverInfo // Info about registering driver
);
VOID HalpMcaInit( VOID );
//
// Disable the Local APIC on UP (PIC 8259) PentiumPro systems to work around
// spurious interrupt errata.
//
#define APIC_BASE_MSR 0x1B
#define APIC_ENABLED 0x0000000000000800
//
// PnP stuff
//
VOID HalIrqTranslatorReference( PVOID Context );
VOID HalIrqTranslatorDereference( PVOID Context );
NTSTATUS HalIrqTranslateResources( IN PVOID Context, IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, IN RESOURCE_TRANSLATION_DIRECTION Direction, IN ULONG AlternativesCount, OPTIONAL IN IO_RESOURCE_DESCRIPTOR Alternatives[], OPTIONAL IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target );
ULONG HalpGetIsaIrqState( ULONG Vector );
// Definion for IA64 HalpVectorToINTI
#define VECTOR 0xFF;
#define LEVEL 32;
extern UCHAR HalpVectorToINTI[]; extern UCHAR HalpVectorToIRQL[];
// Definition for IA64 complete
//
// ACPI specific stuff
//
// from detect\i386\acpibios.h
typedef struct _ACPI_BIOS_INSTALLATION_CHECK { UCHAR Signature[8]; // "RSD PTR" (ascii)
UCHAR Checksum; UCHAR OemId[6]; // An OEM-supplied string
UCHAR reserved; // must be 0
ULONG RsdtAddress; // 32-bit physical address of RSDT
} ACPI_BIOS_INSTALLATION_CHECK, *PACPI_BIOS_INSTALLATION_CHECK;
NTSTATUS HalpAcpiFindRsdt ( OUT PACPI_BIOS_INSTALLATION_CHECK RsdtPtr ); NTSTATUS HalpAcpiFindRsdtPhase0( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); NTSTATUS HalpSetupAcpiPhase0( IN PLOADER_PARAMETER_BLOCK LoaderBlock );
PVOID HalpGetAcpiTable( ULONG Signature );
VOID HalpSleepS5( VOID ); VOID HalProcessorThrottle ( UCHAR );
VOID HalpStoreBufferUCHAR ( PUCHAR VirtualAddress, PUCHAR Buffer, ULONG Count );
VOID HalpStoreBufferUSHORT ( PUSHORT VirtualAddress, PUSHORT Buffer, ULONG Count );
VOID HalpStoreBufferULONG ( PULONG VirtualAddress, PULONG Buffer, ULONG Count );
VOID HalpStoreBufferULONGLONG ( PULONGLONG VirtualAddress, PULONGLONG Buffer, ULONG Count );
VOID HalpLoadBufferUCHAR ( PUCHAR VirtualAddress, PUCHAR Buffer, ULONG Count );
VOID HalpLoadBufferUSHORT ( PUSHORT VirtualAddress, PUSHORT Buffer, ULONG Count );
VOID HalpLoadBufferULONG ( PULONG VirtualAddress, PULONG Buffer, ULONG Count );
VOID HalpLoadBufferULONGLONG ( PULONGLONG VirtualAddress, PULONGLONG Buffer, ULONG Count );
//
// I/O Port space
//
// IoSpaceSize = 0x14 for 2 power 0x14 is 1Meg space size.
//
#define IO_SPACE_SIZE 0x14
// Present bit = 1B to wire the space.
// Memory Attributes = 1001B for UC Memory type
// Accessed Bit = 1B to "enable" access without faulting.
// Dirty Bit = 1B to "enable" write without faulting.
// Privilege Level = 00B for kernel accesses
// Access Right = 010B for read/write accesses
// Exception Deferral= 1B for Exception Deferral.
// Exceptions are deferred
// for speculative loads to pages with
// non-spec. mem. attributes anyway.
// Protection Key = 0 for kernel mode
#define IO_SPACE_ATTRIBUTE 0x0010000000000473
#endif // _HALP_
|