2112 lines
49 KiB
C
2112 lines
49 KiB
C
/*++ BUILD Version: 0010 // Increment this if a change has global effects
|
||
|
||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
||
Module Name:
|
||
|
||
arc.h
|
||
|
||
Abstract:
|
||
|
||
This header file defines the ARC system firmware interface and the
|
||
NT structures that are dependent on ARC types.
|
||
|
||
Author:
|
||
|
||
David N. Cutler (davec) 18-May-1991
|
||
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#ifndef _ARC_
|
||
#define _ARC_
|
||
|
||
#include "profiles.h"
|
||
|
||
|
||
//
|
||
// Define console input and console output file ids.
|
||
//
|
||
|
||
#define ARC_CONSOLE_INPUT 0
|
||
#define ARC_CONSOLE_OUTPUT 1
|
||
|
||
//
|
||
// Define ARC_STATUS type.
|
||
//
|
||
|
||
typedef ULONG ARC_STATUS;
|
||
|
||
//
|
||
// Define the firmware entry point numbers.
|
||
//
|
||
|
||
typedef enum _FIRMWARE_ENTRY {
|
||
LoadRoutine,
|
||
InvokeRoutine,
|
||
ExecuteRoutine,
|
||
HaltRoutine,
|
||
PowerDownRoutine,
|
||
RestartRoutine,
|
||
RebootRoutine,
|
||
InteractiveModeRoutine,
|
||
Reserved1,
|
||
GetPeerRoutine,
|
||
GetChildRoutine,
|
||
GetParentRoutine,
|
||
GetDataRoutine,
|
||
AddChildRoutine,
|
||
DeleteComponentRoutine,
|
||
GetComponentRoutine,
|
||
SaveConfigurationRoutine,
|
||
GetSystemIdRoutine,
|
||
MemoryRoutine,
|
||
Reserved2,
|
||
GetTimeRoutine,
|
||
GetRelativeTimeRoutine,
|
||
GetDirectoryEntryRoutine,
|
||
OpenRoutine,
|
||
CloseRoutine,
|
||
ReadRoutine,
|
||
ReadStatusRoutine,
|
||
WriteRoutine,
|
||
SeekRoutine,
|
||
MountRoutine,
|
||
GetEnvironmentRoutine,
|
||
SetEnvironmentRoutine,
|
||
GetFileInformationRoutine,
|
||
SetFileInformationRoutine,
|
||
FlushAllCachesRoutine,
|
||
TestUnicodeCharacterRoutine,
|
||
GetDisplayStatusRoutine,
|
||
MaximumRoutine
|
||
} FIRMWARE_ENTRY;
|
||
|
||
//
|
||
// Define software loading and execution routine types.
|
||
//
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_EXECUTE_ROUTINE) (
|
||
IN CHAR * FIRMWARE_PTR ImagePath,
|
||
IN ULONG Argc,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Argv,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Envp
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_INVOKE_ROUTINE) (
|
||
IN ULONG EntryAddress,
|
||
IN ULONG StackAddress,
|
||
IN ULONG Argc,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Argv,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Envp
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_LOAD_ROUTINE) (
|
||
IN CHAR * FIRMWARE_PTR ImagePath,
|
||
IN ULONG TopAddress,
|
||
OUT ULONG * FIRMWARE_PTR EntryAddress,
|
||
OUT ULONG * FIRMWARE_PTR LowAddress
|
||
);
|
||
|
||
//
|
||
// Define firmware software loading and execution prototypes.
|
||
//
|
||
|
||
ARC_STATUS
|
||
FwExecute (
|
||
IN CHAR * FIRMWARE_PTR ImagePath,
|
||
IN ULONG Argc,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Argv,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Envp
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwInvoke (
|
||
IN ULONG EntryAddress,
|
||
IN ULONG StackAddress,
|
||
IN ULONG Argc,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Argv,
|
||
IN CHAR * FIRMWARE_PTR * FIRMWARE_PTR Envp
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwLoad (
|
||
IN CHAR * FIRMWARE_PTR ImagePath,
|
||
IN ULONG TopAddress,
|
||
OUT ULONG * FIRMWARE_PTR EntryAddress,
|
||
OUT ULONG * FIRMWARE_PTR LowAddress
|
||
);
|
||
|
||
//
|
||
// Define program termination routine types.
|
||
//
|
||
|
||
typedef
|
||
VOID
|
||
(*PARC_HALT_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PARC_POWERDOWN_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PARC_RESTART_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PARC_REBOOT_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PARC_INTERACTIVE_MODE_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Define firmware program termination prototypes.
|
||
//
|
||
|
||
VOID
|
||
FwHalt (
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
FwPowerDown (
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
FwRestart (
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
FwReboot (
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
FwEnterInteractiveMode (
|
||
VOID
|
||
);
|
||
|
||
// begin_ntddk
|
||
//
|
||
// Define configuration routine types.
|
||
//
|
||
// Configuration information.
|
||
//
|
||
// end_ntddk
|
||
|
||
typedef enum _CONFIGURATION_CLASS {
|
||
SystemClass,
|
||
ProcessorClass,
|
||
CacheClass,
|
||
AdapterClass,
|
||
ControllerClass,
|
||
PeripheralClass,
|
||
MemoryClass,
|
||
MaximumClass
|
||
} CONFIGURATION_CLASS, *PCONFIGURATION_CLASS;
|
||
|
||
// begin_ntddk
|
||
|
||
typedef enum _CONFIGURATION_TYPE {
|
||
ArcSystem,
|
||
CentralProcessor,
|
||
FloatingPointProcessor,
|
||
PrimaryIcache,
|
||
PrimaryDcache,
|
||
SecondaryIcache,
|
||
SecondaryDcache,
|
||
SecondaryCache,
|
||
EisaAdapter,
|
||
TcAdapter,
|
||
ScsiAdapter,
|
||
DtiAdapter,
|
||
MultiFunctionAdapter,
|
||
DiskController,
|
||
TapeController,
|
||
CdromController,
|
||
WormController,
|
||
SerialController,
|
||
NetworkController,
|
||
DisplayController,
|
||
ParallelController,
|
||
PointerController,
|
||
KeyboardController,
|
||
AudioController,
|
||
OtherController,
|
||
DiskPeripheral,
|
||
FloppyDiskPeripheral,
|
||
TapePeripheral,
|
||
ModemPeripheral,
|
||
MonitorPeripheral,
|
||
PrinterPeripheral,
|
||
PointerPeripheral,
|
||
KeyboardPeripheral,
|
||
TerminalPeripheral,
|
||
OtherPeripheral,
|
||
LinePeripheral,
|
||
NetworkPeripheral,
|
||
SystemMemory,
|
||
DockingInformation,
|
||
RealModeIrqRoutingTable,
|
||
RealModePCIEnumeration,
|
||
MaximumType
|
||
} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
|
||
|
||
// end_ntddk
|
||
|
||
typedef struct _CONFIGURATION_COMPONENT {
|
||
CONFIGURATION_CLASS Class;
|
||
CONFIGURATION_TYPE Type;
|
||
DEVICE_FLAGS Flags;
|
||
USHORT Version;
|
||
USHORT Revision;
|
||
ULONG Key;
|
||
ULONG AffinityMask;
|
||
ULONG ConfigurationDataLength;
|
||
ULONG IdentifierLength;
|
||
CHAR * FIRMWARE_PTR Identifier;
|
||
} CONFIGURATION_COMPONENT, * FIRMWARE_PTR PCONFIGURATION_COMPONENT;
|
||
|
||
typedef
|
||
PCONFIGURATION_COMPONENT
|
||
(*PARC_GET_CHILD_ROUTINE) (
|
||
IN PCONFIGURATION_COMPONENT Component OPTIONAL
|
||
);
|
||
|
||
typedef
|
||
PCONFIGURATION_COMPONENT
|
||
(*PARC_GET_PARENT_ROUTINE) (
|
||
IN PCONFIGURATION_COMPONENT Component
|
||
);
|
||
|
||
typedef
|
||
PCONFIGURATION_COMPONENT
|
||
(*PARC_GET_PEER_ROUTINE) (
|
||
IN PCONFIGURATION_COMPONENT Component
|
||
);
|
||
|
||
typedef
|
||
PCONFIGURATION_COMPONENT
|
||
(*PARC_ADD_CHILD_ROUTINE) (
|
||
IN PCONFIGURATION_COMPONENT Component,
|
||
IN PCONFIGURATION_COMPONENT NewComponent,
|
||
IN VOID * FIRMWARE_PTR ConfigurationData
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_DELETE_COMPONENT_ROUTINE) (
|
||
IN PCONFIGURATION_COMPONENT Component
|
||
);
|
||
|
||
typedef
|
||
PCONFIGURATION_COMPONENT
|
||
(*PARC_GET_COMPONENT_ROUTINE) (
|
||
IN CHAR * FIRMWARE_PTR Path
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_GET_DATA_ROUTINE) (
|
||
OUT VOID * FIRMWARE_PTR ConfigurationData,
|
||
IN PCONFIGURATION_COMPONENT Component
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_SAVE_CONFIGURATION_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Define firmware configuration prototypes.
|
||
//
|
||
|
||
PCONFIGURATION_COMPONENT
|
||
FwGetChild (
|
||
IN PCONFIGURATION_COMPONENT Component OPTIONAL
|
||
);
|
||
|
||
PCONFIGURATION_COMPONENT
|
||
FwGetParent (
|
||
IN PCONFIGURATION_COMPONENT Component
|
||
);
|
||
|
||
PCONFIGURATION_COMPONENT
|
||
FwGetPeer (
|
||
IN PCONFIGURATION_COMPONENT Component
|
||
);
|
||
|
||
PCONFIGURATION_COMPONENT
|
||
FwAddChild (
|
||
IN PCONFIGURATION_COMPONENT Component,
|
||
IN PCONFIGURATION_COMPONENT NewComponent,
|
||
IN VOID * FIRMWARE_PTR ConfigurationData OPTIONAL
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwDeleteComponent (
|
||
IN PCONFIGURATION_COMPONENT Component
|
||
);
|
||
|
||
PCONFIGURATION_COMPONENT
|
||
FwGetComponent(
|
||
IN CHAR * FIRMWARE_PTR Path
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwGetConfigurationData (
|
||
OUT VOID * FIRMWARE_PTR ConfigurationData,
|
||
IN PCONFIGURATION_COMPONENT Component
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwSaveConfiguration (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// System information.
|
||
//
|
||
|
||
typedef struct _SYSTEM_ID {
|
||
CHAR VendorId[8];
|
||
CHAR ProductId[8];
|
||
} SYSTEM_ID, * FIRMWARE_PTR PSYSTEM_ID;
|
||
|
||
typedef
|
||
PSYSTEM_ID
|
||
(*PARC_GET_SYSTEM_ID_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Define system identifier query routine type.
|
||
//
|
||
|
||
PSYSTEM_ID
|
||
FwGetSystemId (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Memory information.
|
||
//
|
||
|
||
typedef enum _MEMORY_TYPE {
|
||
MemoryExceptionBlock,
|
||
MemorySystemBlock,
|
||
MemoryFree,
|
||
MemoryBad,
|
||
MemoryLoadedProgram,
|
||
MemoryFirmwareTemporary,
|
||
MemoryFirmwarePermanent,
|
||
MemoryFreeContiguous,
|
||
MemorySpecialMemory,
|
||
MemoryMaximum
|
||
} MEMORY_TYPE;
|
||
|
||
typedef struct _MEMORY_DESCRIPTOR {
|
||
MEMORY_TYPE MemoryType;
|
||
ULONG BasePage;
|
||
ULONG PageCount;
|
||
} MEMORY_DESCRIPTOR, * FIRMWARE_PTR PMEMORY_DESCRIPTOR;
|
||
|
||
#if defined(_IA64_)
|
||
|
||
//
|
||
// Cache Attribute.
|
||
//
|
||
|
||
#define WTU 0x1
|
||
#define WTO 0x2
|
||
#define WBO 0x4
|
||
#define WBU 0x8
|
||
#define WCU 0x10
|
||
#define UCU 0x20
|
||
#define UCUE 0x40
|
||
#define UCO 0x80
|
||
|
||
typedef enum _MEMORY_USAGE_TYPE {
|
||
RegularMemory,
|
||
MemoryMappedIo,
|
||
ProcessorIoBlock,
|
||
BootServicesCode,
|
||
BootServicesData,
|
||
RuntimeServicesCode,
|
||
RuntimeServicesData,
|
||
FirmwareSpace,
|
||
DisplayMemory,
|
||
CacheAttributeMaximum
|
||
} MEMORY_USAGE_TYPE;
|
||
|
||
typedef struct _CACHE_ATTRIBUTE_DESCRIPTOR {
|
||
LIST_ENTRY ListEntry;
|
||
MEMORY_USAGE_TYPE MemoryUsage;
|
||
ULONG CacheAttribute;
|
||
ULONG BasePage;
|
||
ULONG PageCount;
|
||
} CACHE_ATTRIBUTE_DESCRIPTOR, *PCACHE_ATTRIBUTE_DESCRIPTOR;
|
||
|
||
#endif // defined(_IA64_)
|
||
|
||
typedef
|
||
PMEMORY_DESCRIPTOR
|
||
(*PARC_MEMORY_ROUTINE) (
|
||
IN PMEMORY_DESCRIPTOR MemoryDescriptor OPTIONAL
|
||
);
|
||
|
||
//
|
||
// Define memory query routine type.
|
||
//
|
||
|
||
PMEMORY_DESCRIPTOR
|
||
FwGetMemoryDescriptor (
|
||
IN PMEMORY_DESCRIPTOR MemoryDescriptor OPTIONAL
|
||
);
|
||
|
||
//
|
||
// Query time functions.
|
||
//
|
||
|
||
typedef
|
||
PTIME_FIELDS
|
||
(*PARC_GET_TIME_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
ULONG
|
||
(*PARC_GET_RELATIVE_TIME_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Define query time routine types.
|
||
//
|
||
|
||
PTIME_FIELDS
|
||
FwGetTime (
|
||
VOID
|
||
);
|
||
|
||
ULONG
|
||
FwGetRelativeTime (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Define I/O routine types.
|
||
//
|
||
|
||
#define ArcReadOnlyFile 1
|
||
#define ArcHiddenFile 2
|
||
#define ArcSystemFile 4
|
||
#define ArcArchiveFile 8
|
||
#define ArcDirectoryFile 16
|
||
#define ArcDeleteFile 32
|
||
|
||
typedef enum _OPEN_MODE {
|
||
ArcOpenReadOnly,
|
||
ArcOpenWriteOnly,
|
||
ArcOpenReadWrite,
|
||
ArcCreateWriteOnly,
|
||
ArcCreateReadWrite,
|
||
ArcSupersedeWriteOnly,
|
||
ArcSupersedeReadWrite,
|
||
ArcOpenDirectory,
|
||
ArcCreateDirectory,
|
||
ArcOpenMaximumMode
|
||
} OPEN_MODE;
|
||
|
||
typedef struct _FILE_INFORMATION {
|
||
LARGE_INTEGER StartingAddress;
|
||
LARGE_INTEGER EndingAddress;
|
||
LARGE_INTEGER CurrentPosition;
|
||
CONFIGURATION_TYPE Type;
|
||
ULONG FileNameLength;
|
||
UCHAR Attributes;
|
||
CHAR FileName[32];
|
||
} FILE_INFORMATION, * FIRMWARE_PTR PFILE_INFORMATION;
|
||
|
||
typedef enum _SEEK_MODE {
|
||
SeekAbsolute,
|
||
SeekRelative,
|
||
SeekMaximum
|
||
} SEEK_MODE;
|
||
|
||
typedef enum _MOUNT_OPERATION {
|
||
MountLoadMedia,
|
||
MountUnloadMedia,
|
||
MountMaximum
|
||
} MOUNT_OPERATION;
|
||
|
||
typedef struct _DIRECTORY_ENTRY {
|
||
ULONG FileNameLength;
|
||
UCHAR FileAttribute;
|
||
CHAR FileName[32];
|
||
} DIRECTORY_ENTRY, * FIRMWARE_PTR PDIRECTORY_ENTRY;
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_CLOSE_ROUTINE) (
|
||
IN ULONG FileId
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_MOUNT_ROUTINE) (
|
||
IN CHAR * FIRMWARE_PTR MountPath,
|
||
IN MOUNT_OPERATION Operation
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_OPEN_ROUTINE) (
|
||
IN CHAR * FIRMWARE_PTR OpenPath,
|
||
IN OPEN_MODE OpenMode,
|
||
OUT ULONG * FIRMWARE_PTR FileId
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_READ_ROUTINE) (
|
||
IN ULONG FileId,
|
||
OUT VOID * FIRMWARE_PTR Buffer,
|
||
IN ULONG Length,
|
||
OUT ULONG * FIRMWARE_PTR Count
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_READ_STATUS_ROUTINE) (
|
||
IN ULONG FileId
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_SEEK_ROUTINE) (
|
||
IN ULONG FileId,
|
||
IN LARGE_INTEGER * FIRMWARE_PTR Offset,
|
||
IN SEEK_MODE SeekMode
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_WRITE_ROUTINE) (
|
||
IN ULONG FileId,
|
||
IN VOID * FIRMWARE_PTR Buffer,
|
||
IN ULONG Length,
|
||
OUT ULONG * FIRMWARE_PTR Count
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_GET_FILE_INFO_ROUTINE) (
|
||
IN ULONG FileId,
|
||
OUT PFILE_INFORMATION FileInformation
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_SET_FILE_INFO_ROUTINE) (
|
||
IN ULONG FileId,
|
||
IN ULONG AttributeFlags,
|
||
IN ULONG AttributeMask
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_GET_DIRECTORY_ENTRY_ROUTINE) (
|
||
IN ULONG FileId,
|
||
OUT PDIRECTORY_ENTRY Buffer,
|
||
IN ULONG Length,
|
||
OUT ULONG * FIRMWARE_PTR Count
|
||
);
|
||
|
||
//
|
||
// Define firmware I/O prototypes.
|
||
//
|
||
|
||
ARC_STATUS
|
||
FwClose (
|
||
IN ULONG FileId
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwMount (
|
||
IN CHAR * FIRMWARE_PTR MountPath,
|
||
IN MOUNT_OPERATION Operation
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwOpen (
|
||
IN CHAR * FIRMWARE_PTR OpenPath,
|
||
IN OPEN_MODE OpenMode,
|
||
OUT ULONG * FIRMWARE_PTR FileId
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwRead (
|
||
IN ULONG FileId,
|
||
OUT VOID * FIRMWARE_PTR Buffer,
|
||
IN ULONG Length,
|
||
OUT ULONG * FIRMWARE_PTR Count
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwGetReadStatus (
|
||
IN ULONG FileId
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwSeek (
|
||
IN ULONG FileId,
|
||
IN LARGE_INTEGER * FIRMWARE_PTR Offset,
|
||
IN SEEK_MODE SeekMode
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwWrite (
|
||
IN ULONG FileId,
|
||
IN VOID * FIRMWARE_PTR Buffer,
|
||
IN ULONG Length,
|
||
OUT ULONG * FIRMWARE_PTR Count
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwGetFileInformation (
|
||
IN ULONG FileId,
|
||
OUT PFILE_INFORMATION FileInformation
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwSetFileInformation (
|
||
IN ULONG FileId,
|
||
IN ULONG AttributeFlags,
|
||
IN ULONG AttributeMask
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwGetDirectoryEntry (
|
||
IN ULONG FileId,
|
||
OUT PDIRECTORY_ENTRY Buffer,
|
||
IN ULONG Length,
|
||
OUT ULONG * FIRMWARE_PTR Count
|
||
);
|
||
|
||
|
||
//
|
||
// Define environment routine types.
|
||
//
|
||
|
||
typedef
|
||
CHAR * FIRMWARE_PTR
|
||
(*PARC_GET_ENVIRONMENT_ROUTINE) (
|
||
IN CHAR * FIRMWARE_PTR Variable
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_SET_ENVIRONMENT_ROUTINE) (
|
||
IN CHAR * FIRMWARE_PTR Variable,
|
||
IN CHAR * FIRMWARE_PTR Value
|
||
);
|
||
|
||
//
|
||
// Define firmware environment prototypes.
|
||
//
|
||
|
||
CHAR * FIRMWARE_PTR
|
||
FwGetEnvironmentVariable (
|
||
IN CHAR * FIRMWARE_PTR Variable
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwSetEnvironmentVariable (
|
||
IN CHAR * FIRMWARE_PTR Variable,
|
||
IN CHAR * FIRMWARE_PTR Value
|
||
);
|
||
|
||
//
|
||
// Define functions to acquire and release the firmware lock and the stub
|
||
// function prototypes necessary to interface with the 32-bit firmware on
|
||
// 64-bit systems.
|
||
//
|
||
// These routines are required for the 64-bit system until (if) 64-bit
|
||
// firmware is ever supplied.
|
||
//
|
||
|
||
#if defined(_AXP64_) && defined(_NTHAL_)
|
||
|
||
extern ULONGLONG HalpMarshallBuffer[];
|
||
extern KSPIN_LOCK HalpFirmwareLock;
|
||
|
||
CHAR * FIRMWARE_PTR
|
||
HalpArcGetEnvironmentVariable(
|
||
IN CHAR * FIRMWARE_PTR Variable
|
||
);
|
||
|
||
ARC_STATUS
|
||
HalpArcSetEnvironmentVariable(
|
||
IN CHAR * FIRMWARE_PTR Variable,
|
||
IN CHAR * FIRMWARE_PTR Value
|
||
);
|
||
|
||
KIRQL
|
||
FwAcquireFirmwareLock(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
FwReleaseFirmwareLock(
|
||
IN KIRQL OldIrql
|
||
);
|
||
|
||
#endif // _AXP64_ && defined(_NTHAL_)
|
||
|
||
|
||
//
|
||
// Define cache flush routine types
|
||
//
|
||
|
||
typedef
|
||
VOID
|
||
(*PARC_FLUSH_ALL_CACHES_ROUTINE) (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Define firmware cache flush prototypes.
|
||
//
|
||
|
||
VOID
|
||
FwFlushAllCaches (
|
||
VOID
|
||
);
|
||
|
||
//
|
||
// Define TestUnicodeCharacter and GetDisplayStatus routines.
|
||
//
|
||
|
||
typedef struct _ARC_DISPLAY_STATUS {
|
||
USHORT CursorXPosition;
|
||
USHORT CursorYPosition;
|
||
USHORT CursorMaxXPosition;
|
||
USHORT CursorMaxYPosition;
|
||
UCHAR ForegroundColor;
|
||
UCHAR BackgroundColor;
|
||
BOOLEAN HighIntensity;
|
||
BOOLEAN Underscored;
|
||
BOOLEAN ReverseVideo;
|
||
} ARC_DISPLAY_STATUS, * FIRMWARE_PTR PARC_DISPLAY_STATUS;
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PARC_TEST_UNICODE_CHARACTER_ROUTINE) (
|
||
IN ULONG FileId,
|
||
IN WCHAR UnicodeCharacter
|
||
);
|
||
|
||
typedef
|
||
PARC_DISPLAY_STATUS
|
||
(*PARC_GET_DISPLAY_STATUS_ROUTINE) (
|
||
IN ULONG FileId
|
||
);
|
||
|
||
ARC_STATUS
|
||
FwTestUnicodeCharacter(
|
||
IN ULONG FileId,
|
||
IN WCHAR UnicodeCharacter
|
||
);
|
||
|
||
PARC_DISPLAY_STATUS
|
||
FwGetDisplayStatus(
|
||
IN ULONG FileId
|
||
);
|
||
|
||
|
||
//
|
||
// Define low memory data structures.
|
||
//
|
||
// Define debug block structure.
|
||
//
|
||
|
||
typedef struct _DEBUG_BLOCK {
|
||
ULONG Signature;
|
||
ULONG Length;
|
||
} DEBUG_BLOCK, * FIRMWARE_PTR PDEBUG_BLOCK;
|
||
|
||
//
|
||
// Define restart block structure.
|
||
//
|
||
|
||
#define ARC_RESTART_BLOCK_SIGNATURE 0x42545352
|
||
|
||
typedef struct _BOOT_STATUS {
|
||
ULONG BootStarted : 1;
|
||
ULONG BootFinished : 1;
|
||
ULONG RestartStarted : 1;
|
||
ULONG RestartFinished : 1;
|
||
ULONG PowerFailStarted : 1;
|
||
ULONG PowerFailFinished : 1;
|
||
ULONG ProcessorReady : 1;
|
||
ULONG ProcessorRunning : 1;
|
||
ULONG ProcessorStart : 1;
|
||
} BOOT_STATUS, * FIRMWARE_PTR PBOOT_STATUS;
|
||
|
||
typedef struct _ALPHA_RESTART_STATE {
|
||
|
||
#if defined(_ALPHA_) || defined(_AXP64_)
|
||
|
||
//
|
||
// Control information
|
||
//
|
||
|
||
ULONG HaltReason;
|
||
VOID * FIRMWARE_PTR LogoutFrame;
|
||
ULONGLONG PalBase;
|
||
|
||
//
|
||
// Integer Save State
|
||
//
|
||
|
||
ULONGLONG IntV0;
|
||
ULONGLONG IntT0;
|
||
ULONGLONG IntT1;
|
||
ULONGLONG IntT2;
|
||
ULONGLONG IntT3;
|
||
ULONGLONG IntT4;
|
||
ULONGLONG IntT5;
|
||
ULONGLONG IntT6;
|
||
ULONGLONG IntT7;
|
||
ULONGLONG IntS0;
|
||
ULONGLONG IntS1;
|
||
ULONGLONG IntS2;
|
||
ULONGLONG IntS3;
|
||
ULONGLONG IntS4;
|
||
ULONGLONG IntS5;
|
||
ULONGLONG IntFp;
|
||
ULONGLONG IntA0;
|
||
ULONGLONG IntA1;
|
||
ULONGLONG IntA2;
|
||
ULONGLONG IntA3;
|
||
ULONGLONG IntA4;
|
||
ULONGLONG IntA5;
|
||
ULONGLONG IntT8;
|
||
ULONGLONG IntT9;
|
||
ULONGLONG IntT10;
|
||
ULONGLONG IntT11;
|
||
ULONGLONG IntRa;
|
||
ULONGLONG IntT12;
|
||
ULONGLONG IntAT;
|
||
ULONGLONG IntGp;
|
||
ULONGLONG IntSp;
|
||
ULONGLONG IntZero;
|
||
|
||
//
|
||
// Floating Point Save State
|
||
//
|
||
|
||
ULONGLONG Fpcr;
|
||
ULONGLONG FltF0;
|
||
ULONGLONG FltF1;
|
||
ULONGLONG FltF2;
|
||
ULONGLONG FltF3;
|
||
ULONGLONG FltF4;
|
||
ULONGLONG FltF5;
|
||
ULONGLONG FltF6;
|
||
ULONGLONG FltF7;
|
||
ULONGLONG FltF8;
|
||
ULONGLONG FltF9;
|
||
ULONGLONG FltF10;
|
||
ULONGLONG FltF11;
|
||
ULONGLONG FltF12;
|
||
ULONGLONG FltF13;
|
||
ULONGLONG FltF14;
|
||
ULONGLONG FltF15;
|
||
ULONGLONG FltF16;
|
||
ULONGLONG FltF17;
|
||
ULONGLONG FltF18;
|
||
ULONGLONG FltF19;
|
||
ULONGLONG FltF20;
|
||
ULONGLONG FltF21;
|
||
ULONGLONG FltF22;
|
||
ULONGLONG FltF23;
|
||
ULONGLONG FltF24;
|
||
ULONGLONG FltF25;
|
||
ULONGLONG FltF26;
|
||
ULONGLONG FltF27;
|
||
ULONGLONG FltF28;
|
||
ULONGLONG FltF29;
|
||
ULONGLONG FltF30;
|
||
ULONGLONG FltF31;
|
||
|
||
//
|
||
// Architected Internal Processor State.
|
||
//
|
||
|
||
ULONG Asn;
|
||
VOID * FIRMWARE_PTR GeneralEntry;
|
||
VOID * FIRMWARE_PTR Iksp;
|
||
VOID * FIRMWARE_PTR InterruptEntry;
|
||
VOID * FIRMWARE_PTR Kgp;
|
||
ULONG Mces;
|
||
VOID * FIRMWARE_PTR MemMgmtEntry;
|
||
VOID * FIRMWARE_PTR PanicEntry;
|
||
VOID * FIRMWARE_PTR Pcr;
|
||
VOID * FIRMWARE_PTR Pdr;
|
||
ULONG Psr;
|
||
VOID * FIRMWARE_PTR ReiRestartAddress;
|
||
ULONG Sirr;
|
||
VOID * FIRMWARE_PTR SyscallEntry;
|
||
VOID * FIRMWARE_PTR Teb;
|
||
VOID * FIRMWARE_PTR Thread;
|
||
|
||
//
|
||
// Processor Implementation-dependent State.
|
||
//
|
||
|
||
ULONGLONG PerProcessorState[175]; // allocate 2K maximum restart block
|
||
|
||
#else
|
||
|
||
ULONG PlaceHolder;
|
||
|
||
#endif
|
||
|
||
} ALPHA_RESTART_STATE, * FIRMWARE_PTR PALPHA_RESTART_STATE;
|
||
|
||
typedef struct _I386_RESTART_STATE {
|
||
|
||
#if defined(_X86_)
|
||
|
||
//
|
||
// Put state structure here.
|
||
//
|
||
|
||
ULONG PlaceHolder;
|
||
|
||
#else
|
||
|
||
ULONG PlaceHolder;
|
||
|
||
#endif
|
||
|
||
} I386_RESTART_STATE, *PI386_RESTART_STATE;
|
||
|
||
#if defined(_IA64_)
|
||
#include "pshpck16.h"
|
||
#endif
|
||
|
||
|
||
typedef struct _IA64_RESTART_STATE {
|
||
|
||
#if defined(_IA64_)
|
||
|
||
|
||
//
|
||
// This structure is copied from CONTEXT structure in sdk/ntia64.h.
|
||
//
|
||
|
||
//
|
||
// The flags values within this flag control the contents of
|
||
// a CONTEXT record.
|
||
//
|
||
// If the context record is used as an input parameter, then
|
||
// for each portion of the context record controlled by a flag
|
||
// whose value is set, it is assumed that that portion of the
|
||
// context record contains valid context. If the context record
|
||
// is being used to modify a thread's context, then only that
|
||
// portion of the threads context will be modified.
|
||
//
|
||
// If the context record is used as an IN OUT parameter to capture
|
||
// the context of a thread, then only those portions of the thread's
|
||
// context corresponding to set flags will be returned.
|
||
//
|
||
// The context record is never used as an OUT only parameter.
|
||
//
|
||
|
||
ULONG ContextFlags;
|
||
ULONG Fill1[3]; // for alignment of following on 16-byte boundary
|
||
|
||
//
|
||
// This section is specified/returned if the ContextFlags word contains
|
||
// the flag CONTEXT_DEBUG.
|
||
//
|
||
// N.B. CONTEXT_DEBUG is *not* part of CONTEXT_FULL.
|
||
//
|
||
|
||
ULONGLONG DbI0; // Instruction debug registers
|
||
ULONGLONG DbI1;
|
||
ULONGLONG DbI2;
|
||
ULONGLONG DbI3;
|
||
ULONGLONG DbI4;
|
||
ULONGLONG DbI5;
|
||
ULONGLONG DbI6;
|
||
ULONGLONG DbI7;
|
||
|
||
ULONGLONG DbD0; // Data debug registers
|
||
ULONGLONG DbD1;
|
||
ULONGLONG DbD2;
|
||
ULONGLONG DbD3;
|
||
ULONGLONG DbD4;
|
||
ULONGLONG DbD5;
|
||
ULONGLONG DbD6;
|
||
ULONGLONG DbD7;
|
||
|
||
//
|
||
// This section is specified/returned if the ContextFlags word contains
|
||
// the flag CONTEXT_LOWER_FLOATING_POINT.
|
||
//
|
||
|
||
FLOAT128 FltS0; // Lower saved (preserved)
|
||
FLOAT128 FltS1;
|
||
FLOAT128 FltS2;
|
||
FLOAT128 FltS3;
|
||
FLOAT128 FltS4;
|
||
FLOAT128 FltS5;
|
||
FLOAT128 FltT0; // Lower temporary (scratch)
|
||
FLOAT128 FltT1;
|
||
FLOAT128 FltT2;
|
||
FLOAT128 FltT3;
|
||
FLOAT128 FltT4;
|
||
FLOAT128 FltT5;
|
||
FLOAT128 FltT6;
|
||
FLOAT128 FltT7;
|
||
|
||
//
|
||
// This section is specified/returned if the ContextFlags word contains
|
||
// the flag CONTEXT_HIGHER_FLOATING_POINT.
|
||
//
|
||
|
||
FLOAT128 FltS6; // Higher saved (preserved) floats
|
||
FLOAT128 FltS7;
|
||
FLOAT128 FltS8;
|
||
FLOAT128 FltS9;
|
||
FLOAT128 FltS10;
|
||
FLOAT128 FltS11;
|
||
FLOAT128 FltS12;
|
||
FLOAT128 FltS13;
|
||
FLOAT128 FltS14;
|
||
FLOAT128 FltS15;
|
||
FLOAT128 FltS16;
|
||
FLOAT128 FltS17;
|
||
FLOAT128 FltS18;
|
||
FLOAT128 FltS19;
|
||
FLOAT128 FltS20;
|
||
FLOAT128 FltS21;
|
||
|
||
FLOAT128 FltF32;
|
||
FLOAT128 FltF33;
|
||
FLOAT128 FltF34;
|
||
FLOAT128 FltF35;
|
||
FLOAT128 FltF36;
|
||
FLOAT128 FltF37;
|
||
FLOAT128 FltF38;
|
||
FLOAT128 FltF39;
|
||
|
||
FLOAT128 FltF40;
|
||
FLOAT128 FltF41;
|
||
FLOAT128 FltF42;
|
||
FLOAT128 FltF43;
|
||
FLOAT128 FltF44;
|
||
FLOAT128 FltF45;
|
||
FLOAT128 FltF46;
|
||
FLOAT128 FltF47;
|
||
FLOAT128 FltF48;
|
||
FLOAT128 FltF49;
|
||
|
||
FLOAT128 FltF50;
|
||
FLOAT128 FltF51;
|
||
FLOAT128 FltF52;
|
||
FLOAT128 FltF53;
|
||
FLOAT128 FltF54;
|
||
FLOAT128 FltF55;
|
||
FLOAT128 FltF56;
|
||
FLOAT128 FltF57;
|
||
FLOAT128 FltF58;
|
||
FLOAT128 FltF59;
|
||
|
||
FLOAT128 FltF60;
|
||
FLOAT128 FltF61;
|
||
FLOAT128 FltF62;
|
||
FLOAT128 FltF63;
|
||
FLOAT128 FltF64;
|
||
FLOAT128 FltF65;
|
||
FLOAT128 FltF66;
|
||
FLOAT128 FltF67;
|
||
FLOAT128 FltF68;
|
||
FLOAT128 FltF69;
|
||
|
||
FLOAT128 FltF70;
|
||
FLOAT128 FltF71;
|
||
FLOAT128 FltF72;
|
||
FLOAT128 FltF73;
|
||
FLOAT128 FltF74;
|
||
FLOAT128 FltF75;
|
||
FLOAT128 FltF76;
|
||
FLOAT128 FltF77;
|
||
FLOAT128 FltF78;
|
||
FLOAT128 FltF79;
|
||
|
||
FLOAT128 FltF80;
|
||
FLOAT128 FltF81;
|
||
FLOAT128 FltF82;
|
||
FLOAT128 FltF83;
|
||
FLOAT128 FltF84;
|
||
FLOAT128 FltF85;
|
||
FLOAT128 FltF86;
|
||
FLOAT128 FltF87;
|
||
FLOAT128 FltF88;
|
||
FLOAT128 FltF89;
|
||
|
||
FLOAT128 FltF90;
|
||
FLOAT128 FltF91;
|
||
FLOAT128 FltF92;
|
||
FLOAT128 FltF93;
|
||
FLOAT128 FltF94;
|
||
FLOAT128 FltF95;
|
||
FLOAT128 FltF96;
|
||
FLOAT128 FltF97;
|
||
FLOAT128 FltF98;
|
||
FLOAT128 FltF99;
|
||
|
||
FLOAT128 FltF100;
|
||
FLOAT128 FltF101;
|
||
FLOAT128 FltF102;
|
||
FLOAT128 FltF103;
|
||
FLOAT128 FltF104;
|
||
FLOAT128 FltF105;
|
||
FLOAT128 FltF106;
|
||
FLOAT128 FltF107;
|
||
FLOAT128 FltF108;
|
||
FLOAT128 FltF109;
|
||
|
||
FLOAT128 FltF110;
|
||
FLOAT128 FltF111;
|
||
FLOAT128 FltF112;
|
||
FLOAT128 FltF113;
|
||
FLOAT128 FltF114;
|
||
FLOAT128 FltF115;
|
||
FLOAT128 FltF116;
|
||
FLOAT128 FltF117;
|
||
FLOAT128 FltF118;
|
||
FLOAT128 FltF119;
|
||
|
||
FLOAT128 FltF120;
|
||
FLOAT128 FltF121;
|
||
FLOAT128 FltF122;
|
||
FLOAT128 FltF123;
|
||
FLOAT128 FltF124;
|
||
FLOAT128 FltF125;
|
||
FLOAT128 FltF126;
|
||
FLOAT128 FltF127;
|
||
|
||
//
|
||
// This section is specified/returned if the ContextFlags word contains
|
||
// the flag CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT.
|
||
// **** TBD **** in some cases it may more efficient to return with
|
||
// CONTEXT_CONTROL
|
||
//
|
||
|
||
ULONGLONG StFPSR; // FP status
|
||
|
||
//
|
||
// This section is specified/returned if the ContextFlags word contains
|
||
// the flag CONTEXT_INTEGER.
|
||
//
|
||
// N.B. The registers gp, sp, rp are part of the control context
|
||
//
|
||
|
||
ULONGLONG IntGp; // global pointer (r1)
|
||
ULONGLONG IntT0;
|
||
ULONGLONG IntT1;
|
||
ULONGLONG IntS0;
|
||
ULONGLONG IntS1;
|
||
ULONGLONG IntS2;
|
||
ULONGLONG IntS3;
|
||
ULONGLONG IntV0; // return value (r8)
|
||
ULONGLONG IntAp; // argument pointer (r9)
|
||
ULONGLONG IntT2;
|
||
ULONGLONG IntT3;
|
||
ULONGLONG IntSp; // stack pointer (r12)
|
||
ULONGLONG IntT4;
|
||
ULONGLONG IntT5;
|
||
ULONGLONG IntT6;
|
||
ULONGLONG IntT7;
|
||
ULONGLONG IntT8;
|
||
ULONGLONG IntT9;
|
||
ULONGLONG IntT10;
|
||
ULONGLONG IntT11;
|
||
ULONGLONG IntT12;
|
||
ULONGLONG IntT13;
|
||
ULONGLONG IntT14;
|
||
ULONGLONG IntT15;
|
||
ULONGLONG IntT16;
|
||
ULONGLONG IntT17;
|
||
ULONGLONG IntT18;
|
||
ULONGLONG IntT19;
|
||
ULONGLONG IntT20;
|
||
ULONGLONG IntT21;
|
||
ULONGLONG IntT22;
|
||
|
||
ULONGLONG IntNats; // Nat bits for general registers
|
||
// r1-r31 in bit positions 1 to 31.
|
||
ULONGLONG Preds; // Predicates
|
||
|
||
ULONGLONG BrS0l; // Branch registers
|
||
ULONGLONG BrS0h;
|
||
ULONGLONG BrS1l;
|
||
ULONGLONG BrS1h;
|
||
ULONGLONG BrS2l;
|
||
ULONGLONG BrS2h;
|
||
ULONGLONG BrS3l;
|
||
ULONGLONG BrS3h;
|
||
ULONGLONG BrS4l;
|
||
ULONGLONG BrS4h;
|
||
ULONGLONG BrT0l;
|
||
ULONGLONG BrT0h;
|
||
ULONGLONG BrT1l;
|
||
ULONGLONG BrT1h;
|
||
ULONGLONG BrRpl; // return pointer
|
||
ULONGLONG BrRph;
|
||
ULONGLONG BrT2l;
|
||
ULONGLONG BrT2h;
|
||
ULONGLONG BrT3l;
|
||
ULONGLONG BrT3h;
|
||
ULONGLONG BrT4l;
|
||
ULONGLONG BrT4h;
|
||
ULONGLONG BrT5l;
|
||
ULONGLONG BrT5h;
|
||
ULONGLONG BrT6l;
|
||
ULONGLONG BrT6h;
|
||
ULONGLONG BrT7l;
|
||
ULONGLONG BrT7h;
|
||
ULONGLONG BrT8l;
|
||
ULONGLONG BrT8h;
|
||
ULONGLONG BrT9l;
|
||
ULONGLONG BrT9h;
|
||
|
||
// This section is specified/returned if the ContextFlags word contains
|
||
// the flag CONTEXT_CONTROL.
|
||
//
|
||
|
||
// Other application registers
|
||
ULONGLONG ApSunatcr; // User Nat collection register (preserved)
|
||
ULONGLONG ApSlc; // Loop counter register (preserved)
|
||
ULONGLONG ApTccv; // CMPXCHG value register (volatile)
|
||
|
||
ULONGLONG ApDCR;
|
||
|
||
// Register stack info
|
||
ULONGLONG RsPFS;
|
||
ULONGLONG RsBSP;
|
||
ULONGLONG RsBSPStore;
|
||
ULONGLONG RsRSC;
|
||
ULONGLONG RsRNAT;
|
||
|
||
// Trap Status Information
|
||
ULONGLONG StIPSR; // Interrupt Processor Status
|
||
ULONGLONG StIIP; // Interrupt IP
|
||
ULONGLONG StIFS; // Interrupt Frame Marker
|
||
|
||
ULONGLONG Fill; // padding for 16-byte alignment on stack, if needed
|
||
|
||
|
||
#else
|
||
|
||
ULONG PlaceHolder;
|
||
|
||
#endif // defined(_IA64_)
|
||
|
||
} IA64_RESTART_STATE, *PIA64_RESTART_STATE;
|
||
|
||
|
||
|
||
typedef struct _RESTART_BLOCK {
|
||
ULONG Signature;
|
||
ULONG Length;
|
||
USHORT Version;
|
||
USHORT Revision;
|
||
struct _RESTART_BLOCK * FIRMWARE_PTR NextRestartBlock;
|
||
VOID * FIRMWARE_PTR RestartAddress;
|
||
ULONG BootMasterId;
|
||
ULONG ProcessorId;
|
||
volatile BOOT_STATUS BootStatus;
|
||
ULONG CheckSum;
|
||
ULONG SaveAreaLength;
|
||
union {
|
||
ULONG SaveArea[1];
|
||
ALPHA_RESTART_STATE Alpha;
|
||
I386_RESTART_STATE I386;
|
||
IA64_RESTART_STATE Ia64;
|
||
} u;
|
||
|
||
} RESTART_BLOCK, * FIRMWARE_PTR PRESTART_BLOCK;
|
||
|
||
#if defined(_IA64_)
|
||
#include "poppack.h"
|
||
#endif
|
||
|
||
//
|
||
// Define system parameter block structure.
|
||
//
|
||
|
||
typedef struct _SYSTEM_PARAMETER_BLOCK {
|
||
ULONG Signature;
|
||
ULONG Length;
|
||
USHORT Version;
|
||
USHORT Revision;
|
||
PRESTART_BLOCK RestartBlock;
|
||
PDEBUG_BLOCK DebugBlock;
|
||
VOID * FIRMWARE_PTR GenerateExceptionVector;
|
||
VOID * FIRMWARE_PTR TlbMissExceptionVector;
|
||
ULONG FirmwareVectorLength;
|
||
VOID * FIRMWARE_PTR * FIRMWARE_PTR FirmwareVector;
|
||
ULONG VendorVectorLength;
|
||
VOID * FIRMWARE_PTR * FIRMWARE_PTR VendorVector;
|
||
ULONG AdapterCount;
|
||
ULONG Adapter0Type;
|
||
ULONG Adapter0Length;
|
||
VOID * FIRMWARE_PTR * FIRMWARE_PTR Adapter0Vector;
|
||
} SYSTEM_PARAMETER_BLOCK, * FIRMWARE_PTR PSYSTEM_PARAMETER_BLOCK;
|
||
|
||
//
|
||
// structure defining the function types passed in the FirmwareVector
|
||
// of the system block.
|
||
// define this because the compiler does not like the casting of
|
||
// void * pointers to function pointers
|
||
//
|
||
typedef struct _GLOBAL_FIRMWARE_VECTOR {
|
||
ARC_STATUS (* LoadRoutine)(CHAR * FIRMWARE_PTR, ULONG, ULONG * FIRMWARE_PTR, ULONG * FIRMWARE_PTR);
|
||
ARC_STATUS (* InvokeRoutine)(ULONG, ULONG, ULONG, CHAR * FIRMWARE_PTR * FIRMWARE_PTR, CHAR * FIRMWARE_PTR * FIRMWARE_PTR);
|
||
ARC_STATUS (* ExecuteRoutine)(CHAR * FIRWARE_PTR, ULONG, CHAR * FIRMWARE_PTR * FIRMWARE_PTR, CHAR * FIRMWARE_PTR * FIRMWARE_PTR);
|
||
VOID (* HaltRoutine)(VOID);
|
||
VOID (* PowerDownRoutine)(VOID);
|
||
VOID (* RestartRoutine)(VOID);
|
||
VOID (* RebootRoutine)(VOID);
|
||
VOID (* InteractiveModeRoutine)(VOID);
|
||
VOID (* Reserved1)(VOID);
|
||
PCONFIGURATION_COMPONENT (* GetPeerRoutine)(PCONFIGURATION_COMPONENT);
|
||
PCONFIGURATION_COMPONENT (* GetChildRoutine)(PCONFIGURATION_COMPONENT);
|
||
PCONFIGURATION_COMPONENT (* GetParentRoutine)(PCONFIGURATION_COMPONENT);
|
||
ARC_STATUS (* GetDataRoutine)(VOID * FIRMWARE_PTR, PCONFIGURATION_COMPONENT);
|
||
PCONFIGURATION_COMPONENT (* AddChildRoutine)(PCONFIGURATION_COMPONENT, PCONFIGURATION_COMPONENT, VOID * FIRMWARE_PTR);
|
||
ARC_STATUS (* DeleteComponentRoutine)(PCONFIGURATION_COMPONENT);
|
||
PCONFIGURATION_COMPONENT (* GetComponentRoutine)(CHAR * FIRMWARE_PTR);
|
||
ARC_STATUS (* SaveConfigurationRoutine)(VOID);
|
||
PSYSTEM_ID (* GetSystemIdRoutine)(VOID);
|
||
PMEMORY_DESCRIPTOR (* MemoryRoutine)(PMEMORY_DESCRIPTOR);
|
||
VOID (* Reserved2)(VOID);
|
||
PTIME_FIELDS (* GetTimeRoutine)(VOID);
|
||
ULONG (* GetRelativeTimeRoutine)(VOID);
|
||
ARC_STATUS (* GetDirectoryEntryRoutine)(ULONG, PDIRECTORY_ENTRY, ULONG, ULONG * FIRMWARE_PTR);
|
||
ARC_STATUS (* OpenRoutine)(CHAR * FIRMWARE_PTR, OPEN_MODE, ULONG * FIRMWARE_PTR);
|
||
ARC_STATUS (* CloseRoutine)(ULONG);
|
||
ARC_STATUS (* ReadRoutine)(ULONG, VOID * FIRMWARE_PTR, ULONG, ULONG * FIRMWARE_PTR);
|
||
ARC_STATUS (* ReadStatusRoutine)(ULONG);
|
||
ARC_STATUS (* WriteRoutine)(ULONG, VOID * FIRMWARE_PTR, ULONG, ULONG * FIRMWARE_PTR);
|
||
ARC_STATUS (* SeekRoutine)(ULONG, LARGE_INTEGER * FIRMWARE_PTR, SEEK_MODE);
|
||
ARC_STATUS (* MountRoutine)(CHAR * FIRMWARE_PTR, MOUNT_OPERATION);
|
||
CHAR * FIRMWARE_PTR (* GetEnvironmentRoutine)(CHAR * FIRMWARE_PTR);
|
||
ARC_STATUS (* SetEnvironmentRoutine)(CHAR * FIRMWARE_PTR, CHAR * FIRMWARE_PTR);
|
||
ARC_STATUS (* GetFileInformationRoutine)(ULONG, PFILE_INFORMATION);
|
||
ARC_STATUS (* SetFileInformationRoutine)(ULONG, ULONG, ULONG);
|
||
VOID (* FlushAllCachesRoutine)(VOID);
|
||
ARC_STATUS (* TestUnicodeCharacterRoutine)(ULONG, WCHAR);
|
||
PARC_DISPLAY_STATUS (* GetDisplayStatusRoutine)(ULONG);
|
||
} GLOBAL_FIRMWARE_VECTOR, * FIRMWARE_PTR PGLOBAL_FIRMWARE_VECTOR;
|
||
|
||
|
||
//
|
||
// Define macros that call firmware routines indirectly through the firmware
|
||
// vector and provide type checking of argument values.
|
||
//
|
||
|
||
#if defined(_ALPHA_) || defined(_AXP64_)
|
||
|
||
#define SYSTEM_BLOCK ((SYSTEM_PARAMETER_BLOCK *)(KSEG0_BASE | 0x6FE000))
|
||
|
||
#elif defined(_IA64_)
|
||
|
||
extern SYSTEM_PARAMETER_BLOCK GlobalSystemBlock;
|
||
|
||
#define SYSTEM_BLOCK (&GlobalSystemBlock)
|
||
|
||
#elif defined(_X86_)
|
||
|
||
#if defined(ARCI386)
|
||
#define SYSTEM_BLOCK ((PSYSTEM_PARAMETER_BLOCK)(0x1000))
|
||
|
||
#else
|
||
extern SYSTEM_PARAMETER_BLOCK GlobalSystemBlock;
|
||
|
||
#define SYSTEM_BLOCK (&GlobalSystemBlock)
|
||
|
||
#endif
|
||
|
||
#endif
|
||
|
||
#define FIRMWARE_VECTOR_BLOCK ((PGLOBAL_FIRMWARE_VECTOR) (SYSTEM_BLOCK->FirmwareVector))
|
||
|
||
|
||
//
|
||
// Define software loading and execution functions.
|
||
//
|
||
|
||
#define ArcExecute FIRMWARE_VECTOR_BLOCK->ExecuteRoutine
|
||
#define ArcInvoke FIRMWARE_VECTOR_BLOCK->InvokeRoutine
|
||
#define ArcLoad FIRMWARE_VECTOR_BLOCK->LoadRoutine
|
||
|
||
|
||
//
|
||
// Define program termination functions.
|
||
//
|
||
|
||
#define ArcHalt FIRMWARE_VECTOR_BLOCK->HaltRoutine
|
||
#define ArcPowerDown FIRMWARE_VECTOR_BLOCK->PowerDownRoutine
|
||
#define ArcRestart FIRMWARE_VECTOR_BLOCK->RestartRoutine
|
||
#define ArcReboot FIRMWARE_VECTOR_BLOCK->RebootRoutine
|
||
#define ArcEnterInteractiveMode FIRMWARE_VECTOR_BLOCK->InteractiveModeRoutine
|
||
|
||
|
||
//
|
||
// Define configuration functions.
|
||
//
|
||
#define ArcGetChild FIRMWARE_VECTOR_BLOCK->GetChildRoutine
|
||
#define ArcGetParent FIRMWARE_VECTOR_BLOCK->GetParentRoutine
|
||
#define ArcGetPeer FIRMWARE_VECTOR_BLOCK->GetPeerRoutine
|
||
#define ArcAddChild FIRMWARE_VECTOR_BLOCK->AddChildRoutine
|
||
#define ArcDeleteComponent FIRMWARE_VECTOR_BLOCK->DeleteComponentRoutine
|
||
#define ArcGetComponent FIRMWARE_VECTOR_BLOCK->GetComponentRoutine
|
||
#define ArcGetConfigurationData FIRMWARE_VECTOR_BLOCK->GetDataRoutine
|
||
#define ArcSaveConfiguration FIRMWARE_VECTOR_BLOCK->SaveConfigurationRoutine
|
||
#define ArcGetSystemId FIRMWARE_VECTOR_BLOCK->GetSystemIdRoutine
|
||
#define ArcGetMemoryDescriptor FIRMWARE_VECTOR_BLOCK->MemoryRoutine
|
||
#define ArcGetTime FIRMWARE_VECTOR_BLOCK->GetTimeRoutine
|
||
#define ArcGetRelativeTime FIRMWARE_VECTOR_BLOCK->GetRelativeTimeRoutine
|
||
|
||
|
||
//
|
||
// Define I/O functions.
|
||
//
|
||
|
||
#define ArcClose FIRMWARE_VECTOR_BLOCK->CloseRoutine
|
||
#define ArcGetReadStatus FIRMWARE_VECTOR_BLOCK->ReadStatusRoutine
|
||
#define ArcMount FIRMWARE_VECTOR_BLOCK->MountRoutine
|
||
#define ArcOpen FIRMWARE_VECTOR_BLOCK->OpenRoutine
|
||
#define ArcRead FIRMWARE_VECTOR_BLOCK->ReadRoutine
|
||
#define ArcSeek FIRMWARE_VECTOR_BLOCK->SeekRoutine
|
||
#define ArcWrite FIRMWARE_VECTOR_BLOCK->WriteRoutine
|
||
#define ArcGetFileInformation FIRMWARE_VECTOR_BLOCK->GetFileInformationRoutine
|
||
#define ArcSetFileInformation FIRMWARE_VECTOR_BLOCK->SetFileInformationRoutine
|
||
#define ArcGetDirectoryEntry FIRMWARE_VECTOR_BLOCK->GetDirectoryEntryRoutine
|
||
|
||
|
||
//
|
||
// Define environment functions.
|
||
//
|
||
#if defined(_AXP64_) && defined(_NTHAL_)
|
||
|
||
__inline
|
||
CHAR * FIRMWARE_PTR
|
||
ArcGetEnvironmentVariable(
|
||
IN PCHAR Variable
|
||
)
|
||
|
||
{
|
||
|
||
CHAR * FIRMWARE_PTR FwValue;
|
||
CHAR * FIRMWARE_PTR FwVariable;
|
||
|
||
|
||
//
|
||
// Raise IRQL to high level and acquire firmware lock.
|
||
//
|
||
|
||
KIRQL OldIrql = FwAcquireFirmwareLock();
|
||
|
||
//
|
||
// Copy variable name to a buffer that is addressable by firmware
|
||
// and query the firmware for the variable value.
|
||
//
|
||
|
||
FwVariable = (CHAR * FIRMWARE_PTR)&HalpMarshallBuffer[0];
|
||
strcpy(FwVariable, Variable);
|
||
FwValue = HalpArcGetEnvironmentVariable(FwVariable);
|
||
|
||
//
|
||
// Release the firmware lock and lower IRQL to its previous level.
|
||
//
|
||
|
||
FwReleaseFirmwareLock(OldIrql);
|
||
return FwValue;
|
||
}
|
||
|
||
#else
|
||
|
||
#define ArcGetEnvironmentVariable FIRMWARE_VECTOR_BLOCK->GetEnvironmentRoutine
|
||
|
||
#endif // _AXP64_ && defined(_NTHAL_)
|
||
|
||
#if defined(_AXP64_) && defined(_NTHAL_)
|
||
|
||
__inline
|
||
ARC_STATUS
|
||
ArcSetEnvironmentVariable(
|
||
IN PCHAR Variable,
|
||
IN PCHAR Value
|
||
)
|
||
|
||
{
|
||
|
||
ARC_STATUS ArcStatus;
|
||
CHAR * FIRMWARE_PTR FwValue;
|
||
CHAR * FIRMWARE_PTR FwVariable;
|
||
ULONG Length;
|
||
|
||
//
|
||
// Raise IRQL to high level and acquire firmware lock.
|
||
//
|
||
|
||
KIRQL OldIrql = FwAcquireFirmwareLock();
|
||
|
||
//
|
||
// Copy variable name and value to a buffer that is addressable by
|
||
// firmware and call firmware to set the variable value.
|
||
//
|
||
|
||
Length = strlen(Variable);
|
||
FwVariable = (CHAR * FIRMWARE_PTR)&HalpMarshallBuffer[0];
|
||
FwValue = FwVariable + Length + 1;
|
||
strcpy(FwVariable, Variable);
|
||
strcpy(FwValue, Value);
|
||
ArcStatus = HalpArcSetEnvironmentVariable(FwVariable, FwValue);
|
||
|
||
//
|
||
// Release the firmware lock and lower IRQL to its previous level.
|
||
//
|
||
|
||
FwReleaseFirmwareLock(OldIrql);
|
||
return ArcStatus;
|
||
}
|
||
|
||
#else
|
||
|
||
#define ArcSetEnvironmentVariable FIRMWARE_VECTOR_BLOCK->SetEnvironmentRoutine
|
||
|
||
#endif // _AXP64_ && defined(_NTHAL_)
|
||
|
||
|
||
//
|
||
// Define cache flush functions.
|
||
//
|
||
|
||
#define ArcFlushAllCaches FIRMWARE_VECTOR_BLOCK->FlushAllCachesRoutine
|
||
|
||
//
|
||
// Define TestUnicodeCharacter and GetDisplayStatus functions.
|
||
//
|
||
|
||
#define ArcTestUnicodeCharacter FIRMWARE_VECTOR_BLOCK->TestUnicodeCharacterRoutine
|
||
#define ArcGetDisplayStatus FIRMWARE_VECTOR_BLOCK->GetDisplayStatusRoutine
|
||
|
||
|
||
//
|
||
// Define configuration data structure used in all systems.
|
||
//
|
||
|
||
typedef struct _CONFIGURATION_COMPONENT_DATA {
|
||
struct _CONFIGURATION_COMPONENT_DATA *Parent;
|
||
struct _CONFIGURATION_COMPONENT_DATA *Child;
|
||
struct _CONFIGURATION_COMPONENT_DATA *Sibling;
|
||
CONFIGURATION_COMPONENT ComponentEntry;
|
||
PVOID ConfigurationData;
|
||
} CONFIGURATION_COMPONENT_DATA, *PCONFIGURATION_COMPONENT_DATA;
|
||
|
||
//
|
||
// Define generic display configuration data structure.
|
||
//
|
||
|
||
typedef struct _MONITOR_CONFIGURATION_DATA {
|
||
USHORT Version;
|
||
USHORT Revision;
|
||
USHORT HorizontalResolution;
|
||
USHORT HorizontalDisplayTime;
|
||
USHORT HorizontalBackPorch;
|
||
USHORT HorizontalFrontPorch;
|
||
USHORT HorizontalSync;
|
||
USHORT VerticalResolution;
|
||
USHORT VerticalBackPorch;
|
||
USHORT VerticalFrontPorch;
|
||
USHORT VerticalSync;
|
||
USHORT HorizontalScreenSize;
|
||
USHORT VerticalScreenSize;
|
||
} MONITOR_CONFIGURATION_DATA, *PMONITOR_CONFIGURATION_DATA;
|
||
|
||
//
|
||
// Define generic floppy configuration data structure.
|
||
//
|
||
|
||
typedef struct _FLOPPY_CONFIGURATION_DATA {
|
||
USHORT Version;
|
||
USHORT Revision;
|
||
CHAR Size[8];
|
||
ULONG MaxDensity;
|
||
ULONG MountDensity;
|
||
} FLOPPY_CONFIGURATION_DATA, *PFLOPPY_CONFIGURATION_DATA;
|
||
|
||
//
|
||
// Define memory allocation structures used in all systems.
|
||
//
|
||
|
||
typedef enum _TYPE_OF_MEMORY {
|
||
LoaderExceptionBlock = MemoryExceptionBlock, // 0
|
||
LoaderSystemBlock = MemorySystemBlock, // 1
|
||
LoaderFree = MemoryFree, // 2
|
||
LoaderBad = MemoryBad, // 3
|
||
LoaderLoadedProgram = MemoryLoadedProgram, // 4
|
||
LoaderFirmwareTemporary = MemoryFirmwareTemporary, // 5
|
||
LoaderFirmwarePermanent = MemoryFirmwarePermanent, // 6
|
||
LoaderOsloaderHeap, // 7
|
||
LoaderOsloaderStack, // 8
|
||
LoaderSystemCode, // 9
|
||
LoaderHalCode, // a
|
||
LoaderBootDriver, // b
|
||
LoaderConsoleInDriver, // c
|
||
LoaderConsoleOutDriver, // d
|
||
LoaderStartupDpcStack, // e
|
||
LoaderStartupKernelStack, // f
|
||
LoaderStartupPanicStack, // 10
|
||
LoaderStartupPcrPage, // 11
|
||
LoaderStartupPdrPage, // 12
|
||
LoaderRegistryData, // 13
|
||
LoaderMemoryData, // 14
|
||
LoaderNlsData, // 15
|
||
LoaderSpecialMemory, // 16
|
||
LoaderBBTMemory, // 17
|
||
LoaderReserve, // 18
|
||
LoaderXIPRom, // 19
|
||
LoaderHALCachedMemory, // 1a
|
||
LoaderMaximum // 1b
|
||
} TYPE_OF_MEMORY;
|
||
|
||
typedef struct _MEMORY_ALLOCATION_DESCRIPTOR {
|
||
LIST_ENTRY ListEntry;
|
||
TYPE_OF_MEMORY MemoryType;
|
||
ULONG BasePage;
|
||
ULONG PageCount;
|
||
} MEMORY_ALLOCATION_DESCRIPTOR, *PMEMORY_ALLOCATION_DESCRIPTOR;
|
||
|
||
|
||
//
|
||
// Define loader parameter block structure.
|
||
//
|
||
|
||
typedef struct _NLS_DATA_BLOCK {
|
||
PVOID AnsiCodePageData;
|
||
PVOID OemCodePageData;
|
||
PVOID UnicodeCaseTableData;
|
||
} NLS_DATA_BLOCK, *PNLS_DATA_BLOCK;
|
||
|
||
typedef struct _ARC_DISK_SIGNATURE {
|
||
LIST_ENTRY ListEntry;
|
||
ULONG Signature;
|
||
PCHAR ArcName;
|
||
ULONG CheckSum;
|
||
BOOLEAN ValidPartitionTable;
|
||
BOOLEAN xInt13;
|
||
BOOLEAN IsGpt;
|
||
UCHAR Reserved;
|
||
UCHAR GptSignature[16];
|
||
} ARC_DISK_SIGNATURE, *PARC_DISK_SIGNATURE;
|
||
|
||
typedef struct _ARC_DISK_INFORMATION {
|
||
LIST_ENTRY DiskSignatures;
|
||
} ARC_DISK_INFORMATION, *PARC_DISK_INFORMATION;
|
||
|
||
typedef struct _I386_LOADER_BLOCK {
|
||
|
||
#if defined(_X86_) || defined(_AMD64_)
|
||
|
||
PVOID CommonDataArea;
|
||
ULONG MachineType; // Temporary only
|
||
ULONG VirtualBias;
|
||
|
||
#else
|
||
|
||
ULONG PlaceHolder;
|
||
|
||
#endif
|
||
|
||
} I386_LOADER_BLOCK, *PI386_LOADER_BLOCK;
|
||
|
||
typedef struct _ALPHA_LOADER_BLOCK {
|
||
|
||
#if defined(_ALPHA_) || defined(_AXP64_)
|
||
|
||
ULONG_PTR DpcStack;
|
||
ULONG FirstLevelDcacheSize;
|
||
ULONG FirstLevelDcacheFillSize;
|
||
ULONG FirstLevelIcacheSize;
|
||
ULONG FirstLevelIcacheFillSize;
|
||
ULONG_PTR GpBase;
|
||
ULONG_PTR PanicStack;
|
||
ULONG PcrPage;
|
||
ULONG PdrPage;
|
||
ULONG SecondLevelDcacheSize;
|
||
ULONG SecondLevelDcacheFillSize;
|
||
ULONG SecondLevelIcacheSize;
|
||
ULONG SecondLevelIcacheFillSize;
|
||
ULONG PhysicalAddressBits;
|
||
ULONG MaximumAddressSpaceNumber;
|
||
UCHAR SystemSerialNumber[16];
|
||
UCHAR SystemType[8];
|
||
ULONG SystemVariant;
|
||
ULONG SystemRevision;
|
||
ULONG ProcessorType;
|
||
ULONG ProcessorRevision;
|
||
ULONG CycleClockPeriod;
|
||
ULONG PageSize;
|
||
PVOID RestartBlock;
|
||
ULONGLONG FirmwareRestartAddress;
|
||
ULONG FirmwareRevisionId;
|
||
PVOID PalBaseAddress;
|
||
UCHAR FirmwareVersion[16];
|
||
UCHAR FirmwareBuildTimeStamp[20];
|
||
|
||
#else
|
||
|
||
ULONG PlaceHolder;
|
||
|
||
#endif
|
||
|
||
} ALPHA_LOADER_BLOCK, *PALPHA_LOADER_BLOCK;
|
||
|
||
#if defined(_IA64_)
|
||
typedef struct _TR_INFO {
|
||
BOOLEAN Valid;
|
||
UCHAR Index;
|
||
USHORT Spare0;
|
||
ULONG PageSize;
|
||
ULONGLONG VirtualAddress;
|
||
ULONGLONG PhysicalAddress;
|
||
ULONGLONG PhysicalAddressMemoryDescriptor;
|
||
ULONG PageSizeMemoryDescriptor;
|
||
ULONG Spare1;
|
||
} TR_INFO, *PTR_INFO;
|
||
|
||
typedef struct _EFI_MEM_MAP_PARAM {
|
||
PUCHAR MemoryMap;
|
||
ULONGLONG MemoryMapSize;
|
||
ULONGLONG MapKey;
|
||
ULONGLONG DescriptorSize;
|
||
ULONG DescriptorVersion;
|
||
ULONG InitialPlatformPropertiesEfiFlags;
|
||
} EFI_MEM_MAP_PARAM, *PEFI_MEM_MAP_PARAM;
|
||
|
||
//
|
||
// VM info structure definitions
|
||
//
|
||
typedef union _IA64_VM_SUMMARY1 {
|
||
struct {
|
||
ULONGLONG HwWalker : 1;
|
||
ULONGLONG PhysAddrSize : 7;
|
||
ULONGLONG KeySize : 8;
|
||
ULONGLONG MaxPkr : 8;
|
||
ULONGLONG HashTagId : 8;
|
||
ULONGLONG MaxDtrEntry : 8;
|
||
ULONGLONG MaxItrEntry : 8;
|
||
ULONGLONG NumUniqueTcs : 8;
|
||
ULONGLONG NumTcLevels : 8;
|
||
};
|
||
ULONGLONG Ulong64;
|
||
} IA64_VM_SUMMARY1;
|
||
|
||
typedef union _IA64_VM_SUMMARY2 {
|
||
struct {
|
||
ULONGLONG ImplVaMsb : 8;
|
||
ULONGLONG RidSize : 8;
|
||
ULONGLONG Rsvd : 48;
|
||
};
|
||
ULONGLONG Ulong64;
|
||
} IA64_VM_SUMMARY2;
|
||
|
||
typedef union _IA64_DEPENDENT_FEATURES {
|
||
struct {
|
||
ULONGLONG Rsvd : 41;
|
||
ULONGLONG XIregResource : 1;
|
||
ULONGLONG XRegResource : 1;
|
||
ULONGLONG DisableDynamicPrediatePrediction : 1;
|
||
ULONGLONG DisableProcessorPhysicalNumber : 1;
|
||
ULONGLONG DisableDynamicDataCachePrefetch : 1;
|
||
ULONGLONG DisableDynamicInstructionCache : 1;
|
||
ULONGLONG DisableDynamicBranchPrediction : 1;
|
||
ULONGLONG Rsvd2 : 8;
|
||
ULONGLONG DisableBINIT : 1;
|
||
ULONGLONG DisableCoherency : 1;
|
||
ULONGLONG DisableCache : 1;
|
||
ULONGLONG EnableCMCIPromotion : 1;
|
||
ULONGLONG EnableMCAtoBINIT : 1;
|
||
};
|
||
ULONGLONG Ulong64;
|
||
} IA64_DEPENDENT_FEATURES;
|
||
|
||
typedef struct _IA64_PTCE_INFO {
|
||
ULONGLONG PtceBase;
|
||
union {
|
||
struct {
|
||
ULONG Count1;
|
||
ULONG Count2;
|
||
};
|
||
ULONGLONG Ulong64;
|
||
} PtceTcCount;
|
||
union {
|
||
struct {
|
||
ULONG Strides1;
|
||
ULONG Strides2;
|
||
};
|
||
ULONGLONG Ulong64;
|
||
} PtceStrides;
|
||
} IA64_PTCE_INFO;
|
||
|
||
typedef union _IA64_CACHE_INFO1 {
|
||
ULONGLONG Ulong64;
|
||
struct {
|
||
ULONGLONG Unified : 1;
|
||
ULONGLONG Attributes : 2;
|
||
ULONGLONG Reserved : 5;
|
||
ULONGLONG Associativity : 8;
|
||
ULONGLONG LineSize : 8;
|
||
ULONGLONG Stride : 8;
|
||
ULONGLONG StoreLatency : 8;
|
||
ULONGLONG LoadLatency : 8;
|
||
ULONGLONG StoreHints : 8;
|
||
ULONGLONG LoadHints : 8;
|
||
};
|
||
}IA64_CACHE_INFO1, *PIA64_CACHE_INFO1;
|
||
|
||
|
||
typedef union _IA64_CACHE_INFO2 {
|
||
ULONGLONG Ulong64;
|
||
struct {
|
||
ULONGLONG Size : 32;
|
||
ULONGLONG Alias : 8;
|
||
ULONGLONG TagLeastBit : 8;
|
||
ULONGLONG TagMostBit : 8;
|
||
ULONGLONG Reserved : 8;
|
||
};
|
||
}IA64_CACHE_INFO2, *PIA64_CACHE_INFO2;
|
||
|
||
#define CONFIG_INFO_CACHE_LEVELS 3
|
||
#define CONFIG_INFO_ICACHE 0
|
||
#define CONFIG_INFO_DCACHE 1
|
||
|
||
typedef struct _IA64_DEBUG_INFO {
|
||
ULONGLONG Status; // The following fields are only valid if Status = 0.
|
||
ULONGLONG InstDebugRegisterPairs; // Number of pairs of Instruction debug registers.
|
||
ULONGLONG DataDebugRegisterPairs; // Number of pairs of Data debug registers.
|
||
} IA64_DEBUG_INFO, *PIA64_DEBUG_INFO;
|
||
|
||
typedef struct _IA64_PERFMON_INFO {
|
||
ULONGLONG Status; // The following fields are only valid if Status = 0.
|
||
union {
|
||
ULONGLONG Ulong64;
|
||
struct {
|
||
ULONGLONG PerfMonGenericPairs : 8;
|
||
ULONGLONG ImplementedCounterWidth : 8;
|
||
ULONGLONG ProcessorCyclesEventType : 8;
|
||
ULONGLONG RetiredInstructionBundlesEventType : 8;
|
||
ULONGLONG Reserved : 32;
|
||
};
|
||
};
|
||
// Note: The next following 128 bytes have to be continuous.
|
||
UCHAR PerfMonCnfgMask[32]; // which PMC registers are implemented
|
||
UCHAR PerfMonDataMask[32]; // which PMD registers are implemented
|
||
UCHAR ProcessorCyclesMask[32]; // which registers can count cycles
|
||
UCHAR RetiredInstructionBundlesMask[32]; // which registers can count retired bundles
|
||
} IA64_PERFMON_INFO, *PIA64_PERFMON_INFO;
|
||
|
||
typedef struct _PROCESSOR_CONFIG_INFO {
|
||
ULONGLONG InsertPageSizeInfo;
|
||
ULONGLONG PurgePageSizeInfo;
|
||
IA64_VM_SUMMARY1 VmSummaryInfo1;
|
||
IA64_VM_SUMMARY2 VmSummaryInfo2;
|
||
ULONGLONG NumOfPhysStackedRegs;
|
||
ULONGLONG RseHints;
|
||
IA64_PTCE_INFO PtceInfo;
|
||
IA64_DEPENDENT_FEATURES FeaturesImplemented;
|
||
IA64_DEPENDENT_FEATURES FeaturesCurSetting;
|
||
IA64_DEPENDENT_FEATURES FeaturesSoftControl;
|
||
ULONGLONG ImplRegisterInfo1;
|
||
ULONGLONG ImplRegisterInfo2;
|
||
ULONG CacheFlushStride;
|
||
ULONG LargestCacheLine;
|
||
ULONG NumberOfCacheLevels;
|
||
IA64_CACHE_INFO1 CacheInfo1[2][CONFIG_INFO_CACHE_LEVELS]; // Pass several levels of cache information
|
||
IA64_CACHE_INFO2 CacheInfo2[2][CONFIG_INFO_CACHE_LEVELS]; // One each for instruction and data.
|
||
ULONGLONG CpuId3;
|
||
IA64_DEBUG_INFO DebugInfo;
|
||
IA64_PERFMON_INFO PerfMonInfo;
|
||
} PROCESSOR_CONFIG_INFO, *PPROCESSOR_CONFIG_INFO;
|
||
|
||
#endif
|
||
|
||
typedef struct _IA64_LOADER_BLOCK {
|
||
|
||
#if defined(_IA64_)
|
||
|
||
ULONG MachineType;
|
||
ULONG WakeupVector;
|
||
ULONG_PTR KernelPhysicalBase;
|
||
ULONG_PTR KernelVirtualBase;
|
||
ULONG_PTR InterruptStack;
|
||
ULONG_PTR PanicStack;
|
||
ULONG_PTR PcrPage;
|
||
ULONG_PTR PdrPage;
|
||
ULONG_PTR PcrPage2;
|
||
ULONG_PTR FpswaInterface;
|
||
ULONG_PTR EfiSystemTable;
|
||
ULONG_PTR AcpiRsdt;
|
||
TR_INFO Pal;
|
||
//
|
||
// K.B. We don't really use a TR to map these, but the TR_INFO structure
|
||
// is useful to comminicate info about these entries to the system.
|
||
//
|
||
TR_INFO Sal;
|
||
TR_INFO SalGP;
|
||
TR_INFO ItrInfo[8];
|
||
TR_INFO DtrInfo[8];
|
||
EFI_MEM_MAP_PARAM EfiMemMapParam;
|
||
ULONG_PTR Reserved[10];
|
||
PROCESSOR_CONFIG_INFO ProcessorConfigInfo;
|
||
#else
|
||
|
||
ULONG PlaceHolder;
|
||
|
||
#endif
|
||
|
||
} IA64_LOADER_BLOCK, *PIA64_LOADER_BLOCK;
|
||
|
||
typedef struct _LOADER_PARAMETER_EXTENSION {
|
||
ULONG Size; // set to sizeof (struct _LOADER_PARAMETER_EXTENSION)
|
||
PROFILE_PARAMETER_BLOCK Profile;
|
||
ULONG MajorVersion;
|
||
ULONG MinorVersion;
|
||
PVOID InfFileImage; // Inf used to identify "broken" machines.
|
||
ULONG InfFileSize;
|
||
|
||
//
|
||
// Pointer to the triage block, if present.
|
||
//
|
||
|
||
PVOID TriageDumpBlock;
|
||
|
||
ULONG LoaderPagesSpanned; // Virtual Memory spanned by the loader
|
||
// that MM cannot recover the VA for.
|
||
struct _HEADLESS_LOADER_BLOCK *HeadlessLoaderBlock;
|
||
|
||
struct _SMBIOS_TABLE_HEADER *SMBiosEPSHeader;
|
||
|
||
PVOID DrvDBImage; // Database used to identify "broken" drivers.
|
||
ULONG DrvDBSize;
|
||
|
||
// If booting from the Network (PXE) then we will
|
||
// save the Network boot params in this loader block
|
||
struct _NETWORK_LOADER_BLOCK *NetworkLoaderBlock;
|
||
|
||
#if defined(_X86_)
|
||
|
||
//
|
||
// Pointers to IRQL translation tables that reside in the HAL
|
||
// and are exposed to the kernel for use in the "inlined IRQL"
|
||
// build
|
||
//
|
||
|
||
PUCHAR HalpIRQLToTPR;
|
||
PUCHAR HalpVectorToIRQL;
|
||
|
||
#endif
|
||
|
||
//
|
||
// Firmware Location
|
||
//
|
||
LIST_ENTRY FirmwareDescriptorListHead;
|
||
} LOADER_PARAMETER_EXTENSION, *PLOADER_PARAMETER_EXTENSION;
|
||
|
||
struct _SETUP_LOADER_BLOCK;
|
||
struct _HEADLESS_LOADER_BLOCK;
|
||
struct _SMBIOS_TABLE_HEADER;
|
||
|
||
typedef struct _NETWORK_LOADER_BLOCK {
|
||
|
||
// Binary contents of the entire DHCP Acknowledgment
|
||
// packet received by PXE.
|
||
PUCHAR DHCPServerACK;
|
||
ULONG DHCPServerACKLength;
|
||
|
||
// Binary contents of the entire BINL Reply
|
||
// packet received by PXE.
|
||
PUCHAR BootServerReplyPacket;
|
||
ULONG BootServerReplyPacketLength;
|
||
|
||
} NETWORK_LOADER_BLOCK, * PNETWORK_LOADER_BLOCK;
|
||
|
||
|
||
typedef struct _LOADER_PARAMETER_BLOCK {
|
||
LIST_ENTRY LoadOrderListHead;
|
||
LIST_ENTRY MemoryDescriptorListHead;
|
||
LIST_ENTRY BootDriverListHead;
|
||
ULONG_PTR KernelStack;
|
||
ULONG_PTR Prcb;
|
||
ULONG_PTR Process;
|
||
ULONG_PTR Thread;
|
||
ULONG RegistryLength;
|
||
PVOID RegistryBase;
|
||
PCONFIGURATION_COMPONENT_DATA ConfigurationRoot;
|
||
PCHAR ArcBootDeviceName;
|
||
PCHAR ArcHalDeviceName;
|
||
PCHAR NtBootPathName;
|
||
PCHAR NtHalPathName;
|
||
PCHAR LoadOptions;
|
||
PNLS_DATA_BLOCK NlsData;
|
||
PARC_DISK_INFORMATION ArcDiskInformation;
|
||
PVOID OemFontFile;
|
||
struct _SETUP_LOADER_BLOCK *SetupLoaderBlock;
|
||
PLOADER_PARAMETER_EXTENSION Extension;
|
||
|
||
union {
|
||
I386_LOADER_BLOCK I386;
|
||
ALPHA_LOADER_BLOCK Alpha;
|
||
IA64_LOADER_BLOCK Ia64;
|
||
} u;
|
||
|
||
|
||
} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;
|
||
|
||
#endif // _ARC_
|
||
|