Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

742 lines
18 KiB

/*++
Copyright (c) 1993 Digital Equipment Corporation
Module Name:
fwcallbk.h
Abstract:
This module defines the firmware vendor vector callbacks that
will be implemented on all Alpha AXP platforms.
Author:
John DeRosa [DEC] 10-December-1993
Revision History:
14-July-1994 John DeRosa [DEC]
Added definitions for GetBusDataByOffset and SetBusDataByOffset.
--*/
#ifndef _FWCALLBK_
#define _FWCALLBK_
//
// This module contains typedefs, which are not parsable by the assembler.
//
#ifndef _LANGUAGE_ASSEMBLY
#include "arc.h"
//
// Define the structure used to pass information to the
// ECU, and other ARC applications.
//
typedef struct _ARC_INFORMATION {
//
// The version number of this structure definition.
//
ULONG Version;
//
// A pointer to an argv-like array. Each entry is a search path
// string.
//
// This is used to pass to the ECU a list of directories to search
// through for configuration files. The definition passed back to
// the ECU depends on both the platform it is running on and the
// operating system selection in effect at the time that the call
// to VenReturnArcInformation is made.
//
// Rules:
//
// 1. The end of the search list is marked with a NULL.
// 2. Each entry must be a subset of a valid FAT filesystem.
// 3. Each entry must start with "\\".
// 4. Each entry must end with an ECU configuration file
// prefix character. (Currently, we use ! and A.)
//
// It is possible that other configuration utilities might want to
// use this search path someday.
//
PUCHAR * SearchPath;
PUCHAR Reserved1;
PUCHAR Reserved2;
PUCHAR Reserved3;
PUCHAR Reserved4;
} ARC_INFORMATION, *PARC_INFORMATION;
#define ARC_INFORMATION_VERSION 0
//
// Structure used to return system and processor information.
//
typedef struct _EXTENDED_SYSTEM_INFORMATION {
ULONG ProcessorId;
ULONG ProcessorRevision;
ULONG ProcessorPageSize;
ULONG NumberOfPhysicalAddressBits;
ULONG MaximumAddressSpaceNumber;
ULONG ProcessorCycleCounterPeriod;
ULONG SystemRevision;
UCHAR SystemSerialNumber[16];
UCHAR FirmwareVersion[16];
UCHAR FirmwareBuildTimeStamp[12]; // yymmdd.hhmm (Available as of 5.10)
} EXTENDED_SYSTEM_INFORMATION, *PEXTENDED_SYSTEM_INFORMATION;
//
// Define structure used to call BIOS emulator. This mimics the
// VIDEO_X86_BIOS_ARGUMENTS typedef in \nt\private\ntos\inc\video.h.
//
typedef struct X86_BIOS_ARGUMENTS {
ULONG Eax;
ULONG Ebx;
ULONG Ecx;
ULONG Edx;
ULONG Esi;
ULONG Edi;
ULONG Ebp;
} X86_BIOS_ARGUMENTS, *PX86_BIOS_ARGUMENTS;
//
// Define the firmware vendor specific entry point numbers that are
// common to all Alpha AXP platforms.
//
typedef enum _VENDOR_GENERIC_ENTRY {
AllocatePoolRoutine,
StallExecutionRoutine,
PrintRoutine,
ReturnExtendedSystemInformationRoutine,
VideoDisplayInitializeRoutine,
EISAReadRegisterBufferUCHARRoutine,
EISAWriteRegisterBufferUCHARRoutine,
EISAReadPortUCHARRoutine,
EISAReadPortUSHORTRoutine,
EISAReadPortULONGRoutine,
EISAWritePortUCHARRoutine,
EISAWritePortUSHORTRoutine,
EISAWritePortULONGRoutine,
FreePoolRoutine,
CallBiosRoutine,
TranslateBusAddressRoutine,
ReadPortUCHARRoutine,
ReadPortUSHORTRoutine,
ReadPortULONGRoutine,
WritePortUCHARRoutine,
WritePortUSHORTRoutine,
WritePortULONGRoutine,
ReadRegisterUCHARRoutine,
ReadRegisterUSHORTRoutine,
ReadRegisterULONGRoutine,
WriteRegisterUCHARRoutine,
WriteRegisterUSHORTRoutine,
WriteRegisterULONGRoutine,
GetBusDataByOffsetRoutine,
SetBusDataByOffsetRoutine,
WidePrintRoutine,
ReturnLanguageIdRoutine,
GetAdapterRoutine,
AllocateCommonBufferRoutine,
FreeCommonBufferRoutine,
ReturnArcInformationRoutine,
IssueSrbDirectRoutine,
ReservedRoutine0,
ReadWriteErrorFrameRoutine,
MaximumVendorRoutine
} VENDOR_GENERIC_ENTRY;
//
// Define vendor specific routine types.
//
typedef
PVOID
(*PVEN_ALLOCATE_POOL_ROUTINE) (
IN ULONG NumberOfBytes
);
typedef
VOID
(*PVEN_STALL_EXECUTION_ROUTINE) (
IN ULONG Microseconds
);
typedef
ULONG
(*PVEN_PRINT_ROUTINE) (
IN PCHAR Format,
...
);
typedef
ULONG
(*PVEN_WIDE_PRINT_ROUTINE) (
IN PWCHAR Format,
...
);
typedef
LONG
(*PVEN_RETURN_LANGUAGE_ID_ROUTINE) (
IN VOID
);
typedef
VOID
(*PVEN_RETURN_EXTENDED_SYSTEM_INFORMATION_ROUTINE) (
OUT PEXTENDED_SYSTEM_INFORMATION SystemInfo
);
typedef
ARC_STATUS
(*PVEN_VIDEO_DISPLAY_INITIALIZE_ROUTINE) (
OUT PVOID UnusedParameter
);
typedef
ULONG
(*PVEN_EISA_READ_REGISTER_BUFFER_UCHAR_ROUTINE) (
IN ULONG BusNumber,
IN ULONG Offset,
OUT PVOID Buffer,
IN ULONG Length
);
typedef
ULONG
(*PVEN_EISA_WRITE_REGISTER_BUFFER_UCHAR_ROUTINE) (
IN ULONG BusNumber,
IN ULONG Offset,
OUT PVOID Buffer,
IN ULONG Length
);
typedef
UCHAR
(*PVEN_EISA_READ_PORT_UCHAR_ROUTINE) (
IN ULONG BusNumber,
IN ULONG Offset
);
typedef
USHORT
(*PVEN_EISA_READ_PORT_USHORT_ROUTINE) (
IN ULONG BusNumber,
IN ULONG Offset
);
typedef
ULONG
(*PVEN_EISA_READ_PORT_ULONG_ROUTINE) (
IN ULONG BusNumber,
IN ULONG Offset
);
typedef
VOID
(*PVEN_EISA_WRITE_PORT_UCHAR_ROUTINE) (
IN ULONG BusNumber,
IN ULONG Offset,
IN UCHAR Datum
);
typedef
VOID
(*PVEN_EISA_WRITE_PORT_USHORT_ROUTINE) (
IN ULONG BusNumber,
IN ULONG Offset,
IN USHORT Datum
);
typedef
VOID
(*PVEN_EISA_WRITE_PORT_ULONG_ROUTINE) (
IN ULONG BusNumber,
IN ULONG Offset,
IN ULONG Datum
);
typedef
VOID
(*PVEN_FREE_POOL_ROUTINE) (
IN PVOID MemoryPointer
);
typedef
VOID
(*PVEN_CALL_BIOS_ROUTINE) (
IN ULONG InterruptNumber,
IN OUT PX86_BIOS_ARGUMENTS BiosArguments
);
typedef
BOOLEAN
(*PVEN_TRANSLATE_BUS_ADDRESS_ROUTINE) (
IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress
);
typedef
UCHAR
(*PVEN_READ_PORT_UCHAR_ROUTINE) (
PUCHAR Port
);
typedef
USHORT
(*PVEN_READ_PORT_USHORT_ROUTINE) (
PUSHORT Port
);
typedef
ULONG
(*PVEN_READ_PORT_ULONG_ROUTINE) (
PULONG Port
);
typedef
VOID
(*PVEN_WRITE_PORT_UCHAR_ROUTINE) (
PUCHAR Port,
UCHAR Value
);
typedef
VOID
(*PVEN_WRITE_PORT_USHORT_ROUTINE) (
PUSHORT Port,
USHORT Value
);
typedef
VOID
(*PVEN_WRITE_PORT_ULONG_ROUTINE) (
PULONG Port,
ULONG Value
);
typedef
UCHAR
(*PVEN_READ_REGISTER_UCHAR_ROUTINE) (
PUCHAR Register
);
typedef
USHORT
(*PVEN_READ_REGISTER_USHORT_ROUTINE) (
PUSHORT Register
);
typedef
ULONG
(*PVEN_READ_REGISTER_ULONG_ROUTINE) (
PULONG Register
);
typedef
VOID
(*PVEN_WRITE_REGISTER_UCHAR_ROUTINE) (
PUCHAR Register,
UCHAR Value
);
typedef
VOID
(*PVEN_WRITE_REGISTER_USHORT_ROUTINE) (
PUSHORT Register,
USHORT Value
);
typedef
VOID
(*PVEN_WRITE_REGISTER_ULONG_ROUTINE) (
PULONG Register,
ULONG Value
);
typedef
ULONG
(*PVEN_GET_BUS_DATA_BY_OFFSET_ROUTINE) (
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length
);
typedef
ULONG
(*PVEN_SET_BUS_DATA_BY_OFFSET_ROUTINE) (
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length
);
typedef
PADAPTER_OBJECT
(*PVEN_GET_ADAPTER_ROUTINE) (
IN PDEVICE_DESCRIPTION DeviceDescription,
IN OUT PULONG NumberOfMapRegisters
);
typedef
PVOID
(*PVEN_ALLOCATE_COMMON_BUFFER_ROUTINE) (
IN PADAPTER_OBJECT AdapterObject,
IN ULONG Length,
OUT PPHYSICAL_ADDRESS LogicalAddress,
IN BOOLEAN CacheEnabled
);
typedef
VOID
(*PVEN_FREE_COMMON_BUFFER_ROUTINE) (
IN PADAPTER_OBJECT AdapterObject,
IN ULONG Length,
IN PHYSICAL_ADDRESS LogicalAddress,
IN PVOID VirtualAddress,
IN BOOLEAN CacheEnabled
);
typedef
ARC_STATUS
(*PVEN_RETURN_ARC_INFORMATION_ROUTINE) (
OUT PARC_INFORMATION ArcInformation
);
typedef
ARC_STATUS
(*PVEN_ISSUE_SRB_DIRECT_ROUTINE) (
UCHAR ScsiAdapterId,
UCHAR PathId,
UCHAR TargetId,
UCHAR LunId,
PVOID Srb,
PVOID BufferAddress,
ULONG BufferLength,
BOOLEAN WriteToDevice
);
typedef
ARC_STATUS
(*PVEN_READ_WRITE_ERROR_FRAME_ROUTINE) (
ULONG ReadWrite,
ULONG FrameType,
PVOID FrameAddress,
PLONG FrameSize,
ULONG FrameNumber
);
//
// Define 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_)
VOID
HalpVenCallBios(
IN ULONG InterruptNumber,
IN OUT PX86_BIOS_ARGUMENTS BiosArguments
);
ARC_STATUS
HalpVenReadWriteErrorFrame(
IN ULONG ReadWrite,
IN ULONG FrameType,
IN OUT PVOID FrameAddress,
IN OUT PLONG FrameSize,
IN ULONG FrameNumber
);
VOID
HalpVenVideoDisplayInitialize(
OUT PVOID UnusedParameter
);
#endif
//
// Define vendor specific macros for use by programs that run on
// Alpha AXP NT firmware.
//
// These calls are guaranteed to return legitimate values. If a function
// is not defined for a particular platform, it will return with an error
// code or just return normally, as appropriate.
//
#define VenAllocatePool(NumberOfBytes) \
((PVEN_ALLOCATE_POOL_ROUTINE)(SYSTEM_BLOCK->VendorVector[AllocatePoolRoutine])) \
((NumberOfBytes))
#define VenStallExecution(Microseconds) \
((PVEN_STALL_EXECUTION_ROUTINE)(SYSTEM_BLOCK->VendorVector[StallExecutionRoutine])) \
((Microseconds))
#define VenReturnLanguageId \
((PVEN_RETURN_LANGUAGE_ID_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReturnLanguageIdRoutine]))
#define VenWPrint \
((PVEN_WIDE_PRINT_ROUTINE)(SYSTEM_BLOCK->VendorVector[WidePrintRoutine]))
#define VenPrint \
((PVEN_PRINT_ROUTINE)(SYSTEM_BLOCK->VendorVector[PrintRoutine]))
//
// N.B. VenPrint1 and VenPrint2 are retained here for backwards compatibility.
//
#define VenPrint1 VenPrint
#define VenPrint2 VenPrint
#define VenReturnExtendedSystemInformation(x) \
((PVEN_RETURN_EXTENDED_SYSTEM_INFORMATION_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReturnExtendedSystemInformationRoutine]))(x)
#if defined(_AXP64_) && defined(_NTHAL_)
__inline
VOID
VenVideoDisplayInitialize(
OUT PVOID UnusedParameter
)
{
KIRQL OldIrql = FwAcquireFirmwareLock();
HalpVenVideoDisplayInitialize(UnusedParameter);
FwReleaseFirmwareLock(OldIrql);
return;
}
#else
#define VenVideoDisplayInitialize(x) \
((PVEN_VIDEO_DISPLAY_INITIALIZE_ROUTINE)(SYSTEM_BLOCK->VendorVector[VideoDisplayInitializeRoutine]))(x)
#endif
#define VenEISAReadRegisterBufferUCHAR(BusNumber, Offset, Buffer, Length) \
((PVEN_EISA_READ_REGISTER_BUFFER_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAReadRegisterBufferUCHARRoutine])) \
((BusNumber), (Offset), (Buffer), (Length))
#define VenEISAWriteRegisterBufferUCHAR(BusNumber, Offset, Buffer, Length) \
((PVEN_EISA_WRITE_REGISTER_BUFFER_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAWriteRegisterBufferUCHARRoutine])) \
((BusNumber), (Offset), (Buffer), (Length))
#define VenEISAReadPortUCHAR(BusNumber, Offset) \
((PVEN_EISA_READ_PORT_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAReadPortUCHARRoutine])) \
((BusNumber), (Offset))
#define VenEISAReadPortUSHORT(BusNumber, Offset) \
((PVEN_EISA_READ_PORT_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAReadPortUSHORTRoutine])) \
((BusNumber), (Offset))
#define VenEISAReadPortULONG(BusNumber, Offset) \
((PVEN_EISA_READ_PORT_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAReadPortULONGRoutine])) \
((BusNumber), (Offset))
#define VenEISAWritePortUCHAR(BusNumber, Offset, Datum) \
((PVEN_EISA_WRITE_PORT_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAWritePortUCHARRoutine])) \
((BusNumber), (Offset), (Datum))
#define VenEISAWritePortUSHORT(BusNumber, Offset, Datum) \
((PVEN_EISA_WRITE_PORT_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAWritePortUSHORTRoutine])) \
((BusNumber), (Offset), (Datum))
#define VenEISAWritePortULONG(BusNumber, Offset, Datum) \
((PVEN_EISA_WRITE_PORT_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAWritePortULONGRoutine])) \
((BusNumber), (Offset), (Datum))
#define VenFreePool(MemoryPointer) \
((PVEN_FREE_POOL_ROUTINE)(SYSTEM_BLOCK->VendorVector[FreePoolRoutine])) \
((MemoryPointer))
#if defined(_AXP64_) && defined(_NTHAL_)
__inline
VOID
VenCallBios(
IN ULONG InterruptNumber,
IN OUT PX86_BIOS_ARGUMENTS BiosArguments
)
{
KIRQL OldIrql = FwAcquireFirmwareLock();
HalpVenCallBios(InterruptNumber, BiosArguments);
FwReleaseFirmwareLock(OldIrql);
return;
}
#else
#define VenCallBios(InterruptNumber, BiosArguments) \
((PVEN_CALL_BIOS_ROUTINE)(SYSTEM_BLOCK->VendorVector[CallBiosRoutine])) \
((InterruptNumber), (BiosArguments))
#endif
#define VenTranslateBusAddress(InterfaceType, BusNumber, BusAddress, AddressSpace, TranslatedAddress) \
((PVEN_TRANSLATE_BUS_ADDRESS_ROUTINE)(SYSTEM_BLOCK->VendorVector[TranslateBusAddressRoutine])) \
((InterfaceType), (BusNumber), (BusAddress), (AddressSpace), (TranslatedAddress))
#define VenReadPortUCHAR(Port) \
((PVEN_READ_PORT_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadPortUCHARRoutine])) \
((Port))
#define VenReadPortUSHORT(Port) \
((PVEN_READ_PORT_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadPortUSHORTRoutine])) \
((Port))
#define VenReadPortULONG(Port) \
((PVEN_READ_PORT_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadPortULONGRoutine])) \
((Port))
#define VenWritePortUCHAR(Port, Value) \
((PVEN_WRITE_PORT_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[WritePortUCHARRoutine])) \
((Port), (Value))
#define VenWritePortUSHORT(Port, Value) \
((PVEN_WRITE_PORT_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[WritePortUSHORTRoutine])) \
((Port), (Value))
#define VenWritePortULONG(Port, Value) \
((PVEN_WRITE_PORT_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[WritePortULONGRoutine])) \
((Port), (Value))
#define VenReadRegisterUCHAR(Register) \
((PVEN_READ_REGISTER_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadRegisterUCHARRoutine])) \
((Register))
#define VenReadRegisterUSHORT(Register) \
((PVEN_READ_REGISTER_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadRegisterUSHORTRoutine])) \
((Register))
#define VenReadRegisterULONG(Register) \
((PVEN_READ_REGISTER_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadRegisterULONGRoutine])) \
((Register))
#define VenWriteRegisterUCHAR(Register, Value) \
((PVEN_WRITE_REGISTER_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[WriteRegisterUCHARRoutine])) \
((Register), (Value))
#define VenWriteRegisterUSHORT(Register, Value) \
((PVEN_WRITE_REGISTER_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[WriteRegisterUSHORTRoutine])) \
((Register), (Value))
#define VenWriteRegisterULONG(Register, Value) \
((PVEN_WRITE_REGISTER_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[WriteRegisterULONGRoutine])) \
((Register), (Value))
#define VenGetBusDataByOffset(BusDataType, BusNumber, SlotNumber, Buffer, Offset, Length) \
((PVEN_GET_BUS_DATA_BY_OFFSET_ROUTINE)(SYSTEM_BLOCK->VendorVector[GetBusDataByOffsetRoutine])) \
((BusDataType), (BusNumber), (SlotNumber), (Buffer), (Offset), (Length))
#define VenSetBusDataByOffset(BusDataType, BusNumber, SlotNumber, Buffer, Offset, Length) \
((PVEN_SET_BUS_DATA_BY_OFFSET_ROUTINE)(SYSTEM_BLOCK->VendorVector[SetBusDataByOffsetRoutine])) \
((BusDataType), (BusNumber), (SlotNumber), (Buffer), (Offset), (Length))
#define VenGetAdapter(DeviceDescription, NumberOfMapRegisters) \
((PVEN_GET_ADAPTER_ROUTINE)(SYSTEM_BLOCK->VendorVector[GetAdapterRoutine])) \
((DeviceDescription), (NumberOfMapRegisters))
#define VenAllocateCommonBuffer(AdapterObject, Length, LogicalAddress, CacheEnabled) \
((PVEN_ALLOCATE_COMMON_BUFFER_ROUTINE)(SYSTEM_BLOCK->VendorVector[AllocateCommonBufferRoutine])) \
((AdapterObject), (Length), (LogicalAddress), (CacheEnabled))
#define VenFreeCommonBuffer(AdapterObject, Length, LogicalAddress, VirtualAddress, CacheEnabled) \
((PVEN_FREE_COMMON_BUFFER_ROUTINE)(SYSTEM_BLOCK->VendorVector[FreeCommonBufferRoutine])) \
((AdapterObject), (Length), (LogicalAddress), (VirtualAddress), (CacheEnabled))
#define VenReturnArcInformation(ArcInfo) \
((PVEN_RETURN_ARC_INFORMATION_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReturnArcInformationRoutine])) \
((ArcInfo))
#define VenIssueSrbDirect(ScsiAdapterId, PathId, TargetId, LunId, Srb, BufferAddress, BufferLength, WriteToDevice) \
((PVEN_ISSUE_SRB_DIRECT_ROUTINE)(SYSTEM_BLOCK->VendorVector[IssueSrbDirectRoutine])) \
((ScsiAdapterId), (PathId), (TargetId), (LunId), (Srb), (BufferAddress), (BufferLength), (WriteToDevice))
//
// As we are extending the vendor array here. Let's check the AlphaBIOS
// has set the CDS tree up to support th extension. If not, don't do the call.
//
//
// Define the params used for the Error Logging callbacks.
//
typedef enum _VENDOR_READWRITE_TYPE {
ReadFrame = 1,
WriteFrame
} VENDOR_READWRITE_TYPE;
typedef enum _VENDOR_READWRITE_FRAMETYPE {
FatalErrorFrame = 1,
DoubleErrorFrame,
FRUErrorFrame
} VENDOR_READWRITE_FRAMETYPE;
#if defined(_AXP64_) && defined(_NTHAL_)
__inline
ARC_STATUS
VenReadWriteErrorFrame(
IN ULONG ReadWrite,
IN ULONG FrameType,
IN OUT PVOID FrameAddress,
IN OUT PLONG FrameSize,
IN ULONG FrameNumber
)
{
ARC_STATUS Status;
KIRQL OldIrql = FwAcquireFirmwareLock();
Status = HalpVenReadWriteErrorFrame(ReadWrite,
FrameType,
FrameAddress,
FrameSize,
FrameNumber);
FwReleaseFirmwareLock(OldIrql);
return Status;
}
#else
#define VenReadWriteErrorFrame(ReadWrite, Frametype, FrameAddress, FrameSizeAddress, FrameNumber) \
(SYSTEM_BLOCK->VendorVectorLength > (ReadWriteErrorFrameRoutine * sizeof(SYSTEM_BLOCK->VendorVector[0])) ? \
((PVEN_READ_WRITE_ERROR_FRAME_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadWriteErrorFrameRoutine])) \
((ReadWrite), (Frametype), (FrameAddress), (FrameSizeAddress), (FrameNumber)) : \
(EINVAL)) // Return bad status if vector not present.
#endif
#endif // _LANGUAGE_ASSEMBLY not defined
#endif // _FWCALLBK_