You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
453 lines
13 KiB
453 lines
13 KiB
//
|
|
//
|
|
// Module name
|
|
// i64fw.h
|
|
// Author
|
|
// Arad Rostampour ([email protected]) Mar-22-99
|
|
// Description
|
|
// Defines SAL/PAL data structures and prototypes
|
|
//
|
|
|
|
#ifndef _I64FW_H_
|
|
#define _I64FW_H_
|
|
|
|
|
|
|
|
#define SET_ITR_AND_DTR 3
|
|
#define SET_DTR_ONLY 2
|
|
#define SET_ITR_ONLY 1
|
|
|
|
// TR for PAL is:
|
|
// ed=1, PPN=0 (to be ORed in), RWX privledge only for ring 0, dirty/accessed bit set,
|
|
// cacheable memory, present bit set.
|
|
|
|
#define HAL_SAL_PAL_TR_ATTRIB TR_VALUE(1,0,3,0,1,1,0,1)
|
|
#define HAL_TR_ATTRIBUTE_PPN_MASK 0x0000FFFFFFFFF000I64
|
|
#define HAL_RID_MASK 0x00000000FFFFFF00I64
|
|
#define HAL_RR_PS_VE 0x69
|
|
#define HAL_ITIR_PPN_MASK 0x7FFF000000000000I64
|
|
#define PAL_HIGHEST_STATIC_FUNCTION_ID 255
|
|
|
|
|
|
#define REGULAR_MEMORY 0
|
|
#define PAL_CODE_MEM 1
|
|
#define SAL_CODE_MEM 4
|
|
#define SAL_DATA_MEM 5
|
|
#define FW_RESERVED 12
|
|
|
|
#define FIRMWARE_CODE 4
|
|
#define FW_SAL_PAL 0
|
|
|
|
#define OEM_ID_LENGTH RTL_NUMBER_OF_FIELD( SST_HEADER, OemId )
|
|
#define OEM_PRODUCT_ID_LENGTH RTL_NUMBER_OF_FIELD( SST_HEADER, ProductId )
|
|
|
|
#define MASK_16KB 0xffffffffffffc000I64
|
|
#define MASK_16MB 0xffffffffff000000I64
|
|
#define SIZE_IN_BYTES_16KB 16384
|
|
|
|
//
|
|
// Define the size of the stack and backing store needed by calls to the
|
|
// PAL and SAL. PAL needs 8KB of each and SAL needs 16KB of each so we'll
|
|
// set this value to the larger of the two. The EFI specification defers
|
|
// to the SAL specification when discussing stack and backing store needs
|
|
// for its runtime services so these stack sizes should accomodate EFI calls
|
|
// as well.
|
|
//
|
|
|
|
#define HALP_FW_MEMORY_STACK_SIZE 16384
|
|
#define HALP_FW_BACKING_STORE_SIZE 16384
|
|
|
|
//
|
|
// The stack and backing store for physical mode firmware calls are allocated
|
|
// in one large block. These macros extract the top of the stack and the
|
|
// bottom of the backing store, respectively, given the base of the combined
|
|
// block.
|
|
//
|
|
|
|
#define GET_FW_STACK_POINTER(StackBase) \
|
|
((StackBase) + HALP_FW_MEMORY_STACK_SIZE - 16)
|
|
|
|
#define GET_FW_BACKING_STORE_POINTER(StackBase) \
|
|
((StackBase) + HALP_FW_MEMORY_STACK_SIZE)
|
|
|
|
// SAL_STATUS and PAL_STATUS is a 64-bit copy of the value in ReturnValues[0]
|
|
|
|
typedef LONGLONG SAL_STATUS;
|
|
typedef LONGLONG PAL_STATUS;
|
|
|
|
// SAL and PAL return up to 4 64-bit return values; HalpSalCall() and
|
|
// HalpPalCall() will return a pointer to this structure
|
|
|
|
typedef struct _SAL_PAL_RETURN_VALUES {
|
|
LONGLONG ReturnValues[4];
|
|
} SAL_PAL_RETURN_VALUES, *PSAL_PAL_RETURN_VALUES;
|
|
|
|
|
|
typedef struct _HAL_PLATFORM_ID {
|
|
ANSI_STRING VendorId;
|
|
ANSI_STRING DeviceId;
|
|
} HAL_PLATFORM_ID, *PHAL_PLATFORM_ID;
|
|
|
|
typedef struct _SST_MEMORY_LIST {
|
|
ULONGLONG PhysicalAddress;
|
|
ULONGLONG VirtualAddress;
|
|
ULONGLONG Length;
|
|
UCHAR NeedVaReg;
|
|
struct _SST_MEMORY_LIST *Next;
|
|
} SST_MEMORY_LIST, *PSST_MEMORY_LIST;
|
|
|
|
// Function Prototypes: SAL takes 8 arguments, PAL takes 4
|
|
|
|
VOID
|
|
HalpSetupTranslationRegisters(
|
|
ULONGLONG VAddr,
|
|
ULONGLONG PAddr,
|
|
ULONG PageSize,
|
|
ULONG TrNumber,
|
|
ULONG RidValue,
|
|
ULONG Mode
|
|
);
|
|
|
|
|
|
SAL_STATUS
|
|
HalpSalCall(
|
|
IN LONGLONG FunctionId,
|
|
IN LONGLONG Arg1,
|
|
IN LONGLONG Arg2,
|
|
IN LONGLONG Arg3,
|
|
IN LONGLONG Arg4,
|
|
IN LONGLONG Arg5,
|
|
IN LONGLONG Arg6,
|
|
IN LONGLONG Arg7,
|
|
OUT PSAL_PAL_RETURN_VALUES ReturnValues
|
|
);
|
|
|
|
PAL_STATUS
|
|
HalpPalCall(
|
|
IN LONGLONG FunctionId,
|
|
IN LONGLONG Arg1,
|
|
IN LONGLONG Arg2,
|
|
IN LONGLONG Arg3,
|
|
OUT PSAL_PAL_RETURN_VALUES ReturnValues
|
|
);
|
|
|
|
//
|
|
// Define a function prototype for the virtual and physical mode SAL call
|
|
// dispatchers.
|
|
//
|
|
|
|
typedef
|
|
SAL_PAL_RETURN_VALUES
|
|
(*HALP_SAL_PROC) (
|
|
LONGLONG FunctionId,
|
|
LONGLONG Arg1,
|
|
LONGLONG Arg2,
|
|
LONGLONG Arg3,
|
|
LONGLONG Arg4,
|
|
LONGLONG Arg5,
|
|
LONGLONG Arg6,
|
|
LONGLONG Arg7
|
|
);
|
|
|
|
SAL_PAL_RETURN_VALUES
|
|
HalpSalProc(
|
|
LONGLONG FunctionId,
|
|
LONGLONG Arg1,
|
|
LONGLONG Arg2,
|
|
LONGLONG Arg3,
|
|
LONGLONG Arg4,
|
|
LONGLONG Arg5,
|
|
LONGLONG Arg6,
|
|
LONGLONG Arg7
|
|
);
|
|
|
|
SAL_PAL_RETURN_VALUES
|
|
HalpSalProcPhysical(
|
|
LONGLONG FunctionId,
|
|
LONGLONG Arg1,
|
|
LONGLONG Arg2,
|
|
LONGLONG Arg3,
|
|
LONGLONG Arg4,
|
|
LONGLONG Arg5,
|
|
LONGLONG Arg6,
|
|
LONGLONG Arg7
|
|
);
|
|
|
|
SAL_PAL_RETURN_VALUES
|
|
HalpSalProcPhysicalEx(
|
|
LONGLONG FunctionId,
|
|
LONGLONG Arg1,
|
|
LONGLONG Arg2,
|
|
LONGLONG Arg3,
|
|
LONGLONG Arg4,
|
|
LONGLONG Arg5,
|
|
LONGLONG Arg6,
|
|
LONGLONG Arg7,
|
|
LONGLONG StackPointer,
|
|
LONGLONG BackingStorePointer
|
|
);
|
|
|
|
SAL_PAL_RETURN_VALUES
|
|
HalpPalProc(
|
|
LONGLONG FunctionId,
|
|
LONGLONG Arg1,
|
|
LONGLONG Arg2,
|
|
LONGLONG Arg3
|
|
);
|
|
|
|
SAL_PAL_RETURN_VALUES
|
|
HalpPalProcPhysicalStatic(
|
|
LONGLONG FunctionId,
|
|
LONGLONG Arg1,
|
|
LONGLONG Arg2,
|
|
LONGLONG Arg3
|
|
);
|
|
|
|
SAL_PAL_RETURN_VALUES
|
|
HalpPalProcPhysicalStacked(
|
|
LONGLONG FunctionId,
|
|
LONGLONG Arg1,
|
|
LONGLONG Arg2,
|
|
LONGLONG Arg3,
|
|
LONGLONG StackPointer,
|
|
LONGLONG BackingStorePointer
|
|
);
|
|
|
|
NTSTATUS
|
|
HalpGetPlatformId(
|
|
OUT PHAL_PLATFORM_ID PlatformId
|
|
);
|
|
|
|
VOID
|
|
InternalTestSal(
|
|
IN LONGLONG FunctionId,
|
|
IN LONGLONG Arg1,
|
|
IN LONGLONG Arg2,
|
|
IN LONGLONG Arg3,
|
|
IN LONGLONG Arg4,
|
|
IN LONGLONG Arg5,
|
|
IN LONGLONG Arg6,
|
|
IN LONGLONG Arg7,
|
|
OUT PSAL_PAL_RETURN_VALUES ReturnValues
|
|
);
|
|
|
|
VOID
|
|
InternalTestPal(
|
|
IN LONGLONG FunctionId,
|
|
IN LONGLONG Arg1,
|
|
IN LONGLONG Arg2,
|
|
IN LONGLONG Arg3,
|
|
OUT PSAL_PAL_RETURN_VALUES ReturnValues
|
|
);
|
|
|
|
// For SAL cache flush
|
|
|
|
#define FLUSH_INSTRUCTION_CACHE 1
|
|
#define FLUSH_DATA_CACHE 2
|
|
#define FLUSH_INSTRUCTION_AND_DATA_CACHE 3
|
|
#define FLUSH_COHERENT 4
|
|
|
|
// iA-64 defined SAL function IDs in hex format as in the SAL spec
|
|
|
|
#define SAL_SET_VECTORS 0x01000000I64
|
|
#define SAL_GET_STATE_INFO 0x01000001I64
|
|
#define SAL_GET_STATE_INFO_SIZE 0x01000002I64
|
|
#define SAL_CLEAR_STATE_INFO 0x01000003I64
|
|
#define SAL_MC_RENDEZ 0x01000004I64
|
|
#define SAL_MC_SET_PARAMS 0x01000005I64
|
|
#define SAL_REGISTER_VIRTUAL_ADDR 0x01000050I64
|
|
#define SAL_REGISTER_PHYSICAL_ADDR 0x01000006I64
|
|
#define SAL_CACHE_FLUSH 0x01000008I64
|
|
#define SAL_CACHE_INIT 0x01000009I64
|
|
#define SAL_PCI_CONFIG_READ 0x01000010I64
|
|
#define SAL_PCI_CONFIG_WRITE 0x01000011I64
|
|
#define SAL_FREQ_BASE 0x01000012I64
|
|
#define SAL_UPDATE_PAL 0x01000020I64
|
|
|
|
// iA-64 defined SAL return values
|
|
|
|
#define SAL_STATUS_SUCCESS 0I64
|
|
#define SAL_STATUS_SUCCESS_WITH_OVERFLOW 1I64
|
|
#define SAL_STATUS_SUCCESS_MORE_RECORDS 3I64
|
|
#define SAL_STATUS_NOT_IMPLEMENTED -1I64
|
|
#define SAL_STATUS_INVALID_ARGUMENT -2I64
|
|
#define SAL_STATUS_ERROR -3I64
|
|
#define SAL_STATUS_VA_NOT_REGISTERED -4I64
|
|
#define SAL_STATUS_NO_INFORMATION_AVAILABLE -5I64
|
|
#define SAL_STATUS_INSUFFICIENT_NVM_MEMORY -6I64
|
|
#define SAL_STATUS_INSUFFICIENT_SCRATCH_BUFFER -7I64
|
|
#define SAL_STATUS_INVALID_INTERRUPT_VECTOR -8I64
|
|
#define SAL_STATUS_PARTITION_TYPE_EXISTS -9I64
|
|
#define SAL_STATUS_REQUESTED_MEMORY_UNAVAILABLE -9I64
|
|
#define SAL_STATUS_UNABLE_TO_WRITE_NVM -10I64
|
|
#define SAL_STATUS_INVALID_PARTITION_TYPE -11I64
|
|
#define SAL_STATUS_INVALID_NVM_OBJECT_ID -12I64
|
|
#define SAL_STATUS_NVM_OBJECT_MAXIMUM_PARITIONS -13I64
|
|
#define SAL_STATUS_INSUFFICIENT_SPACE_FOR_WRITE -14I64
|
|
#define SAL_STATUS_INSUFFICIENT_SPACE_FOR_READ -15I64
|
|
#define SAL_STATUS_SCRATCH_BUFFER_REQUIRED -16I64
|
|
#define SAL_STATUS_INSUFFICIENT_NVM_SPACE_FOR_SUBFUNCTION -17I64
|
|
#define SAL_STATUS_INVALID_PARTITION_VALUE -18I64
|
|
#define SAL_STATUS_RECORD_ORIENTED_IO_NOT_SUPPORTED -19I64
|
|
#define SAL_STATUS_BAD_RECORD_FORMAT_OR_KEYWORD_VARIABLE -20I64
|
|
|
|
#define SAL_SUCCESSFUL( /* SAL_PAL_RETURN_VALUE */ _rv ) (((_rv).ReturnValues[0]) >= (LONGLONG)0)
|
|
|
|
//
|
|
// SAL descriptor types
|
|
//
|
|
|
|
typedef enum {
|
|
SAL_PAL_ENTRY_POINT_TYPE = 0,
|
|
SST_MEMORY_DESCRIPTOR_TYPE,
|
|
PLATFORM_FEATURES_TYPE,
|
|
TRANSLATION_REGISTER_TYPE,
|
|
PTC_COHERENCE_DOMAIN_TYPE,
|
|
AP_WAKEUP_DESCRIPTOR_TYPE
|
|
};
|
|
|
|
//
|
|
// IA64 PAL: PAL_VERSION
|
|
//
|
|
|
|
typedef union _PAL_VERSION_STRUCT {
|
|
struct {
|
|
UCHAR PAL_B_Revision;
|
|
UCHAR PAL_B_Model;
|
|
UCHAR PAL_Reserved1;
|
|
UCHAR PAL_Vendor;
|
|
UCHAR PAL_A_Revision;
|
|
UCHAR PAL_A_Model;
|
|
UCHAR PAL_Reserved2[2];
|
|
};
|
|
|
|
ULONGLONG ReturnValue;
|
|
|
|
}PAL_VERSION_STRUCT, *PPAL_VERSION_STRUCT;
|
|
|
|
//
|
|
// IA64 SAL: SAL_REVISION definitions
|
|
//
|
|
|
|
typedef union _SAL_REVISION {
|
|
USHORT Revision; // Major and Minor revision:
|
|
struct {
|
|
UCHAR Minor; // Byte0: Minor.
|
|
UCHAR Major; // Byte1: Major.
|
|
};
|
|
} SAL_REVISION, *PSAL_REVISION;
|
|
|
|
#define HALP_SAL_REVISION_2_90 0x0290 /* v2.9 */
|
|
#define HALP_SAL_REVISION_MAX 0xffff
|
|
|
|
//
|
|
// Format of the SAL System Table (SST) Header. SAL Specs July 2000, Revision: 2.9.
|
|
// The SST is followed by a variable number of entries with varying length.
|
|
//
|
|
|
|
typedef struct _SST_HEADER {
|
|
ULONG Signature;
|
|
ULONG Length;
|
|
USHORT SalRev;
|
|
USHORT EntryCount;
|
|
UCHAR CheckSum;
|
|
UCHAR Reserved1[7];
|
|
USHORT Sal_A_Version;
|
|
USHORT Sal_B_Version;
|
|
UCHAR OemId[32];
|
|
UCHAR ProductId[32];
|
|
UCHAR Reserved2[8];
|
|
} SST_HEADER, *PSST_HEADER;
|
|
|
|
//
|
|
// Global Data used by the SAL/PAL support routines
|
|
//
|
|
|
|
// _HALP_SAL_PAL_DATA.Flags:
|
|
#define HALP_SALPAL_FIX_MCE_LOG_ID 0x0001
|
|
#define HALP_SALPAL_FIX_MP_SAFE 0x0002
|
|
#define HALP_SALPAL_CMC_BROKEN 0x0004
|
|
#define HALP_SALPAL_CPE_BROKEN 0x0008
|
|
|
|
|
|
typedef struct _HALP_SAL_PAL_DATA {
|
|
PSST_HEADER SalSystemTable;
|
|
ULONGLONG PalTrBase;
|
|
ULONGLONG PalTrSize;
|
|
NTSTATUS Status;
|
|
SAL_REVISION SalRevision; // Copy of SalSystemTable.SalRev in case we unmap SST.
|
|
USHORT Flags;
|
|
PAL_VERSION_STRUCT PalVersion;
|
|
PUCHAR SmBiosVersion;
|
|
ULONGLONG Reserved[4];
|
|
} HALP_SAL_PAL_DATA, *PHALP_SAL_PAL_DATA;
|
|
|
|
#define SMBIOS_STRUCT_HEADER_TYPE_FIELD 0
|
|
#define SMBIOS_STRUCT_HEADER_LENGTH_FIELD 1
|
|
#define SMBIOS_STRUCT_HEADER_HANDLE_FIELD 2
|
|
#define SMBIOS_TYPE0_STRUCT_BIOSVER_FIELD 5
|
|
|
|
//
|
|
// Listing of Descriptors in the SAL System Table and their formats
|
|
//
|
|
|
|
typedef struct _SAL_PAL_ENTRY_POINT {
|
|
UCHAR EntryType;
|
|
UCHAR Reserved0[7];
|
|
ULONGLONG PalEntryPoint;
|
|
ULONGLONG SalEntryPoint;
|
|
ULONGLONG GlobalPointer;
|
|
UCHAR Reserved1[16];
|
|
} SAL_PAL_ENTRY_POINT, *PSAL_PAL_ENTRY_POINT;
|
|
|
|
typedef struct _SST_MEMORY_DESCRIPTOR {
|
|
UCHAR EntryType;
|
|
UCHAR NeedVaReg;
|
|
UCHAR CurrentAttribute;
|
|
UCHAR PageAccessRights;
|
|
UCHAR SupportedAttribute;
|
|
UCHAR Reserved1[1];
|
|
UCHAR MemoryType;
|
|
UCHAR MemoryUsage;
|
|
ULONGLONG MemoryAddress;
|
|
ULONG Length;
|
|
UCHAR Reserved[4];
|
|
UCHAR OemReserved[8];
|
|
} SST_MEMORY_DESCRIPTOR, *PSST_MEMORY_DESCRIPTOR;
|
|
|
|
typedef struct _PLATFORM_FEATURES {
|
|
UCHAR EntryType;
|
|
UCHAR FeatureList;
|
|
UCHAR Reserved[14];
|
|
} PLATFORM_FEATURES, *PPLATFORM_FEATURES;
|
|
|
|
typedef struct _PTC_COHERENCE_DOMAIN {
|
|
UCHAR EntryType;
|
|
UCHAR Reserved[3];
|
|
ULONG NumberOfDomains;
|
|
ULONGLONG CoherenceDomainInfo;
|
|
} PTC_COHERENCE_DOMAIN, *PPTC_COHERENCE_DOMAIN;
|
|
|
|
typedef struct _COHERENCE_DOMAIN_INFO {
|
|
ULONGLONG NumberOfProcessors;
|
|
ULONGLONG LocalIdRegisters;
|
|
} COHERENCE_DOMAIN_INFO, *PCOHERENCE_DOMAIN_INFO;
|
|
|
|
typedef struct _AP_WAKEUP_DESCRIPTOR {
|
|
UCHAR EntryType;
|
|
UCHAR WakeupMechanism;
|
|
UCHAR Reserved[6];
|
|
ULONGLONG WakeupVector;
|
|
} AP_WAKEUP_DESCRIPTOR, *PAP_WAKEUP_DESCRIPTOR;
|
|
|
|
typedef struct _TRANSLATION_REGISTER {
|
|
UCHAR EntryType;
|
|
UCHAR TRType;
|
|
UCHAR TRNumber;
|
|
UCHAR Reserved1[5];
|
|
ULONGLONG VirtualAddress;
|
|
ULONGLONG PageSize;
|
|
UCHAR Reserved2[8];
|
|
} TRANSLATION_REGISTER, *PTRANSLATION_REGISTER;
|
|
|
|
#endif // _I64FW_H_
|