mirror of https://github.com/acidanthera/audk.git
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:
parent
a7a0f78bd6
commit
bcecde140a
|
@ -0,0 +1,782 @@
|
|||
/** @file
|
||||
EFI glue for BIOS INT 13h block devices.
|
||||
|
||||
This file is coded to EDD 3.0 as defined by T13 D1386 Revision 4
|
||||
Availible on http://www.t13.org/#Project drafts
|
||||
Currently at ftp://fission.dt.wdc.com/pub/standards/x3t13/project/d1386r4.pdf
|
||||
|
||||
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 "BiosBlkIo.h"
|
||||
|
||||
//
|
||||
// Global data declaration
|
||||
//
|
||||
//
|
||||
// EFI Driver Binding Protocol Instance
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gBiosBlockIoDriverBinding = {
|
||||
BiosBlockIoDriverBindingSupported,
|
||||
BiosBlockIoDriverBindingStart,
|
||||
BiosBlockIoDriverBindingStop,
|
||||
0x3,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
//
|
||||
// Semaphore to control access to global variables mActiveInstances and mBufferUnder1Mb
|
||||
//
|
||||
EFI_LOCK mGlobalDataLock = EFI_INITIALIZE_LOCK_VARIABLE(TPL_APPLICATION);
|
||||
|
||||
//
|
||||
// Number of active instances of this protocol. This is used to allocate/free
|
||||
// the shared buffer. You must acquire the semaphore to modify.
|
||||
//
|
||||
UINTN mActiveInstances = 0;
|
||||
|
||||
//
|
||||
// Pointer to the beginning of the buffer used for real mode thunk
|
||||
// You must acquire the semaphore to modify.
|
||||
//
|
||||
EFI_PHYSICAL_ADDRESS mBufferUnder1Mb = 0;
|
||||
|
||||
//
|
||||
// Address packet is a buffer under 1 MB for all version EDD calls
|
||||
//
|
||||
EDD_DEVICE_ADDRESS_PACKET *mEddBufferUnder1Mb;
|
||||
|
||||
//
|
||||
// This is a buffer for INT 13h func 48 information
|
||||
//
|
||||
BIOS_LEGACY_DRIVE *mLegacyDriverUnder1Mb;
|
||||
|
||||
//
|
||||
// Buffer of 0xFE00 bytes for EDD 1.1 transfer must be under 1 MB
|
||||
// 0xFE00 bytes is the max transfer size supported.
|
||||
//
|
||||
VOID *mEdd11Buffer;
|
||||
|
||||
EFI_GUID mUnknownDevGuid = UNKNOWN_DEVICE_GUID;
|
||||
|
||||
/**
|
||||
Driver entry point.
|
||||
|
||||
@param ImageHandle Handle of driver image.
|
||||
@param SystemTable Pointer to system table.
|
||||
|
||||
@retval EFI_SUCCESS Entrypoint successfully executed.
|
||||
@retval Others Fail to execute entrypoint.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosBlockIoDriverEntryPoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install protocols
|
||||
//
|
||||
Status = EfiLibInstallDriverBindingComponentName2 (
|
||||
ImageHandle,
|
||||
SystemTable,
|
||||
&gBiosBlockIoDriverBinding,
|
||||
ImageHandle,
|
||||
&gBiosBlockIoComponentName,
|
||||
&gBiosBlockIoComponentName2
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// Install Legacy BIOS GUID to mark this driver as a BIOS Thunk Driver
|
||||
//
|
||||
return gBS->InstallMultipleProtocolInterfaces (
|
||||
&ImageHandle,
|
||||
&gEfiLegacyBiosGuid,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Check whether the driver supports this device.
|
||||
|
||||
@param This The Udriver binding protocol.
|
||||
@param Controller The controller handle to check.
|
||||
@param RemainingDevicePath The remaining device path.
|
||||
|
||||
@retval EFI_SUCCESS The driver supports this controller.
|
||||
@retval other This device isn't supported.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosBlockIoDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
PCI_TYPE00 Pci;
|
||||
|
||||
//
|
||||
// See if the Legacy BIOS Protocol is available
|
||||
//
|
||||
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &DevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
//
|
||||
// Open the IO Abstraction(s) needed to perform the supported test
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
(VOID **) &PciIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// See if this is a PCI VGA Controller by looking at the Command register and
|
||||
// Class Code Register
|
||||
//
|
||||
Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0, sizeof (Pci) / sizeof (UINT32), &Pci);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = EFI_UNSUPPORTED;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
Status = EFI_UNSUPPORTED;
|
||||
if (Pci.Hdr.ClassCode[2] == PCI_CLASS_MASS_STORAGE ||
|
||||
(Pci.Hdr.ClassCode[2] == PCI_BASE_CLASS_INTELLIGENT && Pci.Hdr.ClassCode[1] == PCI_SUB_CLASS_INTELLIGENT)
|
||||
) {
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
Done:
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Starts the device with this driver.
|
||||
|
||||
@param This The driver binding instance.
|
||||
@param Controller Handle of device to bind driver to.
|
||||
@param RemainingDevicePath Optional parameter use to pick a specific child
|
||||
device to start.
|
||||
|
||||
@retval EFI_SUCCESS The controller is controlled by the driver.
|
||||
@retval Other This controller cannot be started.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosBlockIoDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT8 DiskStart;
|
||||
UINT8 DiskEnd;
|
||||
BIOS_BLOCK_IO_DEV *BiosBlockIoPrivate;
|
||||
EFI_DEVICE_PATH_PROTOCOL *PciDevPath;
|
||||
UINTN Index;
|
||||
UINTN Flags;
|
||||
UINTN TmpAddress;
|
||||
BOOLEAN DeviceEnable;
|
||||
|
||||
//
|
||||
// Initialize variables
|
||||
//
|
||||
PciIo = NULL;
|
||||
PciDevPath = NULL;
|
||||
|
||||
DeviceEnable = FALSE;
|
||||
|
||||
//
|
||||
// See if the Legacy BIOS Protocol is available
|
||||
//
|
||||
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
//
|
||||
// Open the IO Abstraction(s) needed
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
(VOID **) &PciIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &PciDevPath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
//
|
||||
// Enable the device and make sure VGA cycles are being forwarded to this VGA device
|
||||
//
|
||||
Status = PciIo->Attributes (
|
||||
PciIo,
|
||||
EfiPciIoAttributeOperationEnable,
|
||||
EFI_PCI_DEVICE_ENABLE,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
|
||||
DeviceEnable = TRUE;
|
||||
|
||||
//
|
||||
// Check to see if there is a legacy option ROM image associated with this PCI device
|
||||
//
|
||||
Status = LegacyBios->CheckPciRom (
|
||||
LegacyBios,
|
||||
Controller,
|
||||
NULL,
|
||||
NULL,
|
||||
&Flags
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
//
|
||||
// Post the legacy option ROM if it is available.
|
||||
//
|
||||
Status = LegacyBios->InstallPciRom (
|
||||
LegacyBios,
|
||||
Controller,
|
||||
NULL,
|
||||
&Flags,
|
||||
&DiskStart,
|
||||
&DiskEnd,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
//
|
||||
// All instances share a buffer under 1MB to put real mode thunk code in
|
||||
// If it has not been allocated, then we allocate it.
|
||||
//
|
||||
if (mBufferUnder1Mb == 0) {
|
||||
//
|
||||
// Should only be here if there are no active instances
|
||||
//
|
||||
ASSERT (mActiveInstances == 0);
|
||||
|
||||
//
|
||||
// Acquire the lock
|
||||
//
|
||||
EfiAcquireLock (&mGlobalDataLock);
|
||||
|
||||
//
|
||||
// Allocate below 1MB
|
||||
//
|
||||
mBufferUnder1Mb = 0x00000000000FFFFF;
|
||||
Status = gBS->AllocatePages (AllocateMaxAddress, EfiBootServicesData, BLOCK_IO_BUFFER_PAGE_SIZE, &mBufferUnder1Mb);
|
||||
|
||||
//
|
||||
// Release the lock
|
||||
//
|
||||
EfiReleaseLock (&mGlobalDataLock);
|
||||
|
||||
//
|
||||
// Check memory allocation success
|
||||
//
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// In checked builds we want to assert if the allocate failed.
|
||||
//
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
mBufferUnder1Mb = 0;
|
||||
goto Error;
|
||||
}
|
||||
|
||||
TmpAddress = (UINTN) mBufferUnder1Mb;
|
||||
//
|
||||
// Adjusting the value to be on proper boundary
|
||||
//
|
||||
mEdd11Buffer = (VOID *) ALIGN_VARIABLE (TmpAddress);
|
||||
|
||||
TmpAddress = (UINTN) mEdd11Buffer + MAX_EDD11_XFER;
|
||||
//
|
||||
// Adjusting the value to be on proper boundary
|
||||
//
|
||||
mLegacyDriverUnder1Mb = (BIOS_LEGACY_DRIVE *) ALIGN_VARIABLE (TmpAddress);
|
||||
|
||||
TmpAddress = (UINTN) mLegacyDriverUnder1Mb + sizeof (BIOS_LEGACY_DRIVE);
|
||||
//
|
||||
// Adjusting the value to be on proper boundary
|
||||
//
|
||||
mEddBufferUnder1Mb = (EDD_DEVICE_ADDRESS_PACKET *) ALIGN_VARIABLE (TmpAddress);
|
||||
}
|
||||
//
|
||||
// Allocate the private device structure for each disk
|
||||
//
|
||||
for (Index = DiskStart; Index < DiskEnd; Index++) {
|
||||
|
||||
Status = gBS->AllocatePool (
|
||||
EfiBootServicesData,
|
||||
sizeof (BIOS_BLOCK_IO_DEV),
|
||||
(VOID **) &BiosBlockIoPrivate
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
//
|
||||
// Zero the private device structure
|
||||
//
|
||||
ZeroMem (BiosBlockIoPrivate, sizeof (BIOS_BLOCK_IO_DEV));
|
||||
|
||||
//
|
||||
// Initialize the private device structure
|
||||
//
|
||||
BiosBlockIoPrivate->Signature = BIOS_CONSOLE_BLOCK_IO_DEV_SIGNATURE;
|
||||
BiosBlockIoPrivate->ControllerHandle = Controller;
|
||||
BiosBlockIoPrivate->LegacyBios = LegacyBios;
|
||||
BiosBlockIoPrivate->PciIo = PciIo;
|
||||
|
||||
BiosBlockIoPrivate->Bios.Floppy = FALSE;
|
||||
BiosBlockIoPrivate->Bios.Number = (UINT8) Index;
|
||||
BiosBlockIoPrivate->Bios.Letter = (UINT8) (Index - 0x80 + 'C');
|
||||
BiosBlockIoPrivate->BlockMedia.RemovableMedia = FALSE;
|
||||
|
||||
if (BiosInitBlockIo (BiosBlockIoPrivate)) {
|
||||
SetBiosInitBlockIoDevicePath (PciDevPath, &BiosBlockIoPrivate->Bios, &BiosBlockIoPrivate->DevicePath);
|
||||
|
||||
//
|
||||
// Install the Block Io Protocol onto a new child handle
|
||||
//
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&BiosBlockIoPrivate->Handle,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
&BiosBlockIoPrivate->BlockIo,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
BiosBlockIoPrivate->DevicePath,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->FreePool (BiosBlockIoPrivate);
|
||||
}
|
||||
//
|
||||
// Open For Child Device
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
(VOID **) &BiosBlockIoPrivate->PciIo,
|
||||
This->DriverBindingHandle,
|
||||
BiosBlockIoPrivate->Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
|
||||
} else {
|
||||
gBS->FreePool (BiosBlockIoPrivate);
|
||||
}
|
||||
}
|
||||
|
||||
Error:
|
||||
if (EFI_ERROR (Status)) {
|
||||
if (PciIo != NULL) {
|
||||
if (DeviceEnable) {
|
||||
PciIo->Attributes (
|
||||
PciIo,
|
||||
EfiPciIoAttributeOperationDisable,
|
||||
EFI_PCI_DEVICE_ENABLE,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
if (PciDevPath != NULL) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
if (mBufferUnder1Mb != 0 && mActiveInstances == 0) {
|
||||
gBS->FreePages (mBufferUnder1Mb, BLOCK_IO_BUFFER_PAGE_SIZE);
|
||||
|
||||
//
|
||||
// Clear the buffer back to 0
|
||||
//
|
||||
EfiAcquireLock (&mGlobalDataLock);
|
||||
mBufferUnder1Mb = 0;
|
||||
EfiReleaseLock (&mGlobalDataLock);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//
|
||||
// Successfully installed, so increment the number of active instances
|
||||
//
|
||||
EfiAcquireLock (&mGlobalDataLock);
|
||||
mActiveInstances++;
|
||||
EfiReleaseLock (&mGlobalDataLock);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Stop the device handled by this driver.
|
||||
|
||||
@param This The driver binding protocol.
|
||||
@param Controller The controller to release.
|
||||
@param NumberOfChildren The number of handles in ChildHandleBuffer.
|
||||
@param ChildHandleBuffer The array of child handle.
|
||||
|
||||
@retval EFI_SUCCESS The device was stopped.
|
||||
@retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
|
||||
@retval Others Fail to uninstall protocols attached on the device.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosBlockIoDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN AllChildrenStopped;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
BIOS_BLOCK_IO_DEV *BiosBlockIoPrivate;
|
||||
UINTN Index;
|
||||
|
||||
//
|
||||
// Decrement the number of active instances
|
||||
//
|
||||
if (mActiveInstances != 0) {
|
||||
//
|
||||
// Add a check since the stop function will be called 2 times for each handle
|
||||
//
|
||||
EfiAcquireLock (&mGlobalDataLock);
|
||||
mActiveInstances--;
|
||||
EfiReleaseLock (&mGlobalDataLock);
|
||||
}
|
||||
|
||||
if ((mActiveInstances == 0) && (mBufferUnder1Mb != 0)) {
|
||||
//
|
||||
// Free our global buffer
|
||||
//
|
||||
Status = gBS->FreePages (mBufferUnder1Mb, BLOCK_IO_BUFFER_PAGE_SIZE);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
EfiAcquireLock (&mGlobalDataLock);
|
||||
mBufferUnder1Mb = 0;
|
||||
EfiReleaseLock (&mGlobalDataLock);
|
||||
}
|
||||
|
||||
AllChildrenStopped = TRUE;
|
||||
|
||||
for (Index = 0; Index < NumberOfChildren; Index++) {
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
BiosBlockIoPrivate = BIOS_BLOCK_IO_FROM_THIS (BlockIo);
|
||||
|
||||
//
|
||||
// Release PCI I/O and Block IO Protocols on the clild handle.
|
||||
//
|
||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||
ChildHandleBuffer[Index],
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
&BiosBlockIoPrivate->BlockIo,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
BiosBlockIoPrivate->DevicePath,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
AllChildrenStopped = FALSE;
|
||||
}
|
||||
//
|
||||
// Shutdown the hardware
|
||||
//
|
||||
BiosBlockIoPrivate->PciIo->Attributes (
|
||||
BiosBlockIoPrivate->PciIo,
|
||||
EfiPciIoAttributeOperationDisable,
|
||||
EFI_PCI_DEVICE_ENABLE,
|
||||
NULL
|
||||
);
|
||||
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
ChildHandleBuffer[Index]
|
||||
);
|
||||
|
||||
gBS->FreePool (BiosBlockIoPrivate);
|
||||
}
|
||||
|
||||
if (!AllChildrenStopped) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
Status = gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
Status = gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Build device path for device.
|
||||
|
||||
@param BaseDevicePath Base device path.
|
||||
@param Drive Legacy drive.
|
||||
@param DevicePath Device path for output.
|
||||
|
||||
**/
|
||||
VOID
|
||||
SetBiosInitBlockIoDevicePath (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *BaseDevicePath,
|
||||
IN BIOS_LEGACY_DRIVE *Drive,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UNKNOWN_DEVICE_VENDOR_DEVICE_PATH VendorNode;
|
||||
|
||||
Status = EFI_UNSUPPORTED;
|
||||
|
||||
//
|
||||
// BugBug: Check for memory leaks!
|
||||
//
|
||||
if (Drive->EddVersion == EDD_VERSION_30) {
|
||||
//
|
||||
// EDD 3.0 case.
|
||||
//
|
||||
Status = BuildEdd30DevicePath (BaseDevicePath, Drive, DevicePath);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// EDD 1.1 device case or it is unrecognized EDD 3.0 device
|
||||
//
|
||||
ZeroMem (&VendorNode, sizeof (VendorNode));
|
||||
VendorNode.DevicePath.Header.Type = HARDWARE_DEVICE_PATH;
|
||||
VendorNode.DevicePath.Header.SubType = HW_VENDOR_DP;
|
||||
SetDevicePathNodeLength (&VendorNode.DevicePath.Header, sizeof (VendorNode));
|
||||
CopyMem (&VendorNode.DevicePath.Guid, &mUnknownDevGuid, sizeof (EFI_GUID));
|
||||
VendorNode.LegacyDriveLetter = Drive->Number;
|
||||
*DevicePath = AppendDevicePathNode (BaseDevicePath, &VendorNode.DevicePath.Header);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Build device path for EDD 3.0.
|
||||
|
||||
@param BaseDevicePath Base device path.
|
||||
@param Drive Legacy drive.
|
||||
@param DevicePath Device path for output.
|
||||
|
||||
@retval EFI_SUCCESS The device path is built successfully.
|
||||
@retval EFI_UNSUPPORTED It is failed to built device path.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BuildEdd30DevicePath (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *BaseDevicePath,
|
||||
IN BIOS_LEGACY_DRIVE *Drive,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
)
|
||||
{
|
||||
//
|
||||
// AVL UINT64 Address;
|
||||
// AVL EFI_HANDLE Handle;
|
||||
//
|
||||
EFI_DEV_PATH Node;
|
||||
UINT32 Controller;
|
||||
|
||||
Controller = (UINT32) Drive->Parameters.InterfacePath.Pci.Controller;
|
||||
|
||||
ZeroMem (&Node, sizeof (Node));
|
||||
if ((AsciiStrnCmp ("ATAPI", Drive->Parameters.InterfaceType, 5) == 0) ||
|
||||
(AsciiStrnCmp ("ATA", Drive->Parameters.InterfaceType, 3) == 0)
|
||||
) {
|
||||
//
|
||||
// ATA or ATAPI drive found
|
||||
//
|
||||
Node.Atapi.Header.Type = MESSAGING_DEVICE_PATH;
|
||||
Node.Atapi.Header.SubType = MSG_ATAPI_DP;
|
||||
SetDevicePathNodeLength (&Node.Atapi.Header, sizeof (ATAPI_DEVICE_PATH));
|
||||
Node.Atapi.SlaveMaster = Drive->Parameters.DevicePath.Atapi.Master;
|
||||
Node.Atapi.Lun = Drive->Parameters.DevicePath.Atapi.Lun;
|
||||
Node.Atapi.PrimarySecondary = (UINT8) Controller;
|
||||
} else {
|
||||
//
|
||||
// Not an ATA/ATAPI drive
|
||||
//
|
||||
if (Controller != 0) {
|
||||
ZeroMem (&Node, sizeof (Node));
|
||||
Node.Controller.Header.Type = HARDWARE_DEVICE_PATH;
|
||||
Node.Controller.Header.SubType = HW_CONTROLLER_DP;
|
||||
SetDevicePathNodeLength (&Node.Controller.Header, sizeof (CONTROLLER_DEVICE_PATH));
|
||||
Node.Controller.ControllerNumber = Controller;
|
||||
*DevicePath = AppendDevicePathNode (*DevicePath, &Node.DevPath);
|
||||
}
|
||||
|
||||
ZeroMem (&Node, sizeof (Node));
|
||||
|
||||
if (AsciiStrnCmp ("SCSI", Drive->Parameters.InterfaceType, 4) == 0) {
|
||||
//
|
||||
// SCSI drive
|
||||
//
|
||||
Node.Scsi.Header.Type = MESSAGING_DEVICE_PATH;
|
||||
Node.Scsi.Header.SubType = MSG_SCSI_DP;
|
||||
SetDevicePathNodeLength (&Node.Scsi.Header, sizeof (SCSI_DEVICE_PATH));
|
||||
|
||||
//
|
||||
// Lun is miss aligned in both EDD and Device Path data structures.
|
||||
// thus we do a byte copy, to prevent alignment traps on IA-64.
|
||||
//
|
||||
CopyMem (&Node.Scsi.Lun, &Drive->Parameters.DevicePath.Scsi.Lun, sizeof (UINT16));
|
||||
Node.Scsi.Pun = Drive->Parameters.DevicePath.Scsi.Pun;
|
||||
|
||||
} else if (AsciiStrnCmp ("USB", Drive->Parameters.InterfaceType, 3) == 0) {
|
||||
//
|
||||
// USB drive
|
||||
//
|
||||
Node.Usb.Header.Type = MESSAGING_DEVICE_PATH;
|
||||
Node.Usb.Header.SubType = MSG_USB_DP;
|
||||
SetDevicePathNodeLength (&Node.Usb.Header, sizeof (USB_DEVICE_PATH));
|
||||
Node.Usb.ParentPortNumber = (UINT8) Drive->Parameters.DevicePath.Usb.Reserved;
|
||||
|
||||
} else if (AsciiStrnCmp ("1394", Drive->Parameters.InterfaceType, 4) == 0) {
|
||||
//
|
||||
// 1394 drive
|
||||
//
|
||||
Node.F1394.Header.Type = MESSAGING_DEVICE_PATH;
|
||||
Node.F1394.Header.SubType = MSG_1394_DP;
|
||||
SetDevicePathNodeLength (&Node.F1394.Header, sizeof (F1394_DEVICE_PATH));
|
||||
Node.F1394.Guid = Drive->Parameters.DevicePath.FireWire.Guid;
|
||||
|
||||
} else if (AsciiStrnCmp ("FIBRE", Drive->Parameters.InterfaceType, 5) == 0) {
|
||||
//
|
||||
// Fibre drive
|
||||
//
|
||||
Node.FibreChannel.Header.Type = MESSAGING_DEVICE_PATH;
|
||||
Node.FibreChannel.Header.SubType = MSG_FIBRECHANNEL_DP;
|
||||
SetDevicePathNodeLength (&Node.FibreChannel.Header, sizeof (FIBRECHANNEL_DEVICE_PATH));
|
||||
Node.FibreChannel.WWN = Drive->Parameters.DevicePath.FibreChannel.Wwn;
|
||||
Node.FibreChannel.Lun = Drive->Parameters.DevicePath.FibreChannel.Lun;
|
||||
|
||||
} else {
|
||||
DEBUG (
|
||||
(
|
||||
DEBUG_BLKIO, "It is unrecognized EDD 3.0 device, Drive Number = %x, InterfaceType = %s\n",
|
||||
Drive->Number,
|
||||
Drive->Parameters.InterfaceType
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (Node.DevPath.Type == 0) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
*DevicePath = AppendDevicePathNode (BaseDevicePath, &Node.DevPath);
|
||||
return EFI_SUCCESS;
|
||||
}
|
|
@ -0,0 +1,439 @@
|
|||
/** @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.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _BIOS_BLOCK_IO_H_
|
||||
#define _BIOS_BLOCK_IO_H_
|
||||
|
||||
#include <Uefi.h>
|
||||
|
||||
#include <Protocol/BlockIo.h>
|
||||
#include <Protocol/PciIo.h>
|
||||
#include <Protocol/LegacyBios.h>
|
||||
#include <Protocol/DevicePath.h>
|
||||
#include <Guid/LegacyBios.h>
|
||||
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/DevicePathLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
|
||||
#include <IndustryStandard/Pci.h>
|
||||
|
||||
#include "Edd.h"
|
||||
|
||||
#define UNKNOWN_DEVICE_GUID \
|
||||
{ 0xcf31fac5, 0xc24e, 0x11d2, {0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} }
|
||||
|
||||
typedef struct {
|
||||
VENDOR_DEVICE_PATH DevicePath;
|
||||
UINT8 LegacyDriveLetter;
|
||||
} UNKNOWN_DEVICE_VENDOR_DEVICE_PATH;
|
||||
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gBiosBlockIoComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gBiosBlockIoComponentName2;
|
||||
|
||||
|
||||
//
|
||||
// Define the I2O class code
|
||||
//
|
||||
#define PCI_BASE_CLASS_INTELLIGENT 0x0e
|
||||
#define PCI_SUB_CLASS_INTELLIGENT 0x00
|
||||
|
||||
//
|
||||
// Number of pages needed for our buffer under 1MB
|
||||
//
|
||||
#define BLOCK_IO_BUFFER_PAGE_SIZE (((sizeof (EDD_DEVICE_ADDRESS_PACKET) + sizeof (BIOS_LEGACY_DRIVE) + MAX_EDD11_XFER) / EFI_PAGE_SIZE) + 1 \
|
||||
)
|
||||
|
||||
//
|
||||
// Driver Binding Protocol functions
|
||||
//
|
||||
|
||||
/**
|
||||
Check whether the driver supports this device.
|
||||
|
||||
@param This The Udriver binding protocol.
|
||||
@param Controller The controller handle to check.
|
||||
@param RemainingDevicePath The remaining device path.
|
||||
|
||||
@retval EFI_SUCCESS The driver supports this controller.
|
||||
@retval other This device isn't supported.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosBlockIoDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Starts the device with this driver.
|
||||
|
||||
@param This The driver binding instance.
|
||||
@param Controller Handle of device to bind driver to.
|
||||
@param RemainingDevicePath Optional parameter use to pick a specific child
|
||||
device to start.
|
||||
|
||||
@retval EFI_SUCCESS The controller is controlled by the driver.
|
||||
@retval Other This controller cannot be started.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosBlockIoDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
Stop the device handled by this driver.
|
||||
|
||||
@param This The driver binding protocol.
|
||||
@param Controller The controller to release.
|
||||
@param NumberOfChildren The number of handles in ChildHandleBuffer.
|
||||
@param ChildHandleBuffer The array of child handle.
|
||||
|
||||
@retval EFI_SUCCESS The device was stopped.
|
||||
@retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
|
||||
@retval Others Fail to uninstall protocols attached on the device.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosBlockIoDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
//
|
||||
// Other internal functions
|
||||
//
|
||||
|
||||
/**
|
||||
Build device path for EDD 3.0.
|
||||
|
||||
@param BaseDevicePath Base device path.
|
||||
@param Drive Legacy drive.
|
||||
@param DevicePath Device path for output.
|
||||
|
||||
@retval EFI_SUCCESS The device path is built successfully.
|
||||
@retval EFI_UNSUPPORTED It is failed to built device path.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BuildEdd30DevicePath (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *BaseDevicePath,
|
||||
IN BIOS_LEGACY_DRIVE *Drive,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
Initialize block I/O device instance
|
||||
|
||||
@param Dev Instance of block I/O device instance
|
||||
|
||||
@retval TRUE Initialization succeeds.
|
||||
@retval FALSE Initialization fails.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
BiosInitBlockIo (
|
||||
IN BIOS_BLOCK_IO_DEV *Dev
|
||||
);
|
||||
|
||||
/**
|
||||
Read BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@param This Indicates a pointer to the calling context.
|
||||
@param MediaId Id of the media, changes every time the media is replaced.
|
||||
@param Lba The starting Logical Block Address to read from
|
||||
@param BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param Buffer A pointer to the destination buffer for the data. The caller is
|
||||
responsible for either having implicit or explicit ownership of the buffer.
|
||||
|
||||
@retval EFI_SUCCESS The data was read correctly from the device.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error while performing the read.
|
||||
@retval EFI_NO_MEDIA There is no media in the device.
|
||||
@retval EFI_MEDIA_CHANGED The MediaId does not matched the current device.
|
||||
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
|
||||
@retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid,
|
||||
or the buffer is not on proper alignment.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Edd30BiosReadBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Write BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@param This Indicates a pointer to the calling context.
|
||||
@param MediaId The media ID that the write request is for.
|
||||
@param Lba The starting logical block address to be written. The caller is
|
||||
responsible for writing to only legitimate locations.
|
||||
@param BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param Buffer A pointer to the source buffer for the data.
|
||||
|
||||
@retval EFI_SUCCESS The data was written correctly to the device.
|
||||
@retval EFI_WRITE_PROTECTED The device can not be written to.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error while performing the write.
|
||||
@retval EFI_NO_MEDIA There is no media in the device.
|
||||
@retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device.
|
||||
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
|
||||
@retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid,
|
||||
or the buffer is not on proper alignment.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Edd30BiosWriteBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Flush the Block Device.
|
||||
|
||||
@param This Indicates a pointer to the calling context.
|
||||
|
||||
@retval EFI_SUCCESS All outstanding data was written to the device
|
||||
@retval EFI_DEVICE_ERROR The device reported an error while writting back the data
|
||||
@retval EFI_NO_MEDIA There is no media in the device.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosBlockIoFlushBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
);
|
||||
|
||||
/**
|
||||
Reset the Block Device.
|
||||
|
||||
@param This Indicates a pointer to the calling context.
|
||||
@param ExtendedVerification Driver may perform diagnostics on reset.
|
||||
|
||||
@retval EFI_SUCCESS The device was reset.
|
||||
@retval EFI_DEVICE_ERROR The device is not functioning properly and could
|
||||
not be reset.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosBlockIoReset (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
/**
|
||||
Read BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@param This Indicates a pointer to the calling context.
|
||||
@param MediaId Id of the media, changes every time the media is replaced.
|
||||
@param Lba The starting Logical Block Address to read from
|
||||
@param BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param Buffer A pointer to the destination buffer for the data. The caller is
|
||||
responsible for either having implicit or explicit ownership of the buffer.
|
||||
|
||||
@retval EFI_SUCCESS The data was read correctly from the device.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error while performing the read.
|
||||
@retval EFI_NO_MEDIA There is no media in the device.
|
||||
@retval EFI_MEDIA_CHANGED The MediaId does not matched the current device.
|
||||
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
|
||||
@retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid,
|
||||
or the buffer is not on proper alignment.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Edd11BiosReadBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Write BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@param This Indicates a pointer to the calling context.
|
||||
@param MediaId The media ID that the write request is for.
|
||||
@param Lba The starting logical block address to be written. The caller is
|
||||
responsible for writing to only legitimate locations.
|
||||
@param BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param Buffer A pointer to the source buffer for the data.
|
||||
|
||||
@retval EFI_SUCCESS The data was written correctly to the device.
|
||||
@retval EFI_WRITE_PROTECTED The device can not be written to.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error while performing the write.
|
||||
@retval EFI_NO_MEDIA There is no media in the device.
|
||||
@retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device.
|
||||
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
|
||||
@retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid,
|
||||
or the buffer is not on proper alignment.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Edd11BiosWriteBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Read BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@param This Indicates a pointer to the calling context.
|
||||
@param MediaId Id of the media, changes every time the media is replaced.
|
||||
@param Lba The starting Logical Block Address to read from
|
||||
@param BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param Buffer A pointer to the destination buffer for the data. The caller is
|
||||
responsible for either having implicit or explicit ownership of the buffer.
|
||||
|
||||
@retval EFI_SUCCESS The data was read correctly from the device.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error while performing the read.
|
||||
@retval EFI_NO_MEDIA There is no media in the device.
|
||||
@retval EFI_MEDIA_CHANGED The MediaId does not matched the current device.
|
||||
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
|
||||
@retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid,
|
||||
or the buffer is not on proper alignment.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosReadLegacyDrive (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Write BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@param This Indicates a pointer to the calling context.
|
||||
@param MediaId The media ID that the write request is for.
|
||||
@param Lba The starting logical block address to be written. The caller is
|
||||
responsible for writing to only legitimate locations.
|
||||
@param BufferSize Size of Buffer, must be a multiple of device block size.
|
||||
@param Buffer A pointer to the source buffer for the data.
|
||||
|
||||
@retval EFI_SUCCESS The data was written correctly to the device.
|
||||
@retval EFI_WRITE_PROTECTED The device can not be written to.
|
||||
@retval EFI_DEVICE_ERROR The device reported an error while performing the write.
|
||||
@retval EFI_NO_MEDIA There is no media in the device.
|
||||
@retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device.
|
||||
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
|
||||
@retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid,
|
||||
or the buffer is not on proper alignment.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosWriteLegacyDrive (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
Gets parameters of block I/O device.
|
||||
|
||||
@param BiosBlockIoDev Instance of block I/O device.
|
||||
@param Drive Legacy drive.
|
||||
|
||||
@return Result of device parameter retrieval.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
Int13GetDeviceParameters (
|
||||
IN BIOS_BLOCK_IO_DEV *BiosBlockIoDev,
|
||||
IN BIOS_LEGACY_DRIVE *Drive
|
||||
);
|
||||
|
||||
/**
|
||||
Extension of INT13 call.
|
||||
|
||||
@param BiosBlockIoDev Instance of block I/O device.
|
||||
@param Drive Legacy drive.
|
||||
|
||||
@return Result of this extension.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
Int13Extensions (
|
||||
IN BIOS_BLOCK_IO_DEV *BiosBlockIoDev,
|
||||
IN BIOS_LEGACY_DRIVE *Drive
|
||||
);
|
||||
|
||||
/**
|
||||
Gets parameters of legacy drive.
|
||||
|
||||
@param BiosBlockIoDev Instance of block I/O device.
|
||||
@param Drive Legacy drive.
|
||||
|
||||
@return Result of drive parameter retrieval.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
GetDriveParameters (
|
||||
IN BIOS_BLOCK_IO_DEV *BiosBlockIoDev,
|
||||
IN BIOS_LEGACY_DRIVE *Drive
|
||||
);
|
||||
|
||||
/**
|
||||
Build device path for device.
|
||||
|
||||
@param BaseDevicePath Base device path.
|
||||
@param Drive Legacy drive.
|
||||
@param DevicePath Device path for output.
|
||||
|
||||
**/
|
||||
VOID
|
||||
SetBiosInitBlockIoDevicePath (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *BaseDevicePath,
|
||||
IN BIOS_LEGACY_DRIVE *Drive,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,58 @@
|
|||
## @file
|
||||
# Component description file for BIOS Block IO module.
|
||||
#
|
||||
# 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]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BlockIoDxe
|
||||
FILE_GUID = 4495E47E-42A9-4007-8c17-B6664F909D04
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
|
||||
ENTRY_POINT = BiosBlockIoDriverEntryPoint
|
||||
|
||||
[Sources]
|
||||
BiosBlkIo.h
|
||||
Edd.h
|
||||
BiosBlkIo.c
|
||||
BiosInt13.c
|
||||
ComponentName.c
|
||||
|
||||
[LibraryClasses]
|
||||
UefiDriverEntryPoint
|
||||
DebugLib
|
||||
BaseMemoryLib
|
||||
UefiBootServicesTableLib
|
||||
UefiLib
|
||||
DevicePathLib
|
||||
MemoryAllocationLib
|
||||
|
||||
|
||||
[Protocols]
|
||||
gEfiBlockIoProtocolGuid
|
||||
gEfiDevicePathProtocolGuid
|
||||
gEfiPciIoProtocolGuid
|
||||
gEfiLegacyBiosProtocolGuid
|
||||
|
||||
|
||||
[Guids]
|
||||
gEfiLegacyBiosGuid
|
||||
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
|
||||
|
|
@ -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 "BiosBlkIo.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
|
||||
BiosBlockIoComponentNameGetDriverName (
|
||||
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
|
||||
BiosBlockIoComponentNameGetControllerName (
|
||||
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 gBiosBlockIoComponentName = {
|
||||
BiosBlockIoComponentNameGetDriverName,
|
||||
BiosBlockIoComponentNameGetControllerName,
|
||||
"eng"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gBiosBlockIoComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) BiosBlockIoComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) BiosBlockIoComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mBiosBlockIoDriverNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
L"BIOS[INT13] Block Io 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
|
||||
BiosBlockIoComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
mBiosBlockIoDriverNameTable,
|
||||
DriverName,
|
||||
(BOOLEAN)(This == &gBiosBlockIoComponentName)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
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
|
||||
BiosBlockIoComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
|
@ -0,0 +1,209 @@
|
|||
/** @file
|
||||
Include file to suport EDD 3.0.
|
||||
This file is coded to T13 D1386 Revision 3
|
||||
Availible on http://www.t13.org/#Project drafts
|
||||
Currently at ftp://fission.dt.wdc.com/pub/standards/x3t13/project/d1386r3.pdf
|
||||
|
||||
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 _EDD_H_
|
||||
#define _EDD_H_
|
||||
|
||||
//
|
||||
// packing with no compiler padding, so that the fields
|
||||
// of the following architected structures can be
|
||||
// properly accessed from C code.
|
||||
//
|
||||
#pragma pack(1)
|
||||
|
||||
typedef struct {
|
||||
UINT8 Bus;
|
||||
UINT8 Device;
|
||||
UINT8 Function;
|
||||
UINT8 Controller;
|
||||
UINT32 Reserved;
|
||||
} EDD_PCI;
|
||||
|
||||
typedef struct {
|
||||
UINT16 Base;
|
||||
UINT16 Reserved;
|
||||
UINT32 Reserved2;
|
||||
} EDD_LEGACY;
|
||||
|
||||
typedef union {
|
||||
EDD_PCI Pci;
|
||||
EDD_LEGACY Legacy;
|
||||
} EDD_INTERFACE_PATH;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Master;
|
||||
UINT8 Reserved[15];
|
||||
} EDD_ATA;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Master;
|
||||
UINT8 Lun;
|
||||
UINT8 Reserved[14];
|
||||
} EDD_ATAPI;
|
||||
|
||||
typedef struct {
|
||||
UINT16 Pun;
|
||||
UINT64 Lun;
|
||||
UINT8 Reserved[6];
|
||||
} EDD_SCSI;
|
||||
|
||||
typedef struct {
|
||||
UINT64 SerialNumber;
|
||||
UINT64 Reserved;
|
||||
} EDD_USB;
|
||||
|
||||
typedef struct {
|
||||
UINT64 Guid;
|
||||
UINT64 Reserved;
|
||||
} EDD_1394;
|
||||
|
||||
typedef struct {
|
||||
UINT64 Wwn;
|
||||
UINT64 Lun;
|
||||
} EDD_FIBRE;
|
||||
|
||||
typedef union {
|
||||
EDD_ATA Ata;
|
||||
EDD_ATAPI Atapi;
|
||||
EDD_SCSI Scsi;
|
||||
EDD_USB Usb;
|
||||
EDD_1394 FireWire;
|
||||
EDD_FIBRE FibreChannel;
|
||||
} EDD_DEVICE_PATH;
|
||||
|
||||
typedef struct {
|
||||
UINT16 StructureSize;
|
||||
UINT16 Flags;
|
||||
UINT32 MaxCylinders;
|
||||
UINT32 MaxHeads;
|
||||
UINT32 SectorsPerTrack;
|
||||
UINT64 PhysicalSectors;
|
||||
UINT16 BytesPerSector;
|
||||
UINT32 Fdpt;
|
||||
UINT16 Key;
|
||||
UINT8 DevicePathLength;
|
||||
UINT8 Reserved1;
|
||||
UINT16 Reserved2;
|
||||
CHAR8 HostBusType[4];
|
||||
CHAR8 InterfaceType[8];
|
||||
EDD_INTERFACE_PATH InterfacePath;
|
||||
EDD_DEVICE_PATH DevicePath;
|
||||
UINT8 Reserved3;
|
||||
UINT8 Checksum;
|
||||
} EDD_DRIVE_PARAMETERS;
|
||||
|
||||
//
|
||||
// EDD_DRIVE_PARAMETERS.Flags defines
|
||||
//
|
||||
#define EDD_GEOMETRY_VALID 0x02
|
||||
#define EDD_DEVICE_REMOVABLE 0x04
|
||||
#define EDD_WRITE_VERIFY_SUPPORTED 0x08
|
||||
#define EDD_DEVICE_CHANGE 0x10
|
||||
#define EDD_DEVICE_LOCKABLE 0x20
|
||||
|
||||
//
|
||||
// BUGBUG: This bit does not follow the spec. It tends to be always set
|
||||
// to work properly with Win98.
|
||||
//
|
||||
#define EDD_DEVICE_GEOMETRY_MAX 0x40
|
||||
|
||||
typedef struct {
|
||||
UINT8 PacketSizeInBytes; // 0x18
|
||||
UINT8 Zero;
|
||||
UINT8 NumberOfBlocks; // Max 0x7f
|
||||
UINT8 Zero2;
|
||||
UINT32 SegOffset;
|
||||
UINT64 Lba;
|
||||
UINT64 TransferBuffer;
|
||||
UINT32 ExtendedBlockCount; // Max 0xffffffff
|
||||
UINT32 Zero3;
|
||||
} EDD_DEVICE_ADDRESS_PACKET;
|
||||
|
||||
#define EDD_VERSION_30 0x30
|
||||
|
||||
//
|
||||
// Int 13 BIOS Errors
|
||||
//
|
||||
#define BIOS_PASS 0x00
|
||||
#define BIOS_WRITE_PROTECTED 0x03
|
||||
#define BIOS_SECTOR_NOT_FOUND 0x04
|
||||
#define BIOS_RESET_FAILED 0x05
|
||||
#define BIOS_DISK_CHANGED 0x06
|
||||
#define BIOS_DRIVE_DOES_NOT_EXIST 0x07
|
||||
#define BIOS_DMA_ERROR 0x08
|
||||
#define BIOS_DATA_BOUNDRY_ERROR 0x09
|
||||
#define BIOS_BAD_SECTOR 0x0a
|
||||
#define BIOS_BAD_TRACK 0x0b
|
||||
#define BIOS_MEADIA_TYPE_NOT_FOUND 0x0c
|
||||
#define BIOS_INVALED_FORMAT 0x0d
|
||||
#define BIOS_ECC_ERROR 0x10
|
||||
#define BIOS_ECC_CORRECTED_ERROR 0x11
|
||||
#define BIOS_HARD_DRIVE_FAILURE 0x20
|
||||
#define BIOS_SEEK_FAILED 0x40
|
||||
#define BIOS_DRIVE_TIMEOUT 0x80
|
||||
#define BIOS_DRIVE_NOT_READY 0xaa
|
||||
#define BIOS_UNDEFINED_ERROR 0xbb
|
||||
#define BIOS_WRITE_FAULT 0xcc
|
||||
#define BIOS_SENSE_FAILED 0xff
|
||||
|
||||
#define MAX_EDD11_XFER 0xfe00
|
||||
|
||||
#pragma pack()
|
||||
//
|
||||
// Internal Data Structures
|
||||
//
|
||||
typedef struct {
|
||||
CHAR8 Letter;
|
||||
UINT8 Number;
|
||||
UINT8 EddVersion;
|
||||
BOOLEAN ExtendedInt13;
|
||||
BOOLEAN DriveLockingAndEjecting;
|
||||
BOOLEAN Edd;
|
||||
BOOLEAN Extensions64Bit;
|
||||
BOOLEAN ParametersValid;
|
||||
UINT8 ErrorCode;
|
||||
VOID *FdptPointer;
|
||||
BOOLEAN Floppy;
|
||||
BOOLEAN AtapiFloppy;
|
||||
UINT8 MaxHead;
|
||||
UINT8 MaxSector;
|
||||
UINT16 MaxCylinder;
|
||||
UINT16 Pad;
|
||||
EDD_DRIVE_PARAMETERS Parameters;
|
||||
} BIOS_LEGACY_DRIVE;
|
||||
|
||||
#define BIOS_CONSOLE_BLOCK_IO_DEV_SIGNATURE SIGNATURE_32 ('b', 'b', 'i', 'o')
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
|
||||
EFI_HANDLE Handle;
|
||||
EFI_HANDLE ControllerHandle;
|
||||
EFI_BLOCK_IO_PROTOCOL BlockIo;
|
||||
EFI_BLOCK_IO_MEDIA BlockMedia;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
|
||||
|
||||
BIOS_LEGACY_DRIVE Bios;
|
||||
|
||||
} BIOS_BLOCK_IO_DEV;
|
||||
|
||||
#define BIOS_BLOCK_IO_FROM_THIS(a) CR (a, BIOS_BLOCK_IO_DEV, BlockIo, BIOS_CONSOLE_BLOCK_IO_DEV_SIGNATURE)
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,744 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006 - 2011, 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 _BIOS_KEYBOARD_H_
|
||||
#define _BIOS_KEYBOARD_H_
|
||||
|
||||
|
||||
#include <FrameworkDxe.h>
|
||||
|
||||
#include <Guid/StatusCodeDataTypeId.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
#include <Protocol/SimpleTextInEx.h>
|
||||
#include <Protocol/LegacyBios.h>
|
||||
#include <Protocol/IsaIo.h>
|
||||
#include <Protocol/DevicePath.h>
|
||||
#include <Protocol/Ps2Policy.h>
|
||||
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/ReportStatusCodeLib.h>
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
|
||||
//
|
||||
// Driver Binding Externs
|
||||
//
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gBiosKeyboardDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gBiosKeyboardComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gBiosKeyboardComponentName2;
|
||||
|
||||
|
||||
#include <IndustryStandard/Pci.h>
|
||||
|
||||
//
|
||||
// BISO Keyboard Defines
|
||||
//
|
||||
#define CHAR_SCANCODE 0xe0
|
||||
#define CHAR_ESC 0x1b
|
||||
|
||||
#define KEYBOARD_8042_DATA_REGISTER 0x60
|
||||
#define KEYBOARD_8042_STATUS_REGISTER 0x64
|
||||
#define KEYBOARD_8042_COMMAND_REGISTER 0x64
|
||||
|
||||
#define KEYBOARD_TIMEOUT 65536 // 0.07s
|
||||
#define KEYBOARD_WAITFORVALUE_TIMEOUT 1000000 // 1s
|
||||
#define KEYBOARD_BAT_TIMEOUT 4000000 // 4s
|
||||
#define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s
|
||||
// KEYBOARD COMMAND BYTE -- read by writing command KBC_CMDREG_VIA64_CMDBYTE_R to 64H, then read from 60H
|
||||
// write by wrting command KBC_CMDREG_VIA64_CMDBYTE_W to 64H, then write to 60H
|
||||
// 7: Reserved
|
||||
// 6: PC/XT translation mode convert
|
||||
// 5: Disable Auxiliary device interface
|
||||
// 4: Disable keyboard interface
|
||||
// 3: Reserved
|
||||
// 2: System Flag: selftest successful
|
||||
// 1: Enable Auxiliary device interrupt
|
||||
// 0: Enable Keyboard interrupt )
|
||||
//
|
||||
#define KB_CMMBYTE_KSCAN2UNI_COV (0x1 << 6)
|
||||
#define KB_CMMBYTE_DISABLE_AUX (0x1 << 5)
|
||||
#define KB_CMMBYTE_DISABLE_KB (0x1 << 4)
|
||||
#define KB_CMMBYTE_SLFTEST_SUCC (0x1 << 2)
|
||||
#define KB_CMMBYTE_ENABLE_AUXINT (0x1 << 1)
|
||||
#define KB_CMMBYTE_ENABLE_KBINT (0x1 << 0)
|
||||
|
||||
//
|
||||
// KEYBOARD CONTROLLER STATUS REGISTER - read from 64h
|
||||
// 7: Parity error
|
||||
// 6: General time out
|
||||
// 5: Output buffer holds data for AUX
|
||||
// 4: Keyboard is not locked
|
||||
// 3: Command written via 64h / Data written via 60h
|
||||
// 2: KBC self-test successful / Power-on reset
|
||||
// 1: Input buffer holds CPU data / empty
|
||||
// 0: Output buffer holds keyboard data / empty
|
||||
//
|
||||
#define KBC_STSREG_VIA64_PARE (0x1 << 7)
|
||||
#define KBC_STSREG_VIA64_TIM (0x1 << 6)
|
||||
#define KBC_STSREG_VIA64_AUXB (0x1 << 5)
|
||||
#define KBC_STSREG_VIA64_KEYL (0x1 << 4)
|
||||
#define KBC_STSREG_VIA64_C_D (0x1 << 3)
|
||||
#define KBC_STSREG_VIA64_SYSF (0x1 << 2)
|
||||
#define KBC_STSREG_VIA64_INPB (0x1 << 1)
|
||||
#define KBC_STSREG_VIA64_OUTB (0x1 << 0)
|
||||
|
||||
//
|
||||
// COMMANDs of KEYBOARD CONTROLLER COMMAND REGISTER - write to 64h
|
||||
//
|
||||
#define KBC_CMDREG_VIA64_CMDBYTE_R 0x20
|
||||
#define KBC_CMDREG_VIA64_CMDBYTE_W 0x60
|
||||
#define KBC_CMDREG_VIA64_AUX_DISABLE 0xA7
|
||||
#define KBC_CMDREG_VIA64_AUX_ENABLE 0xA8
|
||||
#define KBC_CMDREG_VIA64_KBC_SLFTEST 0xAA
|
||||
#define KBC_CMDREG_VIA64_KB_CKECK 0xAB
|
||||
#define KBC_CMDREG_VIA64_KB_DISABLE 0xAD
|
||||
#define KBC_CMDREG_VIA64_KB_ENABLE 0xAE
|
||||
#define KBC_CMDREG_VIA64_INTP_LOW_R 0xC0
|
||||
#define KBC_CMDREG_VIA64_INTP_HIGH_R 0xC2
|
||||
#define KBC_CMDREG_VIA64_OUTP_R 0xD0
|
||||
#define KBC_CMDREG_VIA64_OUTP_W 0xD1
|
||||
#define KBC_CMDREG_VIA64_OUTB_KB_W 0xD2
|
||||
#define KBC_CMDREG_VIA64_OUTB_AUX_W 0xD3
|
||||
#define KBC_CMDREG_VIA64_AUX_W 0xD4
|
||||
|
||||
//
|
||||
// echos of KEYBOARD CONTROLLER COMMAND - read from 60h
|
||||
//
|
||||
#define KBC_CMDECHO_KBCSLFTEST_OK 0x55
|
||||
#define KBC_CMDECHO_KBCHECK_OK 0x00
|
||||
#define KBC_CMDECHO_ACK 0xFA
|
||||
#define KBC_CMDECHO_BATTEST_OK 0xAA
|
||||
#define KBC_CMDECHO_BATTEST_FAILE 0xFC
|
||||
|
||||
//
|
||||
// OUTPUT PORT COMMANDs - write port by writing KBC_CMDREG_VIA64_OUTP_W via 64H, then write the command to 60H
|
||||
// drive data and clock of KB to high for at least 500us for BAT needs
|
||||
//
|
||||
#define KBC_OUTPORT_DCHIGH_BAT 0xC0
|
||||
//
|
||||
// scan code set type
|
||||
//
|
||||
#define KBC_INPBUF_VIA60_SCODESET1 0x01
|
||||
#define KBC_INPBUF_VIA60_SCODESET2 0x02
|
||||
#define KBC_INPBUF_VIA60_SCODESET3 0x03
|
||||
|
||||
//
|
||||
// COMMANDs written to INPUT BUFFER - write to 60h
|
||||
//
|
||||
#define KBC_INPBUF_VIA60_KBECHO 0xEE
|
||||
#define KBC_INPBUF_VIA60_KBSCODE 0xF0
|
||||
#define KBC_INPBUF_VIA60_KBTYPE 0xF2
|
||||
#define KBC_INPBUF_VIA60_KBDELAY 0xF3
|
||||
#define KBC_INPBUF_VIA60_KBEN 0xF4
|
||||
#define KBC_INPBUF_VIA60_KBSTDDIS 0xF5
|
||||
#define KBC_INPBUF_VIA60_KBSTDEN 0xF6
|
||||
#define KBC_INPBUF_VIA60_KBRESEND 0xFE
|
||||
#define KBC_INPBUF_VIA60_KBRESET 0xFF
|
||||
|
||||
//
|
||||
// 0040h:0017h - KEYBOARD - STATUS FLAGS 1
|
||||
// 7 INSert active
|
||||
// 6 Caps Lock active
|
||||
// 5 Num Lock active
|
||||
// 4 Scroll Lock active
|
||||
// 3 either Alt pressed
|
||||
// 2 either Ctrl pressed
|
||||
// 1 Left Shift pressed
|
||||
// 0 Right Shift pressed
|
||||
//
|
||||
// 0040h:0018h - KEYBOARD - STATUS FLAGS 2
|
||||
// 7: insert key is depressed
|
||||
// 6: caps-lock key is depressed (does not work well)
|
||||
// 5: num-lock key is depressed (does not work well)
|
||||
// 4: scroll lock key is depressed (does not work well)
|
||||
// 3: suspend key has been toggled (does not work well)
|
||||
// 2: system key is pressed and held (does not work well)
|
||||
// 1: left ALT key is pressed
|
||||
// 0: left CTRL key is pressed
|
||||
//
|
||||
#define KB_INSERT_BIT (0x1 << 7)
|
||||
#define KB_CAPS_LOCK_BIT (0x1 << 6)
|
||||
#define KB_NUM_LOCK_BIT (0x1 << 5)
|
||||
#define KB_SCROLL_LOCK_BIT (0x1 << 4)
|
||||
#define KB_ALT_PRESSED (0x1 << 3)
|
||||
#define KB_CTRL_PRESSED (0x1 << 2)
|
||||
#define KB_LEFT_SHIFT_PRESSED (0x1 << 1)
|
||||
#define KB_RIGHT_SHIFT_PRESSED (0x1 << 0)
|
||||
|
||||
#define KB_SUSPEND_PRESSED (0x1 << 3)
|
||||
#define KB_SYSREQ_PRESSED (0x1 << 2)
|
||||
#define KB_LEFT_ALT_PRESSED (0x1 << 1)
|
||||
#define KB_LEFT_CTRL_PRESSED (0x1 << 0)
|
||||
|
||||
//
|
||||
// BIOS Keyboard Device Structure
|
||||
//
|
||||
#define BIOS_KEYBOARD_DEV_SIGNATURE SIGNATURE_32 ('B', 'K', 'B', 'D')
|
||||
#define BIOS_KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('c', 'b', 'k', 'h')
|
||||
|
||||
typedef struct _BIOS_KEYBOARD_CONSOLE_IN_EX_NOTIFY {
|
||||
UINTN Signature;
|
||||
EFI_HANDLE NotifyHandle;
|
||||
EFI_KEY_DATA KeyData;
|
||||
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
|
||||
LIST_ENTRY NotifyEntry;
|
||||
} BIOS_KEYBOARD_CONSOLE_IN_EX_NOTIFY;
|
||||
|
||||
#define QUEUE_MAX_COUNT 32
|
||||
typedef struct {
|
||||
UINTN Front;
|
||||
UINTN Rear;
|
||||
EFI_KEY_DATA Buffer[QUEUE_MAX_COUNT];
|
||||
} SIMPLE_QUEUE;
|
||||
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
|
||||
EFI_ISA_IO_PROTOCOL *IsaIo;
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
|
||||
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInputEx;
|
||||
UINT16 DataRegisterAddress;
|
||||
UINT16 StatusRegisterAddress;
|
||||
UINT16 CommandRegisterAddress;
|
||||
BOOLEAN ExtendedKeyboard;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
|
||||
//
|
||||
// Buffer storing EFI_KEY_DATA
|
||||
//
|
||||
SIMPLE_QUEUE Queue;
|
||||
|
||||
//
|
||||
// Notification Function List
|
||||
//
|
||||
LIST_ENTRY NotifyList;
|
||||
EFI_EVENT TimerEvent;
|
||||
|
||||
} BIOS_KEYBOARD_DEV;
|
||||
|
||||
#define BIOS_KEYBOARD_DEV_FROM_THIS(a) CR (a, BIOS_KEYBOARD_DEV, SimpleTextIn, BIOS_KEYBOARD_DEV_SIGNATURE)
|
||||
#define TEXT_INPUT_EX_BIOS_KEYBOARD_DEV_FROM_THIS(a) \
|
||||
CR (a, \
|
||||
BIOS_KEYBOARD_DEV, \
|
||||
SimpleTextInputEx, \
|
||||
BIOS_KEYBOARD_DEV_SIGNATURE \
|
||||
)
|
||||
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gBiosKeyboardDriverBinding;
|
||||
|
||||
//
|
||||
// Driver Binding Protocol functions
|
||||
//
|
||||
|
||||
/**
|
||||
Check whether the driver supports this device.
|
||||
|
||||
@param This The Udriver binding protocol.
|
||||
@param Controller The controller handle to check.
|
||||
@param RemainingDevicePath The remaining device path.
|
||||
|
||||
@retval EFI_SUCCESS The driver supports this controller.
|
||||
@retval other This device isn't supported.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
Starts the device with this driver.
|
||||
|
||||
@param This The driver binding instance.
|
||||
@param Controller Handle of device to bind driver to.
|
||||
@param RemainingDevicePath Optional parameter use to pick a specific child
|
||||
device to start.
|
||||
|
||||
@retval EFI_SUCCESS The controller is controlled by the driver.
|
||||
@retval Other This controller cannot be started.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
Stop the device handled by this driver.
|
||||
|
||||
@param This The driver binding protocol.
|
||||
@param Controller The controller to release.
|
||||
@param NumberOfChildren The number of handles in ChildHandleBuffer.
|
||||
@param ChildHandleBuffer The array of child handle.
|
||||
|
||||
@retval EFI_SUCCESS The device was stopped.
|
||||
@retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
|
||||
@retval Others Fail to uninstall protocols attached on the device.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
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
|
||||
BiosKeyboardComponentNameGetDriverName (
|
||||
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
|
||||
BiosKeyboardComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// Simple Text Input Protocol functions
|
||||
//
|
||||
/**
|
||||
Reset the Keyboard and do BAT test for it, if (ExtendedVerification == TRUE) then do some extra keyboard validations.
|
||||
|
||||
@param This Pointer of simple text Protocol.
|
||||
@param ExtendedVerification Whether perform the extra validation of keyboard. True: perform; FALSE: skip.
|
||||
|
||||
@retval EFI_SUCCESS The command byte is written successfully.
|
||||
@retval EFI_DEVICE_ERROR Errors occurred during reseting keyboard.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardReset (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
/**
|
||||
Read out the scan code of the key that has just been stroked.
|
||||
|
||||
@param This Pointer of simple text Protocol.
|
||||
@param Key Pointer for store the key that read out.
|
||||
|
||||
@retval EFI_SUCCESS The key is read out successfully.
|
||||
@retval other The key reading failed.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardReadKeyStroke (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
|
||||
OUT EFI_INPUT_KEY *Key
|
||||
);
|
||||
|
||||
//
|
||||
// Private worker functions
|
||||
//
|
||||
/**
|
||||
Waiting on the keyboard event, if there's any key pressed by the user, signal the event
|
||||
|
||||
@param Event The event that be siganlled when any key has been stroked.
|
||||
@param Context Pointer of the protocol EFI_SIMPLE_TEXT_INPUT_PROTOCOL.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
BiosKeyboardWaitForKey (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
Check key buffer to get the key stroke status.
|
||||
|
||||
@param This Pointer of the protocol EFI_SIMPLE_TEXT_IN_PROTOCOL.
|
||||
|
||||
@retval EFI_SUCCESS A key is being pressed now.
|
||||
@retval Other No key is now pressed.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardCheckForKey (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This
|
||||
);
|
||||
|
||||
/**
|
||||
Convert unicode combined with scan code of key to the counterpart of EFIScancode of it.
|
||||
|
||||
@param KeyChar Unicode of key.
|
||||
@param ScanCode Scan code of key.
|
||||
|
||||
@return The value of EFI Scancode for the key.
|
||||
@retval SCAN_NULL No corresponding value in the EFI convert table is found for the key.
|
||||
|
||||
**/
|
||||
UINT16
|
||||
ConvertToEFIScanCode (
|
||||
IN CHAR16 KeyChar,
|
||||
IN UINT16 ScanCode
|
||||
);
|
||||
|
||||
/**
|
||||
Check whether there is Ps/2 Keyboard device in system by 0xF4 Keyboard Command
|
||||
If Keyboard receives 0xF4, it will respond with 'ACK'. If it doesn't respond, the device
|
||||
should not be in system.
|
||||
|
||||
@param BiosKeyboardPrivate Keyboard Private Data Struture
|
||||
|
||||
@retval TRUE Keyboard in System.
|
||||
@retval FALSE Keyboard not in System.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
CheckKeyboardConnect (
|
||||
IN BIOS_KEYBOARD_DEV *BiosKeyboardPrivate
|
||||
);
|
||||
|
||||
/**
|
||||
Timer event handler: read a series of key stroke from 8042
|
||||
and put them into memory key buffer.
|
||||
It is registered as running under TPL_NOTIFY
|
||||
|
||||
@param Event The timer event
|
||||
@param Context A BIOS_KEYBOARD_DEV pointer
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
BiosKeyboardTimerHandler (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
Reset the input device and optionaly run diagnostics
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param ExtendedVerification Driver may perform diagnostics on reset.
|
||||
|
||||
@retval EFI_SUCCESS The device was reset.
|
||||
@retval EFI_DEVICE_ERROR The device is not functioning properly and could
|
||||
not be reset.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardResetEx (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
/**
|
||||
Reads the next keystroke from the input device. The WaitForKey Event can
|
||||
be used to test for existance of a keystroke via WaitForEvent () call.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param KeyData A pointer to a buffer that is filled in with the keystroke
|
||||
state data for the key that was pressed.
|
||||
|
||||
@retval EFI_SUCCESS The keystroke information was returned.
|
||||
@retval EFI_NOT_READY There was no keystroke data availiable.
|
||||
@retval EFI_DEVICE_ERROR The keystroke information was not returned due to
|
||||
hardware errors.
|
||||
@retval EFI_INVALID_PARAMETER KeyData is NULL.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardReadKeyStrokeEx (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||
OUT EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
/**
|
||||
Set certain state for the input device.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param KeyToggleState A pointer to the EFI_KEY_TOGGLE_STATE to set the
|
||||
state for the input device.
|
||||
|
||||
@retval EFI_SUCCESS The device state was set successfully.
|
||||
@retval EFI_DEVICE_ERROR The device is not functioning correctly and could
|
||||
not have the setting adjusted.
|
||||
@retval EFI_UNSUPPORTED The device does not have the ability to set its state.
|
||||
@retval EFI_INVALID_PARAMETER KeyToggleState is NULL.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardSetState (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||
IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
||||
);
|
||||
|
||||
/**
|
||||
Register a notification function for a particular keystroke for the input device.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param KeyData A pointer to a buffer that is filled in with the keystroke
|
||||
information data for the key that was pressed.
|
||||
@param KeyNotificationFunction Points to the function to be called when the key
|
||||
sequence is typed specified by KeyData.
|
||||
@param NotifyHandle Points to the unique handle assigned to the registered notification.
|
||||
|
||||
|
||||
@retval EFI_SUCCESS The notification function was registered successfully.
|
||||
@retval EFI_OUT_OF_RESOURCES Unable to allocate resources for necesssary data structures.
|
||||
@retval EFI_INVALID_PARAMETER KeyData or NotifyHandle is NULL.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardRegisterKeyNotify (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||
IN EFI_KEY_DATA *KeyData,
|
||||
IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
|
||||
OUT EFI_HANDLE *NotifyHandle
|
||||
);
|
||||
|
||||
/**
|
||||
Remove a registered notification function from a particular keystroke.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param NotificationHandle The handle of the notification function being unregistered.
|
||||
|
||||
@retval EFI_SUCCESS The notification function was unregistered successfully.
|
||||
@retval EFI_INVALID_PARAMETER The NotificationHandle is invalid.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosKeyboardUnregisterKeyNotify (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||
IN EFI_HANDLE NotificationHandle
|
||||
);
|
||||
|
||||
/**
|
||||
Wait for a specific value to be presented in
|
||||
Data register of Keyboard Controller by keyboard and then read it,
|
||||
used in keyboard commands ack
|
||||
|
||||
@param BiosKeyboardPrivate Keyboard instance pointer.
|
||||
@param Value The value to be waited for
|
||||
@param WaitForValueTimeOut The limit of microseconds for timeout
|
||||
|
||||
@retval EFI_SUCCESS The command byte is written successfully.
|
||||
@retval EFI_TIMEOUT Timeout occurred during writing.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
KeyboardWaitForValue (
|
||||
IN BIOS_KEYBOARD_DEV *BiosKeyboardPrivate,
|
||||
IN UINT8 Value,
|
||||
IN UINTN WaitForValueTimeOut
|
||||
);
|
||||
|
||||
/**
|
||||
Write data byte to input buffer or input/output ports of Keyboard Controller with delay and waiting for buffer-empty state.
|
||||
|
||||
@param BiosKeyboardPrivate Keyboard instance pointer.
|
||||
@param Data Data byte to write.
|
||||
|
||||
@retval EFI_SUCCESS The data byte is written successfully.
|
||||
@retval EFI_TIMEOUT Timeout occurred during writing.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
KeyboardWrite (
|
||||
IN BIOS_KEYBOARD_DEV *BiosKeyboardPrivate,
|
||||
IN UINT8 Data
|
||||
);
|
||||
|
||||
/**
|
||||
Free keyboard notify list.
|
||||
|
||||
@param ListHead The list head
|
||||
|
||||
@retval EFI_SUCCESS Free the notify list successfully
|
||||
@retval EFI_INVALID_PARAMETER ListHead is invalid.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BiosKeyboardFreeNotifyList (
|
||||
IN OUT LIST_ENTRY *ListHead
|
||||
);
|
||||
|
||||
/**
|
||||
Check if key is registered.
|
||||
|
||||
@param RegsiteredData A pointer to a buffer that is filled in with the keystroke
|
||||
state data for the key that was registered.
|
||||
@param InputData A pointer to a buffer that is filled in with the keystroke
|
||||
state data for the key that was pressed.
|
||||
|
||||
@retval TRUE Key be pressed matches a registered key.
|
||||
@retval FLASE Match failed.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
IsKeyRegistered (
|
||||
IN EFI_KEY_DATA *RegsiteredData,
|
||||
IN EFI_KEY_DATA *InputData
|
||||
);
|
||||
|
||||
/**
|
||||
Waiting on the keyboard event, if there's any key pressed by the user, signal the event
|
||||
|
||||
@param Event The event that be siganlled when any key has been stroked.
|
||||
@param Context Pointer of the protocol EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
BiosKeyboardWaitForKeyEx (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,183 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006, 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 "BiosKeyboard.h"
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gBiosKeyboardComponentName = {
|
||||
BiosKeyboardComponentNameGetDriverName,
|
||||
BiosKeyboardComponentNameGetControllerName,
|
||||
"eng"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gBiosKeyboardComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) BiosKeyboardComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) BiosKeyboardComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mBiosKeyboardDriverNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
L"BIOS[INT16] Keyboard 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
|
||||
BiosKeyboardComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
mBiosKeyboardDriverNameTable,
|
||||
DriverName,
|
||||
(BOOLEAN)(This == &gBiosKeyboardComponentName)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
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
|
||||
BiosKeyboardComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006 - 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 _BIOS_KEYBOARD_COMPONENT_NAME_H_
|
||||
#define _BIOS_KEYBOARD_COMPONENT_NAME_H_
|
||||
|
||||
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gBiosKeyboardComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gBiosKeyboardComponentName2;
|
||||
|
||||
//
|
||||
// EFI Component Name Functions
|
||||
//
|
||||
/**
|
||||
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
|
||||
BiosKeyboardComponentNameGetDriverName (
|
||||
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
|
||||
BiosKeyboardComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,68 @@
|
|||
## @file
|
||||
# Component description file for BiosKeyboard module.
|
||||
#
|
||||
# Ps2 Keyboard driver by using Legacy Bios protocol service and IsaIo protocol service.
|
||||
# This dirver uses legacy INT16 to get the key stroke status.
|
||||
#
|
||||
# Copyright (c) 2006 - 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]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = KeyboardDxe
|
||||
FILE_GUID = 5479662B-6AE4-49e8-A6BD-6DE4B625811F
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
|
||||
ENTRY_POINT = InitializeBiosKeyboard
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
# DRIVER_BINDING = gBiosKeyboardDriverBinding
|
||||
# COMPONENT_NAME = gBiosKeyboardComponentName
|
||||
#
|
||||
|
||||
[Sources]
|
||||
ComponentName.c
|
||||
ComponentName.h
|
||||
BiosKeyboard.c
|
||||
BiosKeyboard.h
|
||||
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
|
||||
|
||||
|
||||
[LibraryClasses]
|
||||
MemoryAllocationLib
|
||||
UefiBootServicesTableLib
|
||||
UefiDriverEntryPoint
|
||||
ReportStatusCodeLib
|
||||
BaseMemoryLib
|
||||
UefiLib
|
||||
DebugLib
|
||||
BaseLib
|
||||
|
||||
[Protocols]
|
||||
gEfiIsaIoProtocolGuid # PROTOCOL TO_START
|
||||
gEfiSimpleTextInProtocolGuid # PROTOCOL BY_START
|
||||
gEfiSimpleTextInputExProtocolGuid # PROTOCOL BY_START
|
||||
gEfiLegacyBiosProtocolGuid # PROTOCOL TO_START
|
||||
gEfiPs2PolicyProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,532 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006 - 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 _BIOS_GRAPHICS_OUTPUT_H_
|
||||
#define _BIOS_GRAPHICS_OUTPUT_H_
|
||||
|
||||
#include <FrameworkDxe.h>
|
||||
|
||||
#include <Protocol/PciIo.h>
|
||||
#include <Protocol/EdidActive.h>
|
||||
#include <Protocol/DevicePath.h>
|
||||
#include <Protocol/EdidDiscovered.h>
|
||||
#include <Protocol/LegacyBios.h>
|
||||
#include <Protocol/VgaMiniPort.h>
|
||||
#include <Protocol/GraphicsOutput.h>
|
||||
#include <Protocol/EdidOverride.h>
|
||||
|
||||
#include <Guid/StatusCodeDataTypeId.h>
|
||||
#include <Guid/LegacyBios.h>
|
||||
#include <Guid/EventGroup.h>
|
||||
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/ReportStatusCodeLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/DevicePathLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
|
||||
#include <IndustryStandard/Pci.h>
|
||||
#include "VesaBiosExtensions.h"
|
||||
|
||||
//
|
||||
// Packed format support: The number of bits reserved for each of the colors and the actual
|
||||
// position of RGB in the frame buffer is specified in the VBE Mode information
|
||||
//
|
||||
typedef struct {
|
||||
UINT8 Position; // Position of the color
|
||||
UINT8 Mask; // The number of bits expressed as a mask
|
||||
} BIOS_VIDEO_COLOR_PLACEMENT;
|
||||
|
||||
//
|
||||
// BIOS Graphics Output Graphical Mode Data
|
||||
//
|
||||
typedef struct {
|
||||
UINT16 VbeModeNumber;
|
||||
UINT16 BytesPerScanLine;
|
||||
VOID *LinearFrameBuffer;
|
||||
UINTN FrameBufferSize;
|
||||
UINT32 HorizontalResolution;
|
||||
UINT32 VerticalResolution;
|
||||
UINT32 ColorDepth;
|
||||
UINT32 RefreshRate;
|
||||
UINT32 BitsPerPixel;
|
||||
BIOS_VIDEO_COLOR_PLACEMENT Red;
|
||||
BIOS_VIDEO_COLOR_PLACEMENT Green;
|
||||
BIOS_VIDEO_COLOR_PLACEMENT Blue;
|
||||
BIOS_VIDEO_COLOR_PLACEMENT Reserved;
|
||||
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
|
||||
EFI_PIXEL_BITMASK PixelBitMask;
|
||||
} BIOS_VIDEO_MODE_DATA;
|
||||
|
||||
//
|
||||
// BIOS video child handle private data Structure
|
||||
//
|
||||
#define BIOS_VIDEO_DEV_SIGNATURE SIGNATURE_32 ('B', 'V', 'M', 'p')
|
||||
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
//
|
||||
// Consumed Protocols
|
||||
//
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
|
||||
//
|
||||
// Original PCI attributes
|
||||
//
|
||||
UINT64 OriginalPciAttributes;
|
||||
|
||||
//
|
||||
// Produced Protocols
|
||||
//
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
|
||||
EFI_EDID_DISCOVERED_PROTOCOL EdidDiscovered;
|
||||
EFI_EDID_ACTIVE_PROTOCOL EdidActive;
|
||||
EFI_VGA_MINI_PORT_PROTOCOL VgaMiniPort;
|
||||
|
||||
//
|
||||
// General fields
|
||||
//
|
||||
BOOLEAN VgaCompatible;
|
||||
BOOLEAN ProduceGraphicsOutput;
|
||||
|
||||
//
|
||||
// Graphics Output Protocol related fields
|
||||
//
|
||||
BOOLEAN HardwareNeedsStarting;
|
||||
UINTN CurrentMode;
|
||||
UINTN MaxMode;
|
||||
BIOS_VIDEO_MODE_DATA *ModeData;
|
||||
UINT8 *LineBuffer;
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *VbeFrameBuffer;
|
||||
UINT8 *VgaFrameBuffer;
|
||||
|
||||
//
|
||||
// VESA Bios Extensions related fields
|
||||
//
|
||||
UINTN NumberOfPagesBelow1MB; // Number of 4KB pages in PagesBelow1MB
|
||||
EFI_PHYSICAL_ADDRESS PagesBelow1MB; // Buffer for all VBE Information Blocks
|
||||
VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK *VbeInformationBlock; // 0x200 bytes. Must be allocated below 1MB
|
||||
VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK *VbeModeInformationBlock; // 0x100 bytes. Must be allocated below 1MB
|
||||
VESA_BIOS_EXTENSIONS_EDID_DATA_BLOCK *VbeEdidDataBlock; // 0x80 bytes. Must be allocated below 1MB
|
||||
VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK *VbeCrtcInformationBlock; // 59 bytes. Must be allocated below 1MB
|
||||
UINTN VbeSaveRestorePages; // Number of 4KB pages in VbeSaveRestoreBuffer
|
||||
EFI_PHYSICAL_ADDRESS VbeSaveRestoreBuffer; // Must be allocated below 1MB
|
||||
//
|
||||
// Status code
|
||||
//
|
||||
EFI_DEVICE_PATH_PROTOCOL *GopDevicePath;
|
||||
|
||||
EFI_EVENT ExitBootServicesEvent;
|
||||
} BIOS_VIDEO_DEV;
|
||||
|
||||
#define BIOS_VIDEO_DEV_FROM_PCI_IO_THIS(a) CR (a, BIOS_VIDEO_DEV, PciIo, BIOS_VIDEO_DEV_SIGNATURE)
|
||||
#define BIOS_VIDEO_DEV_FROM_GRAPHICS_OUTPUT_THIS(a) CR (a, BIOS_VIDEO_DEV, GraphicsOutput, BIOS_VIDEO_DEV_SIGNATURE)
|
||||
#define BIOS_VIDEO_DEV_FROM_VGA_MINI_PORT_THIS(a) CR (a, BIOS_VIDEO_DEV, VgaMiniPort, BIOS_VIDEO_DEV_SIGNATURE)
|
||||
|
||||
#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
|
||||
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gBiosVideoDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gBiosVideoComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gBiosVideoComponentName2;
|
||||
|
||||
//
|
||||
// Driver Binding Protocol functions
|
||||
//
|
||||
|
||||
/**
|
||||
Supported.
|
||||
|
||||
@param This Pointer to driver binding protocol
|
||||
@param Controller Controller handle to connect
|
||||
@param RemainingDevicePath A pointer to the remaining portion of a device
|
||||
path
|
||||
|
||||
@retval EFI_STATUS EFI_SUCCESS:This controller can be managed by this
|
||||
driver, Otherwise, this controller cannot be
|
||||
managed by this driver
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosVideoDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Install Graphics Output Protocol onto VGA device handles.
|
||||
|
||||
@param This Pointer to driver binding protocol
|
||||
@param Controller Controller handle to connect
|
||||
@param RemainingDevicePath A pointer to the remaining portion of a device
|
||||
path
|
||||
|
||||
@return EFI_STATUS
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosVideoDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Stop.
|
||||
|
||||
@param This Pointer to driver binding protocol
|
||||
@param Controller Controller handle to connect
|
||||
@param NumberOfChildren Number of children handle created by this driver
|
||||
@param ChildHandleBuffer Buffer containing child handle created
|
||||
|
||||
@retval EFI_SUCCESS Driver disconnected successfully from controller
|
||||
@retval EFI_UNSUPPORTED Cannot find BIOS_VIDEO_DEV structure
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosVideoDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
//
|
||||
// Private worker functions
|
||||
//
|
||||
|
||||
/**
|
||||
Check for VBE device.
|
||||
|
||||
@param BiosVideoPrivate Pointer to BIOS_VIDEO_DEV structure
|
||||
|
||||
@retval EFI_SUCCESS VBE device found
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BiosVideoCheckForVbe (
|
||||
IN OUT BIOS_VIDEO_DEV *BiosVideoPrivate
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Check for VGA device.
|
||||
|
||||
@param BiosVideoPrivate Pointer to BIOS_VIDEO_DEV structure
|
||||
|
||||
@retval EFI_SUCCESS Standard VGA device found
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BiosVideoCheckForVga (
|
||||
IN OUT BIOS_VIDEO_DEV *BiosVideoPrivate
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Release resource for biso video instance.
|
||||
|
||||
@param BiosVideoPrivate Video child device private data structure
|
||||
|
||||
**/
|
||||
VOID
|
||||
BiosVideoDeviceReleaseResource (
|
||||
BIOS_VIDEO_DEV *BiosVideoPrivate
|
||||
);
|
||||
|
||||
//
|
||||
// BIOS Graphics Output Protocol functions
|
||||
//
|
||||
|
||||
/**
|
||||
Graphics Output protocol interface to get video mode.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param ModeNumber The mode number to return information on.
|
||||
@param SizeOfInfo A pointer to the size, in bytes, of the Info
|
||||
buffer.
|
||||
@param Info Caller allocated buffer that returns information
|
||||
about ModeNumber.
|
||||
|
||||
@retval EFI_SUCCESS Mode information returned.
|
||||
@retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
|
||||
@retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve the
|
||||
video mode.
|
||||
@retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
|
||||
@retval EFI_INVALID_PARAMETER One of the input args was NULL.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosVideoGraphicsOutputQueryMode (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN UINT32 ModeNumber,
|
||||
OUT UINTN *SizeOfInfo,
|
||||
OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Graphics Output protocol interface to set video mode.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param ModeNumber The mode number to be set.
|
||||
|
||||
@retval EFI_SUCCESS Graphics mode was changed.
|
||||
@retval EFI_DEVICE_ERROR The device had an error and could not complete the
|
||||
request.
|
||||
@retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosVideoGraphicsOutputSetMode (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL * This,
|
||||
IN UINT32 ModeNumber
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Graphics Output protocol instance to block transfer for VBE device.
|
||||
|
||||
@param This Pointer to Graphics Output protocol instance
|
||||
@param BltBuffer The data to transfer to screen
|
||||
@param BltOperation The operation to perform
|
||||
@param SourceX The X coordinate of the source for BltOperation
|
||||
@param SourceY The Y coordinate of the source for BltOperation
|
||||
@param DestinationX The X coordinate of the destination for
|
||||
BltOperation
|
||||
@param DestinationY The Y coordinate of the destination for
|
||||
BltOperation
|
||||
@param Width The width of a rectangle in the blt rectangle in
|
||||
pixels
|
||||
@param Height The height of a rectangle in the blt rectangle in
|
||||
pixels
|
||||
@param Delta Not used for EfiBltVideoFill and
|
||||
EfiBltVideoToVideo operation. If a Delta of 0 is
|
||||
used, the entire BltBuffer will be operated on. If
|
||||
a subrectangle of the BltBuffer is used, then
|
||||
Delta represents the number of bytes in a row of
|
||||
the BltBuffer.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER Invalid parameter passed in
|
||||
@retval EFI_SUCCESS Blt operation success
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosVideoGraphicsOutputVbeBlt (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
|
||||
IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
|
||||
IN UINTN SourceX,
|
||||
IN UINTN SourceY,
|
||||
IN UINTN DestinationX,
|
||||
IN UINTN DestinationY,
|
||||
IN UINTN Width,
|
||||
IN UINTN Height,
|
||||
IN UINTN Delta
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Grahpics Output protocol instance to block transfer for VGA device.
|
||||
|
||||
@param This Pointer to Grahpics Output protocol instance
|
||||
@param BltBuffer The data to transfer to screen
|
||||
@param BltOperation The operation to perform
|
||||
@param SourceX The X coordinate of the source for BltOperation
|
||||
@param SourceY The Y coordinate of the source for BltOperation
|
||||
@param DestinationX The X coordinate of the destination for
|
||||
BltOperation
|
||||
@param DestinationY The Y coordinate of the destination for
|
||||
BltOperation
|
||||
@param Width The width of a rectangle in the blt rectangle in
|
||||
pixels
|
||||
@param Height The height of a rectangle in the blt rectangle in
|
||||
pixels
|
||||
@param Delta Not used for EfiBltVideoFill and
|
||||
EfiBltVideoToVideo operation. If a Delta of 0 is
|
||||
used, the entire BltBuffer will be operated on. If
|
||||
a subrectangle of the BltBuffer is used, then
|
||||
Delta represents the number of bytes in a row of
|
||||
the BltBuffer.
|
||||
|
||||
@retval EFI_INVALID_PARAMETER Invalid parameter passed in
|
||||
@retval EFI_SUCCESS Blt operation success
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosVideoGraphicsOutputVgaBlt (
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
|
||||
IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
|
||||
IN UINTN SourceX,
|
||||
IN UINTN SourceY,
|
||||
IN UINTN DestinationX,
|
||||
IN UINTN DestinationY,
|
||||
IN UINTN Width,
|
||||
IN UINTN Height,
|
||||
IN UINTN Delta
|
||||
);
|
||||
|
||||
//
|
||||
// BIOS VGA Mini Port Protocol functions
|
||||
//
|
||||
|
||||
/**
|
||||
VgaMiniPort protocol interface to set mode.
|
||||
|
||||
@param This Pointer to VgaMiniPort protocol instance
|
||||
@param ModeNumber The index of the mode
|
||||
|
||||
@retval EFI_UNSUPPORTED The requested mode is not supported
|
||||
@retval EFI_SUCCESS The requested mode is set successfully
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BiosVideoVgaMiniPortSetMode (
|
||||
IN EFI_VGA_MINI_PORT_PROTOCOL *This,
|
||||
IN UINTN ModeNumber
|
||||
);
|
||||
|
||||
/**
|
||||
Event handler for Exit Boot Service.
|
||||
|
||||
@param Event The event that be siganlled when exiting boot service.
|
||||
@param Context Pointer to instance of BIOS_VIDEO_DEV.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
BiosVideoNotifyExitBootServices (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
//
|
||||
// Standard VGA Definitions
|
||||
//
|
||||
#define VGA_HORIZONTAL_RESOLUTION 640
|
||||
#define VGA_VERTICAL_RESOLUTION 480
|
||||
#define VGA_NUMBER_OF_BIT_PLANES 4
|
||||
#define VGA_PIXELS_PER_BYTE 8
|
||||
#define VGA_BYTES_PER_SCAN_LINE (VGA_HORIZONTAL_RESOLUTION / VGA_PIXELS_PER_BYTE)
|
||||
#define VGA_BYTES_PER_BIT_PLANE (VGA_VERTICAL_RESOLUTION * VGA_BYTES_PER_SCAN_LINE)
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_ADDRESS_REGISTER 0x3ce
|
||||
#define VGA_GRAPHICS_CONTROLLER_DATA_REGISTER 0x3cf
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_SET_RESET_REGISTER 0x00
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_ENABLE_SET_RESET_REGISTER 0x01
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_COLOR_COMPARE_REGISTER 0x02
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_DATA_ROTATE_REGISTER 0x03
|
||||
#define VGA_GRAPHICS_CONTROLLER_FUNCTION_REPLACE 0x00
|
||||
#define VGA_GRAPHICS_CONTROLLER_FUNCTION_AND 0x08
|
||||
#define VGA_GRAPHICS_CONTROLLER_FUNCTION_OR 0x10
|
||||
#define VGA_GRAPHICS_CONTROLLER_FUNCTION_XOR 0x18
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_READ_MAP_SELECT_REGISTER 0x04
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_MODE_REGISTER 0x05
|
||||
#define VGA_GRAPHICS_CONTROLLER_READ_MODE_0 0x00
|
||||
#define VGA_GRAPHICS_CONTROLLER_READ_MODE_1 0x08
|
||||
#define VGA_GRAPHICS_CONTROLLER_WRITE_MODE_0 0x00
|
||||
#define VGA_GRAPHICS_CONTROLLER_WRITE_MODE_1 0x01
|
||||
#define VGA_GRAPHICS_CONTROLLER_WRITE_MODE_2 0x02
|
||||
#define VGA_GRAPHICS_CONTROLLER_WRITE_MODE_3 0x03
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_MISCELLANEOUS_REGISTER 0x06
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_COLOR_DONT_CARE_REGISTER 0x07
|
||||
|
||||
#define VGA_GRAPHICS_CONTROLLER_BIT_MASK_REGISTER 0x08
|
||||
|
||||
/**
|
||||
Install child handles if the Handle supports MBR format.
|
||||
|
||||
@param This Calling context.
|
||||
@param ParentHandle Parent Handle
|
||||
@param ParentPciIo Parent PciIo interface
|
||||
@param ParentLegacyBios Parent LegacyBios interface
|
||||
@param ParentDevicePath Parent Device Path
|
||||
@param RemainingDevicePath Remaining Device Path
|
||||
@param OriginalPciAttributes Original PCI Attributes
|
||||
|
||||
@retval EFI_SUCCESS If a child handle was added
|
||||
@retval other A child handle was not added
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BiosVideoChildHandleInstall (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE ParentHandle,
|
||||
IN EFI_PCI_IO_PROTOCOL *ParentPciIo,
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *ParentLegacyBios,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath,
|
||||
IN UINT64 OriginalPciAttributes
|
||||
);
|
||||
|
||||
/**
|
||||
Deregister an video child handle and free resources.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param Controller Video controller handle
|
||||
@param Handle Video child handle
|
||||
|
||||
@return EFI_STATUS
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BiosVideoChildHandleUninstall (
|
||||
EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
EFI_HANDLE Controller,
|
||||
EFI_HANDLE Handle
|
||||
);
|
||||
|
||||
/**
|
||||
Release resource for biso video instance.
|
||||
|
||||
@param BiosVideoPrivate Video child device private data structure
|
||||
|
||||
**/
|
||||
VOID
|
||||
BiosVideoDeviceReleaseResource (
|
||||
BIOS_VIDEO_DEV *BiosVideoPrivate
|
||||
);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,313 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006, 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 "BiosVideo.h"
|
||||
|
||||
//
|
||||
// EFI Component Name Functions
|
||||
//
|
||||
/**
|
||||
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
|
||||
BiosVideoComponentNameGetDriverName (
|
||||
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
|
||||
BiosVideoComponentNameGetControllerName (
|
||||
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 gBiosVideoComponentName = {
|
||||
BiosVideoComponentNameGetDriverName,
|
||||
BiosVideoComponentNameGetControllerName,
|
||||
"eng"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gBiosVideoComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) BiosVideoComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) BiosVideoComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mBiosVideoDriverNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
L"BIOS[INT10] Video 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
|
||||
BiosVideoComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
mBiosVideoDriverNameTable,
|
||||
DriverName,
|
||||
(BOOLEAN)(This == &gBiosVideoComponentName)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
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
|
||||
BiosVideoComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
|
@ -0,0 +1,451 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006 - 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 _VESA_BIOS_EXTENSIONS_H_
|
||||
#define _VESA_BIOS_EXTENSIONS_H_
|
||||
|
||||
//
|
||||
// Turn on byte packing of data structures
|
||||
//
|
||||
#pragma pack(1)
|
||||
//
|
||||
// VESA BIOS Extensions status codes
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_STATUS_SUCCESS 0x004f
|
||||
|
||||
//
|
||||
// VESA BIOS Extensions Services
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_RETURN_CONTROLLER_INFORMATION 0x4f00
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Function 00 : Return Controller Information
|
||||
|
||||
Arguments:
|
||||
Inputs:
|
||||
AX = 0x4f00
|
||||
ES:DI = Pointer to buffer to place VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK structure
|
||||
Outputs:
|
||||
AX = Return Status
|
||||
|
||||
--*/
|
||||
#define VESA_BIOS_EXTENSIONS_RETURN_MODE_INFORMATION 0x4f01
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Function 01 : Return Mode Information
|
||||
|
||||
Arguments:
|
||||
Inputs:
|
||||
AX = 0x4f01
|
||||
CX = Mode Number
|
||||
ES:DI = Pointer to buffer to place VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK structure
|
||||
Outputs:
|
||||
AX = Return Status
|
||||
|
||||
--*/
|
||||
#define VESA_BIOS_EXTENSIONS_SET_MODE 0x4f02
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Function 02 : Set Mode
|
||||
|
||||
Arguments:
|
||||
Inputs:
|
||||
AX = 0x4f02
|
||||
BX = Desired mode to set
|
||||
D0-D8 = Mode Number
|
||||
D9-D10 = Reserved (must be 0)
|
||||
D11 = 0 - Use current default refresh rate
|
||||
= 1 - Use user specfieid CRTC values for refresh rate
|
||||
D12-D13 = Reserved (must be 0)
|
||||
D14 = 0 - Use windowed frame buffer model
|
||||
= 1 - Use linear/flat frame buffer model
|
||||
D15 = 0 - Clear display memory
|
||||
= 1 - Don't clear display memory
|
||||
ES:DI = Pointer to buffer to the VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK structure
|
||||
Outputs:
|
||||
AX = Return Status
|
||||
|
||||
--*/
|
||||
#define VESA_BIOS_EXTENSIONS_RETURN_CURRENT_MODE 0x4f03
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Function 03 : Return Current Mode
|
||||
|
||||
Arguments:
|
||||
Inputs:
|
||||
AX = 0x4f03
|
||||
Outputs:
|
||||
AX = Return Status
|
||||
BX = Current mode
|
||||
D0-D13 = Mode Number
|
||||
D14 = 0 - Windowed frame buffer model
|
||||
= 1 - Linear/flat frame buffer model
|
||||
D15 = 0 - Memory cleared at last mode set
|
||||
= 1 - Memory not cleared at last mode set
|
||||
|
||||
--*/
|
||||
#define VESA_BIOS_EXTENSIONS_SAVE_RESTORE_STATE 0x4f04
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Function 04 : Save/Restore State
|
||||
|
||||
Arguments:
|
||||
Inputs:
|
||||
AX = 0x4f03
|
||||
DL = 0x00 - Return Save/Restore State buffer size
|
||||
= 0x01 - Save State
|
||||
= 0x02 - Restore State
|
||||
CX = Requested Status
|
||||
D0 = Save/Restore controller hardware state
|
||||
D1 = Save/Restore BIOS data state
|
||||
D2 = Save/Restore DAC state
|
||||
D3 = Save/Restore Regsiter state
|
||||
ES:BX = Pointer to buffer if DL=1 or DL=2
|
||||
Outputs:
|
||||
AX = Return Status
|
||||
BX = Number of 64 byte blocks to hold the state buffer if DL=0
|
||||
|
||||
--*/
|
||||
#define VESA_BIOS_EXTENSIONS_EDID 0x4f15
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Function 15 : implement VBE/DDC service
|
||||
|
||||
Arguments:
|
||||
Inputs:
|
||||
AX = 0x4f15
|
||||
BL = 0x00 - Report VBE/DDC Capabilities
|
||||
CX = 0x00 - Controller unit number (00 = primary controller)
|
||||
ES:DI = Null pointer, must be 0:0 in version 1.0
|
||||
Outputs:
|
||||
AX = Return Status
|
||||
BH = Approx. time in seconds, rounded up, to transfer one EDID block(128 bytes)
|
||||
BL = DDC level supported
|
||||
D0 = 0 DDC1 not supported
|
||||
= 1 DDC1 supported
|
||||
D1 = 0 DDC2 not supported
|
||||
= 1 DDC2 supported
|
||||
D2 = 0 Screen not blanked during data transfer
|
||||
= 1 Screen blanked during data transfer
|
||||
|
||||
Inputs:
|
||||
AX = 0x4f15
|
||||
BL = 0x01 - Read EDID
|
||||
CX = 0x00 - Controller unit number (00 = primary controller)
|
||||
DX = 0x00 - EDID block number
|
||||
ES:DI = Pointer to buffer in which the EDID block is returned
|
||||
Outputs:
|
||||
AX = Return Status
|
||||
--*/
|
||||
|
||||
//
|
||||
// Timing data from EDID data block
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_EDID_BLOCK_SIZE 128
|
||||
#define VESA_BIOS_EXTENSIONS_EDID_ESTABLISHED_TIMING_MAX_NUMBER 17
|
||||
|
||||
typedef struct {
|
||||
UINT16 HorizontalResolution;
|
||||
UINT16 VerticalResolution;
|
||||
UINT16 RefreshRate;
|
||||
} VESA_BIOS_EXTENSIONS_EDID_TIMING;
|
||||
|
||||
typedef struct {
|
||||
UINT32 ValidNumber;
|
||||
UINT32 Key[VESA_BIOS_EXTENSIONS_EDID_ESTABLISHED_TIMING_MAX_NUMBER];
|
||||
} VESA_BIOS_EXTENSIONS_VALID_EDID_TIMING;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Header[8]; //EDID header "00 FF FF FF FF FF FF 00"
|
||||
UINT16 ManufactureName; //EISA 3-character ID
|
||||
UINT16 ProductCode; //Vendor assigned code
|
||||
UINT32 SerialNumber; //32-bit serial number
|
||||
UINT8 WeekOfManufacture; //Week number
|
||||
UINT8 YearOfManufacture; //Year
|
||||
UINT8 EdidVersion; //EDID Structure Version
|
||||
UINT8 EdidRevision; //EDID Structure Revision
|
||||
UINT8 VideoInputDefinition;
|
||||
UINT8 MaxHorizontalImageSize; //cm
|
||||
UINT8 MaxVerticalImageSize; //cm
|
||||
UINT8 DisplayTransferCharacteristic;
|
||||
UINT8 FeatureSupport;
|
||||
UINT8 RedGreenLowBits; //Rx1 Rx0 Ry1 Ry0 Gx1 Gx0 Gy1Gy0
|
||||
UINT8 BlueWhiteLowBits; //Bx1 Bx0 By1 By0 Wx1 Wx0 Wy1 Wy0
|
||||
UINT8 RedX; //Red-x Bits 9 - 2
|
||||
UINT8 RedY; //Red-y Bits 9 - 2
|
||||
UINT8 GreenX; //Green-x Bits 9 - 2
|
||||
UINT8 GreenY; //Green-y Bits 9 - 2
|
||||
UINT8 BlueX; //Blue-x Bits 9 - 2
|
||||
UINT8 BlueY; //Blue-y Bits 9 - 2
|
||||
UINT8 WhiteX; //White-x Bits 9 - 2
|
||||
UINT8 WhiteY; //White-x Bits 9 - 2
|
||||
UINT8 EstablishedTimings[3];
|
||||
UINT8 StandardTimingIdentification[16];
|
||||
UINT8 DetailedTimingDescriptions[72];
|
||||
UINT8 ExtensionFlag; //Number of (optional) 128-byte EDID extension blocks to follow
|
||||
UINT8 Checksum;
|
||||
} VESA_BIOS_EXTENSIONS_EDID_DATA_BLOCK;
|
||||
|
||||
//
|
||||
// Super VGA Information Block
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 VESASignature; // 'VESA' 4 byte signature
|
||||
UINT16 VESAVersion; // VBE version number
|
||||
UINT32 OEMStringPtr; // Pointer to OEM string
|
||||
UINT32 Capabilities; // Capabilities of video card
|
||||
UINT32 VideoModePtr; // Pointer to an array of 16-bit supported modes values terminated by 0xFFFF
|
||||
UINT16 TotalMemory; // Number of 64kb memory blocks
|
||||
UINT16 OemSoftwareRev; // VBE implementation Software revision
|
||||
UINT32 OemVendorNamePtr; // VbeFarPtr to Vendor Name String
|
||||
UINT32 OemProductNamePtr; // VbeFarPtr to Product Name String
|
||||
UINT32 OemProductRevPtr; // VbeFarPtr to Product Revision String
|
||||
UINT8 Reserved[222]; // Reserved for VBE implementation scratch area
|
||||
UINT8 OemData[256]; // Data area for OEM strings. Pad to 512 byte block size
|
||||
} VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK;
|
||||
|
||||
//
|
||||
// Super VGA Information Block VESASignature values
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_VESA_SIGNATURE SIGNATURE_32 ('V', 'E', 'S', 'A')
|
||||
#define VESA_BIOS_EXTENSIONS_VBE2_SIGNATURE SIGNATURE_32 ('V', 'B', 'E', '2')
|
||||
|
||||
//
|
||||
// Super VGA Information Block VESAVersion values
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_VERSION_1_2 0x0102
|
||||
#define VESA_BIOS_EXTENSIONS_VERSION_2_0 0x0200
|
||||
#define VESA_BIOS_EXTENSIONS_VERSION_3_0 0x0300
|
||||
|
||||
//
|
||||
// Super VGA Information Block Capabilities field bit defintions
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_CAPABILITY_8_BIT_DAC 0x01 // 0: DAC width is fixed at 6 bits/color
|
||||
// 1: DAC width switchable to 8 bits/color
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_CAPABILITY_NOT_VGA 0x02 // 0: Controller is VGA compatible
|
||||
// 1: Controller is not VGA compatible
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_CAPABILITY_NOT_NORMAL_RAMDAC 0x04 // 0: Normal RAMDAC operation
|
||||
// 1: Use blank bit in function 9 to program RAMDAC
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_CAPABILITY_STEREOSCOPIC 0x08 // 0: No hardware stereoscopic signal support
|
||||
// 1: Hardware stereoscopic signal support
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_CAPABILITY_VESA_EVC 0x10 // 0: Stero signaling supported via external VESA stereo connector
|
||||
// 1: Stero signaling supported via VESA EVC connector
|
||||
//
|
||||
// Super VGA mode number bite field definitions
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_NUMBER_VESA 0x0100 // 0: Not a VESA defined VBE mode
|
||||
// 1: A VESA defined VBE mode
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_NUMBER_REFRESH_CONTROL_USER 0x0800 // 0: Use current BIOS default referesh rate
|
||||
// 1: Use the user specified CRTC values for refresh rate
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_NUMBER_LINEAR_FRAME_BUFFER 0x4000 // 0: Use a banked/windowed frame buffer
|
||||
// 1: Use a linear/flat frame buffer
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_NUMBER_PRESERVE_MEMORY 0x8000 // 0: Clear display memory
|
||||
// 1: Preseve display memory
|
||||
//
|
||||
// Super VGA Information Block mode list terminator value
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_END_OF_MODE_LIST 0xffff
|
||||
|
||||
//
|
||||
// Window Function
|
||||
//
|
||||
typedef
|
||||
VOID
|
||||
(*VESA_BIOS_EXTENSIONS_WINDOW_FUNCTION) (
|
||||
VOID
|
||||
);
|
||||
|
||||
//
|
||||
// Super VGA Mode Information Block
|
||||
//
|
||||
typedef struct {
|
||||
//
|
||||
// Manadory fields for all VESA Bios Extensions revisions
|
||||
//
|
||||
UINT16 ModeAttributes; // Mode attributes
|
||||
UINT8 WinAAttributes; // Window A attributes
|
||||
UINT8 WinBAttributes; // Window B attributes
|
||||
UINT16 WinGranularity; // Window granularity in k
|
||||
UINT16 WinSize; // Window size in k
|
||||
UINT16 WinASegment; // Window A segment
|
||||
UINT16 WinBSegment; // Window B segment
|
||||
UINT32 WindowFunction; // Pointer to window function
|
||||
UINT16 BytesPerScanLine; // Bytes per scanline
|
||||
//
|
||||
// Manadory fields for VESA Bios Extensions 1.2 and above
|
||||
//
|
||||
UINT16 XResolution; // Horizontal resolution
|
||||
UINT16 YResolution; // Vertical resolution
|
||||
UINT8 XCharSize; // Character cell width
|
||||
UINT8 YCharSize; // Character cell height
|
||||
UINT8 NumberOfPlanes; // Number of memory planes
|
||||
UINT8 BitsPerPixel; // Bits per pixel
|
||||
UINT8 NumberOfBanks; // Number of CGA style banks
|
||||
UINT8 MemoryModel; // Memory model type
|
||||
UINT8 BankSize; // Size of CGA style banks
|
||||
UINT8 NumberOfImagePages; // Number of images pages
|
||||
UINT8 Reserved1; // Reserved
|
||||
UINT8 RedMaskSize; // Size of direct color red mask
|
||||
UINT8 RedFieldPosition; // Bit posn of lsb of red mask
|
||||
UINT8 GreenMaskSize; // Size of direct color green mask
|
||||
UINT8 GreenFieldPosition; // Bit posn of lsb of green mask
|
||||
UINT8 BlueMaskSize; // Size of direct color blue mask
|
||||
UINT8 BlueFieldPosition; // Bit posn of lsb of blue mask
|
||||
UINT8 RsvdMaskSize; // Size of direct color res mask
|
||||
UINT8 RsvdFieldPosition; // Bit posn of lsb of res mask
|
||||
UINT8 DirectColorModeInfo; // Direct color mode attributes
|
||||
//
|
||||
// Manadory fields for VESA Bios Extensions 2.0 and above
|
||||
//
|
||||
UINT32 PhysBasePtr; // Physical Address for flat memory frame buffer
|
||||
UINT32 Reserved2; // Reserved
|
||||
UINT16 Reserved3; // Reserved
|
||||
//
|
||||
// Manadory fields for VESA Bios Extensions 3.0 and above
|
||||
//
|
||||
UINT16 LinBytesPerScanLine; // Bytes/scan line for linear modes
|
||||
UINT8 BnkNumberOfImagePages; // Number of images for banked modes
|
||||
UINT8 LinNumberOfImagePages; // Number of images for linear modes
|
||||
UINT8 LinRedMaskSize; // Size of direct color red mask (linear mode)
|
||||
UINT8 LinRedFieldPosition; // Bit posiiton of lsb of red mask (linear modes)
|
||||
UINT8 LinGreenMaskSize; // Size of direct color green mask (linear mode)
|
||||
UINT8 LinGreenFieldPosition; // Bit posiiton of lsb of green mask (linear modes)
|
||||
UINT8 LinBlueMaskSize; // Size of direct color blue mask (linear mode)
|
||||
UINT8 LinBlueFieldPosition; // Bit posiiton of lsb of blue mask (linear modes)
|
||||
UINT8 LinRsvdMaskSize; // Size of direct color reserved mask (linear mode)
|
||||
UINT8 LinRsvdFieldPosition; // Bit posiiton of lsb of reserved mask (linear modes)
|
||||
UINT32 MaxPixelClock; // Maximum pixel clock (in Hz) for graphics mode
|
||||
UINT8 Pad[190]; // Pad to 256 byte block size
|
||||
} VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK;
|
||||
|
||||
//
|
||||
// Super VGA Mode Information Block ModeAttributes field bit defintions
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_HARDWARE 0x0001 // 0: Mode not supported in handware
|
||||
// 1: Mode supported in handware
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_TTY 0x0004 // 0: TTY Output functions not supported by BIOS
|
||||
// 1: TTY Output functions supported by BIOS
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_COLOR 0x0008 // 0: Monochrome mode
|
||||
// 1: Color mode
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_GRAPHICS 0x0010 // 0: Text mode
|
||||
// 1: Graphics mode
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NOT_VGA 0x0020 // 0: VGA compatible mode
|
||||
// 1: Not a VGA compatible mode
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NOT_WINDOWED 0x0040 // 0: VGA compatible windowed memory mode
|
||||
// 1: Not a VGA compatible windowed memory mode
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER 0x0080 // 0: No linear fram buffer mode available
|
||||
// 1: Linear frame buffer mode available
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_DOUBLE_SCAN 0x0100 // 0: No double scan mode available
|
||||
// 1: Double scan mode available
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_INTERLACED 0x0200 // 0: No interlaced mode is available
|
||||
// 1: Interlaced mode is available
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NO_TRIPPLE_BUFFER 0x0400 // 0: No hardware triple buffer mode support available
|
||||
// 1: Hardware triple buffer mode support available
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_STEREOSCOPIC 0x0800 // 0: No hardware steroscopic display support
|
||||
// 1: Hardware steroscopic display support
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_DUAL_DISPLAY 0x1000 // 0: No dual display start address support
|
||||
// 1: Dual display start address support
|
||||
//
|
||||
// Super VGA Mode Information Block WinAAttribite/WinBAttributes field bit defintions
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_RELOCATABLE 0x01 // 0: Single non-relocatable window only
|
||||
// 1: Relocatable window(s) are supported
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_READABLE 0x02 // 0: Window is not readable
|
||||
// 1: Window is readable
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_WRITABLE 0x04 // 0: Window is not writable
|
||||
// 1: Window is writable
|
||||
//
|
||||
// Super VGA Mode Information Block DirectColorMode field bit defintions
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_DIRECT_COLOR_MODE_PROG_COLOR_RAMP 0x01 // 0: Color ram is fixed
|
||||
// 1: Color ramp is programmable
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_DIRECT_COLOR_MODE_RSVD_USABLE 0x02 // 0: Bits in Rsvd field are reserved
|
||||
// 1: Bits in Rsdv field are usable
|
||||
//
|
||||
// Super VGA Memory Models
|
||||
//
|
||||
typedef enum {
|
||||
MemPL = 3, // Planar memory model
|
||||
MemPK = 4, // Packed pixel memory model
|
||||
MemRGB= 6, // Direct color RGB memory model
|
||||
MemYUV= 7 // Direct color YUV memory model
|
||||
} VESA_BIOS_EXTENSIONS_MEMORY_MODELS;
|
||||
|
||||
//
|
||||
// Super VGA CRTC Information Block
|
||||
//
|
||||
typedef struct {
|
||||
UINT16 HorizontalTotal; // Horizontal total in pixels
|
||||
UINT16 HorizontalSyncStart; // Horizontal sync start in pixels
|
||||
UINT16 HorizontalSyncEnd; // Horizontal sync end in pixels
|
||||
UINT16 VericalTotal; // Vertical total in pixels
|
||||
UINT16 VericalSyncStart; // Vertical sync start in pixels
|
||||
UINT16 VericalSyncEnd; // Vertical sync end in pixels
|
||||
UINT8 Flags; // Flags (Interlaced/DoubleScan/etc).
|
||||
UINT32 PixelClock; // Pixel clock in units of Hz
|
||||
UINT16 RefreshRate; // Refresh rate in units of 0.01 Hz
|
||||
UINT8 Reserved[40]; // Pad
|
||||
} VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK;
|
||||
|
||||
#define VESA_BIOS_EXTENSIONS_CRTC_FLAGS_DOUBLE_SCAN 0x01 // 0: Graphics mode is not souble scanned
|
||||
// 1: Graphics mode is double scanned
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_CRTC_FLAGSINTERLACED 0x02 // 0: Graphics mode is not interlaced
|
||||
// 1: Graphics mode is interlaced
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_CRTC_HORIZONTAL_SYNC_NEGATIVE 0x04 // 0: Horizontal sync polarity is positive(+)
|
||||
// 0: Horizontal sync polarity is negative(-)
|
||||
//
|
||||
#define VESA_BIOS_EXTENSIONS_CRTC_VERITICAL_SYNC_NEGATIVE 0x08 // 0: Verical sync polarity is positive(+)
|
||||
// 0: Verical sync polarity is negative(-)
|
||||
//
|
||||
// Turn off byte packing of data structures
|
||||
//
|
||||
#pragma pack()
|
||||
|
||||
#endif
|
|
@ -0,0 +1,80 @@
|
|||
## @file
|
||||
# Video driver based on legacy bios.
|
||||
#
|
||||
# This driver by using Legacy Bios protocol service to support csm Video
|
||||
# and produce Graphics Output Protocol.
|
||||
#
|
||||
# Copyright (c) 2007 - 2011, 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]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BiosVideoDxe
|
||||
FILE_GUID = 0B04B2ED-861C-42cd-A22F-C3AAFACCB896
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
|
||||
ENTRY_POINT = BiosVideoEntryPoint
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
# DRIVER_BINDING = gBiosVideoDriverBinding
|
||||
# COMPONENT_NAME = gBiosVideoComponentName
|
||||
#
|
||||
|
||||
[Sources]
|
||||
BiosVideo.c
|
||||
BiosVideo.h
|
||||
ComponentName.c
|
||||
VesaBiosExtensions.h
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
|
||||
|
||||
|
||||
[LibraryClasses]
|
||||
MemoryAllocationLib
|
||||
DevicePathLib
|
||||
UefiLib
|
||||
UefiBootServicesTableLib
|
||||
UefiDriverEntryPoint
|
||||
BaseMemoryLib
|
||||
ReportStatusCodeLib
|
||||
DebugLib
|
||||
PcdLib
|
||||
|
||||
|
||||
[Guids]
|
||||
gEfiLegacyBiosGuid # ALWAYS_PRODUCED
|
||||
gEfiEventExitBootServicesGuid
|
||||
|
||||
[Protocols]
|
||||
gEfiVgaMiniPortProtocolGuid # PROTOCOL BY_START
|
||||
gEfiEdidDiscoveredProtocolGuid # PROTOCOL BY_START
|
||||
gEfiGraphicsOutputProtocolGuid # PROTOCOL BY_START
|
||||
gEfiEdidActiveProtocolGuid # PROTOCOL BY_START
|
||||
gEfiLegacyBiosProtocolGuid # PROTOCOL TO_START
|
||||
gEfiPciIoProtocolGuid # PROTOCOL TO_START
|
||||
gEfiDevicePathProtocolGuid # PROTOCOL TO_START
|
||||
gEfiEdidOverrideProtocolGuid # PROTOCOL TO_START
|
||||
|
||||
[Pcd]
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoSetTextVgaModeEnable
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVbeEnable
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVgaEnable
|
|
@ -0,0 +1,67 @@
|
|||
## @file
|
||||
# Interrupt Redirection Template
|
||||
#
|
||||
# Copyright (c) 2006, 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.
|
||||
#
|
||||
##
|
||||
|
||||
ASM_GLOBAL ASM_PFX(InterruptRedirectionTemplate)
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Procedure: InterruptRedirectionTemplate: Redirects interrupts 0x68-0x6F
|
||||
#
|
||||
# Input: None
|
||||
#
|
||||
# Output: None
|
||||
#
|
||||
# Prototype: VOID
|
||||
# InterruptRedirectionTemplate (
|
||||
# VOID
|
||||
# );
|
||||
#
|
||||
# Saves: None
|
||||
#
|
||||
# Modified: None
|
||||
#
|
||||
# Description: Contains the code that is copied into low memory (below 640K).
|
||||
# This code reflects interrupts 0x68-0x6f to interrupts 0x08-0x0f.
|
||||
# This template must be copied into low memory, and the IDT entries
|
||||
# 0x68-0x6F must be point to the low memory copy of this code. Each
|
||||
# entry is 4 bytes long, so IDT entries 0x68-0x6F can be easily
|
||||
# computed.
|
||||
#
|
||||
#----------------------------------------------------------------------------
|
||||
ASM_PFX(InterruptRedirectionTemplate):
|
||||
int $0x8
|
||||
.byte 0xcf
|
||||
nop
|
||||
int $0x9
|
||||
.byte 0xcf
|
||||
nop
|
||||
int $0xa
|
||||
.byte 0xcf
|
||||
nop
|
||||
int $0xb
|
||||
.byte 0xcf
|
||||
nop
|
||||
int $0xc
|
||||
.byte 0xcf
|
||||
nop
|
||||
int $0xd
|
||||
.byte 0xcf
|
||||
nop
|
||||
int $0xe
|
||||
.byte 0xcf
|
||||
nop
|
||||
int $0xf
|
||||
.byte 0xcf
|
||||
nop
|
|
@ -0,0 +1,73 @@
|
|||
;; @file
|
||||
; Interrupt Redirection Template
|
||||
;
|
||||
; Copyright (c) 2006, 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.
|
||||
;
|
||||
;;
|
||||
|
||||
.686P
|
||||
.MODEL FLAT, C
|
||||
.CODE
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
; Procedure: InterruptRedirectionTemplate: Redirects interrupts 0x68-0x6F
|
||||
;
|
||||
; Input: None
|
||||
;
|
||||
; Output: None
|
||||
;
|
||||
; Prototype: VOID
|
||||
; InterruptRedirectionTemplate (
|
||||
; VOID
|
||||
; );
|
||||
;
|
||||
; Saves: None
|
||||
;
|
||||
; Modified: None
|
||||
;
|
||||
; Description: Contains the code that is copied into low memory (below 640K).
|
||||
; This code reflects interrupts 0x68-0x6f to interrupts 0x08-0x0f.
|
||||
; This template must be copied into low memory, and the IDT entries
|
||||
; 0x68-0x6F must be point to the low memory copy of this code. Each
|
||||
; entry is 4 bytes long, so IDT entries 0x68-0x6F can be easily
|
||||
; computed.
|
||||
;
|
||||
;----------------------------------------------------------------------------
|
||||
|
||||
InterruptRedirectionTemplate PROC C
|
||||
int 08h
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 09h
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0ah
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0bh
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0ch
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0dh
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0eh
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0fh
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
InterruptRedirectionTemplate ENDP
|
||||
|
||||
END
|
|
@ -0,0 +1,277 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006 - 2011, 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 "LegacyBiosInterface.h"
|
||||
|
||||
/**
|
||||
Assign drive number to legacy HDD drives prior to booting an EFI
|
||||
aware OS so the OS can access drives without an EFI driver.
|
||||
Note: BBS compliant drives ARE NOT available until this call by
|
||||
either shell or EFI.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param BbsCount Number of BBS_TABLE structures
|
||||
@param BbsTable List BBS entries
|
||||
|
||||
@retval EFI_SUCCESS Drive numbers assigned
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LegacyBiosPrepareToBootEfi (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
OUT UINT16 *BbsCount,
|
||||
OUT BBS_TABLE **BbsTable
|
||||
)
|
||||
{
|
||||
//
|
||||
// Shadow All Opion ROM
|
||||
//
|
||||
LegacyBiosShadowAllLegacyOproms (This);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
To boot from an unconventional device like parties and/or execute
|
||||
HDD diagnostics.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param Attributes How to interpret the other input parameters
|
||||
@param BbsEntry The 0-based index into the BbsTable for the
|
||||
parent device.
|
||||
@param BeerData Pointer to the 128 bytes of ram BEER data.
|
||||
@param ServiceAreaData Pointer to the 64 bytes of raw Service Area data.
|
||||
The caller must provide a pointer to the specific
|
||||
Service Area and not the start all Service Areas.
|
||||
EFI_INVALID_PARAMETER if error. Does NOT return if no error.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LegacyBiosBootUnconventionalDevice (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
IN UDC_ATTRIBUTES Attributes,
|
||||
IN UINTN BbsEntry,
|
||||
IN VOID *BeerData,
|
||||
IN VOID *ServiceAreaData
|
||||
)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Attempt to legacy boot the BootOption. If the EFI contexted has been
|
||||
compromised this function will not return.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param BbsDevicePath EFI Device Path from BootXXXX variable.
|
||||
@param LoadOptionsSize Size of LoadOption in size.
|
||||
@param LoadOptions LoadOption from BootXXXX variable
|
||||
|
||||
@retval EFI_SUCCESS Removable media not present
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LegacyBiosLegacyBoot (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
IN BBS_BBS_DEVICE_PATH *BbsDevicePath,
|
||||
IN UINT32 LoadOptionsSize,
|
||||
IN VOID *LoadOptions
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/**
|
||||
Build the E820 table.
|
||||
|
||||
@param Private Legacy BIOS Instance data
|
||||
@param Size Size of E820 Table
|
||||
|
||||
@retval EFI_SUCCESS It should always work.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyBiosBuildE820 (
|
||||
IN LEGACY_BIOS_INSTANCE *Private,
|
||||
OUT UINTN *Size
|
||||
)
|
||||
{
|
||||
*Size = 0;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Get all BBS info
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param HddCount Number of HDD_INFO structures
|
||||
@param HddInfo Onboard IDE controller information
|
||||
@param BbsCount Number of BBS_TABLE structures
|
||||
@param BbsTable List BBS entries
|
||||
|
||||
@retval EFI_SUCCESS Tables returned
|
||||
@retval EFI_NOT_FOUND resource not found
|
||||
@retval EFI_DEVICE_ERROR can not get BBS table
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LegacyBiosGetBbsInfo (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
OUT UINT16 *HddCount,
|
||||
OUT HDD_INFO **HddInfo,
|
||||
OUT UINT16 *BbsCount,
|
||||
OUT BBS_TABLE **BbsTable
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/**
|
||||
Fill in the standard BDA for Keyboard LEDs
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param Leds Current LED status
|
||||
|
||||
@retval EFI_SUCCESS It should always work.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LegacyBiosUpdateKeyboardLedStatus (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
IN UINT8 Leds
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/**
|
||||
Relocate this image under 4G memory for IPF.
|
||||
|
||||
@param ImageHandle Handle of driver image.
|
||||
@param SystemTable Pointer to system table.
|
||||
|
||||
@retval EFI_SUCCESS Image successfully relocated.
|
||||
@retval EFI_ABORTED Failed to relocate image.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
RelocateImageUnder4GIfNeeded (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||
UINTN NumberOfPages;
|
||||
EFI_PHYSICAL_ADDRESS LoadedImageBase;
|
||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
||||
EFI_PHYSICAL_ADDRESS MemoryAddress;
|
||||
EFI_HANDLE NewImageHandle;
|
||||
|
||||
Status = gBS->HandleProtocol (
|
||||
ImageHandle,
|
||||
&gEfiLoadedImageProtocolGuid,
|
||||
(VOID *) &LoadedImage
|
||||
);
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
LoadedImageBase = (EFI_PHYSICAL_ADDRESS) (UINTN) LoadedImage->ImageBase;
|
||||
if (LoadedImageBase > 0xffffffff) {
|
||||
NumberOfPages = (UINTN) (DivU64x32(LoadedImage->ImageSize, EFI_PAGE_SIZE) + 1);
|
||||
|
||||
//
|
||||
// Allocate buffer below 4GB here
|
||||
//
|
||||
Status = AllocateLegacyMemory (
|
||||
AllocateMaxAddress,
|
||||
0x7FFFFFFF,
|
||||
NumberOfPages, // do we have to convert this to pages??
|
||||
&MemoryAddress
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
ZeroMem (&ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));
|
||||
ImageContext.Handle = (VOID *)(UINTN)LoadedImageBase;
|
||||
ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;
|
||||
|
||||
//
|
||||
// Get information about the image being loaded
|
||||
//
|
||||
Status = PeCoffLoaderGetImageInfo (&ImageContext);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
ImageContext.ImageAddress = (PHYSICAL_ADDRESS)MemoryAddress;
|
||||
//
|
||||
// Align buffer on section boundry
|
||||
//
|
||||
ImageContext.ImageAddress += ImageContext.SectionAlignment - 1;
|
||||
ImageContext.ImageAddress &= ~(ImageContext.SectionAlignment - 1);
|
||||
|
||||
//
|
||||
// Load the image to our new buffer
|
||||
//
|
||||
Status = PeCoffLoaderLoadImage (&ImageContext);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->FreePages (MemoryAddress, NumberOfPages);
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Relocate the image in our new buffer
|
||||
//
|
||||
Status = PeCoffLoaderRelocateImage (&ImageContext);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->FreePages (MemoryAddress, NumberOfPages);
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Create a new handle with gEfiCallerIdGuid to be used as the ImageHandle fore the reloaded image
|
||||
//
|
||||
NewImageHandle = NULL;
|
||||
Status = gBS->InstallProtocolInterface (
|
||||
&NewImageHandle,
|
||||
&gEfiCallerIdGuid,
|
||||
EFI_NATIVE_INTERFACE,
|
||||
NULL
|
||||
);
|
||||
|
||||
//
|
||||
// Flush the instruction cache so the image data is written before we execute it
|
||||
//
|
||||
InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);
|
||||
|
||||
Status = ((EFI_IMAGE_ENTRY_POINT)(UINTN)(ImageContext.EntryPoint)) (NewImageHandle, SystemTable);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->FreePages (MemoryAddress, NumberOfPages);
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// return error directly the BS will unload this image
|
||||
//
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
}
|
||||
return EFI_SUCCESS;
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2007 - 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 _IPF_THUNK_H_
|
||||
#define _IPF_THUNK_H_
|
||||
|
||||
#include "LegacyBiosInterface.h"
|
||||
#include <IndustryStandard/Sal.h>
|
||||
|
||||
/**
|
||||
Template of real mode code.
|
||||
|
||||
@param CodeStart Start address of code.
|
||||
@param CodeEnd End address of code
|
||||
@param ReverseThunkStart Start of reverse thunk.
|
||||
@param IntThunk Low memory thunk.
|
||||
|
||||
**/
|
||||
VOID
|
||||
RealModeTemplate (
|
||||
OUT UINTN *CodeStart,
|
||||
OUT UINTN *CodeEnd,
|
||||
OUT UINTN *ReverseThunkStart,
|
||||
LOW_MEMORY_THUNK *IntThunk
|
||||
);
|
||||
|
||||
/**
|
||||
Register physical address of Esal Data Area
|
||||
|
||||
@param ReverseThunkCodeAddress Reverse Thunk Address
|
||||
@param IntThunkAddress IntThunk Address
|
||||
|
||||
@retval EFI_SUCCESS ESAL data area set successfully.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EsalSetSalDataArea (
|
||||
IN UINTN ReverseThunkCodeAddress,
|
||||
IN UINTN IntThunkAddress
|
||||
);
|
||||
|
||||
/**
|
||||
Get address of reverse thunk.
|
||||
|
||||
@retval EFI_SAL_SUCCESS Address of reverse thunk returned successfully.
|
||||
|
||||
**/
|
||||
SAL_RETURN_REGS
|
||||
EsalGetReverseThunkAddress (
|
||||
VOID
|
||||
);
|
||||
|
||||
typedef struct {
|
||||
UINT32 Eax; // 0
|
||||
UINT32 Ecx; // 4
|
||||
UINT32 Edx; // 8
|
||||
UINT32 Ebx; // 12
|
||||
UINT32 Esp; // 16
|
||||
UINT32 Ebp; // 20
|
||||
UINT32 Esi; // 24
|
||||
UINT32 Edi; // 28
|
||||
UINT32 Eflag; // 32
|
||||
UINT32 Eip; // 36
|
||||
UINT16 Cs; // 40
|
||||
UINT16 Ds; // 42
|
||||
UINT16 Es; // 44
|
||||
UINT16 Fs; // 46
|
||||
UINT16 Gs; // 48
|
||||
UINT16 Ss; // 50
|
||||
} IPF_DWORD_REGS;
|
||||
|
||||
/**
|
||||
Entrypoint of IA32 code.
|
||||
|
||||
@param CallTypeData Data of call type
|
||||
@param DwordRegister Register set of IA32 general registers
|
||||
and segment registers
|
||||
@param StackPointer Stack pointer.
|
||||
@param StackSize Size of stack.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EfiIaEntryPoint (
|
||||
UINT64 CallTypeData,
|
||||
IPF_DWORD_REGS *DwordRegister,
|
||||
UINT64 StackPointer,
|
||||
UINT64 StackSize
|
||||
);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,89 @@
|
|||
//// @file
|
||||
//
|
||||
// Copyright (c) 2006, 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.
|
||||
//
|
||||
////
|
||||
|
||||
#define NUM_REAL_GDT_ENTRIES 3
|
||||
#define LOW_STACK_SIZE (8*1024) // 8k?
|
||||
|
||||
//
|
||||
// Low memory Thunk Structure
|
||||
//
|
||||
#define Code 0
|
||||
#define LowReverseThunkStart Code + 4096
|
||||
#define GdtDesc LowReverseThunkStart + 4
|
||||
#define IdtDesc GdtDesc + 6
|
||||
#define FlatSs IdtDesc + 6
|
||||
#define FlatEsp FlatSs + 4
|
||||
#define LowCodeSelector FlatEsp + 4
|
||||
#define LowDataSelector LowCodeSelector + 4
|
||||
#define LowStack LowDataSelector + 4
|
||||
#define RealModeIdtDesc LowStack + 4
|
||||
#define RealModeGdt RealModeIdtDesc + 6
|
||||
#define RealModeGdtDesc RealModeGdt + (8 * NUM_REAL_GDT_ENTRIES)
|
||||
#define RevRealDs RealModeGdtDesc + 6
|
||||
#define RevRealSs RevRealDs + 2
|
||||
#define RevRealEsp RevRealSs + 2
|
||||
#define RevRealIdtDesc RevRealEsp + 4
|
||||
#define RevFlatDataSelector RevRealIdtDesc + 6
|
||||
#define RevFlatStack RevFlatDataSelector + 2
|
||||
#define Stack RevFlatStack + 4
|
||||
#define RevThunkStack Stack + LOW_STACK_SIZE
|
||||
|
||||
#define EfiToLegacy16InitTable RevThunkStack + LOW_STACK_SIZE
|
||||
#define InitTableBiosLessThan1MB EfiToLegacy16InitTable
|
||||
#define InitTableHiPmmMemory InitTableBiosLessThan1MB + 4
|
||||
#define InitTablePmmMemorySizeInBytes InitTableHiPmmMemory + 4
|
||||
#define InitTableReverseThunkCallSegment InitTablePmmMemorySizeInBytes + 4
|
||||
#define InitTableReverseThunkCallOffset InitTableReverseThunkCallSegment + 2
|
||||
#define InitTableNumberE820Entries InitTableReverseThunkCallOffset + 2
|
||||
#define InitTableOsMemoryAbove1Mb InitTableNumberE820Entries + 4
|
||||
#define InitTableThunkStart InitTableOsMemoryAbove1Mb + 4
|
||||
#define InitTableThunkSizeInBytes InitTableThunkStart + 4
|
||||
#define InitTable16InitTableEnd InitTableThunkSizeInBytes + 4
|
||||
|
||||
#define EfiToLegacy16BootTable InitTable16InitTableEnd
|
||||
#define BootTableBiosLessThan1MB EfiToLegacy16BootTable
|
||||
#define BootTableHiPmmMemory BootTableBiosLessThan1MB + 4
|
||||
#define BootTablePmmMemorySizeInBytes BootTableHiPmmMemory + 4
|
||||
#define BootTableReverseThunkCallSegment BootTablePmmMemorySizeInBytes + 4
|
||||
#define BootTableReverseThunkCallOffset BootTableReverseThunkCallSegment + 2
|
||||
#define BootTableNumberE820Entries BootTableReverseThunkCallOffset + 2
|
||||
#define BootTableOsMemoryAbove1Mb BootTableNumberE820Entries + 4
|
||||
#define BootTableThunkStart BootTableOsMemoryAbove1Mb + 4
|
||||
#define BootTableThunkSizeInBytes BootTableThunkStart + 4
|
||||
#define EfiToLegacy16BootTableEnd BootTableThunkSizeInBytes + 4
|
||||
|
||||
#define InterruptRedirectionCode EfiToLegacy16BootTableEnd
|
||||
#define PciHandler InterruptRedirectionCode + 32
|
||||
|
||||
|
||||
//
|
||||
// Register Sets (16 Bit)
|
||||
//
|
||||
|
||||
#define AX 0
|
||||
#define BX 2
|
||||
#define CX 4
|
||||
#define DX 6
|
||||
#define SI 8
|
||||
#define DI 10
|
||||
#define Flags 12
|
||||
#define ES 14
|
||||
#define CS 16
|
||||
#define SS 18
|
||||
#define DS 20
|
||||
#define BP 22
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,524 @@
|
|||
//// @file
|
||||
//
|
||||
// Copyright (c) 1999 - 2008, 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.
|
||||
//
|
||||
////
|
||||
|
||||
.file "IpfThunk.s"
|
||||
|
||||
#include "IpfMacro.i"
|
||||
#include "Ipf/IpfThunk.i"
|
||||
|
||||
.align 0x10
|
||||
//-----------------------------------------------------------------------------
|
||||
//++
|
||||
// EfiIaEntryPoint
|
||||
//
|
||||
// Register physical address of Esal Data Area
|
||||
//
|
||||
// On Entry :
|
||||
// in1 = ptr to legacy bios reg
|
||||
// in2 = ptr to Call Stack
|
||||
// in3 = Call Stack Size
|
||||
//
|
||||
// Return Value:
|
||||
// r8 = SAL_SUCCESS
|
||||
//
|
||||
// As per static calling conventions.
|
||||
//
|
||||
//--
|
||||
//---------------------------------------------------------------------------
|
||||
PROCEDURE_ENTRY(EfiIaEntryPoint)
|
||||
|
||||
alloc loc0 = 8,10,8,0;;
|
||||
|
||||
mov out0 = r0;;
|
||||
mov out1 = r0;;
|
||||
mov out2 = r0;;
|
||||
mov out3 = r0;;
|
||||
mov out4 = r0;;
|
||||
mov out5 = r0;;
|
||||
mov out6 = r0;;
|
||||
mov out7 = r0;;
|
||||
|
||||
mov loc1 = b0;; // save efi (b0)
|
||||
mov loc2 = psr;; // save efi (PSR)
|
||||
mov loc3 = gp;; // save efi (GP)
|
||||
mov loc4 = pr;; // save efi (PR)
|
||||
mov loc5 = sp;; // save efi (SP)
|
||||
mov loc6 = r13;; // save efi (TP)
|
||||
mov loc7 = ar.lc;; // save efi (LC)
|
||||
mov loc8 = ar.fpsr;; // save efi (FPSR)
|
||||
|
||||
mov r8 = r0;; // return status
|
||||
mov r9 = r0;; // return value
|
||||
mov r10 = r0;; // return value
|
||||
mov r11 = r0;; // return value
|
||||
|
||||
bios_int_func::
|
||||
rsm 0x4000;; // i(14)=0, disable interrupt
|
||||
srlz.d;;
|
||||
srlz.i;;
|
||||
|
||||
//---------------------//
|
||||
// save fp registers //
|
||||
//---------------------//
|
||||
|
||||
dep sp = 0,sp,0,4;; // align 16
|
||||
add sp = -16,sp;; // post decrement
|
||||
|
||||
int_ip_1x::
|
||||
mov r2 = ip;;
|
||||
add r2 = (int_ip_1y - int_ip_1x),r2;;
|
||||
mov b7 = r2;;
|
||||
br save_fp_registers;;
|
||||
|
||||
int_ip_1y::
|
||||
add sp = 16,sp;; // adjust (SP)
|
||||
mov loc9 = sp;; // save (SP)
|
||||
adds sp = 0x10,in1;; // in1 + 0x10 = SP
|
||||
ld4 sp = [sp];; // SP
|
||||
adds r17 = 0x32,in1;; // in1 + 0x32 = SS
|
||||
ld2 r17 = [r17];; // SS
|
||||
movl r2 = 0xffffffff;; // if no SS:SP, then define new SS:SP
|
||||
cmp.ne p6,p0 = sp,r2;;
|
||||
movl r2 = 0xffff;;
|
||||
cmp.ne.or p6,p0 = r17,r2;;
|
||||
(p6) br.sptk bif_1;;
|
||||
|
||||
mov sp = in3;; // 16-bit stack pointer
|
||||
mov r2 = psr;;
|
||||
tbit.z p6,p7 = r2,17;; // psr.dt (Physical OR Virtual)
|
||||
|
||||
bif_ip1x::
|
||||
mov r2 = in2;; // ia32 callback stack top
|
||||
mov r3 = in3;; // 16-bit stack pointer
|
||||
sub r2 = r2,r3;;
|
||||
shr.u r17 = r2,4;; // 16-bit stack segment
|
||||
|
||||
bif_1::
|
||||
extr.u sp = sp,0,16;; // SP (16-bit sp for legacy code)
|
||||
dep sp = 0,sp,0,3;; // align 8
|
||||
cmp.eq p6,p0 = 0,sp;; // if SP=0000 then wrap to 0x10000
|
||||
(p6) dep sp = -1,sp,16,1;;
|
||||
shladd r2 = r17,4,sp;; // ESP = SS<<4+SP
|
||||
add r2 = -8,r2;; // post decrement 64 bit pointer
|
||||
add sp = -8,sp;; // post decrement SP
|
||||
|
||||
sale_ip1x::
|
||||
mov r18 = ip;;
|
||||
adds r18 = (sale_ip1y - sale_ip1x),r18;;
|
||||
sub r18 = r18,r2;; // return address - CS base
|
||||
add r18 = r18,sp;; // adjustment for stack
|
||||
shl r18 = r18,32;;
|
||||
movl r19 = 0xb80f66fa;; // CLI, JMPE xxxxxxxx
|
||||
or r18 = r18,r19;;
|
||||
st8 [r2] = r18;; // (FA,66,0F,B8,xx,xx,xx,xx)
|
||||
|
||||
cmp.eq p6,p0 = 0,sp;; // if SP=0000 then wrap to 0x10000
|
||||
(p6) dep sp = -1,sp,16,1;;
|
||||
shladd r2 = r17,4,sp;; // ESP=SS<<4+SP
|
||||
add r2 = -2,r2;; // post decrement 64 bit pointer
|
||||
add sp = -2,sp;; // post decrement SP
|
||||
|
||||
movl r18 = 0x8000000000000100;; // CALL FAR function
|
||||
cmp.eq p6,p7 = in0,r18;;
|
||||
(p6) add r19 = 0x28,in1;; // in1 + 0x28 = CS
|
||||
(p6) ld2 r18 = [r19],-4;; // CS
|
||||
(p6) st2 [r2] = r18,-2;; // in1 + 0x24 = EIP
|
||||
(p6) ld2 r18 = [r19];; // EIP
|
||||
(p6) st2 [r2] = r18,-2;; //
|
||||
(p6) movl r18 = 0x9a90;; // nop, CALLFAR xxxx:yyyy
|
||||
|
||||
(p7) movl r18 = 0xcd;; // INT xx
|
||||
(p7) dep r18 = in0,r18,8,8;;
|
||||
st2 [r2] = r18;; // (CD,xx)
|
||||
|
||||
mov r18 = r2;; // EIP for legacy execution
|
||||
|
||||
//------------------------------//
|
||||
// flush 32 bytes legacy code //
|
||||
//------------------------------//
|
||||
|
||||
dep r2 = 0,r2,0,5;; // align to 32
|
||||
fc r2;;
|
||||
sync.i;;
|
||||
srlz.i;;
|
||||
srlz.d;;
|
||||
|
||||
//------------------------------//
|
||||
// load legacy registers //
|
||||
//------------------------------//
|
||||
mov r2 = in1;; // IA32 BIOS register state
|
||||
ld4 r8 = [r2],4;; // in1 + 0 = EAX
|
||||
ld4 r9 = [r2],4;; // in1 + 4 = ECX
|
||||
ld4 r10 = [r2],4;; // in1 + 8 = EDX
|
||||
ld4 r11 = [r2],4;; // in1 + 12 = EBX
|
||||
|
||||
add r2 = 4,r2;; // in1 + 16 = ESP (skip)
|
||||
|
||||
ld4 r13 = [r2],4;; // in1 + 20 = EBP
|
||||
ld4 r14 = [r2],4;; // in1 + 24 = ESI
|
||||
ld4 r15 = [r2],4;; // in1 + 28 = EDI
|
||||
ld4 r3 = [r2],4;; // in1 + 32 = EFLAGS
|
||||
mov ar.eflag = r3;;
|
||||
|
||||
add r2 = 4,r2;; // in1 + 36 = EIP (skip)
|
||||
add r2 = 2,r2;; // in1 + 40 = CS (skip)
|
||||
|
||||
ld2 r16 = [r2],2;; // in1 + 42 = DS, (r16 = GS,FS,ES,DS)
|
||||
movl r27 = 0xc93fffff00000000;;
|
||||
dep r27 = r16,r27,4,16;; // r27 = DSD
|
||||
|
||||
ld2 r19 = [r2],2;; // in1 + 44 = ES
|
||||
dep r16 = r19,r16,16,16;;
|
||||
movl r24 = 0xc93fffff00000000;;
|
||||
dep r24 = r19,r24,4,16;; // r24 = ESD
|
||||
|
||||
ld2 r19 = [r2],2;; // in1 + 46 = FS
|
||||
dep r16 = r19,r16,32,16;;
|
||||
movl r28 = 0xc93fffff00000000;;
|
||||
dep r28 = r19,r28,4,16;; // r28 = FSD
|
||||
|
||||
ld2 r19 = [r2],2;; // in1 + 48 = GS
|
||||
dep r16 = r19,r16,48,16;;
|
||||
movl r29 = 0xc93fffff00000000;;
|
||||
dep r29 = r19,r29,4,16;; // r29 = GSD
|
||||
|
||||
mov r30 = r0;; // r30 = LDTD, clear NaT
|
||||
mov r31 = r0;; // r31 = GDTD, clear NaT
|
||||
|
||||
dep r17 = r17,r17,16,16;; // CS = SS, (r17 = TSS,LDT,SS,CS)
|
||||
|
||||
movl r3 = 0x0930ffff00000000;;
|
||||
dep r3 = r17,r3,4,16;;
|
||||
mov ar.csd = r3;; // ar25 = CSD
|
||||
mov ar.ssd = r3;; // ar26 = SSD
|
||||
|
||||
//------------------------------//
|
||||
// give control to INT function //
|
||||
//------------------------------//
|
||||
|
||||
br.call.sptk b0 = execute_int_function;;
|
||||
|
||||
//------------------------------//
|
||||
// store legacy registers //
|
||||
//------------------------------//
|
||||
|
||||
mov r2 = in1;;
|
||||
st4 [r2] = r8,4;; // EAX
|
||||
st4 [r2] = r9,4;; // ECX
|
||||
st4 [r2] = r10,4;; // EDX
|
||||
st4 [r2] = r11,4;; // EBX
|
||||
|
||||
add r2 = 4,r2;; // ESP (skip)
|
||||
|
||||
st4 [r2] = r13,4;; // EBP
|
||||
st4 [r2] = r14,4;; // ESI
|
||||
st4 [r2] = r15,4;; // EDI
|
||||
|
||||
mov r3 = ar.eflag;;
|
||||
st4 [r2] = r3,4;; // EFLAGS
|
||||
|
||||
add r2 = 4,r2;; // EIP (skip)
|
||||
add r2 = 2,r2;; // CS (skip)
|
||||
|
||||
st2 [r2] = r16,2;; // DS, (r16 = GS,FS,ES,DS)
|
||||
|
||||
extr.u r3 = r16,16,16;;
|
||||
st2 [r2] = r3,2;; // ES
|
||||
|
||||
extr.u r3 = r16,32,16;;
|
||||
st2 [r2] = r3,2;; // FS
|
||||
|
||||
extr.u r3 = r16,48,16;;
|
||||
st2 [r2] = r3,2;; // GS
|
||||
|
||||
//------------------------------//
|
||||
// restore fp registers //
|
||||
//------------------------------//
|
||||
mov sp = loc9;; // restore (SP)
|
||||
int_ip_2x::
|
||||
mov r2 = ip;;
|
||||
add r2 = (int_ip_2y - int_ip_2x),r2;;
|
||||
mov b7 = r2;;
|
||||
br restore_fp_registers;;
|
||||
|
||||
int_ip_2y::
|
||||
mov r8 = r0;; // return status
|
||||
mov r9 = r0;; // return value
|
||||
mov r10 = r0;; // return value
|
||||
mov r11 = r0;; // return value
|
||||
|
||||
mov ar.fpsr = loc8;; // restore efi (FPSR)
|
||||
mov ar.lc = loc7;; // restore efi (LC)
|
||||
mov r13 = loc6;; // restore efi (TP)
|
||||
mov sp = loc5;; // restore efi (SP)
|
||||
mov pr = loc4;; // restore efi (PR)
|
||||
mov gp = loc3;; // restore efi (GP)
|
||||
mov psr.l = loc2;; // restore efi (PSR)
|
||||
srlz.d;;
|
||||
srlz.i;;
|
||||
mov b0 = loc1;; // restore efi (b0)
|
||||
mov ar.pfs = loc0;;
|
||||
br.ret.sptk b0;; // return to efi
|
||||
|
||||
PROCEDURE_EXIT (EfiIaEntryPoint)
|
||||
|
||||
//==============================//
|
||||
// EXECUTE_INT_FUNCTION //
|
||||
//==============================//
|
||||
// switch to virtual address //
|
||||
//------------------------------//
|
||||
|
||||
execute_int_function::
|
||||
|
||||
alloc r2 = 0,0,0,0;; // cfm.sof=0
|
||||
flushrs;;
|
||||
|
||||
rsm 0x2000;; // ic(13)=0 for control register programming
|
||||
srlz.d;;
|
||||
srlz.i;;
|
||||
|
||||
mov r2 = psr;;
|
||||
dep r2 = -1,r2,34,1;; // set is(34)
|
||||
dep r2 = -1,r2,44,1;; // set bn(44)
|
||||
dep r2 = -1,r2,36,1;; // set it(36)
|
||||
dep r2 = -1,r2,27,1;; // set rt(27)
|
||||
dep r2 = -1,r2,17,1;; // set dt(17)
|
||||
dep r2 = 0,r2,3,1;; // reset ac(3)
|
||||
dep r2 = -1,r2,13,1;; // set ic(13)
|
||||
|
||||
mov cr.ipsr = r2;;
|
||||
mov cr.ifs = r0;; // clear interruption function state register
|
||||
mov cr.iip = r18;;
|
||||
|
||||
rfi;; // go to legacy code execution
|
||||
|
||||
//------------------------------//
|
||||
// back from legacy code //
|
||||
//------------------------------//
|
||||
// switch to physical address //
|
||||
//------------------------------//
|
||||
|
||||
sale_ip1y::
|
||||
rsm 0x6000;; // i(14)=0,ic(13)=0 for control reg programming
|
||||
srlz.d;;
|
||||
srlz.i;;
|
||||
|
||||
mov r2 = psr;;
|
||||
dep r2 = -1,r2,44,1;; // set bn(44)
|
||||
dep r2 = 0,r2,36,1;; // reset it(36)
|
||||
dep r2 = 0,r2,27,1;; // reset rt(27)
|
||||
dep r2 = 0,r2,17,1;; // reset dt(17)
|
||||
dep r2 = -1,r2,13,1;; // set ic(13)
|
||||
mov cr.ipsr = r2;;
|
||||
|
||||
sale_ip2x::
|
||||
mov r2 = ip;;
|
||||
add r2 = (sale_ip2y - sale_ip2x),r2;;
|
||||
mov cr.ifs = r0;; // clear interruption function state register
|
||||
mov cr.iip = r2;;
|
||||
rfi;;
|
||||
|
||||
sale_ip2y::
|
||||
br.ret.sptk b0;; // return to SAL
|
||||
|
||||
//------------------------------//
|
||||
// store fp registers //
|
||||
//------------------------------//
|
||||
save_fp_registers::
|
||||
stf.spill [sp]=f2,-16;; stf.spill [sp]=f3,-16;;
|
||||
stf.spill [sp]=f4,-16;; stf.spill [sp]=f5,-16;; stf.spill [sp]=f6,-16;; stf.spill [sp]=f7,-16;;
|
||||
stf.spill [sp]=f8,-16;; stf.spill [sp]=f9,-16;; stf.spill [sp]=f10,-16;; stf.spill [sp]=f11,-16;;
|
||||
stf.spill [sp]=f12,-16;; stf.spill [sp]=f13,-16;; stf.spill [sp]=f14,-16;; stf.spill [sp]=f15,-16;;
|
||||
stf.spill [sp]=f16,-16;; stf.spill [sp]=f17,-16;; stf.spill [sp]=f18,-16;; stf.spill [sp]=f19,-16;;
|
||||
stf.spill [sp]=f20,-16;; stf.spill [sp]=f21,-16;; stf.spill [sp]=f22,-16;; stf.spill [sp]=f23,-16;;
|
||||
stf.spill [sp]=f24,-16;; stf.spill [sp]=f25,-16;; stf.spill [sp]=f26,-16;; stf.spill [sp]=f27,-16;;
|
||||
stf.spill [sp]=f28,-16;; stf.spill [sp]=f29,-16;; stf.spill [sp]=f30,-16;; stf.spill [sp]=f31,-16;;
|
||||
stf.spill [sp]=f32,-16;; stf.spill [sp]=f33,-16;; stf.spill [sp]=f34,-16;; stf.spill [sp]=f35,-16;;
|
||||
stf.spill [sp]=f36,-16;; stf.spill [sp]=f37,-16;; stf.spill [sp]=f38,-16;; stf.spill [sp]=f39,-16;;
|
||||
stf.spill [sp]=f40,-16;; stf.spill [sp]=f41,-16;; stf.spill [sp]=f42,-16;; stf.spill [sp]=f43,-16;;
|
||||
stf.spill [sp]=f44,-16;; stf.spill [sp]=f45,-16;; stf.spill [sp]=f46,-16;; stf.spill [sp]=f47,-16;;
|
||||
stf.spill [sp]=f48,-16;; stf.spill [sp]=f49,-16;; stf.spill [sp]=f50,-16;; stf.spill [sp]=f51,-16;;
|
||||
stf.spill [sp]=f52,-16;; stf.spill [sp]=f53,-16;; stf.spill [sp]=f54,-16;; stf.spill [sp]=f55,-16;;
|
||||
stf.spill [sp]=f56,-16;; stf.spill [sp]=f57,-16;; stf.spill [sp]=f58,-16;; stf.spill [sp]=f59,-16;;
|
||||
stf.spill [sp]=f60,-16;; stf.spill [sp]=f61,-16;; stf.spill [sp]=f62,-16;; stf.spill [sp]=f63,-16;;
|
||||
stf.spill [sp]=f64,-16;; stf.spill [sp]=f65,-16;; stf.spill [sp]=f66,-16;; stf.spill [sp]=f67,-16;;
|
||||
stf.spill [sp]=f68,-16;; stf.spill [sp]=f69,-16;; stf.spill [sp]=f70,-16;; stf.spill [sp]=f71,-16;;
|
||||
stf.spill [sp]=f72,-16;; stf.spill [sp]=f73,-16;; stf.spill [sp]=f74,-16;; stf.spill [sp]=f75,-16;;
|
||||
stf.spill [sp]=f76,-16;; stf.spill [sp]=f77,-16;; stf.spill [sp]=f78,-16;; stf.spill [sp]=f79,-16;;
|
||||
stf.spill [sp]=f80,-16;; stf.spill [sp]=f81,-16;; stf.spill [sp]=f82,-16;; stf.spill [sp]=f83,-16;;
|
||||
stf.spill [sp]=f84,-16;; stf.spill [sp]=f85,-16;; stf.spill [sp]=f86,-16;; stf.spill [sp]=f87,-16;;
|
||||
stf.spill [sp]=f88,-16;; stf.spill [sp]=f89,-16;; stf.spill [sp]=f90,-16;; stf.spill [sp]=f91,-16;;
|
||||
stf.spill [sp]=f92,-16;; stf.spill [sp]=f93,-16;; stf.spill [sp]=f94,-16;; stf.spill [sp]=f95,-16;;
|
||||
stf.spill [sp]=f96,-16;; stf.spill [sp]=f97,-16;; stf.spill [sp]=f98,-16;; stf.spill [sp]=f99,-16;;
|
||||
stf.spill [sp]=f100,-16;;stf.spill [sp]=f101,-16;;stf.spill [sp]=f102,-16;;stf.spill [sp]=f103,-16;;
|
||||
stf.spill [sp]=f104,-16;;stf.spill [sp]=f105,-16;;stf.spill [sp]=f106,-16;;stf.spill [sp]=f107,-16;;
|
||||
stf.spill [sp]=f108,-16;;stf.spill [sp]=f109,-16;;stf.spill [sp]=f110,-16;;stf.spill [sp]=f111,-16;;
|
||||
stf.spill [sp]=f112,-16;;stf.spill [sp]=f113,-16;;stf.spill [sp]=f114,-16;;stf.spill [sp]=f115,-16;;
|
||||
stf.spill [sp]=f116,-16;;stf.spill [sp]=f117,-16;;stf.spill [sp]=f118,-16;;stf.spill [sp]=f119,-16;;
|
||||
stf.spill [sp]=f120,-16;;stf.spill [sp]=f121,-16;;stf.spill [sp]=f122,-16;;stf.spill [sp]=f123,-16;;
|
||||
stf.spill [sp]=f124,-16;;stf.spill [sp]=f125,-16;;stf.spill [sp]=f126,-16;;stf.spill [sp]=f127,-16;;
|
||||
invala;;
|
||||
br b7;;
|
||||
|
||||
//------------------------------//
|
||||
// restore fp registers //
|
||||
//------------------------------//
|
||||
restore_fp_registers::
|
||||
ldf.fill f127=[sp],16;;ldf.fill f126=[sp],16;;ldf.fill f125=[sp],16;;ldf.fill f124=[sp],16;;
|
||||
ldf.fill f123=[sp],16;;ldf.fill f122=[sp],16;;ldf.fill f121=[sp],16;;ldf.fill f120=[sp],16;;
|
||||
ldf.fill f119=[sp],16;;ldf.fill f118=[sp],16;;ldf.fill f117=[sp],16;;ldf.fill f116=[sp],16;;
|
||||
ldf.fill f115=[sp],16;;ldf.fill f114=[sp],16;;ldf.fill f113=[sp],16;;ldf.fill f112=[sp],16;;
|
||||
ldf.fill f111=[sp],16;;ldf.fill f110=[sp],16;;ldf.fill f109=[sp],16;;ldf.fill f108=[sp],16;;
|
||||
ldf.fill f107=[sp],16;;ldf.fill f106=[sp],16;;ldf.fill f105=[sp],16;;ldf.fill f104=[sp],16;;
|
||||
ldf.fill f103=[sp],16;;ldf.fill f102=[sp],16;;ldf.fill f101=[sp],16;;ldf.fill f100=[sp],16;;
|
||||
ldf.fill f99=[sp],16;; ldf.fill f98=[sp],16;; ldf.fill f97=[sp],16;; ldf.fill f96=[sp],16;;
|
||||
ldf.fill f95=[sp],16;; ldf.fill f94=[sp],16;; ldf.fill f93=[sp],16;; ldf.fill f92=[sp],16;;
|
||||
ldf.fill f91=[sp],16;; ldf.fill f90=[sp],16;; ldf.fill f89=[sp],16;; ldf.fill f88=[sp],16;;
|
||||
ldf.fill f87=[sp],16;; ldf.fill f86=[sp],16;; ldf.fill f85=[sp],16;; ldf.fill f84=[sp],16;;
|
||||
ldf.fill f83=[sp],16;; ldf.fill f82=[sp],16;; ldf.fill f81=[sp],16;; ldf.fill f80=[sp],16;;
|
||||
ldf.fill f79=[sp],16;; ldf.fill f78=[sp],16;; ldf.fill f77=[sp],16;; ldf.fill f76=[sp],16;;
|
||||
ldf.fill f75=[sp],16;; ldf.fill f74=[sp],16;; ldf.fill f73=[sp],16;; ldf.fill f72=[sp],16;;
|
||||
ldf.fill f71=[sp],16;; ldf.fill f70=[sp],16;; ldf.fill f69=[sp],16;; ldf.fill f68=[sp],16;;
|
||||
ldf.fill f67=[sp],16;; ldf.fill f66=[sp],16;; ldf.fill f65=[sp],16;; ldf.fill f64=[sp],16;;
|
||||
ldf.fill f63=[sp],16;; ldf.fill f62=[sp],16;; ldf.fill f61=[sp],16;; ldf.fill f60=[sp],16;;
|
||||
ldf.fill f59=[sp],16;; ldf.fill f58=[sp],16;; ldf.fill f57=[sp],16;; ldf.fill f56=[sp],16;;
|
||||
ldf.fill f55=[sp],16;; ldf.fill f54=[sp],16;; ldf.fill f53=[sp],16;; ldf.fill f52=[sp],16;;
|
||||
ldf.fill f51=[sp],16;; ldf.fill f50=[sp],16;; ldf.fill f49=[sp],16;; ldf.fill f48=[sp],16;;
|
||||
ldf.fill f47=[sp],16;; ldf.fill f46=[sp],16;; ldf.fill f45=[sp],16;; ldf.fill f44=[sp],16;;
|
||||
ldf.fill f43=[sp],16;; ldf.fill f42=[sp],16;; ldf.fill f41=[sp],16;; ldf.fill f40=[sp],16;;
|
||||
ldf.fill f39=[sp],16;; ldf.fill f38=[sp],16;; ldf.fill f37=[sp],16;; ldf.fill f36=[sp],16;;
|
||||
ldf.fill f35=[sp],16;; ldf.fill f34=[sp],16;; ldf.fill f33=[sp],16;; ldf.fill f32=[sp],16;;
|
||||
ldf.fill f31=[sp],16;; ldf.fill f30=[sp],16;; ldf.fill f29=[sp],16;; ldf.fill f28=[sp],16;;
|
||||
ldf.fill f27=[sp],16;; ldf.fill f26=[sp],16;; ldf.fill f25=[sp],16;; ldf.fill f24=[sp],16;;
|
||||
ldf.fill f23=[sp],16;; ldf.fill f22=[sp],16;; ldf.fill f21=[sp],16;; ldf.fill f20=[sp],16;;
|
||||
ldf.fill f19=[sp],16;; ldf.fill f18=[sp],16;; ldf.fill f17=[sp],16;; ldf.fill f16=[sp],16;;
|
||||
ldf.fill f15=[sp],16;; ldf.fill f14=[sp],16;; ldf.fill f13=[sp],16;; ldf.fill f12=[sp],16;;
|
||||
ldf.fill f11=[sp],16;; ldf.fill f10=[sp],16;; ldf.fill f9=[sp],16;; ldf.fill f8=[sp],16;;
|
||||
ldf.fill f7=[sp],16;; ldf.fill f6=[sp],16;; ldf.fill f5=[sp],16;; ldf.fill f4=[sp],16;;
|
||||
ldf.fill f3=[sp],16;; ldf.fill f2=[sp],16;;
|
||||
invala;;
|
||||
br b7;;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//++
|
||||
// EsalSetSalDataArea
|
||||
//
|
||||
// Register physical address of Esal Data Area
|
||||
//
|
||||
// On Entry :
|
||||
// in0 = Reverse Thunk Address
|
||||
// in1 = IntThunk Address
|
||||
//
|
||||
// Return Value:
|
||||
// r8 = SAL_SUCCESS
|
||||
//
|
||||
// As per static calling conventions.
|
||||
//
|
||||
//--
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
PROCEDURE_ENTRY (EsalSetSalDataArea)
|
||||
|
||||
NESTED_SETUP (4,8,0,0)
|
||||
|
||||
EsalCalcStart1_3::
|
||||
mov r8 = ip;;
|
||||
add r8 = (ReverseThunkAddress - EsalCalcStart1_3), r8;;
|
||||
st8 [r8] = in0;;
|
||||
|
||||
EsalCalcStart1_4::
|
||||
mov r8 = ip;;
|
||||
add r8 = (IntThunkAddress - EsalCalcStart1_4), r8;;
|
||||
st8 [r8] = in1;;
|
||||
|
||||
mov r8 = r0;;
|
||||
|
||||
NESTED_RETURN
|
||||
|
||||
PROCEDURE_EXIT (EsalSetSalDataArea)
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//++
|
||||
// EsagGetReverseThunkAddress
|
||||
//
|
||||
// Register physical address of Esal Data Area
|
||||
//
|
||||
// On Entry :
|
||||
// out0 = CodeStart
|
||||
// out1 = CodeEnd
|
||||
// out1 = ReverseThunkCode
|
||||
//
|
||||
// Return Value:
|
||||
// r8 = SAL_SUCCESS
|
||||
//
|
||||
// As per static calling conventions.
|
||||
//
|
||||
//--
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
PROCEDURE_ENTRY (EsalGetReverseThunkAddress)
|
||||
|
||||
NESTED_SETUP (4,8,0,0)
|
||||
|
||||
EsalCalcStart1_31::
|
||||
mov r8 = ip;;
|
||||
add r8 = (Ia32CodeStart - EsalCalcStart1_31), r8;;
|
||||
mov r9 = r8;;
|
||||
|
||||
EsalCalcStart1_41::
|
||||
mov r8 = ip;;
|
||||
add r8 = (Ia32CodeEnd - EsalCalcStart1_41), r8;;
|
||||
mov r10 = r8;;
|
||||
|
||||
EsalCalcStart1_51::
|
||||
mov r8 = ip;;
|
||||
add r8 = (ReverseThunkAddress - EsalCalcStart1_51), r8;;
|
||||
mov r11 = r8;;
|
||||
mov r8 = r0;;
|
||||
|
||||
NESTED_RETURN
|
||||
|
||||
PROCEDURE_EXIT (EsalGetReverseThunkAddress)
|
||||
|
||||
|
||||
.align 16
|
||||
PROCEDURE_ENTRY (InterruptRedirectionTemplate)
|
||||
data8 0x90CFCD08
|
||||
data8 0x90CFCD09
|
||||
data8 0x90CFCD0A
|
||||
data8 0x90CFCD0B
|
||||
data8 0x90CFCD0C
|
||||
data8 0x90CFCD0D
|
||||
data8 0x90CFCD0E
|
||||
data8 0x90CFCD0F
|
||||
PROCEDURE_EXIT (InterruptRedirectionTemplate)
|
||||
|
||||
//------------------------------//
|
||||
// Reverse Thunk Code //
|
||||
//------------------------------//
|
||||
|
||||
Ia32CodeStart::
|
||||
br.sptk.few Ia32CodeStart;; // IPF CSM integration -Bug (Write This Code)
|
||||
ReverseThunkCode::
|
||||
data8 0xb80f66fa // CLI, JMPE xxxx
|
||||
ReverseThunkAddress::
|
||||
data8 0 // Return Address
|
||||
IntThunkAddress::
|
||||
data8 0 // IntThunk Address
|
||||
Ia32CodeEnd::
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,550 @@
|
|||
/** @file
|
||||
Call into 16-bit BIOS code
|
||||
|
||||
BugBug: Thunker does A20 gate. Can we get rid of this code or
|
||||
put it into Legacy16 code.
|
||||
|
||||
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 "LegacyBiosInterface.h"
|
||||
#include "IpfThunk.h"
|
||||
|
||||
/**
|
||||
Gets the current flat GDT and IDT descriptors and store them in
|
||||
Private->IntThunk. These values are used by the Thunk code.
|
||||
This method must be called before every thunk in order to assure
|
||||
that the correct GDT and IDT are restored after the thunk.
|
||||
|
||||
@param Private Private context for Legacy BIOS
|
||||
|
||||
@retval EFI_SUCCESS Should only pass.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyBiosGetFlatDescs (
|
||||
IN LEGACY_BIOS_INSTANCE *Private
|
||||
)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
BIOS interrupt call function.
|
||||
|
||||
@param BiosInt Int number of BIOS call
|
||||
@param Segment Segment number
|
||||
@param Offset Offset in segment
|
||||
@param Regs IA32 Register set.
|
||||
@param Stack Base address of stack
|
||||
@param StackSize Size of stack
|
||||
|
||||
@retval EFI_SUCCESS BIOS interrupt call succeeds.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BiosIntCall (
|
||||
IN UINT16 BiosInt,
|
||||
IN UINT16 Segment,
|
||||
IN UINT16 Offset,
|
||||
IN EFI_IA32_REGISTER_SET *Regs,
|
||||
IN VOID *Stack,
|
||||
IN UINTN StackSize
|
||||
)
|
||||
{
|
||||
IPF_DWORD_REGS DwordRegs;
|
||||
UINT64 IntTypeVariable;
|
||||
|
||||
IntTypeVariable = 0x8000000000000000;
|
||||
IntTypeVariable |= BiosInt;
|
||||
|
||||
DwordRegs.Cs = Segment;
|
||||
DwordRegs.Eip = Offset;
|
||||
|
||||
DwordRegs.Ds = Regs->X.DS;
|
||||
DwordRegs.Es = Regs->X.ES;
|
||||
DwordRegs.Fs = Regs->X.ES;
|
||||
DwordRegs.Gs = Regs->X.ES;
|
||||
DwordRegs.Ss = 0xFFFF;
|
||||
|
||||
DwordRegs.Eax = Regs->X.AX;
|
||||
DwordRegs.Ebx = Regs->X.BX;
|
||||
//
|
||||
// Sometimes, ECX is used to pass in 32 bit data. For example, INT 1Ah, AX = B10Dh is
|
||||
// "PCI BIOS v2.0c + Write Configuration DWORD" and ECX has the dword to write.
|
||||
//
|
||||
DwordRegs.Ecx = Regs->E.ECX;
|
||||
DwordRegs.Edx = Regs->X.DX;
|
||||
|
||||
DwordRegs.Ebp = Regs->X.BP;
|
||||
DwordRegs.Eflag = *((UINT16 *) &Regs->X.Flags);
|
||||
|
||||
DwordRegs.Edi = Regs->X.DI;
|
||||
DwordRegs.Esi = Regs->X.SI;
|
||||
DwordRegs.Esp = 0xFFFFFFFF;
|
||||
|
||||
EfiIaEntryPoint (IntTypeVariable, &DwordRegs, ((UINTN) Stack + StackSize), StackSize);
|
||||
|
||||
Regs->X.CS = DwordRegs.Cs;
|
||||
|
||||
Regs->X.DS = (UINT16) DwordRegs.Ds;
|
||||
Regs->X.SS = (UINT16) DwordRegs.Ss;
|
||||
|
||||
Regs->E.EAX = DwordRegs.Eax;
|
||||
Regs->E.EBX = DwordRegs.Ebx;
|
||||
Regs->E.ECX = DwordRegs.Ecx;
|
||||
Regs->E.EDX = DwordRegs.Edx;
|
||||
|
||||
Regs->E.EBP = DwordRegs.Ebp;
|
||||
CopyMem (&Regs->X.Flags, &DwordRegs.Eflag, sizeof (EFI_FLAGS_REG));
|
||||
|
||||
Regs->E.EDI = DwordRegs.Edi;
|
||||
Regs->E.ESI = DwordRegs.Esi;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Template of real mode code.
|
||||
|
||||
@param CodeStart Start address of code.
|
||||
@param CodeEnd End address of code
|
||||
@param ReverseThunkStart Start of reverse thunk.
|
||||
@param IntThunk Low memory thunk.
|
||||
|
||||
**/
|
||||
VOID
|
||||
RealModeTemplate (
|
||||
OUT UINTN *CodeStart,
|
||||
OUT UINTN *CodeEnd,
|
||||
OUT UINTN *ReverseThunkStart,
|
||||
LOW_MEMORY_THUNK *IntThunk
|
||||
)
|
||||
{
|
||||
SAL_RETURN_REGS SalStatus;
|
||||
|
||||
SalStatus = EsalGetReverseThunkAddress ();
|
||||
|
||||
*CodeStart = SalStatus.r9;
|
||||
*CodeEnd = SalStatus.r10;
|
||||
*ReverseThunkStart = SalStatus.r11;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allocate memory < 1 MB and copy the thunker code into low memory. Se up
|
||||
all the descriptors.
|
||||
|
||||
@param Private Private context for Legacy BIOS
|
||||
|
||||
@retval EFI_SUCCESS Should only pass.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyBiosInitializeThunk (
|
||||
IN LEGACY_BIOS_INSTANCE *Private
|
||||
)
|
||||
{
|
||||
GDT32 *CodeGdt;
|
||||
GDT32 *DataGdt;
|
||||
UINTN CodeStart;
|
||||
UINTN CodeEnd;
|
||||
UINTN ReverseThunkStart;
|
||||
UINT32 Base;
|
||||
LOW_MEMORY_THUNK *IntThunk;
|
||||
UINTN TempData;
|
||||
|
||||
ASSERT (Private);
|
||||
|
||||
IntThunk = Private->IntThunk;
|
||||
|
||||
//
|
||||
// Clear the reserved descriptor
|
||||
//
|
||||
ZeroMem (&(IntThunk->RealModeGdt[0]), sizeof (GDT32));
|
||||
|
||||
//
|
||||
// Setup a descriptor for real-mode code
|
||||
//
|
||||
CodeGdt = &(IntThunk->RealModeGdt[1]);
|
||||
|
||||
//
|
||||
// Fill in the descriptor with our real-mode segment value
|
||||
//
|
||||
CodeGdt->Type = 0xA;
|
||||
//
|
||||
// code/read
|
||||
//
|
||||
CodeGdt->System = 1;
|
||||
CodeGdt->Dpl = 0;
|
||||
CodeGdt->Present = 1;
|
||||
CodeGdt->Software = 0;
|
||||
CodeGdt->Reserved = 0;
|
||||
CodeGdt->DefaultSize = 0;
|
||||
//
|
||||
// 16 bit operands
|
||||
//
|
||||
CodeGdt->Granularity = 0;
|
||||
|
||||
CodeGdt->LimitHi = 0;
|
||||
CodeGdt->LimitLo = 0xffff;
|
||||
|
||||
Base = (*((UINT32 *) &IntThunk->Code));
|
||||
CodeGdt->BaseHi = (Base >> 24) & 0xFF;
|
||||
CodeGdt->BaseMid = (Base >> 16) & 0xFF;
|
||||
CodeGdt->BaseLo = Base & 0xFFFF;
|
||||
|
||||
//
|
||||
// Setup a descriptor for read-mode data
|
||||
//
|
||||
DataGdt = &(IntThunk->RealModeGdt[2]);
|
||||
CopyMem (DataGdt, CodeGdt, sizeof (GDT32));
|
||||
|
||||
DataGdt->Type = 0x2;
|
||||
//
|
||||
// read/write data
|
||||
//
|
||||
DataGdt->BaseHi = 0x0;
|
||||
//
|
||||
// Base = 0
|
||||
//
|
||||
DataGdt->BaseMid = 0x0;
|
||||
//
|
||||
DataGdt->BaseLo = 0x0;
|
||||
//
|
||||
DataGdt->LimitHi = 0x0F;
|
||||
//
|
||||
// Limit = 4Gb
|
||||
//
|
||||
DataGdt->LimitLo = 0xFFFF;
|
||||
//
|
||||
DataGdt->Granularity = 0x1;
|
||||
//
|
||||
//
|
||||
// Compute selector value
|
||||
//
|
||||
IntThunk->RealModeGdtDesc.Limit = (UINT16) (sizeof (IntThunk->RealModeGdt) - 1);
|
||||
CopyMem (&IntThunk->RealModeGdtDesc.Base, (UINT32 *) &IntThunk->RealModeGdt, sizeof (UINT32));
|
||||
//
|
||||
// IntThunk->RealModeGdtDesc.Base = *((UINT32*) &IntThunk->RealModeGdt);
|
||||
//
|
||||
IntThunk->RealModeIdtDesc.Limit = 0xFFFF;
|
||||
IntThunk->RealModeIdtDesc.Base = 0;
|
||||
IntThunk->LowCodeSelector = (UINT32) ((UINTN) CodeGdt - IntThunk->RealModeGdtDesc.Base);
|
||||
IntThunk->LowDataSelector = (UINT32) ((UINTN) DataGdt - IntThunk->RealModeGdtDesc.Base);
|
||||
|
||||
//
|
||||
// Initialize low real-mode code thunk
|
||||
//
|
||||
RealModeTemplate (&CodeStart, &CodeEnd, &ReverseThunkStart, IntThunk);
|
||||
|
||||
TempData = (UINTN) &(IntThunk->Code);
|
||||
IntThunk->LowReverseThunkStart = ((UINT32) TempData + (UINT32) (ReverseThunkStart - CodeStart));
|
||||
|
||||
EsalSetSalDataArea (TempData, (UINTN) IntThunk);
|
||||
CopyMem (IntThunk->Code, (VOID *) CodeStart, CodeEnd - CodeStart);
|
||||
|
||||
IntThunk->EfiToLegacy16InitTable.ReverseThunkCallSegment = EFI_SEGMENT (*((UINT32 *) &IntThunk->LowReverseThunkStart));
|
||||
IntThunk->EfiToLegacy16InitTable.ReverseThunkCallOffset = EFI_OFFSET (*((UINT32 *) &IntThunk->LowReverseThunkStart));
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Thunk to 16-bit real mode and execute a software interrupt with a vector
|
||||
of BiosInt. Regs will contain the 16-bit register context on entry and
|
||||
exit.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param BiosInt Processor interrupt vector to invoke
|
||||
@param Regs Register contexted passed into (and returned) from
|
||||
thunk to 16-bit mode
|
||||
|
||||
@retval FALSE Thunk completed, and there were no BIOS errors in the
|
||||
target code. See Regs for status.
|
||||
@retval TRUE There was a BIOS erro in the target code.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
LegacyBiosInt86 (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
IN UINT8 BiosInt,
|
||||
IN EFI_IA32_REGISTER_SET *Regs
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
LEGACY_BIOS_INSTANCE *Private;
|
||||
LOW_MEMORY_THUNK *IntThunk;
|
||||
UINT16 *Stack16;
|
||||
EFI_TPL OriginalTpl;
|
||||
UINTN IaSegment;
|
||||
UINTN IaOffset;
|
||||
UINTN *Address;
|
||||
UINTN TempData;
|
||||
|
||||
Private = LEGACY_BIOS_INSTANCE_FROM_THIS (This);
|
||||
IntThunk = Private->IntThunk;
|
||||
|
||||
//
|
||||
// Get the current flat GDT, IDT, and SS and store them in Private->IntThunk.
|
||||
//
|
||||
Status = LegacyBiosGetFlatDescs (Private);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Regs->X.Flags.Reserved1 = 1;
|
||||
Regs->X.Flags.Reserved2 = 0;
|
||||
Regs->X.Flags.Reserved3 = 0;
|
||||
Regs->X.Flags.Reserved4 = 0;
|
||||
Regs->X.Flags.IOPL = 3;
|
||||
Regs->X.Flags.NT = 0;
|
||||
Regs->X.Flags.IF = 1;
|
||||
Regs->X.Flags.TF = 0;
|
||||
Regs->X.Flags.CF = 0;
|
||||
//
|
||||
// Clear the error flag; thunk code may set it.
|
||||
//
|
||||
Stack16 = (UINT16 *) (IntThunk->Stack + LOW_STACK_SIZE);
|
||||
|
||||
//
|
||||
// Copy regs to low memory stack
|
||||
//
|
||||
Stack16 -= sizeof (EFI_IA32_REGISTER_SET) / sizeof (UINT16);
|
||||
CopyMem (Stack16, Regs, sizeof (EFI_IA32_REGISTER_SET));
|
||||
|
||||
//
|
||||
// Provide low stack esp
|
||||
//
|
||||
TempData = ((UINTN) Stack16) - ((UINTN) IntThunk);
|
||||
IntThunk->LowStack = *((UINT32 *) &TempData);
|
||||
|
||||
//
|
||||
// Stack for reverse thunk flat mode.
|
||||
// It must point to top of stack (end of stack space).
|
||||
//
|
||||
TempData = ((UINTN) IntThunk->RevThunkStack) + LOW_STACK_SIZE;
|
||||
IntThunk->RevFlatStack = *((UINT32 *) &TempData);
|
||||
|
||||
//
|
||||
// The call to Legacy16 is a critical section to EFI
|
||||
//
|
||||
OriginalTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
|
||||
|
||||
//
|
||||
// Set Legacy16 state. 0x08, 0x70 is legacy 8259 vector bases.
|
||||
//
|
||||
Status = Private->Legacy8259->SetMode (Private->Legacy8259, Efi8259LegacyMode, NULL, NULL);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Call the real mode thunk code
|
||||
//
|
||||
TempData = BiosInt * 4;
|
||||
Address = (UINTN *) TempData;
|
||||
IaOffset = 0xFFFF & (*Address);
|
||||
IaSegment = 0xFFFF & ((*Address) >> 16);
|
||||
|
||||
Status = BiosIntCall (
|
||||
BiosInt,
|
||||
(UINT16) IaSegment,
|
||||
(UINT16) IaOffset,
|
||||
(EFI_IA32_REGISTER_SET *) Stack16,
|
||||
IntThunk,
|
||||
IntThunk->LowStack
|
||||
);
|
||||
|
||||
//
|
||||
// Check for errors with the thunk
|
||||
//
|
||||
switch (Status) {
|
||||
case THUNK_OK:
|
||||
break;
|
||||
|
||||
case THUNK_ERR_A20_UNSUP:
|
||||
case THUNK_ERR_A20_FAILED:
|
||||
default:
|
||||
//
|
||||
// For all errors, set EFLAGS.CF (used by legacy BIOS to indicate error).
|
||||
//
|
||||
Regs->X.Flags.CF = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
Status = Private->Legacy8259->SetMode (Private->Legacy8259, Efi8259ProtectedMode, NULL, NULL);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// End critical section
|
||||
//
|
||||
gBS->RestoreTPL (OriginalTpl);
|
||||
|
||||
//
|
||||
// Return the resulting registers
|
||||
//
|
||||
CopyMem (Regs, Stack16, sizeof (EFI_IA32_REGISTER_SET));
|
||||
|
||||
return (BOOLEAN) (Regs->X.Flags.CF != 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Thunk to 16-bit real mode and call Segment:Offset. Regs will contain the
|
||||
16-bit register context on entry and exit. Arguments can be passed on
|
||||
the Stack argument
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param Segment Segemnt of 16-bit mode call
|
||||
@param Offset Offset of 16-bit mdoe call
|
||||
@param Regs Register contexted passed into (and returned) from
|
||||
thunk to 16-bit mode
|
||||
@param Stack Caller allocated stack used to pass arguments
|
||||
@param StackSize Size of Stack in bytes
|
||||
|
||||
@retval FALSE Thunk completed, and there were no BIOS errors in the
|
||||
target code. See Regs for status.
|
||||
@retval TRUE There was a BIOS erro in the target code.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
LegacyBiosFarCall86 (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
IN UINT16 Segment,
|
||||
IN UINT16 Offset,
|
||||
IN EFI_IA32_REGISTER_SET *Regs,
|
||||
IN VOID *Stack,
|
||||
IN UINTN StackSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
LEGACY_BIOS_INSTANCE *Private;
|
||||
LOW_MEMORY_THUNK *IntThunk;
|
||||
UINT16 *Stack16;
|
||||
EFI_TPL OriginalTpl;
|
||||
UINTN IaSegment;
|
||||
UINTN IaOffset;
|
||||
UINTN TempData;
|
||||
|
||||
Private = LEGACY_BIOS_INSTANCE_FROM_THIS (This);
|
||||
IntThunk = Private->IntThunk;
|
||||
IaSegment = Segment;
|
||||
IaOffset = Offset;
|
||||
|
||||
//
|
||||
// Get the current flat GDT and IDT and store them in Private->IntThunk.
|
||||
//
|
||||
Status = LegacyBiosGetFlatDescs (Private);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Regs->X.Flags.Reserved1 = 1;
|
||||
Regs->X.Flags.Reserved2 = 0;
|
||||
Regs->X.Flags.Reserved3 = 0;
|
||||
Regs->X.Flags.Reserved4 = 0;
|
||||
Regs->X.Flags.IOPL = 3;
|
||||
Regs->X.Flags.NT = 0;
|
||||
Regs->X.Flags.IF = 1;
|
||||
Regs->X.Flags.TF = 0;
|
||||
Regs->X.Flags.CF = 0;
|
||||
//
|
||||
// Clear the error flag; thunk code may set it.
|
||||
//
|
||||
Stack16 = (UINT16 *) (IntThunk->Stack + LOW_STACK_SIZE);
|
||||
if (Stack != NULL && StackSize != 0) {
|
||||
//
|
||||
// Copy Stack to low memory stack
|
||||
//
|
||||
Stack16 -= StackSize / sizeof (UINT16);
|
||||
CopyMem (Stack16, Stack, StackSize);
|
||||
}
|
||||
//
|
||||
// Copy regs to low memory stack
|
||||
//
|
||||
Stack16 -= sizeof (EFI_IA32_REGISTER_SET) / sizeof (UINT16);
|
||||
CopyMem (Stack16, Regs, sizeof (EFI_IA32_REGISTER_SET));
|
||||
|
||||
//
|
||||
// Provide low stack esp
|
||||
//
|
||||
TempData = ((UINTN) Stack16) - ((UINTN) IntThunk);
|
||||
IntThunk->LowStack = *((UINT32 *) &TempData);
|
||||
|
||||
//
|
||||
// The call to Legacy16 is a critical section to EFI
|
||||
//
|
||||
OriginalTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
|
||||
|
||||
//
|
||||
// Set Legacy16 state. 0x08, 0x70 is legacy 8259 vector bases.
|
||||
//
|
||||
Status = Private->Legacy8259->SetMode (Private->Legacy8259, Efi8259LegacyMode, NULL, NULL);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Call the real mode thunk code
|
||||
//
|
||||
Status = BiosIntCall (
|
||||
0x100,
|
||||
(UINT16) IaSegment,
|
||||
(UINT16) IaOffset,
|
||||
(EFI_IA32_REGISTER_SET *) Stack16,
|
||||
IntThunk,
|
||||
IntThunk->LowStack
|
||||
);
|
||||
|
||||
//
|
||||
// Check for errors with the thunk
|
||||
//
|
||||
switch (Status) {
|
||||
case THUNK_OK:
|
||||
break;
|
||||
|
||||
case THUNK_ERR_A20_UNSUP:
|
||||
case THUNK_ERR_A20_FAILED:
|
||||
default:
|
||||
//
|
||||
// For all errors, set EFLAGS.CF (used by legacy BIOS to indicate error).
|
||||
//
|
||||
Regs->X.Flags.CF = 1;
|
||||
break;
|
||||
}
|
||||
//
|
||||
// Restore protected mode interrupt state
|
||||
//
|
||||
Status = Private->Legacy8259->SetMode (Private->Legacy8259, Efi8259ProtectedMode, NULL, NULL);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// End critical section
|
||||
//
|
||||
gBS->RestoreTPL (OriginalTpl);
|
||||
|
||||
//
|
||||
// Return the resulting registers
|
||||
//
|
||||
CopyMem (Regs, Stack16, sizeof (EFI_IA32_REGISTER_SET));
|
||||
Stack16 += sizeof (EFI_IA32_REGISTER_SET) / sizeof (UINT16);
|
||||
|
||||
if (Stack != NULL && StackSize != 0) {
|
||||
//
|
||||
// Copy low memory stack to Stack
|
||||
//
|
||||
CopyMem (Stack, Stack16, StackSize);
|
||||
Stack16 += StackSize / sizeof (UINT16);
|
||||
}
|
||||
|
||||
return (BOOLEAN) (Regs->X.Flags.CF != 0);
|
||||
}
|
|
@ -0,0 +1,384 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2006 - 2011, 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 "LegacyBiosInterface.h"
|
||||
#include <IndustryStandard/Pci.h>
|
||||
|
||||
// Give floppy 3 states
|
||||
// FLOPPY_PRESENT_WITH_MEDIA = Floppy controller present and media is inserted
|
||||
// FLOPPY_NOT_PRESENT = No floppy controller present
|
||||
// FLOPPY_PRESENT_NO_MEDIA = Floppy controller present but no media inserted
|
||||
//
|
||||
#define FLOPPY_NOT_PRESENT 0
|
||||
#define FLOPPY_PRESENT_WITH_MEDIA 1
|
||||
#define FLOPPY_PRESENT_NO_MEDIA 2
|
||||
|
||||
BBS_TABLE *mBbsTable;
|
||||
BOOLEAN mBbsTableDoneFlag = FALSE;
|
||||
BOOLEAN IsHaveMediaInFloppy = TRUE;
|
||||
|
||||
/**
|
||||
Checks the state of the floppy and if media is inserted.
|
||||
|
||||
This routine checks the state of the floppy and if media is inserted.
|
||||
There are 3 cases:
|
||||
No floppy present - Set BBS entry to ignore
|
||||
Floppy present & no media - Set BBS entry to lowest priority. We cannot
|
||||
set it to ignore since 16-bit CSM will
|
||||
indicate no floppy and thus drive A: is
|
||||
unusable. CSM-16 will not try floppy since
|
||||
lowest priority and thus not incur boot
|
||||
time penality.
|
||||
Floppy present & media - Set BBS entry to some priority.
|
||||
|
||||
@return State of floppy media
|
||||
|
||||
**/
|
||||
UINT8
|
||||
HasMediaInFloppy (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN HandleCount;
|
||||
EFI_HANDLE *HandleBuffer;
|
||||
UINTN Index;
|
||||
EFI_ISA_IO_PROTOCOL *IsaIo;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlkIo;
|
||||
|
||||
HandleBuffer = NULL;
|
||||
HandleCount = 0;
|
||||
|
||||
gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiIsaIoProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
|
||||
//
|
||||
// If don't find any ISA/IO protocol assume no floppy. Need for floppy
|
||||
// free system
|
||||
//
|
||||
if (HandleCount == 0) {
|
||||
return FLOPPY_NOT_PRESENT;
|
||||
}
|
||||
|
||||
ASSERT (HandleBuffer != NULL);
|
||||
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
Status = gBS->HandleProtocol (
|
||||
HandleBuffer[Index],
|
||||
&gEfiIsaIoProtocolGuid,
|
||||
(VOID **) &IsaIo
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (IsaIo->ResourceList->Device.HID != EISA_PNP_ID (0x604)) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
// Update blockio in case the floppy is inserted in during BdsTimeout
|
||||
//
|
||||
Status = gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = gBS->HandleProtocol (
|
||||
HandleBuffer[Index],
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlkIo
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (BlkIo->Media->MediaPresent) {
|
||||
FreePool (HandleBuffer);
|
||||
return FLOPPY_PRESENT_WITH_MEDIA;
|
||||
} else {
|
||||
FreePool (HandleBuffer);
|
||||
return FLOPPY_PRESENT_NO_MEDIA;
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (HandleBuffer);
|
||||
|
||||
return FLOPPY_NOT_PRESENT;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Complete build of BBS TABLE.
|
||||
|
||||
@param Private Legacy BIOS Instance data
|
||||
@param BbsTable BBS Table passed to 16-bit code
|
||||
|
||||
@retval EFI_SUCCESS Removable media not present
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyBiosBuildBbs (
|
||||
IN LEGACY_BIOS_INSTANCE *Private,
|
||||
IN BBS_TABLE *BbsTable
|
||||
)
|
||||
{
|
||||
UINTN BbsIndex;
|
||||
HDD_INFO *HddInfo;
|
||||
UINTN HddIndex;
|
||||
UINTN Index;
|
||||
|
||||
//
|
||||
// First entry is floppy.
|
||||
// Next 2*MAX_IDE_CONTROLLER entries are for onboard IDE.
|
||||
// Next n entries are filled in after each ROM is dispatched.
|
||||
// Entry filled in if follow BBS spec. See LegacyPci.c
|
||||
// Next entries are for non-BBS compliant ROMS. They are filled in by
|
||||
// 16-bit code during Legacy16UpdateBbs invocation. Final BootPriority
|
||||
// occurs after that invocation.
|
||||
//
|
||||
// Floppy
|
||||
// Set default state.
|
||||
//
|
||||
IsHaveMediaInFloppy = HasMediaInFloppy ();
|
||||
if (IsHaveMediaInFloppy == FLOPPY_PRESENT_WITH_MEDIA) {
|
||||
BbsTable[0].BootPriority = BBS_UNPRIORITIZED_ENTRY;
|
||||
} else {
|
||||
if (IsHaveMediaInFloppy == FLOPPY_PRESENT_NO_MEDIA) {
|
||||
BbsTable[0].BootPriority = BBS_LOWEST_PRIORITY;
|
||||
} else {
|
||||
BbsTable[0].BootPriority = BBS_IGNORE_ENTRY;
|
||||
}
|
||||
}
|
||||
|
||||
BbsTable[0].Bus = 0xff;
|
||||
BbsTable[0].Device = 0xff;
|
||||
BbsTable[0].Function = 0xff;
|
||||
BbsTable[0].DeviceType = BBS_FLOPPY;
|
||||
BbsTable[0].Class = 01;
|
||||
BbsTable[0].SubClass = 02;
|
||||
BbsTable[0].StatusFlags.OldPosition = 0;
|
||||
BbsTable[0].StatusFlags.Reserved1 = 0;
|
||||
BbsTable[0].StatusFlags.Enabled = 0;
|
||||
BbsTable[0].StatusFlags.Failed = 0;
|
||||
BbsTable[0].StatusFlags.MediaPresent = 0;
|
||||
BbsTable[0].StatusFlags.Reserved2 = 0;
|
||||
|
||||
//
|
||||
// Onboard HDD - Note Each HDD controller controls 2 drives
|
||||
// Master & Slave
|
||||
//
|
||||
HddInfo = &Private->IntThunk->EfiToLegacy16BootTable.HddInfo[0];
|
||||
//
|
||||
// Get IDE Drive Info
|
||||
//
|
||||
LegacyBiosBuildIdeData (Private, &HddInfo, 0);
|
||||
|
||||
for (HddIndex = 0; HddIndex < MAX_IDE_CONTROLLER; HddIndex++) {
|
||||
|
||||
BbsIndex = HddIndex * 2 + 1;
|
||||
for (Index = 0; Index < 2; ++Index) {
|
||||
|
||||
BbsTable[BbsIndex + Index].Bus = HddInfo[HddIndex].Bus;
|
||||
BbsTable[BbsIndex + Index].Device = HddInfo[HddIndex].Device;
|
||||
BbsTable[BbsIndex + Index].Function = HddInfo[HddIndex].Function;
|
||||
BbsTable[BbsIndex + Index].Class = 01;
|
||||
BbsTable[BbsIndex + Index].SubClass = 01;
|
||||
BbsTable[BbsIndex + Index].StatusFlags.OldPosition = 0;
|
||||
BbsTable[BbsIndex + Index].StatusFlags.Reserved1 = 0;
|
||||
BbsTable[BbsIndex + Index].StatusFlags.Enabled = 0;
|
||||
BbsTable[BbsIndex + Index].StatusFlags.Failed = 0;
|
||||
BbsTable[BbsIndex + Index].StatusFlags.MediaPresent = 0;
|
||||
BbsTable[BbsIndex + Index].StatusFlags.Reserved2 = 0;
|
||||
|
||||
//
|
||||
// If no controller found or no device found set to ignore
|
||||
// else set to unprioritized and set device type
|
||||
//
|
||||
if (HddInfo[HddIndex].CommandBaseAddress == 0) {
|
||||
BbsTable[BbsIndex + Index].BootPriority = BBS_IGNORE_ENTRY;
|
||||
} else {
|
||||
if (Index == 0) {
|
||||
if ((HddInfo[HddIndex].Status & (HDD_MASTER_IDE | HDD_MASTER_ATAPI_CDROM | HDD_MASTER_ATAPI_ZIPDISK)) != 0) {
|
||||
BbsTable[BbsIndex + Index].BootPriority = BBS_UNPRIORITIZED_ENTRY;
|
||||
if ((HddInfo[HddIndex].Status & HDD_MASTER_IDE) != 0) {
|
||||
BbsTable[BbsIndex + Index].DeviceType = BBS_HARDDISK;
|
||||
} else if ((HddInfo[HddIndex].Status & HDD_MASTER_ATAPI_CDROM) != 0) {
|
||||
BbsTable[BbsIndex + Index].DeviceType = BBS_CDROM;
|
||||
} else {
|
||||
//
|
||||
// for ZIPDISK
|
||||
//
|
||||
BbsTable[BbsIndex + Index].DeviceType = BBS_HARDDISK;
|
||||
}
|
||||
} else {
|
||||
BbsTable[BbsIndex + Index].BootPriority = BBS_IGNORE_ENTRY;
|
||||
}
|
||||
} else {
|
||||
if ((HddInfo[HddIndex].Status & (HDD_SLAVE_IDE | HDD_SLAVE_ATAPI_CDROM | HDD_SLAVE_ATAPI_ZIPDISK)) != 0) {
|
||||
BbsTable[BbsIndex + Index].BootPriority = BBS_UNPRIORITIZED_ENTRY;
|
||||
if ((HddInfo[HddIndex].Status & HDD_SLAVE_IDE) != 0) {
|
||||
BbsTable[BbsIndex + Index].DeviceType = BBS_HARDDISK;
|
||||
} else if ((HddInfo[HddIndex].Status & HDD_SLAVE_ATAPI_CDROM) != 0) {
|
||||
BbsTable[BbsIndex + Index].DeviceType = BBS_CDROM;
|
||||
} else {
|
||||
//
|
||||
// for ZIPDISK
|
||||
//
|
||||
BbsTable[BbsIndex + Index].DeviceType = BBS_HARDDISK;
|
||||
}
|
||||
} else {
|
||||
BbsTable[BbsIndex + Index].BootPriority = BBS_IGNORE_ENTRY;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Get all BBS info
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param HddCount Number of HDD_INFO structures
|
||||
@param HddInfo Onboard IDE controller information
|
||||
@param BbsCount Number of BBS_TABLE structures
|
||||
@param BbsTable List BBS entries
|
||||
|
||||
@retval EFI_SUCCESS Tables returned
|
||||
@retval EFI_NOT_FOUND resource not found
|
||||
@retval EFI_DEVICE_ERROR can not get BBS table
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
LegacyBiosGetBbsInfo (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
OUT UINT16 *HddCount,
|
||||
OUT HDD_INFO **HddInfo,
|
||||
OUT UINT16 *BbsCount,
|
||||
OUT BBS_TABLE **BbsTable
|
||||
)
|
||||
{
|
||||
LEGACY_BIOS_INSTANCE *Private;
|
||||
EFI_IA32_REGISTER_SET Regs;
|
||||
EFI_TO_COMPATIBILITY16_BOOT_TABLE *EfiToLegacy16BootTable;
|
||||
// HDD_INFO *LocalHddInfo;
|
||||
// IN BBS_TABLE *LocalBbsTable;
|
||||
UINTN NumHandles;
|
||||
EFI_HANDLE *HandleBuffer;
|
||||
UINTN Index;
|
||||
UINTN TempData;
|
||||
UINT32 Granularity;
|
||||
|
||||
HandleBuffer = NULL;
|
||||
|
||||
Private = LEGACY_BIOS_INSTANCE_FROM_THIS (This);
|
||||
EfiToLegacy16BootTable = &Private->IntThunk->EfiToLegacy16BootTable;
|
||||
// LocalHddInfo = EfiToLegacy16BootTable->HddInfo;
|
||||
// LocalBbsTable = (BBS_TABLE*)(UINTN)EfiToLegacy16BootTable->BbsTable;
|
||||
|
||||
if (!mBbsTableDoneFlag) {
|
||||
mBbsTable = Private->BbsTablePtr;
|
||||
|
||||
//
|
||||
// Always enable disk controllers so 16-bit CSM code has valid information for all
|
||||
// drives.
|
||||
//
|
||||
//
|
||||
// Get PciRootBridgeIO protocol
|
||||
//
|
||||
gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiPciRootBridgeIoProtocolGuid,
|
||||
NULL,
|
||||
&NumHandles,
|
||||
&HandleBuffer
|
||||
);
|
||||
|
||||
if (NumHandles == 0) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
mBbsTableDoneFlag = TRUE;
|
||||
for (Index = 0; Index < NumHandles; Index++) {
|
||||
//
|
||||
// Connect PciRootBridgeIO protocol handle with FALSE parameter to let
|
||||
// PCI bus driver enumerate all subsequent handles
|
||||
//
|
||||
gBS->ConnectController (HandleBuffer[Index], NULL, NULL, FALSE);
|
||||
|
||||
}
|
||||
|
||||
LegacyBiosBuildBbs (Private, mBbsTable);
|
||||
|
||||
Private->LegacyRegion->UnLock (Private->LegacyRegion, 0xe0000, 0x20000, &Granularity);
|
||||
|
||||
//
|
||||
// Call into Legacy16 code to add to BBS table for non BBS compliant OPROMs.
|
||||
//
|
||||
ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET));
|
||||
Regs.X.AX = Legacy16UpdateBbs;
|
||||
|
||||
//
|
||||
// Pass in handoff data
|
||||
//
|
||||
TempData = (UINTN) EfiToLegacy16BootTable;
|
||||
Regs.X.ES = EFI_SEGMENT ((UINT32) TempData);
|
||||
Regs.X.BX = EFI_OFFSET ((UINT32) TempData);
|
||||
|
||||
Private->LegacyBios.FarCall86 (
|
||||
This,
|
||||
Private->Legacy16CallSegment,
|
||||
Private->Legacy16CallOffset,
|
||||
&Regs,
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
||||
Private->Cpu->FlushDataCache (Private->Cpu, 0xE0000, 0x20000, EfiCpuFlushTypeWriteBackInvalidate);
|
||||
Private->LegacyRegion->Lock (Private->LegacyRegion, 0xe0000, 0x20000, &Granularity);
|
||||
|
||||
if (Regs.X.AX != 0) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if (HandleBuffer != NULL) {
|
||||
FreePool (HandleBuffer);
|
||||
}
|
||||
|
||||
*HddCount = MAX_IDE_CONTROLLER;
|
||||
*HddInfo = EfiToLegacy16BootTable->HddInfo;
|
||||
*BbsTable = (BBS_TABLE*)(UINTN)EfiToLegacy16BootTable->BbsTable;
|
||||
*BbsCount = (UINT16) (sizeof (Private->IntThunk->BbsTable) / sizeof (BBS_TABLE));
|
||||
return EFI_SUCCESS;
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
/** @file
|
||||
This code fills in BDA (0x400) and EBDA (pointed to by 0x4xx)
|
||||
information. There is support for doing initializeation before
|
||||
Legacy16 is loaded and before a legacy boot is attempted.
|
||||
|
||||
Copyright (c) 2006 - 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 "LegacyBiosInterface.h"
|
||||
|
||||
/**
|
||||
Fill in the standard BDA and EBDA stuff before Legacy16 load
|
||||
|
||||
@param Private Legacy BIOS Instance data
|
||||
|
||||
@retval EFI_SUCCESS It should always work.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyBiosInitBda (
|
||||
IN LEGACY_BIOS_INSTANCE *Private
|
||||
)
|
||||
{
|
||||
BDA_STRUC *Bda;
|
||||
UINT8 *Ebda;
|
||||
|
||||
Bda = (BDA_STRUC *) ((UINTN) 0x400);
|
||||
Ebda = (UINT8 *) ((UINTN) 0x9fc00);
|
||||
|
||||
ZeroMem (Bda, 0x100);
|
||||
ZeroMem (Ebda, 0x400);
|
||||
//
|
||||
// 640k-1k for EBDA
|
||||
//
|
||||
Bda->MemSize = 0x27f;
|
||||
Bda->KeyHead = 0x1e;
|
||||
Bda->KeyTail = 0x1e;
|
||||
Bda->FloppyData = 0x00;
|
||||
Bda->FloppyTimeout = 0xff;
|
||||
|
||||
Bda->KeyStart = 0x001E;
|
||||
Bda->KeyEnd = 0x003E;
|
||||
Bda->KeyboardStatus = 0x10;
|
||||
Bda->Ebda = 0x9fc0;
|
||||
|
||||
//
|
||||
// Move LPT time out here and zero out LPT4 since some SCSI OPROMS
|
||||
// use this as scratch pad (LPT4 is Reserved)
|
||||
//
|
||||
Bda->Lpt1_2Timeout = 0x1414;
|
||||
Bda->Lpt3_4Timeout = 0x1400;
|
||||
|
||||
*Ebda = 0x01;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,143 @@
|
|||
## @file
|
||||
# Legacy Bios Module to support CSM.
|
||||
#
|
||||
# This driver installs Legacy Bios Protocol to support CSM module work in EFI system.
|
||||
#
|
||||
# Copyright (c) 2006 - 2011, 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]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = LegacyBiosDxe
|
||||
FILE_GUID = F122A15C-C10B-4d54-8F48-60F4F06DD1AD
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
|
||||
ENTRY_POINT = LegacyBiosInstall
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF
|
||||
#
|
||||
|
||||
[Sources]
|
||||
LegacyCmos.c
|
||||
LegacyIde.c
|
||||
LegacyBios.c
|
||||
LegacyBda.c
|
||||
LegacyBiosInterface.h
|
||||
LegacyPci.c
|
||||
|
||||
[Sources.Ia32]
|
||||
IA32/InterruptTable.S
|
||||
IA32/InterruptTable.asm
|
||||
Thunk.c
|
||||
LegacyBootSupport.c
|
||||
LegacyBbs.c
|
||||
LegacySio.c
|
||||
|
||||
[Sources.X64]
|
||||
X64/InterruptTable.asm
|
||||
X64/InterruptTable.S
|
||||
Thunk.c
|
||||
LegacyBootSupport.c
|
||||
LegacyBbs.c
|
||||
LegacySio.c
|
||||
|
||||
[Sources.IPF]
|
||||
Ipf/IpfThunk.s
|
||||
Ipf/Thunk.c
|
||||
Ipf/IpfThunk.i
|
||||
Ipf/IpfBootSupport.c
|
||||
Ipf/IpfThunk.h
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
|
||||
|
||||
|
||||
[LibraryClasses]
|
||||
DevicePathLib
|
||||
UefiBootServicesTableLib
|
||||
MemoryAllocationLib
|
||||
UefiDriverEntryPoint
|
||||
BaseMemoryLib
|
||||
UefiLib
|
||||
DebugLib
|
||||
DxeServicesTableLib
|
||||
PcdLib
|
||||
ReportStatusCodeLib
|
||||
PeCoffLib
|
||||
CacheMaintenanceLib
|
||||
DebugAgentLib
|
||||
|
||||
[LibraryClasses.IA32]
|
||||
IoLib
|
||||
HobLib
|
||||
UefiRuntimeServicesTableLib
|
||||
BaseLib
|
||||
|
||||
[LibraryClasses.X64]
|
||||
IoLib
|
||||
HobLib
|
||||
UefiRuntimeServicesTableLib
|
||||
BaseLib
|
||||
|
||||
[LibraryClasses.IPF]
|
||||
IoLib
|
||||
UefiRuntimeServicesTableLib
|
||||
|
||||
|
||||
[Guids]
|
||||
gEfiDiskInfoIdeInterfaceGuid # ALWAYS_CONSUMED
|
||||
gEfiLegacyBiosGuid # ALWAYS_PRODUCED
|
||||
|
||||
[Guids.IA32]
|
||||
gEfiSmbiosTableGuid # ALWAYS_CONSUMED
|
||||
gEfiAcpi20TableGuid # ALWAYS_CONSUMED
|
||||
gEfiAcpi10TableGuid # ALWAYS_CONSUMED
|
||||
|
||||
[Guids.X64]
|
||||
gEfiSmbiosTableGuid # ALWAYS_CONSUMED
|
||||
gEfiAcpi20TableGuid # ALWAYS_CONSUMED
|
||||
gEfiAcpi10TableGuid # ALWAYS_CONSUMED
|
||||
|
||||
|
||||
[Protocols]
|
||||
gEfiLoadedImageProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiPciRootBridgeIoProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiCpuArchProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiIsaIoProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiBlockIoProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiPciIoProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiGenericMemTestProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiDiskInfoProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiSimpleTextInProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiLegacy8259ProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiLegacyBiosPlatformProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiLegacyInterruptProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiLegacyRegion2ProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||
gEfiLegacyBiosProtocolGuid # PROTOCOL ALWAYS_PRODUCED
|
||||
gEfiTimerArchProtocolGuid # PROTOCOL ALWAYS_PRODUCED
|
||||
|
||||
[Pcd]
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLegacyBiosCacheLegacyRegion
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdEbdaReservedMemorySize
|
||||
|
||||
[Depex]
|
||||
gEfiLegacyRegion2ProtocolGuid AND gEfiLegacyInterruptProtocolGuid AND gEfiLegacyBiosPlatformProtocolGuid AND gEfiLegacy8259ProtocolGuid AND gEfiGenericMemTestProtocolGuid AND gEfiCpuArchProtocolGuid
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,124 @@
|
|||
/** @file
|
||||
This code fills in standard CMOS values and updates the standard CMOS
|
||||
checksum. The Legacy16 code or LegacyBiosPlatform.c is responsible for
|
||||
non-standard CMOS locations and non-standard checksums.
|
||||
|
||||
Copyright (c) 2006 - 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 "LegacyBiosInterface.h"
|
||||
|
||||
/**
|
||||
Read CMOS register through index/data port.
|
||||
|
||||
@param[in] Index The index of the CMOS register to read.
|
||||
|
||||
@return The data value from the CMOS register specified by Index.
|
||||
|
||||
**/
|
||||
UINT8
|
||||
LegacyReadStandardCmos (
|
||||
IN UINT8 Index
|
||||
)
|
||||
{
|
||||
IoWrite8 (PORT_70, Index);
|
||||
return IoRead8 (PORT_71);
|
||||
}
|
||||
|
||||
/**
|
||||
Write CMOS register through index/data port.
|
||||
|
||||
@param[in] Index The index of the CMOS register to write.
|
||||
@param[in] Value The value of CMOS register to write.
|
||||
|
||||
@return The value written to the CMOS register specified by Index.
|
||||
|
||||
**/
|
||||
UINT8
|
||||
LegacyWriteStandardCmos (
|
||||
IN UINT8 Index,
|
||||
IN UINT8 Value
|
||||
)
|
||||
{
|
||||
IoWrite8 (PORT_70, Index);
|
||||
return IoWrite8 (PORT_71, Value);
|
||||
}
|
||||
|
||||
/**
|
||||
Calculate the new standard CMOS checksum and write it.
|
||||
|
||||
@param Private Legacy BIOS Instance data
|
||||
|
||||
@retval EFI_SUCCESS Calculate 16-bit checksum successfully
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyCalculateWriteStandardCmosChecksum (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINT8 Register;
|
||||
UINT16 Checksum;
|
||||
|
||||
for (Checksum = 0, Register = 0x10; Register < 0x2e; Register++) {
|
||||
Checksum = (UINT16)(Checksum + LegacyReadStandardCmos (Register));
|
||||
}
|
||||
LegacyWriteStandardCmos (CMOS_2E, (UINT8)(Checksum >> 8));
|
||||
LegacyWriteStandardCmos (CMOS_2F, (UINT8)(Checksum & 0xff));
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Fill in the standard CMOS stuff before Legacy16 load
|
||||
|
||||
@param Private Legacy BIOS Instance data
|
||||
|
||||
@retval EFI_SUCCESS It should always work.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyBiosInitCmos (
|
||||
IN LEGACY_BIOS_INSTANCE *Private
|
||||
)
|
||||
{
|
||||
UINT32 Size;
|
||||
|
||||
//
|
||||
// Clear all errors except RTC lost power
|
||||
//
|
||||
LegacyWriteStandardCmos (CMOS_0E, (UINT8)(LegacyReadStandardCmos (CMOS_0E) & BIT7));
|
||||
|
||||
//
|
||||
// Update CMOS locations 15,16,17,18,30,31 and 32
|
||||
// CMOS 16,15 = 640Kb = 0x280
|
||||
// CMOS 18,17 = 31,30 = 15Mb max in 1Kb increments =0x3C00 max
|
||||
// CMOS 32 = 0x20
|
||||
//
|
||||
LegacyWriteStandardCmos (CMOS_15, 0x80);
|
||||
LegacyWriteStandardCmos (CMOS_16, 0x02);
|
||||
|
||||
Size = 15 * SIZE_1MB;
|
||||
if (Private->IntThunk->EfiToLegacy16InitTable.OsMemoryAbove1Mb < (15 * SIZE_1MB)) {
|
||||
Size = Private->IntThunk->EfiToLegacy16InitTable.OsMemoryAbove1Mb >> 10;
|
||||
}
|
||||
|
||||
LegacyWriteStandardCmos (CMOS_17, (UINT8)(Size & 0xFF));
|
||||
LegacyWriteStandardCmos (CMOS_30, (UINT8)(Size & 0xFF));
|
||||
LegacyWriteStandardCmos (CMOS_18, (UINT8)(Size >> 8));
|
||||
LegacyWriteStandardCmos (CMOS_31, (UINT8)(Size >> 8));
|
||||
|
||||
LegacyCalculateWriteStandardCmosChecksum ();
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
|
@ -0,0 +1,300 @@
|
|||
/** @file
|
||||
Collect IDE information from Native EFI Driver
|
||||
|
||||
Copyright (c) 2006 - 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 "LegacyBiosInterface.h"
|
||||
|
||||
BOOLEAN mIdeDataBuiltFlag = FALSE;
|
||||
|
||||
/**
|
||||
Collect IDE Inquiry data from the IDE disks
|
||||
|
||||
@param Private Legacy BIOS Instance data
|
||||
@param HddInfo Hdd Information
|
||||
@param Flag Reconnect IdeController or not
|
||||
|
||||
@retval EFI_SUCCESS It should always work.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyBiosBuildIdeData (
|
||||
IN LEGACY_BIOS_INSTANCE *Private,
|
||||
IN HDD_INFO **HddInfo,
|
||||
IN UINT16 Flag
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE IdeController;
|
||||
UINTN HandleCount;
|
||||
EFI_HANDLE *HandleBuffer;
|
||||
UINTN Index;
|
||||
EFI_DISK_INFO_PROTOCOL *DiskInfo;
|
||||
UINT32 IdeChannel;
|
||||
UINT32 IdeDevice;
|
||||
UINT32 Size;
|
||||
UINT8 *InquiryData;
|
||||
UINT32 InquiryDataSize;
|
||||
HDD_INFO *LocalHddInfo;
|
||||
UINT32 PciIndex;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePathNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePathNode;
|
||||
PCI_DEVICE_PATH *PciDevicePath;
|
||||
|
||||
//
|
||||
// Only build data once
|
||||
// We have a problem with GetBbsInfo in that it can be invoked two
|
||||
// places. Once in BDS, when all EFI drivers are connected and once in
|
||||
// LegacyBoot after all EFI drivers are disconnected causing this routine
|
||||
// to hang. In LegacyBoot this function is also called before EFI drivers
|
||||
// are disconnected.
|
||||
// Cases covered
|
||||
// GetBbsInfo invoked in BDS. Both invocations in LegacyBoot ignored.
|
||||
// GetBbsInfo not invoked in BDS. First invocation of this function
|
||||
// proceeds normally and second via GetBbsInfo ignored.
|
||||
//
|
||||
PciDevicePath = NULL;
|
||||
LocalHddInfo = *HddInfo;
|
||||
Status = Private->LegacyBiosPlatform->GetPlatformHandle (
|
||||
Private->LegacyBiosPlatform,
|
||||
EfiGetPlatformIdeHandle,
|
||||
0,
|
||||
&HandleBuffer,
|
||||
&HandleCount,
|
||||
(VOID *) &LocalHddInfo
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
IdeController = HandleBuffer[0];
|
||||
//
|
||||
// Force IDE drive spin up!
|
||||
//
|
||||
if (Flag != 0) {
|
||||
gBS->DisconnectController (
|
||||
IdeController,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
||||
gBS->ConnectController (IdeController, NULL, NULL, FALSE);
|
||||
|
||||
//
|
||||
// Do GetIdeHandle twice since disconnect/reconnect will switch to native mode
|
||||
// And GetIdeHandle will switch to Legacy mode, if required.
|
||||
//
|
||||
Private->LegacyBiosPlatform->GetPlatformHandle (
|
||||
Private->LegacyBiosPlatform,
|
||||
EfiGetPlatformIdeHandle,
|
||||
0,
|
||||
&HandleBuffer,
|
||||
&HandleCount,
|
||||
(VOID *) &LocalHddInfo
|
||||
);
|
||||
}
|
||||
|
||||
mIdeDataBuiltFlag = TRUE;
|
||||
|
||||
//
|
||||
// Get Identity command from all drives
|
||||
//
|
||||
gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiDiskInfoProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
|
||||
Private->IdeDriveCount = (UINT8) HandleCount;
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
Status = gBS->HandleProtocol (
|
||||
HandleBuffer[Index],
|
||||
&gEfiDiskInfoProtocolGuid,
|
||||
(VOID **) &DiskInfo
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
if (CompareGuid (&DiskInfo->Interface, &gEfiDiskInfoIdeInterfaceGuid)) {
|
||||
//
|
||||
// Locate which PCI device
|
||||
//
|
||||
Status = gBS->HandleProtocol (
|
||||
HandleBuffer[Index],
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID *) &DevicePath
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
DevicePathNode = DevicePath;
|
||||
while (!IsDevicePathEnd (DevicePathNode)) {
|
||||
TempDevicePathNode = NextDevicePathNode (DevicePathNode);
|
||||
if ((DevicePathType (DevicePathNode) == HARDWARE_DEVICE_PATH) &&
|
||||
( DevicePathSubType (DevicePathNode) == HW_PCI_DP) &&
|
||||
( DevicePathType(TempDevicePathNode) == MESSAGING_DEVICE_PATH) &&
|
||||
( DevicePathSubType(TempDevicePathNode) == MSG_ATAPI_DP) ) {
|
||||
PciDevicePath = (PCI_DEVICE_PATH *) DevicePathNode;
|
||||
break;
|
||||
}
|
||||
DevicePathNode = NextDevicePathNode (DevicePathNode);
|
||||
}
|
||||
|
||||
if (PciDevicePath == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Find start of PCI device in HddInfo. The assumption of the data
|
||||
// structure is 2 controllers(channels) per PCI device and each
|
||||
// controller can have 2 drives(devices).
|
||||
// HddInfo[PciIndex+0].[0] = Channel[0].Device[0] Primary Master
|
||||
// HddInfo[PciIndex+0].[1] = Channel[0].Device[1] Primary Slave
|
||||
// HddInfo[PciIndex+1].[0] = Channel[1].Device[0] Secondary Master
|
||||
// HddInfo[PciIndex+1].[1] = Channel[1].Device[1] Secondary Slave
|
||||
// @bug eventually need to pass in max number of entries
|
||||
// for end of for loop
|
||||
//
|
||||
for (PciIndex = 0; PciIndex < 8; PciIndex++) {
|
||||
if ((PciDevicePath->Device == LocalHddInfo[PciIndex].Device) &&
|
||||
(PciDevicePath->Function == LocalHddInfo[PciIndex].Function)
|
||||
) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (PciIndex == 8) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = DiskInfo->WhichIde (DiskInfo, &IdeChannel, &IdeDevice);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Size = sizeof (ATAPI_IDENTIFY);
|
||||
DiskInfo->Identify (
|
||||
DiskInfo,
|
||||
&LocalHddInfo[PciIndex + IdeChannel].IdentifyDrive[IdeDevice],
|
||||
&Size
|
||||
);
|
||||
if (IdeChannel == 0) {
|
||||
LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_PRIMARY;
|
||||
} else if (IdeChannel == 1) {
|
||||
LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_SECONDARY;
|
||||
}
|
||||
|
||||
InquiryData = NULL;
|
||||
InquiryDataSize = 0;
|
||||
Status = DiskInfo->Inquiry (
|
||||
DiskInfo,
|
||||
NULL,
|
||||
&InquiryDataSize
|
||||
);
|
||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||
InquiryData = (UINT8 *) AllocatePool (
|
||||
InquiryDataSize
|
||||
);
|
||||
if (InquiryData != NULL) {
|
||||
Status = DiskInfo->Inquiry (
|
||||
DiskInfo,
|
||||
InquiryData,
|
||||
&InquiryDataSize
|
||||
);
|
||||
}
|
||||
} else {
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
//
|
||||
// If ATAPI device then Inquiry will pass and ATA fail.
|
||||
//
|
||||
if (!EFI_ERROR (Status)) {
|
||||
ASSERT (InquiryData != NULL);
|
||||
//
|
||||
// If IdeDevice = 0 then set master bit, else slave bit
|
||||
//
|
||||
if (IdeDevice == 0) {
|
||||
if ((InquiryData[0] & 0x1f) == 0x05) {
|
||||
LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_MASTER_ATAPI_CDROM;
|
||||
} else if ((InquiryData[0] & 0x1f) == 0x00) {
|
||||
LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_MASTER_ATAPI_ZIPDISK;
|
||||
}
|
||||
} else {
|
||||
if ((InquiryData[0] & 0x1f) == 0x05) {
|
||||
LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_SLAVE_ATAPI_CDROM;
|
||||
} else if ((InquiryData[0] & 0x1f) == 0x00) {
|
||||
LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_SLAVE_ATAPI_ZIPDISK;
|
||||
}
|
||||
}
|
||||
FreePool (InquiryData);
|
||||
} else {
|
||||
if (IdeDevice == 0) {
|
||||
LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_MASTER_IDE;
|
||||
} else {
|
||||
LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_SLAVE_IDE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (HandleBuffer != NULL) {
|
||||
FreePool (HandleBuffer);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
If the IDE channel is in compatibility (legacy) mode, remove all
|
||||
PCI I/O BAR addresses from the controller.
|
||||
|
||||
@param IdeController The handle of target IDE controller
|
||||
|
||||
|
||||
**/
|
||||
VOID
|
||||
InitLegacyIdeController (
|
||||
IN EFI_HANDLE IdeController
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT8 Pi;
|
||||
UINT32 IOBarClear;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// If the IDE channel is in compatibility (legacy) mode, remove all
|
||||
// PCI I/O BAR addresses from the controller. Some software gets
|
||||
// confused if an IDE controller is in compatibility (legacy) mode
|
||||
// and has PCI I/O resources allocated
|
||||
//
|
||||
Status = gBS->HandleProtocol (
|
||||
IdeController,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
(VOID **) &PciIo
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
IOBarClear = 0x00;
|
||||
PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 1, &Pi);
|
||||
if ((Pi & 0x01) == 0) {
|
||||
PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x10, 1, &IOBarClear);
|
||||
PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x14, 1, &IOBarClear);
|
||||
}
|
||||
if ((Pi & 0x04) == 0) {
|
||||
PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x18, 1, &IOBarClear);
|
||||
PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x1C, 1, &IOBarClear);
|
||||
}
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,234 @@
|
|||
/** @file
|
||||
Collect Sio information from Native EFI Drivers.
|
||||
Sio is floppy, parallel, serial, ... hardware
|
||||
|
||||
Copyright (c) 2006 - 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 "LegacyBiosInterface.h"
|
||||
|
||||
|
||||
/**
|
||||
Collect EFI Info about legacy devices.
|
||||
|
||||
@param Private Legacy BIOS Instance data
|
||||
|
||||
@retval EFI_SUCCESS It should always work.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyBiosBuildSioData (
|
||||
IN LEGACY_BIOS_INSTANCE *Private
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
DEVICE_PRODUCER_DATA_HEADER *SioPtr;
|
||||
DEVICE_PRODUCER_SERIAL *Sio1Ptr;
|
||||
DEVICE_PRODUCER_PARALLEL *Sio2Ptr;
|
||||
DEVICE_PRODUCER_FLOPPY *Sio3Ptr;
|
||||
EFI_HANDLE IsaBusController;
|
||||
UINTN HandleCount;
|
||||
EFI_HANDLE *HandleBuffer;
|
||||
UINTN Index;
|
||||
UINTN ResourceIndex;
|
||||
UINTN ChildIndex;
|
||||
EFI_ISA_IO_PROTOCOL *IsaIo;
|
||||
EFI_ISA_ACPI_RESOURCE_LIST *ResourceList;
|
||||
EFI_ISA_ACPI_RESOURCE *IoResource;
|
||||
EFI_ISA_ACPI_RESOURCE *DmaResource;
|
||||
EFI_ISA_ACPI_RESOURCE *InterruptResource;
|
||||
UINTN EntryCount;
|
||||
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
|
||||
//
|
||||
// Get the pointer to the SIO data structure
|
||||
//
|
||||
SioPtr = &Private->IntThunk->EfiToLegacy16BootTable.SioData;
|
||||
|
||||
//
|
||||
// Zero the data in the SIO data structure
|
||||
//
|
||||
gBS->SetMem (SioPtr, sizeof (DEVICE_PRODUCER_DATA_HEADER), 0);
|
||||
|
||||
//
|
||||
// Find the ISA Bus Controller used for legacy
|
||||
//
|
||||
Status = Private->LegacyBiosPlatform->GetPlatformHandle (
|
||||
Private->LegacyBiosPlatform,
|
||||
EfiGetPlatformIsaBusHandle,
|
||||
0,
|
||||
&HandleBuffer,
|
||||
&HandleCount,
|
||||
NULL
|
||||
);
|
||||
IsaBusController = HandleBuffer[0];
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
// Force ISA Bus Controller to produce all ISA devices
|
||||
//
|
||||
gBS->ConnectController (IsaBusController, NULL, NULL, TRUE);
|
||||
}
|
||||
//
|
||||
// Get the list of ISA controllers in the system
|
||||
//
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiIsaIoProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
//
|
||||
// Collect legacy information from each of the ISA controllers in the system
|
||||
//
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
|
||||
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiIsaIoProtocolGuid, (VOID **) &IsaIo);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ResourceList = IsaIo->ResourceList;
|
||||
|
||||
if (ResourceList == NULL) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
// Collect the resource types neededto fill in the SIO data structure
|
||||
//
|
||||
IoResource = NULL;
|
||||
DmaResource = NULL;
|
||||
InterruptResource = NULL;
|
||||
for (ResourceIndex = 0;
|
||||
ResourceList->ResourceItem[ResourceIndex].Type != EfiIsaAcpiResourceEndOfList;
|
||||
ResourceIndex++
|
||||
) {
|
||||
switch (ResourceList->ResourceItem[ResourceIndex].Type) {
|
||||
case EfiIsaAcpiResourceIo:
|
||||
IoResource = &ResourceList->ResourceItem[ResourceIndex];
|
||||
break;
|
||||
|
||||
case EfiIsaAcpiResourceMemory:
|
||||
break;
|
||||
|
||||
case EfiIsaAcpiResourceDma:
|
||||
DmaResource = &ResourceList->ResourceItem[ResourceIndex];
|
||||
break;
|
||||
|
||||
case EfiIsaAcpiResourceInterrupt:
|
||||
InterruptResource = &ResourceList->ResourceItem[ResourceIndex];
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
//
|
||||
// See if this is an ISA serial port
|
||||
//
|
||||
// Ignore DMA resource since it is always returned NULL
|
||||
//
|
||||
if (ResourceList->Device.HID == EISA_PNP_ID (0x500) || ResourceList->Device.HID == EISA_PNP_ID (0x501)) {
|
||||
|
||||
if (ResourceList->Device.UID <= 3 &&
|
||||
IoResource != NULL &&
|
||||
InterruptResource != NULL
|
||||
) {
|
||||
//
|
||||
// Get the handle of the child device that has opened the ISA I/O Protocol
|
||||
//
|
||||
Status = gBS->OpenProtocolInformation (
|
||||
HandleBuffer[Index],
|
||||
&gEfiIsaIoProtocolGuid,
|
||||
&OpenInfoBuffer,
|
||||
&EntryCount
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
//
|
||||
// We want resource for legacy even if no 32-bit driver installed
|
||||
//
|
||||
for (ChildIndex = 0; ChildIndex < EntryCount; ChildIndex++) {
|
||||
Sio1Ptr = &SioPtr->Serial[ResourceList->Device.UID];
|
||||
Sio1Ptr->Address = (UINT16) IoResource->StartRange;
|
||||
Sio1Ptr->Irq = (UINT8) InterruptResource->StartRange;
|
||||
Sio1Ptr->Mode = DEVICE_SERIAL_MODE_NORMAL | DEVICE_SERIAL_MODE_DUPLEX_HALF;
|
||||
}
|
||||
|
||||
FreePool (OpenInfoBuffer);
|
||||
}
|
||||
}
|
||||
//
|
||||
// See if this is an ISA parallel port
|
||||
//
|
||||
// Ignore DMA resource since it is always returned NULL, port
|
||||
// only used in output mode.
|
||||
//
|
||||
if (ResourceList->Device.HID == EISA_PNP_ID (0x400) || ResourceList->Device.HID == EISA_PNP_ID (0x401)) {
|
||||
if (ResourceList->Device.UID <= 2 &&
|
||||
IoResource != NULL &&
|
||||
InterruptResource != NULL &&
|
||||
DmaResource != NULL
|
||||
) {
|
||||
Sio2Ptr = &SioPtr->Parallel[ResourceList->Device.UID];
|
||||
Sio2Ptr->Address = (UINT16) IoResource->StartRange;
|
||||
Sio2Ptr->Irq = (UINT8) InterruptResource->StartRange;
|
||||
Sio2Ptr->Dma = (UINT8) DmaResource->StartRange;
|
||||
Sio2Ptr->Mode = DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY;
|
||||
}
|
||||
}
|
||||
//
|
||||
// See if this is an ISA floppy controller
|
||||
//
|
||||
if (ResourceList->Device.HID == EISA_PNP_ID (0x604)) {
|
||||
if (IoResource != NULL && InterruptResource != NULL && DmaResource != NULL) {
|
||||
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiBlockIoProtocolGuid, (VOID **) &BlockIo);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Sio3Ptr = &SioPtr->Floppy;
|
||||
Sio3Ptr->Address = (UINT16) IoResource->StartRange;
|
||||
Sio3Ptr->Irq = (UINT8) InterruptResource->StartRange;
|
||||
Sio3Ptr->Dma = (UINT8) DmaResource->StartRange;
|
||||
Sio3Ptr->NumberOfFloppy++;
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// See if this is a mouse
|
||||
// Always set mouse found so USB hot plug will work
|
||||
//
|
||||
// Ignore lower byte of HID. Pnp0fxx is any type of mouse.
|
||||
//
|
||||
// Hid = ResourceList->Device.HID & 0xff00ffff;
|
||||
// PnpId = EISA_PNP_ID(0x0f00);
|
||||
// if (Hid == PnpId) {
|
||||
// if (ResourceList->Device.UID == 1) {
|
||||
// Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSimplePointerProtocolGuid, &SimplePointer);
|
||||
// if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
SioPtr->MousePresent = 0x01;
|
||||
//
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
}
|
||||
|
||||
FreePool (HandleBuffer);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
|
@ -0,0 +1,284 @@
|
|||
/** @file
|
||||
Call into 16-bit BIOS code, Use AsmThunk16 function of BaseLib.
|
||||
|
||||
Copyright (c) 2006 - 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 "LegacyBiosInterface.h"
|
||||
|
||||
THUNK_CONTEXT mThunkContext;
|
||||
|
||||
/**
|
||||
Thunk to 16-bit real mode and execute a software interrupt with a vector
|
||||
of BiosInt. Regs will contain the 16-bit register context on entry and
|
||||
exit.
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param BiosInt Processor interrupt vector to invoke
|
||||
@param Regs Register contexted passed into (and returned) from thunk to
|
||||
16-bit mode
|
||||
|
||||
@retval FALSE Thunk completed, and there were no BIOS errors in the target code.
|
||||
See Regs for status.
|
||||
@retval TRUE There was a BIOS erro in the target code.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
LegacyBiosInt86 (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
IN UINT8 BiosInt,
|
||||
IN EFI_IA32_REGISTER_SET *Regs
|
||||
)
|
||||
{
|
||||
Regs->X.Flags.Reserved1 = 1;
|
||||
Regs->X.Flags.Reserved2 = 0;
|
||||
Regs->X.Flags.Reserved3 = 0;
|
||||
Regs->X.Flags.Reserved4 = 0;
|
||||
Regs->X.Flags.IOPL = 3;
|
||||
Regs->X.Flags.NT = 0;
|
||||
Regs->X.Flags.IF = 0;
|
||||
Regs->X.Flags.TF = 0;
|
||||
Regs->X.Flags.CF = 0;
|
||||
|
||||
return InternalLegacyBiosFarCall (
|
||||
This,
|
||||
(UINT16) (((UINT32 *)NULL)[BiosInt] >> 16),
|
||||
(UINT16) ((UINT32 *)NULL)[BiosInt],
|
||||
Regs,
|
||||
&Regs->X.Flags,
|
||||
sizeof (Regs->X.Flags)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Thunk to 16-bit real mode and call Segment:Offset. Regs will contain the
|
||||
16-bit register context on entry and exit. Arguments can be passed on
|
||||
the Stack argument
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param Segment Segemnt of 16-bit mode call
|
||||
@param Offset Offset of 16-bit mdoe call
|
||||
@param Regs Register contexted passed into (and returned) from
|
||||
thunk to 16-bit mode
|
||||
@param Stack Caller allocated stack used to pass arguments
|
||||
@param StackSize Size of Stack in bytes
|
||||
|
||||
@retval FALSE Thunk completed, and there were no BIOS errors in
|
||||
the target code. See Regs for status.
|
||||
@retval TRUE There was a BIOS erro in the target code.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
LegacyBiosFarCall86 (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
IN UINT16 Segment,
|
||||
IN UINT16 Offset,
|
||||
IN EFI_IA32_REGISTER_SET *Regs,
|
||||
IN VOID *Stack,
|
||||
IN UINTN StackSize
|
||||
)
|
||||
{
|
||||
Regs->X.Flags.Reserved1 = 1;
|
||||
Regs->X.Flags.Reserved2 = 0;
|
||||
Regs->X.Flags.Reserved3 = 0;
|
||||
Regs->X.Flags.Reserved4 = 0;
|
||||
Regs->X.Flags.IOPL = 3;
|
||||
Regs->X.Flags.NT = 0;
|
||||
Regs->X.Flags.IF = 1;
|
||||
Regs->X.Flags.TF = 0;
|
||||
Regs->X.Flags.CF = 0;
|
||||
|
||||
return InternalLegacyBiosFarCall (This, Segment, Offset, Regs, Stack, StackSize);
|
||||
}
|
||||
|
||||
/**
|
||||
Thunk to 16-bit real mode and call Segment:Offset. Regs will contain the
|
||||
16-bit register context on entry and exit. Arguments can be passed on
|
||||
the Stack argument
|
||||
|
||||
@param This Protocol instance pointer.
|
||||
@param Segment Segemnt of 16-bit mode call
|
||||
@param Offset Offset of 16-bit mdoe call
|
||||
@param Regs Register contexted passed into (and returned) from thunk to
|
||||
16-bit mode
|
||||
@param Stack Caller allocated stack used to pass arguments
|
||||
@param StackSize Size of Stack in bytes
|
||||
|
||||
@retval FALSE Thunk completed, and there were no BIOS errors in the target code.
|
||||
See Regs for status.
|
||||
@retval TRUE There was a BIOS erro in the target code.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
InternalLegacyBiosFarCall (
|
||||
IN EFI_LEGACY_BIOS_PROTOCOL *This,
|
||||
IN UINT16 Segment,
|
||||
IN UINT16 Offset,
|
||||
IN EFI_IA32_REGISTER_SET *Regs,
|
||||
IN VOID *Stack,
|
||||
IN UINTN StackSize
|
||||
)
|
||||
{
|
||||
UINTN Status;
|
||||
LEGACY_BIOS_INSTANCE *Private;
|
||||
UINT16 *Stack16;
|
||||
EFI_TPL OriginalTpl;
|
||||
IA32_REGISTER_SET ThunkRegSet;
|
||||
BOOLEAN InterruptState;
|
||||
|
||||
Private = LEGACY_BIOS_INSTANCE_FROM_THIS (This);
|
||||
|
||||
ZeroMem (&ThunkRegSet, sizeof (ThunkRegSet));
|
||||
ThunkRegSet.X.DI = Regs->X.DI;
|
||||
ThunkRegSet.X.SI = Regs->X.SI;
|
||||
ThunkRegSet.X.BP = Regs->X.BP;
|
||||
ThunkRegSet.X.BX = Regs->X.BX;
|
||||
ThunkRegSet.X.DX = Regs->X.DX;
|
||||
//
|
||||
// Sometimes, ECX is used to pass in 32 bit data. For example, INT 1Ah, AX = B10Dh is
|
||||
// "PCI BIOS v2.0c + Write Configuration DWORD" and ECX has the dword to write.
|
||||
//
|
||||
ThunkRegSet.E.ECX = Regs->E.ECX;
|
||||
ThunkRegSet.X.AX = Regs->X.AX;
|
||||
ThunkRegSet.E.DS = Regs->X.DS;
|
||||
ThunkRegSet.E.ES = Regs->X.ES;
|
||||
|
||||
CopyMem (&(ThunkRegSet.E.EFLAGS.UintN), &(Regs->X.Flags), sizeof (Regs->X.Flags));
|
||||
|
||||
//
|
||||
// Clear the error flag; thunk code may set it. Stack16 should be the high address
|
||||
// Make Statk16 address the low 16 bit must be not zero.
|
||||
//
|
||||
Stack16 = (UINT16 *)((UINT8 *) mThunkContext.RealModeBuffer + mThunkContext.RealModeBufferSize - sizeof (UINT16));
|
||||
|
||||
//
|
||||
// Save and disable interrutp of debug timer
|
||||
//
|
||||
InterruptState = SaveAndSetDebugTimerInterrupt (FALSE);
|
||||
|
||||
//
|
||||
// The call to Legacy16 is a critical section to EFI
|
||||
//
|
||||
OriginalTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
|
||||
|
||||
if (Stack != NULL && StackSize != 0) {
|
||||
//
|
||||
// Copy Stack to low memory stack
|
||||
//
|
||||
Stack16 -= StackSize / sizeof (UINT16);
|
||||
CopyMem (Stack16, Stack, StackSize);
|
||||
}
|
||||
|
||||
ThunkRegSet.E.SS = (UINT16) (((UINTN) Stack16 >> 16) << 12);
|
||||
ThunkRegSet.E.ESP = (UINT16) (UINTN) Stack16;
|
||||
ThunkRegSet.E.CS = Segment;
|
||||
ThunkRegSet.E.Eip = Offset;
|
||||
|
||||
mThunkContext.RealModeState = &ThunkRegSet;
|
||||
|
||||
//
|
||||
// Set Legacy16 state. 0x08, 0x70 is legacy 8259 vector bases.
|
||||
//
|
||||
Status = Private->Legacy8259->SetMode (Private->Legacy8259, Efi8259LegacyMode, NULL, NULL);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
AsmThunk16 (&mThunkContext);
|
||||
|
||||
//
|
||||
// OPROM may allocate EBDA range by itself and change EBDA base and EBDA size.
|
||||
// Get the current EBDA base address, and compared with pre-allocate minimum
|
||||
// EBDA base address, if the current EBDA base address is smaller, it indicates
|
||||
// PcdEbdaReservedMemorySize should be adjusted to larger for more OPROMs.
|
||||
//
|
||||
DEBUG_CODE (
|
||||
{
|
||||
UINTN EbdaBaseAddress;
|
||||
UINTN ReservedEbdaBaseAddress;
|
||||
|
||||
EbdaBaseAddress = (*(UINT16 *) (UINTN) 0x40E) << 4;
|
||||
ReservedEbdaBaseAddress = CONVENTIONAL_MEMORY_TOP - PcdGet32 (PcdEbdaReservedMemorySize);
|
||||
ASSERT (ReservedEbdaBaseAddress <= EbdaBaseAddress);
|
||||
}
|
||||
);
|
||||
|
||||
if (Stack != NULL && StackSize != 0) {
|
||||
//
|
||||
// Copy low memory stack to Stack
|
||||
//
|
||||
CopyMem (Stack, Stack16, StackSize);
|
||||
}
|
||||
|
||||
//
|
||||
// Restore protected mode interrupt state
|
||||
//
|
||||
Status = Private->Legacy8259->SetMode (Private->Legacy8259, Efi8259ProtectedMode, NULL, NULL);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
mThunkContext.RealModeState = NULL;
|
||||
|
||||
//
|
||||
// End critical section
|
||||
//
|
||||
gBS->RestoreTPL (OriginalTpl);
|
||||
|
||||
//
|
||||
// Restore interrutp of debug timer
|
||||
//
|
||||
SaveAndSetDebugTimerInterrupt (InterruptState);
|
||||
|
||||
Regs->E.EDI = ThunkRegSet.E.EDI;
|
||||
Regs->E.ESI = ThunkRegSet.E.ESI;
|
||||
Regs->E.EBP = ThunkRegSet.E.EBP;
|
||||
Regs->E.EBX = ThunkRegSet.E.EBX;
|
||||
Regs->E.EDX = ThunkRegSet.E.EDX;
|
||||
Regs->E.ECX = ThunkRegSet.E.ECX;
|
||||
Regs->E.EAX = ThunkRegSet.E.EAX;
|
||||
Regs->X.SS = ThunkRegSet.E.SS;
|
||||
Regs->X.CS = ThunkRegSet.E.CS;
|
||||
Regs->X.DS = ThunkRegSet.E.DS;
|
||||
Regs->X.ES = ThunkRegSet.E.ES;
|
||||
|
||||
CopyMem (&(Regs->X.Flags), &(ThunkRegSet.E.EFLAGS.UintN), sizeof (Regs->X.Flags));
|
||||
|
||||
return (BOOLEAN) (Regs->X.Flags.CF == 1);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocate memory < 1 MB and copy the thunker code into low memory. Se up
|
||||
all the descriptors.
|
||||
|
||||
@param Private Private context for Legacy BIOS
|
||||
|
||||
@retval EFI_SUCCESS Should only pass.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LegacyBiosInitializeThunk (
|
||||
IN LEGACY_BIOS_INSTANCE *Private
|
||||
)
|
||||
{
|
||||
EFI_PHYSICAL_ADDRESS MemoryAddress;
|
||||
|
||||
MemoryAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) Private->IntThunk;
|
||||
|
||||
mThunkContext.RealModeBuffer = (VOID *) (UINTN) (MemoryAddress + ((sizeof (LOW_MEMORY_THUNK) / EFI_PAGE_SIZE) + 1) * EFI_PAGE_SIZE);
|
||||
mThunkContext.RealModeBufferSize = EFI_PAGE_SIZE;
|
||||
mThunkContext.ThunkAttributes = THUNK_ATTRIBUTE_BIG_REAL_MODE | THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15;
|
||||
|
||||
AsmPrepareThunk16 (&mThunkContext);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
## @file
|
||||
# Interrupt Redirection Template
|
||||
#
|
||||
# Copyright (c) 2006, 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.
|
||||
#
|
||||
##
|
||||
|
||||
#text SEGMENT
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Procedure: InterruptRedirectionTemplate: Redirects interrupts 0x68-0x6F
|
||||
#
|
||||
# Input: None
|
||||
#
|
||||
# Output: None
|
||||
#
|
||||
# Prototype: VOID
|
||||
# InterruptRedirectionTemplate (
|
||||
# VOID
|
||||
# );
|
||||
#
|
||||
# Saves: None
|
||||
#
|
||||
# Modified: None
|
||||
#
|
||||
# Description: Contains the code that is copied into low memory (below 640K).
|
||||
# This code reflects interrupts 0x68-0x6f to interrupts 0x08-0x0f.
|
||||
# This template must be copied into low memory, and the IDT entries
|
||||
# 0x68-0x6F must be point to the low memory copy of this code. Each
|
||||
# entry is 4 bytes long, so IDT entries 0x68-0x6F can be easily
|
||||
# computed.
|
||||
#
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
ASM_GLOBAL ASM_PFX(InterruptRedirectionTemplate)
|
||||
ASM_PFX(InterruptRedirectionTemplate):
|
||||
int $0x08
|
||||
.byte 0x0cf # IRET
|
||||
nop
|
||||
int $0x09
|
||||
.byte 0x0cf # IRET
|
||||
nop
|
||||
int $0x0a
|
||||
.byte 0x0cf # IRET
|
||||
nop
|
||||
int $0x0b
|
||||
.byte 0x0cf # IRET
|
||||
nop
|
||||
int $0x0c
|
||||
.byte 0x0cf # IRET
|
||||
nop
|
||||
int $0x0d
|
||||
.byte 0x0cf # IRET
|
||||
nop
|
||||
int $0x0e
|
||||
.byte 0x0cf # IRET
|
||||
nop
|
||||
int $0x0f
|
||||
.byte 0x0cf # IRET
|
||||
nop
|
||||
|
||||
#END
|
|
@ -0,0 +1,71 @@
|
|||
;; @file
|
||||
; Interrupt Redirection Template
|
||||
;
|
||||
; Copyright (c) 2006, 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.
|
||||
;
|
||||
;;
|
||||
|
||||
text SEGMENT
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
; Procedure: InterruptRedirectionTemplate: Redirects interrupts 0x68-0x6F
|
||||
;
|
||||
; Input: None
|
||||
;
|
||||
; Output: None
|
||||
;
|
||||
; Prototype: VOID
|
||||
; InterruptRedirectionTemplate (
|
||||
; VOID
|
||||
; );
|
||||
;
|
||||
; Saves: None
|
||||
;
|
||||
; Modified: None
|
||||
;
|
||||
; Description: Contains the code that is copied into low memory (below 640K).
|
||||
; This code reflects interrupts 0x68-0x6f to interrupts 0x08-0x0f.
|
||||
; This template must be copied into low memory, and the IDT entries
|
||||
; 0x68-0x6F must be point to the low memory copy of this code. Each
|
||||
; entry is 4 bytes long, so IDT entries 0x68-0x6F can be easily
|
||||
; computed.
|
||||
;
|
||||
;----------------------------------------------------------------------------
|
||||
|
||||
InterruptRedirectionTemplate PROC
|
||||
int 08h
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 09h
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0ah
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0bh
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0ch
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0dh
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0eh
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
int 0fh
|
||||
DB 0cfh ; IRET
|
||||
nop
|
||||
InterruptRedirectionTemplate ENDP
|
||||
|
||||
END
|
|
@ -0,0 +1,36 @@
|
|||
/** @file
|
||||
Defines a Tag GUID used to mark a UEFI legacy BIOS thunk driver based
|
||||
on legacy BIOS services and legacy option ROM. This Tag GUID must be installed on
|
||||
the ImageHandle of any module that follows the EFI Driver Model and uses
|
||||
the Int86() or FarCall() services of the Legacy Bios Protocol to produce
|
||||
a standard UEFI I/O Protocol.
|
||||
|
||||
Copyright (c) 2006 - 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 _LEGACY_BIOS_H_
|
||||
#define _LEGACY_BIOS_H_
|
||||
|
||||
///
|
||||
/// The Global ID for the Legacy BIOS GUID that must be installed onto the ImageHandle
|
||||
/// of any module follows the EFI Driver Model and uses the Int86() or FarCall()
|
||||
/// services of the Legacy BIOS Protocol to produce a standard UEFI I/O Protocol.
|
||||
///
|
||||
#define EFI_LEGACY_BIOS_GUID \
|
||||
{ \
|
||||
0x2e3044ac, 0x879f, 0x490f, {0x97, 0x60, 0xbb, 0xdf, 0xaf, 0x69, 0x5f, 0x50 } \
|
||||
}
|
||||
|
||||
extern EFI_GUID gEfiLegacyBiosGuid;
|
||||
|
||||
#endif
|
|
@ -56,6 +56,9 @@
|
|||
## Include/Guid/AcpiVariable.h
|
||||
gEfiAcpiVariableCompatiblityGuid = { 0xc020489e, 0x6db2, 0x4ef2, { 0x9a, 0xa5, 0xca, 0x6, 0xfc, 0x11, 0xd3, 0x6a }}
|
||||
|
||||
## Include/Guid/LegacyBios.h
|
||||
gEfiLegacyBiosGuid = { 0x2E3044AC, 0x879F, 0x490F, { 0x97, 0x60, 0xBB, 0xDF, 0xAF, 0x69, 0x5F, 0x50 }}
|
||||
|
||||
[Protocols]
|
||||
## Vga Mini port binding for a VGA controller
|
||||
# Include/Protocol/VgaMiniPort.h
|
||||
|
@ -87,6 +90,10 @@
|
|||
## This PCD specifies whether Serial device use half hand shake.
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdIsaBusSerialUseHalfHandshake|FALSE|BOOLEAN|0x00010043
|
||||
|
||||
## Indicates if CSM support is needed for ACPI S3 Save.
|
||||
# If TRUE, CSM support is enclosed for ACPI S3 Save.
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformCsmSupport|TRUE|BOOLEAN|0x00010044
|
||||
|
||||
[PcdsFixedAtBuild]
|
||||
## FFS filename to find the default BMP Logo file.
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile |{ 0x99, 0x8b, 0xB2, 0x7B, 0xBB, 0x61, 0xD5, 0x11, 0x9A, 0x5D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }|VOID*|0x40000003
|
||||
|
@ -113,8 +120,25 @@
|
|||
# This PCD should be set as HII type PCD by platform integrator mapped to variable L"HwErrRecSupport"
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdHardwareErrorRecordLevel|0|UINT16|0x40000002
|
||||
|
||||
|
||||
[PcdsFixedAtBuild, PcdsDynamic, PcdsDynamicEx, PcdsPatchableInModule]
|
||||
## I/O Base address of floppy device controller.
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdFdcBaseAddress|0x3f0|UINT16|0x30000000
|
||||
|
||||
## If TRUE, BiosVideo will switch to 80x25 Text VGA Mode when exiting boot service.
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoSetTextVgaModeEnable|FALSE|BOOLEAN|0x30000001
|
||||
|
||||
## If TRUE, BiosVideo will check for VESA BIOS Extension service support.
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVbeEnable|TRUE|BOOLEAN|0x30000002
|
||||
|
||||
## If TRUE, BiosVideo will check for VGA service support.
|
||||
# NOTE: If both PcdBiosVideoCheckVbeEnable and PcdBiosVideoCheckVgaEnable are set to FALSE,
|
||||
# that means Graphics Output protocol will not be installed, the VGA miniport protocol will be installed instead.
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBiosVideoCheckVgaEnable|TRUE|BOOLEAN|0x30000003
|
||||
|
||||
## If TRUE, memory space for legacy region will be set as cacheable.
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLegacyBiosCacheLegacyRegion|TRUE|BOOLEAN|0x00000004
|
||||
|
||||
## The PCD is used to specify memory size with bytes to reserve EBDA for OPROM.
|
||||
## The value should be a multiple of 4KB.
|
||||
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdEbdaReservedMemorySize|0x8000|UINT32|0x30000005
|
||||
|
||||
|
|
|
@ -39,11 +39,14 @@
|
|||
0|DEFAULT # The entry: 0|DEFAULT is reserved and always required.
|
||||
|
||||
[LibraryClasses]
|
||||
CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf
|
||||
DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf
|
||||
DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
|
||||
DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
|
||||
BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
|
||||
SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
|
||||
BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
|
||||
IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
|
||||
PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
|
||||
PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
|
||||
TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
|
||||
|
@ -55,6 +58,8 @@
|
|||
HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
|
||||
PlatformBdsLib|IntelFrameworkModulePkg/Library/PlatformBdsLibNull/PlatformBdsLibNull.inf
|
||||
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
|
||||
PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
|
||||
PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
|
||||
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
|
||||
DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
|
||||
ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf
|
||||
|
@ -139,6 +144,11 @@
|
|||
IntelFrameworkModulePkg/Bus/Isa/Ps2MouseAbsolutePointerDxe/Ps2MouseAbsolutePointerDxe.inf
|
||||
IntelFrameworkModulePkg/Bus/Pci/VgaMiniPortDxe/VgaMiniPortDxe.inf
|
||||
|
||||
IntelFrameworkModulePkg/Csm/BiosThunk/KeyboardDxe/KeyboardDxe.inf
|
||||
IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/VideoDxe.inf
|
||||
IntelFrameworkModulePkg/Csm/BiosThunk/BlockIoDxe/BlockIoDxe.inf
|
||||
IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Snp16Dxe.inf
|
||||
|
||||
IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtractionDxe.inf
|
||||
IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf
|
||||
IntelFrameworkModulePkg/Universal/DataHubStdErrDxe/DataHubStdErrDxe.inf
|
||||
|
@ -147,6 +157,9 @@
|
|||
IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
|
||||
IntelFrameworkModulePkg/Universal/LegacyRegionDxe/LegacyRegionDxe.inf
|
||||
IntelFrameworkModulePkg/Universal/StatusCode/DatahubStatusCodeHandlerDxe/DatahubStatusCodeHandlerDxe.inf
|
||||
|
||||
[Components.IA32,Components.X64,Components.IPF]
|
||||
IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBiosDxe.inf
|
||||
|
||||
[Components.IA32]
|
||||
IntelFrameworkModulePkg/Universal/StatusCode/RuntimeDxe/StatusCodeRuntimeDxe.inf
|
||||
|
|
Loading…
Reference in New Issue