IntelFrameworkModulePkg: Add Compatibility Support Module (CSM) drivers
Added these drivers: * LegacyBiosDxe * BlockIoDxe * KeyboardDxe * Snp16Dxe * VideoDxe Signed-off-by: jljusten Reviewed-by: mdkinney Reviewed-by: geekboy15a git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11905 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
3507
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/BiosSnp16.c
Normal file
3507
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/BiosSnp16.c
Normal file
File diff suppressed because it is too large
Load Diff
1655
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/BiosSnp16.h
Normal file
1655
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/BiosSnp16.h
Normal file
File diff suppressed because it is too large
Load Diff
309
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/ComponentName.c
Normal file
309
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/ComponentName.c
Normal file
@@ -0,0 +1,309 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 1999 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
of the BSD License which accompanies this distribution. The
|
||||
full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "BiosSnp16.h"
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
This function retrieves the user readable name of a driver in the form of a
|
||||
Unicode string. If the driver specified by This has a user readable name in
|
||||
the language specified by Language, then a pointer to the driver name is
|
||||
returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
|
||||
by This does not support the language specified by Language,
|
||||
then EFI_UNSUPPORTED is returned.
|
||||
|
||||
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||||
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||
|
||||
@param Language[in] A pointer to a Null-terminated ASCII string
|
||||
array indicating the language. This is the
|
||||
language of the driver name that the caller is
|
||||
requesting, and it must match one of the
|
||||
languages specified in SupportedLanguages. The
|
||||
number of languages supported by a driver is up
|
||||
to the driver writer. Language is specified
|
||||
in RFC 4646 or ISO 639-2 language code format.
|
||||
|
||||
@param DriverName[out] A pointer to the Unicode string to return.
|
||||
This Unicode string is the name of the
|
||||
driver specified by This in the language
|
||||
specified by Language.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string for the Driver specified by
|
||||
This and the language specified by Language was
|
||||
returned in DriverName.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER DriverName is NULL.
|
||||
|
||||
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||||
the language specified by Language.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosSnp16ComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
|
||||
This function retrieves the user readable name of the controller specified by
|
||||
ControllerHandle and ChildHandle in the form of a Unicode string. If the
|
||||
driver specified by This has a user readable name in the language specified by
|
||||
Language, then a pointer to the controller name is returned in ControllerName,
|
||||
and EFI_SUCCESS is returned. If the driver specified by This is not currently
|
||||
managing the controller specified by ControllerHandle and ChildHandle,
|
||||
then EFI_UNSUPPORTED is returned. If the driver specified by This does not
|
||||
support the language specified by Language, then EFI_UNSUPPORTED is returned.
|
||||
|
||||
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||||
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||
|
||||
@param ControllerHandle[in] The handle of a controller that the driver
|
||||
specified by This is managing. This handle
|
||||
specifies the controller whose name is to be
|
||||
returned.
|
||||
|
||||
@param ChildHandle[in] The handle of the child controller to retrieve
|
||||
the name of. This is an optional parameter that
|
||||
may be NULL. It will be NULL for device
|
||||
drivers. It will also be NULL for a bus drivers
|
||||
that wish to retrieve the name of the bus
|
||||
controller. It will not be NULL for a bus
|
||||
driver that wishes to retrieve the name of a
|
||||
child controller.
|
||||
|
||||
@param Language[in] A pointer to a Null-terminated ASCII string
|
||||
array indicating the language. This is the
|
||||
language of the driver name that the caller is
|
||||
requesting, and it must match one of the
|
||||
languages specified in SupportedLanguages. The
|
||||
number of languages supported by a driver is up
|
||||
to the driver writer. Language is specified in
|
||||
RFC 4646 or ISO 639-2 language code format.
|
||||
|
||||
@param ControllerName[out] A pointer to the Unicode string to return.
|
||||
This Unicode string is the name of the
|
||||
controller specified by ControllerHandle and
|
||||
ChildHandle in the language specified by
|
||||
Language from the point of view of the driver
|
||||
specified by This.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string for the user readable name in
|
||||
the language specified by Language for the
|
||||
driver specified by This was returned in
|
||||
DriverName.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
|
||||
EFI_HANDLE.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
|
||||
|
||||
@retval EFI_UNSUPPORTED The driver specified by This is not currently
|
||||
managing the controller specified by
|
||||
ControllerHandle and ChildHandle.
|
||||
|
||||
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||||
the language specified by Language.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosSnp16ComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gBiosSnp16ComponentName = {
|
||||
BiosSnp16ComponentNameGetDriverName,
|
||||
BiosSnp16ComponentNameGetControllerName,
|
||||
"eng"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gBiosSnp16ComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) BiosSnp16ComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) BiosSnp16ComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mBiosSnp16DriverNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
L"BIOS[UNDI] Simple Network Protocol Driver"
|
||||
},
|
||||
{
|
||||
NULL,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
This function retrieves the user readable name of a driver in the form of a
|
||||
Unicode string. If the driver specified by This has a user readable name in
|
||||
the language specified by Language, then a pointer to the driver name is
|
||||
returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
|
||||
by This does not support the language specified by Language,
|
||||
then EFI_UNSUPPORTED is returned.
|
||||
|
||||
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||||
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||
|
||||
@param Language[in] A pointer to a Null-terminated ASCII string
|
||||
array indicating the language. This is the
|
||||
language of the driver name that the caller is
|
||||
requesting, and it must match one of the
|
||||
languages specified in SupportedLanguages. The
|
||||
number of languages supported by a driver is up
|
||||
to the driver writer. Language is specified
|
||||
in RFC 4646 or ISO 639-2 language code format.
|
||||
|
||||
@param DriverName[out] A pointer to the Unicode string to return.
|
||||
This Unicode string is the name of the
|
||||
driver specified by This in the language
|
||||
specified by Language.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string for the Driver specified by
|
||||
This and the language specified by Language was
|
||||
returned in DriverName.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER DriverName is NULL.
|
||||
|
||||
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||||
the language specified by Language.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosSnp16ComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
mBiosSnp16DriverNameTable,
|
||||
DriverName,
|
||||
(BOOLEAN)(This == &gBiosSnp16ComponentName)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
|
||||
This function retrieves the user readable name of the controller specified by
|
||||
ControllerHandle and ChildHandle in the form of a Unicode string. If the
|
||||
driver specified by This has a user readable name in the language specified by
|
||||
Language, then a pointer to the controller name is returned in ControllerName,
|
||||
and EFI_SUCCESS is returned. If the driver specified by This is not currently
|
||||
managing the controller specified by ControllerHandle and ChildHandle,
|
||||
then EFI_UNSUPPORTED is returned. If the driver specified by This does not
|
||||
support the language specified by Language, then EFI_UNSUPPORTED is returned.
|
||||
|
||||
@param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
|
||||
EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||
|
||||
@param ControllerHandle[in] The handle of a controller that the driver
|
||||
specified by This is managing. This handle
|
||||
specifies the controller whose name is to be
|
||||
returned.
|
||||
|
||||
@param ChildHandle[in] The handle of the child controller to retrieve
|
||||
the name of. This is an optional parameter that
|
||||
may be NULL. It will be NULL for device
|
||||
drivers. It will also be NULL for a bus drivers
|
||||
that wish to retrieve the name of the bus
|
||||
controller. It will not be NULL for a bus
|
||||
driver that wishes to retrieve the name of a
|
||||
child controller.
|
||||
|
||||
@param Language[in] A pointer to a Null-terminated ASCII string
|
||||
array indicating the language. This is the
|
||||
language of the driver name that the caller is
|
||||
requesting, and it must match one of the
|
||||
languages specified in SupportedLanguages. The
|
||||
number of languages supported by a driver is up
|
||||
to the driver writer. Language is specified in
|
||||
RFC 4646 or ISO 639-2 language code format.
|
||||
|
||||
@param ControllerName[out] A pointer to the Unicode string to return.
|
||||
This Unicode string is the name of the
|
||||
controller specified by ControllerHandle and
|
||||
ChildHandle in the language specified by
|
||||
Language from the point of view of the driver
|
||||
specified by This.
|
||||
|
||||
@retval EFI_SUCCESS The Unicode string for the user readable name in
|
||||
the language specified by Language for the
|
||||
driver specified by This was returned in
|
||||
DriverName.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
|
||||
EFI_HANDLE.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
|
||||
|
||||
@retval EFI_UNSUPPORTED The driver specified by This is not currently
|
||||
managing the controller specified by
|
||||
ControllerHandle and ChildHandle.
|
||||
|
||||
@retval EFI_UNSUPPORTED The driver specified by This does not support
|
||||
the language specified by Language.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosSnp16ComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
956
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Misc.c
Normal file
956
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Misc.c
Normal file
@@ -0,0 +1,956 @@
|
||||
/** @file
|
||||
Helper Routines that use a PXE-enabled NIC option ROM.
|
||||
|
||||
Copyright (c) 1999 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
of the BSD License which accompanies this distribution. The
|
||||
full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include "BiosSnp16.h"
|
||||
|
||||
#define TO_SEGMENT(x) ((UINT16) (RShiftU64 ((UINT32)(UINTN) (x), 4) & 0xF000))
|
||||
#define TO_OFFSET(x) ((UINT16) ((UINT32)(UINTN) (x) & 0xFFFF))
|
||||
#define PARAGRAPH_SIZE 0x10
|
||||
#define IVT_BASE 0x00000000
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct {
|
||||
UINT16 Signature; ///< 0xaa55
|
||||
UINT8 ROMlength; ///< size of this ROM in 512 byte blocks
|
||||
UINT8 InitEntryPoint[4]; ///< a jump to the initialization routine
|
||||
UINT8 Reserved[0xf]; ///< various
|
||||
UINT16 PxeRomIdOffset; ///< offset of UNDI, $BC$, or BUSD ROM ID structure
|
||||
UINT16 PcirHeaderOffset; ///< offset of PCI Expansion Header
|
||||
UINT16 PnpHeaderOffset; ///< offset of Plug and Play Expansion Header
|
||||
} OPTION_ROM_HEADER;
|
||||
#pragma pack()
|
||||
|
||||
UINT32 CachedVectorAddress[0x100];
|
||||
|
||||
/**
|
||||
Cache Interrupt verctor address converted from IVT number.
|
||||
|
||||
@param VectorNumber IVT number
|
||||
|
||||
@retval EFI_SUCCESS Success to operation.
|
||||
**/
|
||||
EFI_STATUS
|
||||
CacheVectorAddress (
|
||||
UINT8 VectorNumber
|
||||
)
|
||||
{
|
||||
UINT32 *Address;
|
||||
|
||||
Address = (UINT32 *)(UINTN) (IVT_BASE + VectorNumber * 4);
|
||||
CachedVectorAddress[VectorNumber] = *Address;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Get interrupt vector address according to IVT number.
|
||||
|
||||
@param VectorNumber Given IVT number
|
||||
|
||||
@return cached interrupt vector address.
|
||||
**/
|
||||
EFI_STATUS
|
||||
RestoreCachedVectorAddress (
|
||||
UINT8 VectorNumber
|
||||
)
|
||||
{
|
||||
UINT32 *Address;
|
||||
|
||||
Address = (UINT32 *)(UINTN) (IVT_BASE + VectorNumber * 4);
|
||||
*Address = CachedVectorAddress[VectorNumber];
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Print Undi loader table.
|
||||
|
||||
@param UndiLoaderStructure Point to Undi Loader table structure.
|
||||
|
||||
**/
|
||||
VOID
|
||||
Print_Undi_Loader_Table (
|
||||
VOID *UndiLoaderStructure
|
||||
)
|
||||
{
|
||||
UNDI_LOADER_T *DisplayPointer;
|
||||
|
||||
DisplayPointer = (UNDI_LOADER_T *) UndiLoaderStructure;
|
||||
|
||||
DEBUG ((DEBUG_NET, "Before Parsing the table contents, the table itself lives\n"));
|
||||
DEBUG ((DEBUG_NET, "\tat the address 0x%X\n\r", (UINT32)(UINTN) UndiLoaderStructure));
|
||||
|
||||
DEBUG ((DEBUG_NET, "\n\rStatus = 0x%X\n\r", DisplayPointer->Status));
|
||||
DEBUG ((DEBUG_NET, "\t_AX_= 0x%X\n\r", DisplayPointer->Ax));
|
||||
DEBUG ((DEBUG_NET, "\t_BX_= 0x%X\n\r", DisplayPointer->Bx));
|
||||
DEBUG ((DEBUG_NET, "\t_DX_= 0x%X\n\r", DisplayPointer->Dx));
|
||||
DEBUG ((DEBUG_NET, "\t_DI_= 0x%X\n\r", DisplayPointer->Di));
|
||||
DEBUG ((DEBUG_NET, "\t_ES_= 0x%X\n\r", DisplayPointer->Es));
|
||||
DEBUG ((DEBUG_NET, "\tUNDI_DS= 0x%X\n\r", DisplayPointer->Undi_Ds));
|
||||
DEBUG ((DEBUG_NET, "\tUNDI_CS= 0x%X\n\r", DisplayPointer->Undi_Cs));
|
||||
DEBUG ((DEBUG_NET, "\tPXEptr:SEG= 0x%X\n\r", (UINT16) DisplayPointer->PXEptr.Segment));
|
||||
DEBUG ((DEBUG_NET, "\tPXEptr:OFF= 0x%X\n\r", (UINT16) DisplayPointer->PXEptr.Offset));
|
||||
DEBUG ((DEBUG_NET, "\tPXENVptr:SEG= 0x%X\n\r", (UINT16) DisplayPointer->PXENVptr.Segment));
|
||||
DEBUG ((DEBUG_NET, "\tPXENVptr:OFF= 0x%X\n\r", (UINT16) DisplayPointer->PXENVptr.Offset));
|
||||
}
|
||||
|
||||
/**
|
||||
Simple table dumper. The ROMID table is necessary in order to effect
|
||||
the "Early UNDI" trick. Herein, the UNDI layer can be loaded in the
|
||||
pre-boot phase without having to download a Network Boot Program
|
||||
across the wire. It is required in the implementation in that we
|
||||
are not using PXE.
|
||||
|
||||
@param RomIDStructure Point to RomID structure.
|
||||
|
||||
**/
|
||||
VOID
|
||||
Print_ROMID_Table (
|
||||
IN VOID *RomIDStructure
|
||||
)
|
||||
{
|
||||
UNDI_ROMID_T *DisplayPointer;
|
||||
|
||||
DisplayPointer = (UNDI_ROMID_T *) RomIDStructure;
|
||||
|
||||
DEBUG ((DEBUG_NET, "Before Parsing the table contents, the table itself lives\n"));
|
||||
DEBUG ((DEBUG_NET, "\tat the address 0x%X\n\r", (UINT32)(UINTN) RomIDStructure));
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"\n\rROMID %c%c%c%c\n\r",
|
||||
DisplayPointer->Signature[0],
|
||||
DisplayPointer->Signature[1],
|
||||
DisplayPointer->Signature[2],
|
||||
DisplayPointer->Signature[3])
|
||||
);
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Length of this structure in bytes = 0x%X\n\r",
|
||||
DisplayPointer->StructLength)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Use to make byte checksum of this structure == zero is = 0x%X\n\r",
|
||||
DisplayPointer->StructCksum)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Structure format revision number= 0x%X\n\r",
|
||||
DisplayPointer->StructRev)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"API Revision number = 0x%X 0x%X 0x%X\n\r",
|
||||
DisplayPointer->UNDI_Rev[0],
|
||||
DisplayPointer->UNDI_Rev[1],
|
||||
DisplayPointer->UNDI_Rev[2])
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Offset of UNDI loader routine in the option ROM image= 0x%X\n\r",
|
||||
DisplayPointer->UNDI_Loader)
|
||||
);
|
||||
DEBUG ((DEBUG_NET, "From the data above, the absolute entry point of the UNDI loader is\n\r"));
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"\tat address 0x%X\n\r",
|
||||
(UINT32) (DisplayPointer->UNDI_Loader + ((UINT32) (UINTN)(DisplayPointer - 0x20) & 0xFFFF0)))
|
||||
);
|
||||
DEBUG ((DEBUG_NET, "Minimum stack segment size, in bytes,\n\r"));
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"needed to load and run the UNDI= 0x%X \n\r",
|
||||
DisplayPointer->StackSize)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"UNDI runtime code and data = 0x%X\n\r",
|
||||
DisplayPointer->DataSize)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Segment size = 0x%X\n\r",
|
||||
DisplayPointer->CodeSize)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"\n\rBus Type = %c%c%c%c\n\r",
|
||||
DisplayPointer->BusType[0],
|
||||
DisplayPointer->BusType[1],
|
||||
DisplayPointer->BusType[2],
|
||||
DisplayPointer->BusType[3])
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Print PXE table.
|
||||
|
||||
@param PxeTable Point to PXE table structure
|
||||
|
||||
**/
|
||||
VOID
|
||||
Print_PXE_Table (
|
||||
IN VOID* PxeTable
|
||||
)
|
||||
{
|
||||
PXE_T *DisplayPointer;
|
||||
UINTN Index;
|
||||
UINT8 *Dptr;
|
||||
|
||||
DisplayPointer = (PXE_T *) PxeTable;
|
||||
Dptr = (UINT8 *) PxeTable;
|
||||
|
||||
DEBUG ((DEBUG_NET, "This is the PXE table at address 0x%X\n\r", PxeTable));
|
||||
|
||||
DEBUG ((DEBUG_NET, "A dump of the 0x%X bytes is:\n\r", sizeof (PXE_T)));
|
||||
|
||||
for (Index = 0; Index < sizeof (PXE_T); Index++) {
|
||||
if ((Index % 0x10) == 0) {
|
||||
DEBUG ((DEBUG_NET, "\t\n\r"));
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_NET, " 0x%X ", *Dptr++));
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_NET, "\n\r"));
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"\n\rPXE %c%c%c%c%c%c\n\r",
|
||||
DisplayPointer->Signature[0],
|
||||
DisplayPointer->Signature[1],
|
||||
DisplayPointer->Signature[2],
|
||||
DisplayPointer->Signature[3])
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Length of this structure in bytes = 0x%X\n\r",
|
||||
DisplayPointer->StructLength)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Use to make byte checksum of this structure == zero is = 0x%X\n\r",
|
||||
DisplayPointer->StructCksum)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Structure format revision number = 0x%X\n\r",
|
||||
DisplayPointer->StructRev)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Must be zero, is equal to 0x%X\n\r",
|
||||
DisplayPointer->Reserved1)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Far pointer to UNDI ROMID = 0x%X\n\r",
|
||||
(UINT32) (DisplayPointer->Undi.Segment << 0x4 | DisplayPointer->Undi.Offset))
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Far pointer to base-code ROMID = 0x%X\n\r",
|
||||
(UINT32) ((DisplayPointer->Base.Segment << 0x04) | DisplayPointer->Base.Offset))
|
||||
);
|
||||
DEBUG ((DEBUG_NET, "16bit stack segment API entry point. This will be seg:off in \n\r"));
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"real mode and sel:off in 16:16 protected mode = 0x%X:0x%X\n\r",
|
||||
DisplayPointer->EntryPointSP.Segment,
|
||||
DisplayPointer->EntryPointSP.Offset)
|
||||
);
|
||||
|
||||
DEBUG ((DEBUG_NET, "\n\tNOTE to the implementer\n\tThis is the entry to use for call-ins\n\r"));
|
||||
|
||||
DEBUG ((DEBUG_NET, "32bit stack Segment API entry point. This will be sel:off. \n\r"));
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"In real mode, sel == 0 = 0x%X:0x%X\n\r",
|
||||
DisplayPointer->EntryPointESP.Segment,
|
||||
DisplayPointer->EntryPointESP.Offset)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Reserved2 value, must be zero, is equal to 0x%X\n\r",
|
||||
DisplayPointer->Reserved2)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Number of segment descriptors in this structur = 0x%X\n\r",
|
||||
(UINT8) DisplayPointer->SegDescCnt)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"First segment descriptor in GDT assigned to PXE = 0x%X\n\r",
|
||||
(UINT16) DisplayPointer->FirstSelector)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The Stack is \n\r\tSegment Addr = 0x%X\n\r\tPhysical Addr = 0x%X\n\r\tSeg Size = 0x%X\n\r",
|
||||
(UINT16) DisplayPointer->Stack.Seg_Addr,
|
||||
(UINT32) DisplayPointer->Stack.Phy_Addr,
|
||||
(UINT16) DisplayPointer->Stack.Seg_Size)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The UNDIData is \n\r\tSegment Addr = 0x%X\n\r\tPhysical Addr = 0x%X\n\r\tSeg Size = 0x%X\n\r",
|
||||
(UINT16) DisplayPointer->UNDIData.Seg_Addr,
|
||||
(UINT32) DisplayPointer->UNDIData.Phy_Addr,
|
||||
(UINT16) DisplayPointer->UNDIData.Seg_Size)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The UNDICodeWrite is \n\r\tSegment Addr = 0x%X\n\r\tPhysical Addr = 0x%X\n\r\tSeg Size = 0x%X\n\r",
|
||||
(UINT16) DisplayPointer->UNDICode.Seg_Addr,
|
||||
(UINT32) DisplayPointer->UNDICode.Phy_Addr,
|
||||
(UINT16) DisplayPointer->UNDICode.Seg_Size)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The Stack is \n\r\tSegment Addr = 0x%X\n\r\tPhysical Addr = 0x%X\n\r\tSeg Size = 0x%X\n\r",
|
||||
(UINT16) DisplayPointer->UNDICodeWrite.Seg_Addr,
|
||||
(UINT32) DisplayPointer->UNDICodeWrite.Phy_Addr,
|
||||
(UINT16) DisplayPointer->UNDICodeWrite.Seg_Size)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The BC_Data is \n\r\tSegment Addr = 0x%X\n\r\tPhysical Addr = 0x%X\n\r\tSeg Size = 0x%X\n\r",
|
||||
(UINT16) DisplayPointer->BC_Data.Seg_Addr,
|
||||
(UINT32) DisplayPointer->BC_Data.Phy_Addr,
|
||||
(UINT16) DisplayPointer->BC_Data.Seg_Size)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The BC_Code is \n\r\tSegment Addr = 0x%X\n\r\tPhysical Addr = 0x%X\n\r\tSeg Size = 0x%X\n\r",
|
||||
(UINT16) DisplayPointer->BC_Code.Seg_Addr,
|
||||
(UINT32) DisplayPointer->BC_Code.Phy_Addr,
|
||||
(UINT16) DisplayPointer->BC_Code.Seg_Size)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The BC_CodeWrite is \n\r\tSegment Addr = 0x%X\n\r\tPhysical Addr = 0x%X\n\r\tSeg Size = 0x%X\n\r",
|
||||
(UINT16) DisplayPointer->BC_CodeWrite.Seg_Addr,
|
||||
(UINT32) DisplayPointer->BC_CodeWrite.Phy_Addr,
|
||||
(UINT16) DisplayPointer->BC_CodeWrite.Seg_Size)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Print PXENV table.
|
||||
|
||||
@param PxenvTable Point to PXENV
|
||||
|
||||
**/
|
||||
VOID
|
||||
Print_PXENV_Table (
|
||||
IN VOID *PxenvTable
|
||||
)
|
||||
{
|
||||
PXENV_T *DisplayPointer;
|
||||
|
||||
DisplayPointer = (PXENV_T *) PxenvTable;
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"\n\rPXENV+ %c%c%c%c%c%c\n\r",
|
||||
DisplayPointer->Signature[0],
|
||||
DisplayPointer->Signature[1],
|
||||
DisplayPointer->Signature[2],
|
||||
DisplayPointer->Signature[3],
|
||||
DisplayPointer->Signature[4],
|
||||
DisplayPointer->Signature[5])
|
||||
);
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"PXE version number. \n\r\tLSB is minor version. \n\r\tMSB is major version = 0x%X\n\r",
|
||||
DisplayPointer->Version)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Length of PXE-2.0 Entry Point structure in bytes = 0x%X\n\r",
|
||||
DisplayPointer->StructLength)
|
||||
);
|
||||
DEBUG ((DEBUG_NET, "Used to make structure checksum equal zero is now = 0x%X\n\r", DisplayPointer->StructCksum));
|
||||
DEBUG ((DEBUG_NET, "Real mode API entry point segment:Offset. = 0x%X\n\r", DisplayPointer->RMEntry));
|
||||
DEBUG ((DEBUG_NET, "Protected mode API entry point = 0x%X\n\r", DisplayPointer->PMEntryOff));
|
||||
DEBUG ((DEBUG_NET, " segment:Offset. This will always be zero. \n\r"));
|
||||
DEBUG ((DEBUG_NET, "Protected mode API calls = 0x%X\n\r", DisplayPointer->PMEntrySeg));
|
||||
DEBUG ((DEBUG_NET, "Real mode stack segment = 0x%X\n\r", DisplayPointer->StackSeg));
|
||||
DEBUG ((DEBUG_NET, "Stack segment size in bytes = 0x%X\n\r", DisplayPointer->StackSize));
|
||||
DEBUG ((DEBUG_NET, "Real mode base-code code segment = 0x%X\n\r", DisplayPointer->BaseCodeSeg));
|
||||
DEBUG ((DEBUG_NET, "Base-code code segment size = 0x%X\n\r", DisplayPointer->BaseCodeSize));
|
||||
DEBUG ((DEBUG_NET, "Real mode base-code data segment = 0x%X\n\r", DisplayPointer->BaseDataSeg));
|
||||
DEBUG ((DEBUG_NET, "Base-code data segment size = 0x%X\n\r", DisplayPointer->BaseDataSize));
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"UNDI code segment size in bytes = 0x%X\n\r",
|
||||
DisplayPointer->UNDICodeSize)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"Real mode segment:Offset pointer \n\r\tto PXE Runtime ID structure, address = 0x%X\n\r",
|
||||
DisplayPointer->RuntimePtr)
|
||||
);
|
||||
DEBUG (
|
||||
(
|
||||
DEBUG_NET,
|
||||
"From above, we have a linear address of 0x%X\n\r",
|
||||
(UINT32)
|
||||
(
|
||||
((UINT32)(UINTN)(DisplayPointer->RuntimePtr) & 0xFFFF) +
|
||||
(((UINT32)(UINTN)(DisplayPointer->RuntimePtr) & 0xFFFF0000) >> 12)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
#define OPTION_ROM_PTR ((OPTION_ROM_HEADER *) RomAddress)
|
||||
|
||||
/**
|
||||
If available, launch the BaseCode from a NIC option ROM.
|
||||
This should install the !PXE and PXENV+ structures in memory for
|
||||
subsequent use.
|
||||
|
||||
|
||||
@param SimpleNetworkDevice Simple network device instance
|
||||
@param RomAddress The ROM base address for NIC rom.
|
||||
|
||||
@retval EFI_NOT_FOUND The check sum does not match
|
||||
@retval EFI_NOT_FOUND Rom ID offset is wrong
|
||||
@retval EFI_NOT_FOUND No Rom ID structure is found
|
||||
**/
|
||||
EFI_STATUS
|
||||
LaunchBaseCode (
|
||||
EFI_SIMPLE_NETWORK_DEV *SimpleNetworkDevice,
|
||||
UINTN RomAddress
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_IA32_REGISTER_SET InOutRegs;
|
||||
UNDI_ROMID_T *RomIdTableAddress;
|
||||
UNDI_LOADER_T *UndiLoaderTable;
|
||||
UINT16 Segment;
|
||||
UINT16 *StackPointer;
|
||||
VOID *Buffer;
|
||||
UINTN Size;
|
||||
PXE_T *Pxe;
|
||||
UINT32 RomLength;
|
||||
UINTN PciSegment;
|
||||
UINTN Bus;
|
||||
UINTN Device;
|
||||
UINTN Function;
|
||||
BOOLEAN ThunkFailed;
|
||||
|
||||
DEBUG ((DEBUG_NET, "\n\r\n\rCheck for the UNDI ROMID Signature\n\r"));
|
||||
|
||||
//
|
||||
// paranoia - check structures for validity
|
||||
//
|
||||
RomLength = OPTION_ROM_PTR->ROMlength << 9;
|
||||
if (CalculateSum8 ((UINT8 *) RomAddress, RomLength) != 0) {
|
||||
DEBUG ((DEBUG_ERROR, "ROM Header Checksum Error\n\r"));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
RomIdTableAddress = (UNDI_ROMID_T *) (RomAddress + OPTION_ROM_PTR->PxeRomIdOffset);
|
||||
|
||||
if ((UINTN) (OPTION_ROM_PTR->PxeRomIdOffset + RomIdTableAddress->StructLength) > RomLength) {
|
||||
DEBUG ((DEBUG_ERROR, "ROM ID Offset Error\n\r"));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
//
|
||||
// see if this is a header for an UNDI ROM ID structure (vs. a $BC$ or BUSD type)
|
||||
//
|
||||
if (CompareMem (RomIdTableAddress->Signature, UNDI_ROMID_SIG, sizeof RomIdTableAddress->Signature) != 0) {
|
||||
DEBUG ((DEBUG_ERROR, "No ROM ID Structure found....\n\r"));
|
||||
return EFI_NOT_FOUND;
|
||||
//
|
||||
// its not - keep looking
|
||||
//
|
||||
}
|
||||
|
||||
if (CalculateSum8 ((UINT8 *) RomIdTableAddress, RomIdTableAddress->StructLength) != 0) {
|
||||
DEBUG ((DEBUG_ERROR, "ROM ID Checksum Error\n\r"));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
Print_ROMID_Table (RomIdTableAddress);
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The ROM ID is located at 0x%X\n\r",
|
||||
RomIdTableAddress)
|
||||
);
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"With an UNDI Loader located at 0x%X\n\r",
|
||||
RomAddress + RomIdTableAddress->UNDI_Loader)
|
||||
);
|
||||
|
||||
//
|
||||
// found an UNDI ROM ID structure
|
||||
//
|
||||
SimpleNetworkDevice->Nii.ImageAddr = RomAddress;
|
||||
SimpleNetworkDevice->Nii.ImageSize = RomLength;
|
||||
SimpleNetworkDevice->Nii.MajorVer = RomIdTableAddress->UNDI_Rev[2];
|
||||
SimpleNetworkDevice->Nii.MinorVer = RomIdTableAddress->UNDI_Rev[1];
|
||||
|
||||
DEBUG ((DEBUG_NET, "Allocate area for the UNDI_LOADER_T structure\n\r"));
|
||||
//
|
||||
// Allocate 1 page below 1MB to put real mode thunk code in
|
||||
//
|
||||
// Undi Loader Table is a PXE Specification prescribed data structure
|
||||
// that is used to transfer information into and out of the Undi layer.
|
||||
// Note how it must be located below 1 MB.
|
||||
//
|
||||
SimpleNetworkDevice->UndiLoaderTablePages = EFI_SIZE_TO_PAGES (PARAGRAPH_SIZE + sizeof (UNDI_LOADER_T));
|
||||
Status = BiosSnp16AllocatePagesBelowOneMb (
|
||||
SimpleNetworkDevice->UndiLoaderTablePages,
|
||||
&SimpleNetworkDevice->UndiLoaderTable
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "We had a failure in AllocatePages, status code = 0x%X\n", Status));
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
UndiLoaderTable = SimpleNetworkDevice->UndiLoaderTable;
|
||||
|
||||
DEBUG ((DEBUG_NET, "Allocate area for the real-mode stack whose sole purpose\n\r"));
|
||||
DEBUG ((DEBUG_NET, "in life right now is to store a SEG:OFFSET combo pair that\n\r"));
|
||||
DEBUG ((DEBUG_NET, "points to an Undi_Loader_t table structure\n\r"));
|
||||
|
||||
Size = 0x100;
|
||||
Status = gBS->AllocatePool (EfiLoaderData, Size, &Buffer);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// Now we want to put a pointer to the Under Loader Table in our MemPage
|
||||
// Buffer. This will be the argument stack for the call into the Undi Loader
|
||||
//
|
||||
StackPointer = (UINT16 *) Buffer;
|
||||
*StackPointer++ = TO_OFFSET (UndiLoaderTable);
|
||||
//
|
||||
// push the OFFSET
|
||||
//
|
||||
*StackPointer++ = TO_SEGMENT (UndiLoaderTable);
|
||||
//
|
||||
// push the SEGMENT
|
||||
//
|
||||
StackPointer = (UINT16 *) Buffer;
|
||||
//
|
||||
// reset the stack pointer
|
||||
//
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"After the fixups, the stack pointer is 0x%X\n\r",
|
||||
(UINT64)(UINTN) StackPointer)
|
||||
);
|
||||
|
||||
//
|
||||
// Allocate memory for the Deployed UNDI.
|
||||
// The UNDI is essentially telling us how much space it needs, and
|
||||
// it is up to the EFI driver to allocate sufficient, boot-time
|
||||
// persistent resources for the call
|
||||
//
|
||||
SimpleNetworkDevice->DestinationDataSegmentPages = EFI_SIZE_TO_PAGES (RomIdTableAddress->DataSize);
|
||||
Status = BiosSnp16AllocatePagesBelowOneMb (
|
||||
SimpleNetworkDevice->DestinationDataSegmentPages,
|
||||
&SimpleNetworkDevice->DestinationDataSegment
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "We had a failure in AllocatePages, status code = 0x%X\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
UndiLoaderTable->Undi_Ds = (UINT16) ((UINTN) SimpleNetworkDevice->DestinationDataSegment >> 4);
|
||||
|
||||
//
|
||||
// Allocate memory for the Deployed UNDI stack
|
||||
// The UNDI is essentially telling us how much space it needs, and
|
||||
// it is up to the EFI driver to allocate sufficient, boot-time
|
||||
// persistent resources for the call
|
||||
//
|
||||
SimpleNetworkDevice->DestinationStackSegmentPages = EFI_SIZE_TO_PAGES (RomIdTableAddress->StackSize);
|
||||
Status = BiosSnp16AllocatePagesBelowOneMb (
|
||||
SimpleNetworkDevice->DestinationStackSegmentPages,
|
||||
&SimpleNetworkDevice->DestinationStackSegment
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "We had a failure in AllocatePages, status code = 0x%X\n", Status));
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// Allocate memory for the Deployed UNDI.
|
||||
// The UNDI is essentially telling us how much space it needs, and
|
||||
// it is up to the EFI driver to allocate sufficient, boot-time
|
||||
// persistent resources for the call
|
||||
//
|
||||
SimpleNetworkDevice->DestinationCodeSegmentPages = EFI_SIZE_TO_PAGES (RomIdTableAddress->CodeSize);
|
||||
Status = BiosSnp16AllocatePagesBelowOneMb (
|
||||
SimpleNetworkDevice->DestinationCodeSegmentPages,
|
||||
&SimpleNetworkDevice->DestinationCodeSegment
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "We had a failure in AllocatePages, status code = 0x%X\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
UndiLoaderTable->Undi_Cs = (UINT16) ((UINTN) SimpleNetworkDevice->DestinationCodeSegment >> 4);
|
||||
|
||||
//
|
||||
// these are in the Input and Output Parameter to be sent to the UNDI Loader code
|
||||
//
|
||||
UndiLoaderTable->Status = 0xAA55;
|
||||
//
|
||||
// -------------------- Changed by Michael_Huang@3Com.com -----------------
|
||||
// UndiLoaderTable->_AX is AX value when UNDI ROM is initialized by BIOS, it is the PCI bus device
|
||||
// function of the NIC. Please refer to PXE Spec for detail info.
|
||||
// old code is:
|
||||
// UndiLoaderTable->Ax = 0x0;
|
||||
// -----------------------------------------------------------------------
|
||||
//
|
||||
SimpleNetworkDevice->PciIo->GetLocation (
|
||||
SimpleNetworkDevice->PciIo,
|
||||
&PciSegment,
|
||||
&Bus,
|
||||
&Device,
|
||||
&Function
|
||||
);
|
||||
UndiLoaderTable->Ax = (UINT16) ((Bus << 0x8) | (Device << 0x3) | (Function));
|
||||
UndiLoaderTable->Bx = 0x0;
|
||||
UndiLoaderTable->Dx = 0x0;
|
||||
UndiLoaderTable->Di = 0x0;
|
||||
UndiLoaderTable->Es = 0x0;
|
||||
|
||||
//
|
||||
// set these OUT values to zero in order to ensure that
|
||||
// uninitialized memory is not mistaken for display data
|
||||
//
|
||||
UndiLoaderTable->PXEptr.Offset = 0;
|
||||
UndiLoaderTable->PXEptr.Segment = 0;
|
||||
UndiLoaderTable->PXENVptr.Segment = 0;
|
||||
UndiLoaderTable->PXENVptr.Offset = 0;
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_INIT,
|
||||
"The NIC is located at Bus 0x%X, Device 0x%X, Function 0x%X\n\r",
|
||||
Bus,
|
||||
Device,
|
||||
Function)
|
||||
);
|
||||
|
||||
//
|
||||
// These are the values that set up the ACTUAL IA32 machine state, whether in
|
||||
// Real16 in EFI32 or the IVE for IA64
|
||||
// register values are unused except for CS:IP and SS:SP
|
||||
//
|
||||
InOutRegs.X.AX = 0;
|
||||
InOutRegs.X.BX = 0;
|
||||
InOutRegs.X.CX = 0;
|
||||
InOutRegs.X.DX = 0;
|
||||
InOutRegs.X.SI = 0;
|
||||
InOutRegs.X.DI = 0;
|
||||
InOutRegs.X.BP = 0;
|
||||
InOutRegs.X.DS = 0;
|
||||
InOutRegs.X.ES = 0;
|
||||
//
|
||||
// just to be clean
|
||||
//
|
||||
DEBUG ((DEBUG_NET, "The way this game works is that the SS:SP +4 should point\n\r"));
|
||||
DEBUG ((DEBUG_NET, "to the contents of the UndiLoaderTable\n\r"));
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The Undi Loader Table is at address = 0x%X\n\r",
|
||||
(UINT32)(UINTN) UndiLoaderTable)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The segment and offsets are 0x%X and 0x%X, resp\n",
|
||||
TO_SEGMENT (UndiLoaderTable),
|
||||
TO_OFFSET (UndiLoaderTable))
|
||||
);
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The Linear Address of the UNDI Loader entry is 0x%X\n",
|
||||
RomAddress + RomIdTableAddress->UNDI_Loader)
|
||||
);
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The Address offset of the UNDI Loader entry is 0x%X\n",
|
||||
RomIdTableAddress->UNDI_Loader)
|
||||
);
|
||||
|
||||
DEBUG ((DEBUG_NET, "Before the call, we have...\n\r"));
|
||||
Print_Undi_Loader_Table (UndiLoaderTable);
|
||||
|
||||
Segment = ((UINT16) (RShiftU64 (RomAddress, 4) & 0xFFFF));
|
||||
DEBUG ((DEBUG_NET, "The Segment of the call is 0x%X\n\r", Segment));
|
||||
|
||||
//
|
||||
// make the call into the UNDI Code
|
||||
//
|
||||
DEBUG ((DEBUG_INIT, "Make the call into the UNDI code now\n\r"));
|
||||
|
||||
DEBUG ((DEBUG_NET, "\nThe 20-BIt address of the Call, and the location \n\r"));
|
||||
DEBUG ((DEBUG_NET, "\twhere we should be able to set a breakpoint is \n\r"));
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"\t\t0x%X, from SEG:OFF 0x%X:0x%X\n\r\n\r",
|
||||
Segment * 0x10 + RomIdTableAddress->UNDI_Loader,
|
||||
Segment,
|
||||
RomIdTableAddress->UNDI_Loader)
|
||||
);
|
||||
|
||||
ThunkFailed = SimpleNetworkDevice->LegacyBios->FarCall86 (
|
||||
SimpleNetworkDevice->LegacyBios,
|
||||
Segment, // Input segment
|
||||
(UINT16) RomIdTableAddress->UNDI_Loader, // Offset
|
||||
&InOutRegs, // Ptr to Regs
|
||||
Buffer, // Reference to Stack
|
||||
Size // Size of the Stack
|
||||
);
|
||||
if (ThunkFailed) {
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"The return code UndiLoaderTable->Status is = 0x%X\n\r",
|
||||
UndiLoaderTable->Status)
|
||||
);
|
||||
DEBUG (
|
||||
(DEBUG_NET,
|
||||
"This error code should match eax, which is = 0x%X\n\r",
|
||||
InOutRegs.X.AX)
|
||||
);
|
||||
|
||||
DEBUG ((DEBUG_NET, "Now returned from the UNDI code\n\r"));
|
||||
|
||||
DEBUG ((DEBUG_NET, "After the call, we have...\n\r"));
|
||||
Print_Undi_Loader_Table (UndiLoaderTable);
|
||||
|
||||
DEBUG ((DEBUG_NET, "Display the PXENV+ and !PXE tables exported by NIC\n\r"));
|
||||
Print_PXENV_Table ((VOID *)(UINTN)((UndiLoaderTable->PXENVptr.Segment << 4) | UndiLoaderTable->PXENVptr.Offset));
|
||||
Print_PXE_Table ((VOID *)(UINTN)((UndiLoaderTable->PXEptr.Segment << 4) + UndiLoaderTable->PXEptr.Offset));
|
||||
|
||||
Pxe = (PXE_T *)(UINTN)((UndiLoaderTable->PXEptr.Segment << 4) + UndiLoaderTable->PXEptr.Offset);
|
||||
SimpleNetworkDevice->Nii.Id = (UINT64)(UINTN) Pxe;
|
||||
|
||||
//
|
||||
// FreePool (Buffer);
|
||||
// paranoia - make sure a valid !PXE structure
|
||||
//
|
||||
if (CompareMem (Pxe->Signature, PXE_SIG, sizeof Pxe->Signature) != 0) {
|
||||
DEBUG ((DEBUG_ERROR, "!PXE Structure not found....\n\r"));
|
||||
return EFI_NOT_FOUND;
|
||||
//
|
||||
// its not - keep looking
|
||||
//
|
||||
}
|
||||
|
||||
if (CalculateSum8 ((UINT8 *) Pxe, Pxe->StructLength) != 0) {
|
||||
DEBUG ((DEBUG_ERROR, "!PXE Checksum Error\n\r"));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
if (Pxe->StructLength < (UINT8 *) &Pxe->FirstSelector - (UINT8 *) Pxe->Signature) {
|
||||
DEBUG ((DEBUG_ERROR, "!PXE Length Error\n\r"));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
if ((((UINTN) Pxe->Undi.Segment) << 4) + Pxe->Undi.Offset != (UINTN) RomIdTableAddress) {
|
||||
DEBUG ((DEBUG_ERROR, "!PXE RomId Address Error\n\r"));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
//
|
||||
// This is the magic to bind the global PXE interface
|
||||
// This dirtiness is for non-protocol shrouded access
|
||||
//
|
||||
SimpleNetworkDevice->PxeEntrySegment = Pxe->EntryPointSP.Segment;
|
||||
|
||||
if (SimpleNetworkDevice->PxeEntrySegment == 0) {
|
||||
DEBUG ((DEBUG_ERROR, "!PXE EntryPointSP segment Error\n\r"));
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
SimpleNetworkDevice->PxeEntryOffset = Pxe->EntryPointSP.Offset;
|
||||
|
||||
DEBUG (
|
||||
(
|
||||
DEBUG_NET, "The entry point is 0x%X:0x%X\n\r", SimpleNetworkDevice->PxeEntrySegment, SimpleNetworkDevice->
|
||||
PxeEntryOffset
|
||||
)
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Effect the Far Call into the PXE Layer
|
||||
|
||||
Note: When using a 32-bit stack segment do not push 32-bit words onto the stack. The PXE API
|
||||
services will not work, unless there are three 16-bit parameters pushed onto the stack.
|
||||
push DS ;Far pointer to parameter structure
|
||||
push offset pxe_data_call_struct ;is pushed onto stack.
|
||||
push Index ;UINT16 is pushed onto stack.
|
||||
call dword ptr (s_PXE ptr es:[di]).EntryPointSP
|
||||
add sp, 6 ;Caller cleans up stack.
|
||||
|
||||
@param SimpleNetworkDevice Device instance for simple network
|
||||
@param Table Point to parameter/retun value table for legacy far call
|
||||
@param TableSize The size of paramter/return value table
|
||||
@param CallIndex The index of legacy call.
|
||||
|
||||
@return EFI_STATUS
|
||||
**/
|
||||
EFI_STATUS
|
||||
MakePxeCall (
|
||||
EFI_SIMPLE_NETWORK_DEV *SimpleNetworkDevice,
|
||||
IN OUT VOID *Table,
|
||||
IN UINTN TableSize,
|
||||
IN UINT16 CallIndex
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_IA32_REGISTER_SET InOutRegs;
|
||||
UINT16 *BPtr;
|
||||
VOID *Buffer;
|
||||
UINTN Size;
|
||||
VOID *MemPageAddress;
|
||||
UINTN Index;
|
||||
BOOLEAN ThunkFailed;
|
||||
|
||||
DEBUG ((DEBUG_NET, "MakePxeCall(CallIndex = %02x, Table = %X, TableSize = %d)\n", CallIndex, Table, TableSize));
|
||||
|
||||
if (SimpleNetworkDevice->PxeEntrySegment == 0 && SimpleNetworkDevice->PxeEntryOffset == 0) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
//
|
||||
// Allocate a transient data structure for the argument table
|
||||
// This table needs to have the input XXX_t structure copied into here.
|
||||
// The PXE UNDI can only grab this table when it's below one-MB, and
|
||||
// this implementation will not try to push this table on the stack
|
||||
// (although this is a possible optimization path since EFI always allocates
|
||||
// 4K as a minimum page size...............)
|
||||
//
|
||||
Status = BiosSnp16AllocatePagesBelowOneMb (
|
||||
TableSize / EFI_PAGE_SIZE + 1,
|
||||
&MemPageAddress
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "We had a failure in AllocatePages, status code = 0x%X\n", Status));
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// Copy the > 1MB pool table to a sub-1MB buffer
|
||||
//
|
||||
CopyMem (MemPageAddress, Table, TableSize);
|
||||
|
||||
//
|
||||
// Allocate space for IA-32 register context
|
||||
//
|
||||
ZeroMem (&InOutRegs, sizeof (InOutRegs));
|
||||
InOutRegs.X.ES = SimpleNetworkDevice->PxeEntrySegment;
|
||||
InOutRegs.X.DI = SimpleNetworkDevice->PxeEntryOffset;
|
||||
|
||||
//
|
||||
// The game here is to build the stack which will subsequently
|
||||
// get copied down below 1 MB by the FarCall primitive.
|
||||
// This is now our working stack
|
||||
//
|
||||
Size = 6;
|
||||
Status = gBS->AllocatePool (
|
||||
EfiRuntimeServicesData,
|
||||
Size,
|
||||
&Buffer
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
BPtr = (UINT16 *) Buffer;
|
||||
*BPtr++ = CallIndex;
|
||||
//
|
||||
// SP + 2
|
||||
//
|
||||
*BPtr++ = TO_OFFSET (MemPageAddress);
|
||||
*BPtr++ = TO_SEGMENT (MemPageAddress);
|
||||
|
||||
DEBUG ((DEBUG_NET, "State before FarCall86\n"));
|
||||
DEBUG ((DEBUG_NET, "The Buffer is at 0x%X\n\r", Buffer));
|
||||
BPtr = (UINT16 *) Buffer;
|
||||
DEBUG ((DEBUG_NET, " Buffer = %04X %04X %04X", *BPtr, *(BPtr + 1), *(BPtr + 2)));
|
||||
DEBUG ((DEBUG_NET, " MemPage = "));
|
||||
for (Index = 0; Index < TableSize; Index++) {
|
||||
DEBUG ((DEBUG_NET, " %02x", *((UINT8 *) MemPageAddress + Index)));
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_NET, "\n"));
|
||||
|
||||
ThunkFailed = SimpleNetworkDevice->LegacyBios->FarCall86 (
|
||||
SimpleNetworkDevice->LegacyBios,
|
||||
SimpleNetworkDevice->PxeEntrySegment, // Input segment
|
||||
SimpleNetworkDevice->PxeEntryOffset,
|
||||
&InOutRegs, // Ptr to Regs
|
||||
Buffer, // Reference to Stack
|
||||
6 // Size of the Stack
|
||||
);
|
||||
if (ThunkFailed) {
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_NET, "State after FarCall86\n"));
|
||||
DEBUG ((DEBUG_NET, "The Buffer is at 0x%X\n\r", Buffer));
|
||||
BPtr = (UINT16 *) Buffer;
|
||||
DEBUG ((DEBUG_NET, " Buffer = %04X %04X %04X", *BPtr, *(BPtr + 1), *(BPtr + 2)));
|
||||
DEBUG ((DEBUG_NET, " MemPage = "));
|
||||
for (Index = 0; Index < TableSize; Index++) {
|
||||
DEBUG ((DEBUG_NET, " %02x", *((UINT8 *) MemPageAddress + Index)));
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_NET, "\n"));
|
||||
|
||||
//
|
||||
// Copy the sub 1MB table to > 1MB table
|
||||
//
|
||||
CopyMem (Table, MemPageAddress, TableSize);
|
||||
|
||||
//
|
||||
// For PXE UNDI call, AX contains the return status.
|
||||
// Convert the PXE UNDI Status to EFI_STATUS type
|
||||
//
|
||||
if (InOutRegs.X.AX == PXENV_EXIT_SUCCESS) {
|
||||
Status = EFI_SUCCESS;
|
||||
} else {
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
}
|
||||
//
|
||||
// Clean up house
|
||||
//
|
||||
gBS->FreePool (Buffer);
|
||||
gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) MemPageAddress, TableSize / EFI_PAGE_SIZE + 1);
|
||||
|
||||
return Status;
|
||||
}
|
613
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Pxe.h
Normal file
613
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Pxe.h
Normal file
@@ -0,0 +1,613 @@
|
||||
/** @file
|
||||
These are PXE Specification 2.1-compliant data structures and defines.
|
||||
|
||||
This file relies upon the existence of a PXE-compliant ROM
|
||||
in memory, as defined by the Preboot Execution Environment
|
||||
Specification (PXE), Version 2.1, located at
|
||||
|
||||
http://developer.intel.com/ial/wfm/wfmspecs.htm
|
||||
|
||||
Copyright (c) 1999 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
of the BSD License which accompanies this distribution. The
|
||||
full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _PXEDEF_H_
|
||||
#define _PXEDEF_H_
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
//
|
||||
// PXE structure signatures
|
||||
//
|
||||
#define BC_ROMID_SIG "$BC$"
|
||||
#define UNDI_ROMID_SIG "UNDI"
|
||||
#define BUSD_ROMID_SIG "BUSD"
|
||||
|
||||
#define PXE_SIG "!PXE"
|
||||
#define PXENV_SIG "PXENV+"
|
||||
|
||||
#define BC_ROMID_REV 0x00
|
||||
#define UNDI_ROMID_REV 0x00
|
||||
#define BUSD_ROMID_REV 0x00
|
||||
|
||||
#define PXE_REV 0x00
|
||||
#define PXENV_REV 0x0201
|
||||
|
||||
#define PXENV_PTR SIGNATURE_32 ('P', 'X', 'E', 'N')
|
||||
#define PXE_PTR SIGNATURE_32 ('!', 'P', 'X', 'E')
|
||||
#define UNDI_ROMID_SIG_PTR SIGNATURE_32 ('U', 'N', 'D', 'I')
|
||||
|
||||
typedef UINT16 SEGSEL; // Real mode segment or protected mode selector.
|
||||
typedef UINT16 OFF16; // Unsigned 16bit offset.
|
||||
typedef UINT32 ADDR32;
|
||||
|
||||
//
|
||||
// Bus types
|
||||
//
|
||||
#define PXENV_BUS_ISA 0
|
||||
#define PXENV_BUS_EISA 1
|
||||
#define PXENV_BUS_MCA 2
|
||||
#define PXENV_BUS_PCI 3
|
||||
#define PXENV_BUS_VESA 4
|
||||
#define PXENV_BUS_PCMCIA 5
|
||||
|
||||
//
|
||||
//
|
||||
// Result codes returned in AX by a PXENV API service.
|
||||
//
|
||||
#define PXENV_EXIT_SUCCESS 0x0000
|
||||
#define PXENV_EXIT_FAILURE 0x0001
|
||||
|
||||
//
|
||||
// Status codes returned in the status word of PXENV API parameter structures.
|
||||
//
|
||||
// Generic API errors - these do not match up with the M0x or E0x messages
|
||||
// that are reported by the loader.
|
||||
//
|
||||
#define PXENV_STATUS_SUCCESS 0x00
|
||||
#define PXENV_STATUS_FAILURE 0x01
|
||||
#define PXENV_STATUS_BAD_FUNC 0x02
|
||||
#define PXENV_STATUS_UNSUPPORTED 0x03
|
||||
#define PXENV_STATUS_KEEP_UNDI 0x04
|
||||
#define PXENV_STATUS_KEEP_ALL 0x05
|
||||
#define PXENV_STATUS_OUT_OF_RESOURCES 0x06
|
||||
|
||||
typedef enum {
|
||||
PxeEnvStatus_Success,
|
||||
PxeEnvStatus_Failure,
|
||||
PxeEnvStatus_BadFunc,
|
||||
PxeEnvStatus_Unsupported,
|
||||
PxeEnvStatus_KeepUndi,
|
||||
PxeEnvStatus_KeepAll
|
||||
} EFI_PXE_STATUS;
|
||||
|
||||
/* Driver errors (0x60 to 0x6F) */
|
||||
|
||||
// These errors are for UNDI compatible NIC drivers.
|
||||
#define PXENV_STATUS_UNDI_INVALID_FUNCTION 0x60
|
||||
#define PXENV_STATUS_UNDI_MEDIATEST_FAILED 0x61
|
||||
#define PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST 0x62
|
||||
#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC 0x63
|
||||
#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY 0x64
|
||||
#define PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA 0x65
|
||||
#define PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA 0x66
|
||||
#define PXENV_STATUS_UNDI_BAD_MAC_ADDR 0x67
|
||||
#define PXENV_STATUS_UNDI_BAD_EEPROM_CKSUM 0x68
|
||||
#define PXENV_STATUS_UNDI_ERROR_SETTING_ISR 0x69
|
||||
#define PXENV_STATUS_UNDI_INVALID_STATE 0x6A
|
||||
#define PXENV_STATUS_UNDI_TRANSMIT_ERROR 0x6B
|
||||
#define PXENV_STATUS_UNDI_INVALID_PARAMETER 0x6C
|
||||
|
||||
typedef struct {
|
||||
UINT16 Seg_Addr;
|
||||
UINT32 Phy_Addr;
|
||||
UINT16 Seg_Size;
|
||||
} NEWSEGDESC_T;
|
||||
|
||||
typedef struct {
|
||||
OFF16 Offset;
|
||||
SEGSEL Segment;
|
||||
} SEGOFF16;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Signature[4]; ///< Structure signature is not NULL terminated.
|
||||
UINT8 StructLength; ///< Length of this structure in bytes.
|
||||
UINT8 StructCksum; ///< Use to make byte checksum of this structure == zero.
|
||||
UINT8 StructRev; ///< Structure format revision number.
|
||||
UINT8 UNDI_Rev[3]; ///< API revision number stored in Intel order.
|
||||
//
|
||||
// Revision 2.1.0 == 0x00, 0x01, 0x02
|
||||
//
|
||||
UINT16 UNDI_Loader; ///< Offset of UNDI loader routine in the option ROM image.
|
||||
UINT16 StackSize; ///< Minimum stack segment size, in bytes, needed to load and run the UNDI.
|
||||
UINT16 DataSize; ///< UNDI runtime code and data
|
||||
UINT16 CodeSize; ///< segment sizes.
|
||||
UINT8 BusType[4]; ///< 'ISAR', 'EISA', 'PCIR', 'PCCR'
|
||||
} UNDI_ROMID_T;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Signature[4]; ///< Structure signature is not NULL terminated.
|
||||
UINT8 StructLength; ///< Length of this structure in bytes.
|
||||
UINT8 StructCksum; ///< Use to make byte checksum of this structure == zero.
|
||||
UINT8 StructRev; ///< Structure format revision number.
|
||||
UINT8 BC_Rev[3]; ///< API revision number stored in Intel order.
|
||||
//
|
||||
// Revision 2.1.0 == 0x00, 0x01, 0x02
|
||||
//
|
||||
UINT16 BC_Loader; ///< Offset of base-code loader routine in the option ROM image.
|
||||
UINT16 StackSize; ///< Minimum stack segment size (bytes) needed to load/run base-code.
|
||||
UINT16 DataSize; ///< Base-code runtime code and data
|
||||
UINT16 CodeSize; ///< segment sizes.
|
||||
} BC_ROMID_T;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Signature[4]; ///< Structure signature is not NULL terminated.
|
||||
UINT8 StructLength; ///< Length of this structure in bytes.
|
||||
UINT8 StructCksum; ///< Use to make byte checksum of this structure == zero.
|
||||
UINT8 StructRev; ///< Structure format revision number.
|
||||
UINT8 Reserved1; ///< must be zero
|
||||
///
|
||||
/// UNDI_ROMID_T __FAR *UNDI;// Far pointer to UNDI ROMID
|
||||
///
|
||||
SEGOFF16 Undi;
|
||||
|
||||
///
|
||||
/// BC_ROMID_T __FAR *Base; // Far pointer to base-code ROMID
|
||||
///
|
||||
SEGOFF16 Base;
|
||||
|
||||
///
|
||||
/// UINT16 (__FAR __CDECL *EntryPointSP)(UINT16 func, VOID __FAR *param);
|
||||
/// 16bit stack segment API entry point. This will be seg:off in
|
||||
/// real mode and sel:off in 16:16 protected mode.
|
||||
///
|
||||
SEGOFF16 EntryPointSP;
|
||||
|
||||
///
|
||||
/// UINT16 (__FAR __CDECL *EntryPointESP)(UINT16 func, VOID __FAR *param);
|
||||
/// 32bit stack segment API entry point. This will be sel:off.
|
||||
/// In real mode, sel == 0
|
||||
///
|
||||
SEGOFF16 EntryPointESP;
|
||||
///
|
||||
/// UINT16 (__FAR __CDECL *StatusCallout)(UINT16 param);
|
||||
/// Address of DHCP/TFTP status callout routine.
|
||||
///
|
||||
SEGOFF16 StatusCallout;
|
||||
UINT8 Reserved2; ///< must be zero
|
||||
UINT8 SegDescCnt; ///< Number of segment descriptors in this structure.
|
||||
UINT16 FirstSelector; ///< First segment descriptor in GDT assigned to PXE.
|
||||
NEWSEGDESC_T Stack;
|
||||
NEWSEGDESC_T UNDIData;
|
||||
NEWSEGDESC_T UNDICode;
|
||||
NEWSEGDESC_T UNDICodeWrite;
|
||||
NEWSEGDESC_T BC_Data;
|
||||
NEWSEGDESC_T BC_Code;
|
||||
NEWSEGDESC_T BC_CodeWrite;
|
||||
} PXE_T;
|
||||
|
||||
typedef struct {
|
||||
CHAR8 Signature[6]; ///< "PXENV+"
|
||||
UINT16 Version; ///< PXE version number. LSB is minor version. MSB is major version.
|
||||
UINT8 StructLength; ///< Length of PXE-2.0 Entry Point structure in bytes.
|
||||
UINT8 StructCksum; ///< Used to make structure checksum equal zero.
|
||||
UINT32 RMEntry; ///< Real mode API entry point segment:offset.
|
||||
UINT32 PMEntryOff; ///< Protected mode API entry point
|
||||
UINT16 PMEntrySeg; ///< segment:offset. This will always be zero. Protected mode API calls
|
||||
///< must be made through the API entry points in the PXE Runtime ID structure.
|
||||
|
||||
UINT16 StackSeg; ///< Real mode stack segment.
|
||||
UINT16 StackSize; ///< Stack segment size in bytes.
|
||||
UINT16 BaseCodeSeg; ///< Real mode base-code code segment.
|
||||
UINT16 BaseCodeSize; ///< Base-code code segment size
|
||||
UINT16 BaseDataSeg; ///< Real mode base-code data segment.
|
||||
UINT16 BaseDataSize; ///< Base-code data segment size
|
||||
UINT16 UNDIDataSeg; ///< Real mode UNDI data segment.
|
||||
UINT16 UNDIDataSize; ///< UNDI data segment size in bytes.
|
||||
UINT16 UNDICodeSeg; ///< Real mode UNDI code segment.
|
||||
UINT16 UNDICodeSize; ///< UNDI code segment size in bytes.
|
||||
PXE_T *RuntimePtr; ///< Real mode segment:offset pointer to PXE Runtime ID structure.
|
||||
} PXENV_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status;
|
||||
IN OUT UINT16 Ax;
|
||||
IN OUT UINT16 Bx;
|
||||
IN OUT UINT16 Dx;
|
||||
IN OUT UINT16 Di;
|
||||
IN OUT UINT16 Es;
|
||||
IN OUT UINT16 Undi_Ds;
|
||||
IN OUT UINT16 Undi_Cs;
|
||||
OUT SEGOFF16 PXEptr;
|
||||
OUT SEGOFF16 PXENVptr;
|
||||
} UNDI_LOADER_T;
|
||||
|
||||
//
|
||||
// Put in some UNDI-specific arguments
|
||||
//
|
||||
#define PXENV_START_UNDI 0x0000
|
||||
#define PXENV_UNDI_STARTUP 0x0001
|
||||
#define PXENV_UNDI_CLEANUP 0x0002
|
||||
#define PXENV_UNDI_INITIALIZE 0x0003
|
||||
#define PXENV_UNDI_RESET_NIC 0x0004
|
||||
#define PXENV_UNDI_SHUTDOWN 0x0005
|
||||
#define PXENV_UNDI_OPEN 0x0006
|
||||
#define PXENV_UNDI_CLOSE 0x0007
|
||||
#define PXENV_UNDI_TRANSMIT 0x0008
|
||||
#define PXENV_UNDI_SET_MCAST_ADDR 0x0009
|
||||
#define PXENV_UNDI_SET_STATION_ADDR 0x000A
|
||||
#define PXENV_UNDI_SET_PACKET_FILTER 0x000B
|
||||
#define PXENV_UNDI_GET_INFORMATION 0x000C
|
||||
#define PXENV_UNDI_GET_STATISTICS 0x000D
|
||||
#define PXENV_UNDI_CLEAR_STATISTICS 0x000E
|
||||
#define PXENV_UNDI_INITIATE_DIAGS 0x000F
|
||||
#define PXENV_UNDI_FORCE_INTERRUPT 0x0010
|
||||
#define PXENV_UNDI_GET_MCAST_ADDR 0x0011
|
||||
#define PXENV_UNDI_GET_NIC_TYPE 0x0012
|
||||
#define PXENV_UNDI_GET_NDIS_INFO 0x0013
|
||||
#define PXENV_UNDI_ISR 0x0014
|
||||
#define PXENV_STOP_UNDI 0x0015
|
||||
#define PXENV_UNDI_GET_STATE 0x0016
|
||||
|
||||
#define ADDR_LEN 16
|
||||
#define MAXNUM_MCADDR 8
|
||||
#define IPLEN 4 ///< length of an IP address
|
||||
#define XMT_DESTADDR 0x0000 ///< destination address given
|
||||
#define XMT_BROADCAST 0x0001 ///< use broadcast address
|
||||
|
||||
typedef struct {
|
||||
UINT16 MCastAddrCount; ///< In: Number of multi-cast
|
||||
|
||||
/* addresses. */
|
||||
UINT8 MCastAddr[MAXNUM_MCADDR][ADDR_LEN]; /* In: */
|
||||
|
||||
/* list of multi-cast addresses. */
|
||||
|
||||
/* Each address can take up to */
|
||||
|
||||
/* ADDR_LEN bytes and a maximum */
|
||||
|
||||
/* of MAXNUM_MCADDR address can */
|
||||
|
||||
/* be provided*/
|
||||
} PXENV_UNDI_MCAST_ADDR_T;
|
||||
|
||||
/* Definitions of TFTP API parameter structures.
|
||||
*/
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
IN UINT16 Ax; ///< In: These register fields must be
|
||||
IN UINT16 Bx; ///< filled in with the same data
|
||||
IN UINT16 Dx; ///< that was passed to the MLID
|
||||
IN UINT16 Di; ///< option ROM boot code by the
|
||||
IN UINT16 Es; ///< system BIOS.
|
||||
} PXENV_START_UNDI_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
} PXENV_UNDI_STARTUP_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
} PXENV_UNDI_CLEANUP_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
|
||||
///
|
||||
/// This is an input parameter and is a 32-bit physical address of
|
||||
/// a memory copy of the driver module in the protocol.ini file
|
||||
/// obtained from the Protocol Manager driver(refer to NDIS 2.0
|
||||
/// specifications). This parameter is basically supported for
|
||||
/// the universal NDIS driver to pass the information contained in
|
||||
/// protocol.ini file to the NIC driver for any specific
|
||||
/// configuration of the NIC. (Note that the module
|
||||
/// identification in the protocol.ini file was done by NDIS
|
||||
/// itself.) This value can be NULL for for any other application
|
||||
/// interfacing to the Universal NIC Driver.
|
||||
///
|
||||
IN UINT32 ProtocolIni;
|
||||
UINT8 Reserved[8];
|
||||
} PXENV_UNDI_INITIALIZE_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
IN PXENV_UNDI_MCAST_ADDR_T R_Mcast_Buf; ///< multicast address list
|
||||
/* see note below */
|
||||
} PXENV_UNDI_RESET_T;
|
||||
|
||||
/*++
|
||||
Note: The NIC driver does not remember the multicast
|
||||
addresses provided in any call. So the application must
|
||||
provide the multicast address list with all the calls that
|
||||
reset the receive unit of the adapter.
|
||||
--*/
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
} PXENV_UNDI_SHUTDOWN_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
|
||||
///
|
||||
/// This is an input parameter and is adapter specific. This is
|
||||
/// supported for Universal NDIS 2.0 driver to pass down the Open
|
||||
/// flags provided by the protocol driver (See NDIS 2.0
|
||||
/// specifications). This can be zero.
|
||||
///
|
||||
IN UINT16 OpenFlag; ///< In: See description below
|
||||
IN UINT16 PktFilter; ///< In: Filter for receiving
|
||||
|
||||
/* packet. It takes the following */
|
||||
|
||||
/* values, multiple values can be */
|
||||
|
||||
/* ORed together. */
|
||||
#define FLTR_DIRECTED 0x0001 ///< directed/multicast
|
||||
#define FLTR_BRDCST 0x0002 ///< broadcast packets
|
||||
#define FLTR_PRMSCS 0x0004 ///< any packet on LAN
|
||||
#define FLTR_SRC_RTG 0x0008 ///< source routing packet
|
||||
IN PXENV_UNDI_MCAST_ADDR_T McastBuffer; /* In: */
|
||||
/* See t_PXENV_UNDI_MCAST_ADDR. */
|
||||
} PXENV_UNDI_OPEN_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
} PXENV_UNDI_CLOSE_T;
|
||||
|
||||
#define MAX_DATA_BLKS 8
|
||||
|
||||
typedef struct {
|
||||
IN UINT16 ImmedLength; ///< In: Data buffer length in
|
||||
|
||||
/* bytes. */
|
||||
UINT16 XmitOffset; ///< 16-bit segment & offset of the
|
||||
UINT16 XmitSegment; ///< immediate data buffer.
|
||||
UINT16 DataBlkCount; ///< In: Number of data blocks.
|
||||
struct DataBlk {
|
||||
UINT8 TDPtrType; ///< 0 => 32 bit Phys pointer in TDDataPtr, not supported in this version of LSA
|
||||
///< 1 => seg:offser in TDDataPtr which can be a real mode or 16-bit protected mode pointer
|
||||
UINT8 TDRsvdByte; ///< Reserved, must be zero.
|
||||
UINT16 TDDataLen; ///< Data block length in bytes.
|
||||
UINT16 TDDataPtrOffset; ///< Far pointer to data buffer.
|
||||
UINT16 TDDataPtrSegment; ///< Far pointer to data buffer.
|
||||
} DataBlock[MAX_DATA_BLKS];
|
||||
}
|
||||
PXENV_UNDI_TBD_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
|
||||
///
|
||||
/// This is the protocol of the upper layer that is calling
|
||||
/// NICTransmit call. If the upper layer has filled the media
|
||||
/// header this field must be 0.
|
||||
///
|
||||
IN UINT8 Protocol;
|
||||
#define P_UNKNOWN 0
|
||||
#define P_IP 1
|
||||
#define P_ARP 2
|
||||
#define P_RARP 3
|
||||
|
||||
///
|
||||
/// If this flag is 0, the NIC driver expects a pointer to the
|
||||
/// destination media address in the field DestMediaAddr. If 1,
|
||||
/// the NIC driver fills the broadcast address for the
|
||||
/// destination.
|
||||
///
|
||||
IN UINT8 XmitFlag;
|
||||
#define XMT_DESTADDR 0x0000 ///< destination address given
|
||||
#define XMT_BROADCAST 0x0001 ///< use broadcast address
|
||||
|
||||
///
|
||||
/// This is a pointer to the hardware address of the destination
|
||||
/// media. It can be null if the destination is not known in
|
||||
/// which case the XmitFlag contains 1 for broadcast. Destination
|
||||
/// media address must be obtained by the upper level protocol
|
||||
/// (with Address Resolution Protocol) and NIC driver does not do
|
||||
/// any address resolution.
|
||||
///
|
||||
IN UINT16 DestAddrOffset; ///< 16-bit segment & offset of the
|
||||
IN UINT16 DestAddrSegment; ///< destination media address
|
||||
|
||||
|
||||
IN UINT16 TBDOffset; ///< 16-bit segment & offset of the
|
||||
IN UINT16 TBDSegment; ///< transmit buffer descriptor of type
|
||||
|
||||
/// XmitBufferDesc
|
||||
IN UINT32 Reserved[2];
|
||||
} PXENV_UNDI_TRANSMIT_T;
|
||||
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
IN PXENV_UNDI_MCAST_ADDR_T McastBuffer; ///< In:
|
||||
} PXENV_UNDI_SET_MCAST_ADDR_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
IN UINT8 StationAddress[ADDR_LEN]; ///< new address to be set
|
||||
} PXENV_UNDI_SET_STATION_ADDR_T;
|
||||
|
||||
typedef struct s_PXENV_UNDI_SET_PACKET_FILTER {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
IN UINT8 Filter; ///< In: Receive filter value.
|
||||
} PXENV_UNDI_SET_PACKET_FILTER_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
OUT UINT16 BaseIo; ///< Out: Adapter's Base IO
|
||||
OUT UINT16 IntNumber; ///< Out: IRQ number
|
||||
OUT UINT16 MaxTranUnit; ///< Out: MTU
|
||||
OUT UINT16 HwType; ///< Out: type of protocol at hardware level
|
||||
|
||||
#define ETHER_TYPE 1
|
||||
#define EXP_ETHER_TYPE 2
|
||||
#define IEEE_TYPE 6
|
||||
#define ARCNET_TYPE 7
|
||||
/*++
|
||||
other numbers can be obtained from rfc1010 for "Assigned
|
||||
Numbers". This number may not be validated by the application
|
||||
and hence adding new numbers to the list should be fine at any
|
||||
time.
|
||||
--*/
|
||||
OUT UINT16 HwAddrLen; ///< Out: actual length of hardware address
|
||||
OUT UINT8 CurrentNodeAddress[ADDR_LEN]; ///< Out: Current hardware address
|
||||
OUT UINT8 PermNodeAddress[ADDR_LEN]; ///< Out: Permanent hardware address
|
||||
OUT UINT16 ROMAddress; ///< Out: ROM address
|
||||
OUT UINT16 RxBufCt; ///< Out: receive Queue length
|
||||
OUT UINT16 TxBufCt; ///< Out: Transmit Queue length
|
||||
} PXENV_UNDI_GET_INFORMATION_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
OUT UINT32 XmtGoodFrames; ///< Out: No. of good transmissions
|
||||
OUT UINT32 RcvGoodFrames; ///< Out: No. of good frames received
|
||||
OUT UINT32 RcvCRCErrors; ///< Out: No. of frames with CRC error
|
||||
OUT UINT32 RcvResourceErrors; ///< Out: no. of frames discarded
|
||||
/* Out: receive Queue full */
|
||||
} PXENV_UNDI_GET_STATISTICS_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
} PXENV_UNDI_CLEAR_STATISTICS_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
} PXENV_UNDI_INITIATE_DIAGS_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
} PXENV_UNDI_FORCE_INTERRUPT_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
IN UINT32 InetAddr; ///< In: IP Multicast Address
|
||||
OUT UINT8 MediaAddr[ADDR_LEN]; ///< Out: corresponding hardware
|
||||
/* multicast address */
|
||||
} PXENV_UNDI_GET_MCAST_ADDR_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Vendor_ID; ///< OUT:
|
||||
OUT UINT16 Dev_ID; ///< OUT:
|
||||
OUT UINT8 Base_Class; ///< OUT:
|
||||
OUT UINT8 Sub_Class; ///< OUT:
|
||||
OUT UINT8 Prog_Intf; ///< OUT: program interface
|
||||
OUT UINT8 Rev; ///< OUT: Revision number
|
||||
OUT UINT16 BusDevFunc; ///< OUT: Bus, Device & Function numbers
|
||||
OUT UINT16 SubVendor_ID; ///< OUT:
|
||||
OUT UINT16 SubDevice_ID; ///< OUT:
|
||||
} PCI_INFO_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT32 EISA_Dev_ID; ///< Out:
|
||||
OUT UINT8 Base_Class; ///< OUT:
|
||||
OUT UINT8 Sub_Class; ///< OUT:
|
||||
OUT UINT8 Prog_Intf; ///< OUT: program interface
|
||||
OUT UINT16 CardSelNum; ///< OUT: Card Selector Number
|
||||
OUT UINT8 Reserved; ///< to make it 10 bytes
|
||||
} PNP_INFO_T;
|
||||
|
||||
|
||||
typedef union {
|
||||
PCI_INFO_T Pci;
|
||||
PNP_INFO_T Pnp;
|
||||
} PCI_PNP_INFO_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< OUT: PXENV_STATUS_xxx
|
||||
OUT UINT8 NicType; ///< OUT: 2=PCI, 3=PnP
|
||||
PCI_PNP_INFO_T PciPnpInfo;
|
||||
} PXENV_UNDI_GET_NIC_TYPE_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< OUT: PXENV_STATUS_xxx
|
||||
OUT UINT8 IfaceType[16]; ///< OUT: Type name of MAC, AsciiZ
|
||||
|
||||
/* format. This is used by the */
|
||||
|
||||
/* Universal NDIS Driver to fill */
|
||||
|
||||
/* the driver type in it's MAC */
|
||||
|
||||
/* Service specific */
|
||||
|
||||
/* characteristic table */
|
||||
OUT UINT32 LinkSpeed; ///< OUT:
|
||||
OUT UINT32 ServiceFlags; ///< OUT: as defined in NDIS Spec 2.0X
|
||||
OUT UINT32 Reserved[4]; ///< OUT: will be filled with 0s till defined
|
||||
} PXENV_UNDI_GET_NDIS_INFO_T;
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< OUT: PXENV_STATUS_xxx
|
||||
IN OUT UINT16 FuncFlag; ///< In: PXENV_UNDI_ISR_IN_xxx
|
||||
|
||||
/* Out: PXENV_UNDI_ISR_OUT_xxx */
|
||||
OUT UINT16 BufferLength;
|
||||
OUT UINT16 FrameLength;
|
||||
OUT UINT16 FrameHeaderLength;
|
||||
OUT UINT16 FrameOffset;
|
||||
OUT UINT16 FrameSegSel;
|
||||
OUT UINT8 ProtType;
|
||||
OUT UINT8 PktType;
|
||||
} PXENV_UNDI_ISR_T;
|
||||
|
||||
#define PXENV_UNDI_ISR_IN_START 1 /* This function must be first */
|
||||
|
||||
/* when an interrupt is received. */
|
||||
|
||||
/* It will tell us if the intr */
|
||||
|
||||
/* was generated by our device. */
|
||||
#define PXENV_UNDI_ISR_IN_PROCESS 2 /* Call to start processing one of */
|
||||
|
||||
/* our interrupts. */
|
||||
#define PXENV_UNDI_ISR_IN_GET_NEXT 3 /* Call to start/continue receiving */
|
||||
|
||||
/* data from receive buffer(s). */
|
||||
|
||||
/*++
|
||||
|
||||
Possible responses from PXENV_UNDI_ISR_IN_START
|
||||
|
||||
--*/
|
||||
#define PXENV_UNDI_ISR_OUT_OURS 0 ///< This is our interrupt. Deal with it.
|
||||
#define PXENV_UNDI_ISR_OUT_NOT_OURS 1 ///< This is not our interrupt.
|
||||
|
||||
/*++
|
||||
|
||||
Possible responses from PXENV_UNDI_ISR_IN_PROCESS and
|
||||
PXENV_UNDI_ISR_IN_PROCESS
|
||||
|
||||
--*/
|
||||
#define PXENV_UNDI_ISR_OUT_DONE 0 ///< We are done processing this interrupt.
|
||||
#define PXENV_UNDI_ISR_OUT_TRANSMIT 2 ///< We completed a transmit interrupt.
|
||||
#define PXENV_UNDI_ISR_OUT_RECEIVE 3 ///< Get data from receive buffer.
|
||||
|
||||
#define PXENV_UNDI_ISR_OUT_BUSY 4 /* ? */
|
||||
|
||||
typedef struct {
|
||||
UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
} PXENV_STOP_UNDI_T;
|
||||
|
||||
#define PXENV_UNDI_STARTED 1 ///< not even initialized
|
||||
#define PXENV_UNDI_INITIALIZED 2 ///< initialized and closed (not opened)
|
||||
#define PXENV_UNDI_OPENED 3 ///< initialized & opened
|
||||
|
||||
typedef struct {
|
||||
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
|
||||
UINT16 UNDI_State;
|
||||
} PXENV_UNDI_GET_STATE_T;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif
|
1254
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/PxeUndi.c
Normal file
1254
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/PxeUndi.c
Normal file
File diff suppressed because it is too large
Load Diff
67
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Snp16Dxe.inf
Normal file
67
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Snp16Dxe.inf
Normal file
@@ -0,0 +1,67 @@
|
||||
## @file
|
||||
# Thunk wrapper UEFI driver to produce EFI SNP protocol based on legacy 16 NIC ROM.
|
||||
#
|
||||
# Copyright (c) 1999 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions
|
||||
# of the BSD License which accompanies this distribution. The
|
||||
# full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
BASE_NAME = BiosSnp16
|
||||
FILE_GUID = D0CAA91E-2DE4-4b0d-B3DC-09C67E854E34
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
INF_VERSION = 0x00010005
|
||||
VERSION_STRING = 1.0
|
||||
|
||||
ENTRY_POINT = BiosSnp16DriverEntryPoint
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
# DRIVER_BINDING = gBiosSnp16DriverBinding
|
||||
# COMPONENT_NAME = gBiosSnp16ComponentName
|
||||
#
|
||||
|
||||
[Sources]
|
||||
BiosSnp16.h
|
||||
BiosSnp16.c
|
||||
Misc.c
|
||||
Pxe.h
|
||||
PxeUndi.c
|
||||
ComponentName.c
|
||||
|
||||
|
||||
[Libraryclasses]
|
||||
UefiDriverEntryPoint
|
||||
DebugLib
|
||||
BaseMemoryLib
|
||||
UefiBootServicesTableLib
|
||||
UefiLib
|
||||
BaseLib
|
||||
DevicePathLib
|
||||
MemoryAllocationLib
|
||||
|
||||
[Guids]
|
||||
gEfiEventExitBootServicesGuid
|
||||
|
||||
[Protocols]
|
||||
gEfiNetworkInterfaceIdentifierProtocolGuid
|
||||
gEfiDevicePathProtocolGuid
|
||||
gEfiSimpleNetworkProtocolGuid
|
||||
gEfiPciIoProtocolGuid
|
||||
gEfiLegacyBiosProtocolGuid
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||
|
Reference in New Issue
Block a user