OvmfPkg: Apply uncrustify changes

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737

Apply uncrustify changes to .c/.h files in the OvmfPkg package

Cc: Andrew Fish <afish@apple.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Reviewed-by: Andrew Fish <afish@apple.com>
This commit is contained in:
Michael Kubacki
2021-12-05 14:54:09 -08:00
committed by mergify[bot]
parent d1050b9dff
commit ac0a286f4d
445 changed files with 30894 additions and 26369 deletions

View File

@ -47,6 +47,7 @@ volatile UINT64 mTimerPeriod = 0;
// //
// Worker Functions // Worker Functions
// //
/** /**
Sets the counter value for Timer #0 in a legacy 8254 timer. Sets the counter value for Timer #0 in a legacy 8254 timer.
@ -133,11 +134,11 @@ TimerDriverRegisterHandler (
// //
// Check for invalid parameters // Check for invalid parameters
// //
if (NotifyFunction == NULL && mTimerNotifyFunction == NULL) { if ((NotifyFunction == NULL) && (mTimerNotifyFunction == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (NotifyFunction != NULL && mTimerNotifyFunction != NULL) { if ((NotifyFunction != NULL) && (mTimerNotifyFunction != NULL)) {
return EFI_ALREADY_STARTED; return EFI_ALREADY_STARTED;
} }
@ -203,11 +204,10 @@ TimerDriverSetTimerPeriod (
// //
mLegacy8259->DisableIrq (mLegacy8259, Efi8259Irq0); mLegacy8259->DisableIrq (mLegacy8259, Efi8259Irq0);
} else { } else {
// //
// Convert TimerPeriod into 8254 counts // Convert TimerPeriod into 8254 counts
// //
TimerCount = DivU64x32 (MultU64x32 (119318, (UINT32) TimerPeriod) + 500000, 1000000); TimerCount = DivU64x32 (MultU64x32 (119318, (UINT32)TimerPeriod) + 500000, 1000000);
// //
// Check for overflow // Check for overflow
@ -216,16 +216,18 @@ TimerDriverSetTimerPeriod (
TimerCount = 0; TimerCount = 0;
TimerPeriod = MAX_TIMER_TICK_DURATION; TimerPeriod = MAX_TIMER_TICK_DURATION;
} }
// //
// Program the 8254 timer with the new count value // Program the 8254 timer with the new count value
// //
SetPitCount ((UINT16) TimerCount); SetPitCount ((UINT16)TimerCount);
// //
// Enable timer interrupt // Enable timer interrupt
// //
mLegacy8259->EnableIrq (mLegacy8259, Efi8259Irq0, FALSE); mLegacy8259->EnableIrq (mLegacy8259, Efi8259Irq0, FALSE);
} }
// //
// Save the new timer period // Save the new timer period
// //
@ -353,13 +355,13 @@ TimerDriverInitialize (
// //
// Find the CPU architectural protocol. // Find the CPU architectural protocol.
// //
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **) &mCpu); Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
// Find the Legacy8259 protocol. // Find the Legacy8259 protocol.
// //
Status = gBS->LocateProtocol (&gEfiLegacy8259ProtocolGuid, NULL, (VOID **) &mLegacy8259); Status = gBS->LocateProtocol (&gEfiLegacy8259ProtocolGuid, NULL, (VOID **)&mLegacy8259);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
@ -372,7 +374,7 @@ TimerDriverInitialize (
// Get the interrupt vector number corresponding to IRQ0 from the 8259 driver // Get the interrupt vector number corresponding to IRQ0 from the 8259 driver
// //
TimerVector = 0; TimerVector = 0;
Status = mLegacy8259->GetVector (mLegacy8259, Efi8259Irq0, (UINT8 *) &TimerVector); Status = mLegacy8259->GetVector (mLegacy8259, Efi8259Irq0, (UINT8 *)&TimerVector);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
@ -392,11 +394,11 @@ TimerDriverInitialize (
// //
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&mTimerHandle, &mTimerHandle,
&gEfiTimerArchProtocolGuid, &mTimer, &gEfiTimerArchProtocolGuid,
&mTimer,
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }

View File

@ -43,6 +43,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// //
// Function Prototypes // Function Prototypes
// //
/** /**
Initialize the Timer Architectural Protocol driver Initialize the Timer Architectural Protocol driver

View File

@ -55,10 +55,10 @@ Interrupt8259WriteMask (
IN UINT16 EdgeLevel IN UINT16 EdgeLevel
) )
{ {
IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, (UINT8) Mask); IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, (UINT8)Mask);
IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, (UINT8) (Mask >> 8)); IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, (UINT8)(Mask >> 8));
IoWrite8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER, (UINT8) EdgeLevel); IoWrite8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER, (UINT8)EdgeLevel);
IoWrite8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE, (UINT8) (EdgeLevel >> 8)); IoWrite8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE, (UINT8)(EdgeLevel >> 8));
} }
/** /**
@ -83,14 +83,14 @@ Interrupt8259ReadMask (
MasterValue = IoRead8 (LEGACY_8259_MASK_REGISTER_MASTER); MasterValue = IoRead8 (LEGACY_8259_MASK_REGISTER_MASTER);
SlaveValue = IoRead8 (LEGACY_8259_MASK_REGISTER_SLAVE); SlaveValue = IoRead8 (LEGACY_8259_MASK_REGISTER_SLAVE);
*Mask = (UINT16) (MasterValue | (SlaveValue << 8)); *Mask = (UINT16)(MasterValue | (SlaveValue << 8));
} }
if (EdgeLevel != NULL) { if (EdgeLevel != NULL) {
MasterValue = IoRead8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER); MasterValue = IoRead8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_MASTER);
SlaveValue = IoRead8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE); SlaveValue = IoRead8 (LEGACY_8259_EDGE_LEVEL_TRIGGERED_REGISTER_SLAVE);
*EdgeLevel = (UINT16) (MasterValue | (SlaveValue << 8)); *EdgeLevel = (UINT16)(MasterValue | (SlaveValue << 8));
} }
} }
@ -416,9 +416,9 @@ Interrupt8259GetVector (
} }
if (Irq <= Efi8259Irq7) { if (Irq <= Efi8259Irq7) {
*Vector = (UINT8) (mMasterBase + Irq); *Vector = (UINT8)(mMasterBase + Irq);
} else { } else {
*Vector = (UINT8) (mSlaveBase + (Irq - Efi8259Irq8)); *Vector = (UINT8)(mSlaveBase + (Irq - Efi8259Irq8));
} }
return EFI_SUCCESS; return EFI_SUCCESS;
@ -447,11 +447,11 @@ Interrupt8259EnableIrq (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
mProtectedModeMask = (UINT16) (mProtectedModeMask & ~(1 << Irq)); mProtectedModeMask = (UINT16)(mProtectedModeMask & ~(1 << Irq));
if (LevelTriggered) { if (LevelTriggered) {
mProtectedModeEdgeLevel = (UINT16) (mProtectedModeEdgeLevel | (1 << Irq)); mProtectedModeEdgeLevel = (UINT16)(mProtectedModeEdgeLevel | (1 << Irq));
} else { } else {
mProtectedModeEdgeLevel = (UINT16) (mProtectedModeEdgeLevel & ~(1 << Irq)); mProtectedModeEdgeLevel = (UINT16)(mProtectedModeEdgeLevel & ~(1 << Irq));
} }
Interrupt8259WriteMask (mProtectedModeMask, mProtectedModeEdgeLevel); Interrupt8259WriteMask (mProtectedModeMask, mProtectedModeEdgeLevel);
@ -480,9 +480,9 @@ Interrupt8259DisableIrq (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
mProtectedModeMask = (UINT16) (mProtectedModeMask | (1 << Irq)); mProtectedModeMask = (UINT16)(mProtectedModeMask | (1 << Irq));
mProtectedModeEdgeLevel = (UINT16) (mProtectedModeEdgeLevel & ~(1 << Irq)); mProtectedModeEdgeLevel = (UINT16)(mProtectedModeEdgeLevel & ~(1 << Irq));
Interrupt8259WriteMask (mProtectedModeMask, mProtectedModeEdgeLevel); Interrupt8259WriteMask (mProtectedModeMask, mProtectedModeEdgeLevel);
@ -514,7 +514,7 @@ Interrupt8259GetInterruptLine (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
PciHandle, PciHandle,
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID **) &PciIo (VOID **)&PciIo
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;

View File

@ -69,4 +69,3 @@ TransferS3ContextToBootScript (
); );
#endif #endif

View File

@ -14,7 +14,6 @@
#include "AcpiPlatform.h" #include "AcpiPlatform.h"
// //
// Condensed structure for capturing the fw_cfg operations -- select, skip, // Condensed structure for capturing the fw_cfg operations -- select, skip,
// write -- inherent in executing a QEMU_LOADER_WRITE_POINTER command. // write -- inherent in executing a QEMU_LOADER_WRITE_POINTER command.
@ -27,7 +26,6 @@ typedef struct {
// and QEMU_LOADER_WRITE_POINTER.PointeeOffset // and QEMU_LOADER_WRITE_POINTER.PointeeOffset
} CONDENSED_WRITE_POINTER; } CONDENSED_WRITE_POINTER;
// //
// Context structure to accumulate CONDENSED_WRITE_POINTER objects from // Context structure to accumulate CONDENSED_WRITE_POINTER objects from
// QEMU_LOADER_WRITE_POINTER commands. // QEMU_LOADER_WRITE_POINTER commands.
@ -45,7 +43,6 @@ struct S3_CONTEXT {
// WritePointers // WritePointers
}; };
// //
// Scratch buffer, allocated in EfiReservedMemoryType type memory, for the ACPI // Scratch buffer, allocated in EfiReservedMemoryType type memory, for the ACPI
// S3 Boot Script opcodes to work on. // S3 Boot Script opcodes to work on.
@ -56,7 +53,6 @@ typedef union {
} SCRATCH_BUFFER; } SCRATCH_BUFFER;
#pragma pack () #pragma pack ()
/** /**
Allocate an S3_CONTEXT object. Allocate an S3_CONTEXT object.
@ -91,8 +87,10 @@ AllocateS3Context (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Context->WritePointers = AllocatePool (WritePointerCount * Context->WritePointers = AllocatePool (
sizeof *Context->WritePointers); WritePointerCount *
sizeof *Context->WritePointers
);
if (Context->WritePointers == NULL) { if (Context->WritePointers == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto FreeContext; goto FreeContext;
@ -108,7 +106,6 @@ FreeContext:
return Status; return Status;
} }
/** /**
Release an S3_CONTEXT object. Release an S3_CONTEXT object.
@ -123,7 +120,6 @@ ReleaseS3Context (
FreePool (S3Context); FreePool (S3Context);
} }
/** /**
Save the information necessary to replicate a QEMU_LOADER_WRITE_POINTER Save the information necessary to replicate a QEMU_LOADER_WRITE_POINTER
command during S3 resume, in condensed format. command during S3 resume, in condensed format.
@ -170,19 +166,26 @@ SaveCondensedWritePointerToS3Context (
if (S3Context->Used == S3Context->Allocated) { if (S3Context->Used == S3Context->Allocated) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Condensed = S3Context->WritePointers + S3Context->Used; Condensed = S3Context->WritePointers + S3Context->Used;
Condensed->PointerItem = PointerItem; Condensed->PointerItem = PointerItem;
Condensed->PointerSize = PointerSize; Condensed->PointerSize = PointerSize;
Condensed->PointerOffset = PointerOffset; Condensed->PointerOffset = PointerOffset;
Condensed->PointerValue = PointerValue; Condensed->PointerValue = PointerValue;
DEBUG ((DEBUG_VERBOSE, "%a: 0x%04x/[0x%08x+%d] := 0x%Lx (%Lu)\n", DEBUG ((
__FUNCTION__, PointerItem, PointerOffset, PointerSize, PointerValue, DEBUG_VERBOSE,
(UINT64)S3Context->Used)); "%a: 0x%04x/[0x%08x+%d] := 0x%Lx (%Lu)\n",
__FUNCTION__,
PointerItem,
PointerOffset,
PointerSize,
PointerValue,
(UINT64)S3Context->Used
));
++S3Context->Used; ++S3Context->Used;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION provided to QemuFwCfgS3Lib. FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION provided to QemuFwCfgS3Lib.
**/ **/
@ -207,8 +210,10 @@ AppendFwCfgBootScript (
Condensed = &S3Context->WritePointers[Index]; Condensed = &S3Context->WritePointers[Index];
Status = QemuFwCfgS3ScriptSkipBytes (Condensed->PointerItem, Status = QemuFwCfgS3ScriptSkipBytes (
Condensed->PointerOffset); Condensed->PointerItem,
Condensed->PointerOffset
);
if (RETURN_ERROR (Status)) { if (RETURN_ERROR (Status)) {
goto FatalError; goto FatalError;
} }
@ -230,7 +235,6 @@ FatalError:
CpuDeadLoop (); CpuDeadLoop ();
} }
/** /**
Translate and append the information from an S3_CONTEXT object to the ACPI S3 Translate and append the information from an S3_CONTEXT object to the ACPI S3
Boot Script. Boot Script.
@ -263,7 +267,10 @@ TransferS3ContextToBootScript (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
Status = QemuFwCfgS3CallWhenBootScriptReady (AppendFwCfgBootScript, Status = QemuFwCfgS3CallWhenBootScriptReady (
S3Context, sizeof (SCRATCH_BUFFER)); AppendFwCfgBootScript,
S3Context,
sizeof (SCRATCH_BUFFER)
);
return (EFI_STATUS)Status; return (EFI_STATUS)Status;
} }

View File

@ -27,13 +27,12 @@ FindAcpiTableProtocol (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiAcpiTableProtocolGuid, &gEfiAcpiTableProtocolGuid,
NULL, NULL,
(VOID**)&AcpiTable (VOID **)&AcpiTable
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return AcpiTable; return AcpiTable;
} }
STATIC STATIC
VOID VOID
EFIAPI EFIAPI
@ -44,17 +43,19 @@ OnRootBridgesConnected (
{ {
EFI_STATUS Status; EFI_STATUS Status;
DEBUG ((DEBUG_INFO, DEBUG ((
DEBUG_INFO,
"%a: root bridges have been connected, installing ACPI tables\n", "%a: root bridges have been connected, installing ACPI tables\n",
__FUNCTION__)); __FUNCTION__
));
Status = InstallAcpiTables (FindAcpiTableProtocol ()); Status = InstallAcpiTables (FindAcpiTableProtocol ());
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: InstallAcpiTables: %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: InstallAcpiTables: %r\n", __FUNCTION__, Status));
} }
gBS->CloseEvent (Event); gBS->CloseEvent (Event);
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AcpiPlatformEntryPoint ( AcpiPlatformEntryPoint (
@ -71,8 +72,12 @@ AcpiPlatformEntryPoint (
// the full functionality. // the full functionality.
// //
if (PcdGetBool (PcdPciDisableBusEnumeration)) { if (PcdGetBool (PcdPciDisableBusEnumeration)) {
DEBUG ((DEBUG_INFO, "%a: PCI or its enumeration disabled, installing " DEBUG ((
"ACPI tables\n", __FUNCTION__)); DEBUG_INFO,
"%a: PCI or its enumeration disabled, installing "
"ACPI tables\n",
__FUNCTION__
));
return InstallAcpiTables (FindAcpiTableProtocol ()); return InstallAcpiTables (FindAcpiTableProtocol ());
} }
@ -82,13 +87,20 @@ AcpiPlatformEntryPoint (
// setup. (Note that we're a DXE_DRIVER; our entry point function is invoked // setup. (Note that we're a DXE_DRIVER; our entry point function is invoked
// strictly before BDS is entered and can connect the root bridges.) // strictly before BDS is entered and can connect the root bridges.)
// //
Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, Status = gBS->CreateEventEx (
OnRootBridgesConnected, NULL /* Context */, EVT_NOTIFY_SIGNAL,
&gRootBridgesConnectedEventGroupGuid, &RootBridgesConnected); TPL_CALLBACK,
OnRootBridgesConnected,
NULL /* Context */,
&gRootBridgesConnectedEventGroupGuid,
&RootBridgesConnected
);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, DEBUG ((
DEBUG_INFO,
"%a: waiting for root bridges to be connected, registered callback\n", "%a: waiting for root bridges to be connected, registered callback\n",
__FUNCTION__)); __FUNCTION__
));
} }
return Status; return Status;

View File

@ -13,7 +13,6 @@
#include "AcpiPlatform.h" #include "AcpiPlatform.h"
/** /**
Collect all PciIo protocol instances in the system. Save their original Collect all PciIo protocol instances in the system. Save their original
attributes, and enable IO and MMIO decoding for each. attributes, and enable IO and MMIO decoding for each.
@ -61,8 +60,13 @@ EnablePciDecoding (
return; return;
} }
Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiPciIoProtocolGuid, Status = gBS->LocateHandleBuffer (
NULL /* SearchKey */, &NoHandles, &Handles); ByProtocol,
&gEfiPciIoProtocolGuid,
NULL /* SearchKey */,
&NoHandles,
&Handles
);
if (Status == EFI_NOT_FOUND) { if (Status == EFI_NOT_FOUND) {
// //
// No PCI devices were found on either of the root bridges. We're done. // No PCI devices were found on either of the root bridges. We're done.
@ -71,15 +75,22 @@ EnablePciDecoding (
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: LocateHandleBuffer(): %r\n", __FUNCTION__, DEBUG ((
Status)); DEBUG_WARN,
"%a: LocateHandleBuffer(): %r\n",
__FUNCTION__,
Status
));
return; return;
} }
OrigAttrs = AllocatePool (NoHandles * sizeof *OrigAttrs); OrigAttrs = AllocatePool (NoHandles * sizeof *OrigAttrs);
if (OrigAttrs == NULL) { if (OrigAttrs == NULL) {
DEBUG ((DEBUG_WARN, "%a: AllocatePool(): out of resources\n", DEBUG ((
__FUNCTION__)); DEBUG_WARN,
"%a: AllocatePool(): out of resources\n",
__FUNCTION__
));
goto FreeHandles; goto FreeHandles;
} }
@ -90,30 +101,49 @@ EnablePciDecoding (
// //
// Look up PciIo on the handle and stash it // Look up PciIo on the handle and stash it
// //
Status = gBS->HandleProtocol (Handles[Idx], &gEfiPciIoProtocolGuid, Status = gBS->HandleProtocol (
(VOID**)&PciIo); Handles[Idx],
&gEfiPciIoProtocolGuid,
(VOID **)&PciIo
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
OrigAttrs[Idx].PciIo = PciIo; OrigAttrs[Idx].PciIo = PciIo;
// //
// Stash the current attributes // Stash the current attributes
// //
Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationGet, 0, Status = PciIo->Attributes (
&OrigAttrs[Idx].PciAttributes); PciIo,
EfiPciIoAttributeOperationGet,
0,
&OrigAttrs[Idx].PciAttributes
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: EfiPciIoAttributeOperationGet: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_WARN,
"%a: EfiPciIoAttributeOperationGet: %r\n",
__FUNCTION__,
Status
));
goto RestoreAttributes; goto RestoreAttributes;
} }
// //
// Retrieve supported attributes // Retrieve supported attributes
// //
Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationSupported, 0, Status = PciIo->Attributes (
&Attributes); PciIo,
EfiPciIoAttributeOperationSupported,
0,
&Attributes
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: EfiPciIoAttributeOperationSupported: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_WARN,
"%a: EfiPciIoAttributeOperationSupported: %r\n",
__FUNCTION__,
Status
));
goto RestoreAttributes; goto RestoreAttributes;
} }
@ -121,11 +151,19 @@ EnablePciDecoding (
// Enable IO and MMIO decoding // Enable IO and MMIO decoding
// //
Attributes &= EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY; Attributes &= EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY;
Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationEnable, Status = PciIo->Attributes (
Attributes, NULL); PciIo,
EfiPciIoAttributeOperationEnable,
Attributes,
NULL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: EfiPciIoAttributeOperationEnable: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_WARN,
"%a: EfiPciIoAttributeOperationEnable: %r\n",
__FUNCTION__,
Status
));
goto RestoreAttributes; goto RestoreAttributes;
} }
} }
@ -141,19 +179,20 @@ EnablePciDecoding (
RestoreAttributes: RestoreAttributes:
while (Idx > 0) { while (Idx > 0) {
--Idx; --Idx;
OrigAttrs[Idx].PciIo->Attributes (OrigAttrs[Idx].PciIo, OrigAttrs[Idx].PciIo->Attributes (
OrigAttrs[Idx].PciIo,
EfiPciIoAttributeOperationSet, EfiPciIoAttributeOperationSet,
OrigAttrs[Idx].PciAttributes, OrigAttrs[Idx].PciAttributes,
NULL NULL
); );
} }
FreePool (OrigAttrs); FreePool (OrigAttrs);
FreeHandles: FreeHandles:
FreePool (Handles); FreePool (Handles);
} }
/** /**
Restore the original PCI attributes saved with EnablePciDecoding(). Restore the original PCI attributes saved with EnablePciDecoding().
@ -190,5 +229,6 @@ RestorePciDecoding (
NULL NULL
); );
} }
FreePool (OriginalAttributes); FreePool (OriginalAttributes);
} }

View File

@ -36,7 +36,6 @@ typedef struct {
// part of ACPI tables. // part of ACPI tables.
} BLOB; } BLOB;
/** /**
Compare a standalone key against a user structure containing an embedded key. Compare a standalone key against a user structure containing an embedded key.
@ -65,7 +64,6 @@ BlobKeyCompare (
return AsciiStrCmp (StandaloneKey, (CONST CHAR8 *)Blob->File); return AsciiStrCmp (StandaloneKey, (CONST CHAR8 *)Blob->File);
} }
/** /**
Comparator function for two user structures. Comparator function for two user structures.
@ -93,7 +91,6 @@ BlobCompare (
return BlobKeyCompare (Blob1->File, UserStruct2); return BlobKeyCompare (Blob1->File, UserStruct2);
} }
/** /**
Comparator function for two opaque pointers, ordering on (unsigned) pointer Comparator function for two opaque pointers, ordering on (unsigned) pointer
value itself. value itself.
@ -120,13 +117,14 @@ PointerCompare (
if (Pointer1 == Pointer2) { if (Pointer1 == Pointer2) {
return 0; return 0;
} }
if ((UINTN)Pointer1 < (UINTN)Pointer2) { if ((UINTN)Pointer1 < (UINTN)Pointer2) {
return -1; return -1;
} }
return 1; return 1;
} }
/** /**
Comparator function for two ASCII strings. Can be used as both Key and Comparator function for two ASCII strings. Can be used as both Key and
UserStruct comparator. UserStruct comparator.
@ -151,7 +149,6 @@ AsciiStringCompare (
return AsciiStrCmp (AsciiString1, AsciiString2); return AsciiStrCmp (AsciiString1, AsciiString2);
} }
/** /**
Release the ORDERED_COLLECTION structure populated by Release the ORDERED_COLLECTION structure populated by
CollectAllocationsRestrictedTo32Bit() (below). CollectAllocationsRestrictedTo32Bit() (below).
@ -166,20 +163,21 @@ STATIC
VOID VOID
ReleaseAllocationsRestrictedTo32Bit ( ReleaseAllocationsRestrictedTo32Bit (
IN ORDERED_COLLECTION *AllocationsRestrictedTo32Bit IN ORDERED_COLLECTION *AllocationsRestrictedTo32Bit
) )
{ {
ORDERED_COLLECTION_ENTRY *Entry, *Entry2; ORDERED_COLLECTION_ENTRY *Entry, *Entry2;
for (Entry = OrderedCollectionMin (AllocationsRestrictedTo32Bit); for (Entry = OrderedCollectionMin (AllocationsRestrictedTo32Bit);
Entry != NULL; Entry != NULL;
Entry = Entry2) { Entry = Entry2)
{
Entry2 = OrderedCollectionNext (Entry); Entry2 = OrderedCollectionNext (Entry);
OrderedCollectionDelete (AllocationsRestrictedTo32Bit, Entry, NULL); OrderedCollectionDelete (AllocationsRestrictedTo32Bit, Entry, NULL);
} }
OrderedCollectionUninit (AllocationsRestrictedTo32Bit); OrderedCollectionUninit (AllocationsRestrictedTo32Bit);
} }
/** /**
Iterate over the linker/loader script, and collect the names of the fw_cfg Iterate over the linker/loader script, and collect the names of the fw_cfg
blobs that are referenced by QEMU_LOADER_ADD_POINTER.PointeeFile fields, such blobs that are referenced by QEMU_LOADER_ADD_POINTER.PointeeFile fields, such
@ -213,7 +211,7 @@ CollectAllocationsRestrictedTo32Bit (
OUT ORDERED_COLLECTION **AllocationsRestrictedTo32Bit, OUT ORDERED_COLLECTION **AllocationsRestrictedTo32Bit,
IN CONST QEMU_LOADER_ENTRY *LoaderStart, IN CONST QEMU_LOADER_ENTRY *LoaderStart,
IN CONST QEMU_LOADER_ENTRY *LoaderEnd IN CONST QEMU_LOADER_ENTRY *LoaderEnd
) )
{ {
ORDERED_COLLECTION *Collection; ORDERED_COLLECTION *Collection;
CONST QEMU_LOADER_ENTRY *LoaderEntry; CONST QEMU_LOADER_ENTRY *LoaderEntry;
@ -230,6 +228,7 @@ CollectAllocationsRestrictedTo32Bit (
if (LoaderEntry->Type != QemuLoaderCmdAddPointer) { if (LoaderEntry->Type != QemuLoaderCmdAddPointer) {
continue; continue;
} }
AddPointer = &LoaderEntry->Command.AddPointer; AddPointer = &LoaderEntry->Command.AddPointer;
if (AddPointer->PointerSize >= 8) { if (AddPointer->PointerSize >= 8) {
@ -276,7 +275,6 @@ RollBack:
return Status; return Status;
} }
/** /**
Process a QEMU_LOADER_ALLOCATE command. Process a QEMU_LOADER_ALLOCATE command.
@ -335,15 +333,24 @@ ProcessCmdAllocate (
} }
if (Allocate->Alignment > EFI_PAGE_SIZE) { if (Allocate->Alignment > EFI_PAGE_SIZE) {
DEBUG ((DEBUG_ERROR, "%a: unsupported alignment 0x%x\n", __FUNCTION__, DEBUG ((
Allocate->Alignment)); DEBUG_ERROR,
"%a: unsupported alignment 0x%x\n",
__FUNCTION__,
Allocate->Alignment
));
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
Status = QemuFwCfgFindFile ((CHAR8 *)Allocate->File, &FwCfgItem, &FwCfgSize); Status = QemuFwCfgFindFile ((CHAR8 *)Allocate->File, &FwCfgItem, &FwCfgSize);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: QemuFwCfgFindFile(\"%a\"): %r\n", __FUNCTION__, DEBUG ((
Allocate->File, Status)); DEBUG_ERROR,
"%a: QemuFwCfgFindFile(\"%a\"): %r\n",
__FUNCTION__,
Allocate->File,
Status
));
return Status; return Status;
} }
@ -352,11 +359,17 @@ ProcessCmdAllocate (
if (OrderedCollectionFind ( if (OrderedCollectionFind (
AllocationsRestrictedTo32Bit, AllocationsRestrictedTo32Bit,
Allocate->File Allocate->File
) != NULL) { ) != NULL)
{
Address = MAX_UINT32; Address = MAX_UINT32;
} }
Status = gBS->AllocatePages (AllocateMaxAddress, EfiACPIMemoryNVS, NumPages,
&Address); Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiACPIMemoryNVS,
NumPages,
&Address
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -366,6 +379,7 @@ ProcessCmdAllocate (
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto FreePages; goto FreePages;
} }
CopyMem (Blob->File, Allocate->File, QEMU_LOADER_FNAME_SIZE); CopyMem (Blob->File, Allocate->File, QEMU_LOADER_FNAME_SIZE);
Blob->Size = FwCfgSize; Blob->Size = FwCfgSize;
Blob->Base = (VOID *)(UINTN)Address; Blob->Base = (VOID *)(UINTN)Address;
@ -373,10 +387,15 @@ ProcessCmdAllocate (
Status = OrderedCollectionInsert (Tracker, NULL, Blob); Status = OrderedCollectionInsert (Tracker, NULL, Blob);
if (Status == RETURN_ALREADY_STARTED) { if (Status == RETURN_ALREADY_STARTED) {
DEBUG ((DEBUG_ERROR, "%a: duplicated file \"%a\"\n", __FUNCTION__, DEBUG ((
Allocate->File)); DEBUG_ERROR,
"%a: duplicated file \"%a\"\n",
__FUNCTION__,
Allocate->File
));
Status = EFI_PROTOCOL_ERROR; Status = EFI_PROTOCOL_ERROR;
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreeBlob; goto FreeBlob;
} }
@ -385,9 +404,17 @@ ProcessCmdAllocate (
QemuFwCfgReadBytes (FwCfgSize, Blob->Base); QemuFwCfgReadBytes (FwCfgSize, Blob->Base);
ZeroMem (Blob->Base + Blob->Size, EFI_PAGES_TO_SIZE (NumPages) - Blob->Size); ZeroMem (Blob->Base + Blob->Size, EFI_PAGES_TO_SIZE (NumPages) - Blob->Size);
DEBUG ((DEBUG_VERBOSE, "%a: File=\"%a\" Alignment=0x%x Zone=%d Size=0x%Lx " DEBUG ((
"Address=0x%Lx\n", __FUNCTION__, Allocate->File, Allocate->Alignment, DEBUG_VERBOSE,
Allocate->Zone, (UINT64)Blob->Size, (UINT64)(UINTN)Blob->Base)); "%a: File=\"%a\" Alignment=0x%x Zone=%d Size=0x%Lx "
"Address=0x%Lx\n",
__FUNCTION__,
Allocate->File,
Allocate->Alignment,
Allocate->Zone,
(UINT64)Blob->Size,
(UINT64)(UINTN)Blob->Base
));
return EFI_SUCCESS; return EFI_SUCCESS;
FreeBlob: FreeBlob:
@ -399,7 +426,6 @@ FreePages:
return Status; return Status;
} }
/** /**
Process a QEMU_LOADER_ADD_POINTER command. Process a QEMU_LOADER_ADD_POINTER command.
@ -431,28 +457,39 @@ ProcessCmdAddPointer (
UINT8 *PointerField; UINT8 *PointerField;
UINT64 PointerValue; UINT64 PointerValue;
if (AddPointer->PointerFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0' || if ((AddPointer->PointerFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0') ||
AddPointer->PointeeFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0') { (AddPointer->PointeeFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0'))
{
DEBUG ((DEBUG_ERROR, "%a: malformed file name\n", __FUNCTION__)); DEBUG ((DEBUG_ERROR, "%a: malformed file name\n", __FUNCTION__));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
TrackerEntry = OrderedCollectionFind (Tracker, AddPointer->PointerFile); TrackerEntry = OrderedCollectionFind (Tracker, AddPointer->PointerFile);
TrackerEntry2 = OrderedCollectionFind (Tracker, AddPointer->PointeeFile); TrackerEntry2 = OrderedCollectionFind (Tracker, AddPointer->PointeeFile);
if (TrackerEntry == NULL || TrackerEntry2 == NULL) { if ((TrackerEntry == NULL) || (TrackerEntry2 == NULL)) {
DEBUG ((DEBUG_ERROR, "%a: invalid blob reference(s) \"%a\" / \"%a\"\n", DEBUG ((
__FUNCTION__, AddPointer->PointerFile, AddPointer->PointeeFile)); DEBUG_ERROR,
"%a: invalid blob reference(s) \"%a\" / \"%a\"\n",
__FUNCTION__,
AddPointer->PointerFile,
AddPointer->PointeeFile
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
Blob = OrderedCollectionUserStruct (TrackerEntry); Blob = OrderedCollectionUserStruct (TrackerEntry);
Blob2 = OrderedCollectionUserStruct (TrackerEntry2); Blob2 = OrderedCollectionUserStruct (TrackerEntry2);
if ((AddPointer->PointerSize != 1 && AddPointer->PointerSize != 2 && if (((AddPointer->PointerSize != 1) && (AddPointer->PointerSize != 2) &&
AddPointer->PointerSize != 4 && AddPointer->PointerSize != 8) || (AddPointer->PointerSize != 4) && (AddPointer->PointerSize != 8)) ||
Blob->Size < AddPointer->PointerSize || (Blob->Size < AddPointer->PointerSize) ||
Blob->Size - AddPointer->PointerSize < AddPointer->PointerOffset) { (Blob->Size - AddPointer->PointerSize < AddPointer->PointerOffset))
DEBUG ((DEBUG_ERROR, "%a: invalid pointer location or size in \"%a\"\n", {
__FUNCTION__, AddPointer->PointerFile)); DEBUG ((
DEBUG_ERROR,
"%a: invalid pointer location or size in \"%a\"\n",
__FUNCTION__,
AddPointer->PointerFile
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -460,8 +497,12 @@ ProcessCmdAddPointer (
PointerValue = 0; PointerValue = 0;
CopyMem (&PointerValue, PointerField, AddPointer->PointerSize); CopyMem (&PointerValue, PointerField, AddPointer->PointerSize);
if (PointerValue >= Blob2->Size) { if (PointerValue >= Blob2->Size) {
DEBUG ((DEBUG_ERROR, "%a: invalid pointer value in \"%a\"\n", __FUNCTION__, DEBUG ((
AddPointer->PointerFile)); DEBUG_ERROR,
"%a: invalid pointer value in \"%a\"\n",
__FUNCTION__,
AddPointer->PointerFile
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -472,23 +513,34 @@ ProcessCmdAddPointer (
ASSERT ((UINTN)Blob2->Base <= MAX_ADDRESS - Blob2->Size); ASSERT ((UINTN)Blob2->Base <= MAX_ADDRESS - Blob2->Size);
PointerValue += (UINT64)(UINTN)Blob2->Base; PointerValue += (UINT64)(UINTN)Blob2->Base;
if (AddPointer->PointerSize < 8 && if ((AddPointer->PointerSize < 8) &&
RShiftU64 (PointerValue, AddPointer->PointerSize * 8) != 0) { (RShiftU64 (PointerValue, AddPointer->PointerSize * 8) != 0))
DEBUG ((DEBUG_ERROR, "%a: relocated pointer value unrepresentable in " {
"\"%a\"\n", __FUNCTION__, AddPointer->PointerFile)); DEBUG ((
DEBUG_ERROR,
"%a: relocated pointer value unrepresentable in "
"\"%a\"\n",
__FUNCTION__,
AddPointer->PointerFile
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
CopyMem (PointerField, &PointerValue, AddPointer->PointerSize); CopyMem (PointerField, &PointerValue, AddPointer->PointerSize);
DEBUG ((DEBUG_VERBOSE, "%a: PointerFile=\"%a\" PointeeFile=\"%a\" " DEBUG ((
"PointerOffset=0x%x PointerSize=%d\n", __FUNCTION__, DEBUG_VERBOSE,
AddPointer->PointerFile, AddPointer->PointeeFile, "%a: PointerFile=\"%a\" PointeeFile=\"%a\" "
AddPointer->PointerOffset, AddPointer->PointerSize)); "PointerOffset=0x%x PointerSize=%d\n",
__FUNCTION__,
AddPointer->PointerFile,
AddPointer->PointeeFile,
AddPointer->PointerOffset,
AddPointer->PointerSize
));
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Process a QEMU_LOADER_ADD_CHECKSUM command. Process a QEMU_LOADER_ADD_CHECKSUM command.
@ -522,17 +574,26 @@ ProcessCmdAddChecksum (
TrackerEntry = OrderedCollectionFind (Tracker, AddChecksum->File); TrackerEntry = OrderedCollectionFind (Tracker, AddChecksum->File);
if (TrackerEntry == NULL) { if (TrackerEntry == NULL) {
DEBUG ((DEBUG_ERROR, "%a: invalid blob reference \"%a\"\n", __FUNCTION__, DEBUG ((
AddChecksum->File)); DEBUG_ERROR,
"%a: invalid blob reference \"%a\"\n",
__FUNCTION__,
AddChecksum->File
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
Blob = OrderedCollectionUserStruct (TrackerEntry); Blob = OrderedCollectionUserStruct (TrackerEntry);
if (Blob->Size <= AddChecksum->ResultOffset || if ((Blob->Size <= AddChecksum->ResultOffset) ||
Blob->Size < AddChecksum->Length || (Blob->Size < AddChecksum->Length) ||
Blob->Size - AddChecksum->Length < AddChecksum->Start) { (Blob->Size - AddChecksum->Length < AddChecksum->Start))
DEBUG ((DEBUG_ERROR, "%a: invalid checksum range in \"%a\"\n", {
__FUNCTION__, AddChecksum->File)); DEBUG ((
DEBUG_ERROR,
"%a: invalid checksum range in \"%a\"\n",
__FUNCTION__,
AddChecksum->File
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -540,13 +601,19 @@ ProcessCmdAddChecksum (
Blob->Base + AddChecksum->Start, Blob->Base + AddChecksum->Start,
AddChecksum->Length AddChecksum->Length
); );
DEBUG ((DEBUG_VERBOSE, "%a: File=\"%a\" ResultOffset=0x%x Start=0x%x " DEBUG ((
"Length=0x%x\n", __FUNCTION__, AddChecksum->File, DEBUG_VERBOSE,
AddChecksum->ResultOffset, AddChecksum->Start, AddChecksum->Length)); "%a: File=\"%a\" ResultOffset=0x%x Start=0x%x "
"Length=0x%x\n",
__FUNCTION__,
AddChecksum->File,
AddChecksum->ResultOffset,
AddChecksum->Start,
AddChecksum->Length
));
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Process a QEMU_LOADER_WRITE_POINTER command. Process a QEMU_LOADER_WRITE_POINTER command.
@ -593,29 +660,42 @@ ProcessCmdWritePointer (
BLOB *PointeeBlob; BLOB *PointeeBlob;
UINT64 PointerValue; UINT64 PointerValue;
if (WritePointer->PointerFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0' || if ((WritePointer->PointerFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0') ||
WritePointer->PointeeFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0') { (WritePointer->PointeeFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0'))
{
DEBUG ((DEBUG_ERROR, "%a: malformed file name\n", __FUNCTION__)); DEBUG ((DEBUG_ERROR, "%a: malformed file name\n", __FUNCTION__));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
Status = QemuFwCfgFindFile ((CONST CHAR8 *)WritePointer->PointerFile, Status = QemuFwCfgFindFile (
&PointerItem, &PointerItemSize); (CONST CHAR8 *)WritePointer->PointerFile,
&PointerItem,
&PointerItemSize
);
PointeeEntry = OrderedCollectionFind (Tracker, WritePointer->PointeeFile); PointeeEntry = OrderedCollectionFind (Tracker, WritePointer->PointeeFile);
if (RETURN_ERROR (Status) || PointeeEntry == NULL) { if (RETURN_ERROR (Status) || (PointeeEntry == NULL)) {
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"%a: invalid fw_cfg file or blob reference \"%a\" / \"%a\"\n", "%a: invalid fw_cfg file or blob reference \"%a\" / \"%a\"\n",
__FUNCTION__, WritePointer->PointerFile, WritePointer->PointeeFile)); __FUNCTION__,
WritePointer->PointerFile,
WritePointer->PointeeFile
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
if ((WritePointer->PointerSize != 1 && WritePointer->PointerSize != 2 && if (((WritePointer->PointerSize != 1) && (WritePointer->PointerSize != 2) &&
WritePointer->PointerSize != 4 && WritePointer->PointerSize != 8) || (WritePointer->PointerSize != 4) && (WritePointer->PointerSize != 8)) ||
(PointerItemSize < WritePointer->PointerSize) || (PointerItemSize < WritePointer->PointerSize) ||
(PointerItemSize - WritePointer->PointerSize < (PointerItemSize - WritePointer->PointerSize <
WritePointer->PointerOffset)) { WritePointer->PointerOffset))
DEBUG ((DEBUG_ERROR, "%a: invalid pointer location or size in \"%a\"\n", {
__FUNCTION__, WritePointer->PointerFile)); DEBUG ((
DEBUG_ERROR,
"%a: invalid pointer location or size in \"%a\"\n",
__FUNCTION__,
WritePointer->PointerFile
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -633,10 +713,15 @@ ProcessCmdWritePointer (
ASSERT ((UINTN)PointeeBlob->Base <= MAX_ADDRESS - PointeeBlob->Size); ASSERT ((UINTN)PointeeBlob->Base <= MAX_ADDRESS - PointeeBlob->Size);
PointerValue += (UINT64)(UINTN)PointeeBlob->Base; PointerValue += (UINT64)(UINTN)PointeeBlob->Base;
if (WritePointer->PointerSize < 8 && if ((WritePointer->PointerSize < 8) &&
RShiftU64 (PointerValue, WritePointer->PointerSize * 8) != 0) { (RShiftU64 (PointerValue, WritePointer->PointerSize * 8) != 0))
DEBUG ((DEBUG_ERROR, "%a: pointer value unrepresentable in \"%a\"\n", {
__FUNCTION__, WritePointer->PointerFile)); DEBUG ((
DEBUG_ERROR,
"%a: pointer value unrepresentable in \"%a\"\n",
__FUNCTION__,
WritePointer->PointerFile
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -670,15 +755,20 @@ ProcessCmdWritePointer (
// //
PointeeBlob->HostsOnlyTableData = FALSE; PointeeBlob->HostsOnlyTableData = FALSE;
DEBUG ((DEBUG_VERBOSE, "%a: PointerFile=\"%a\" PointeeFile=\"%a\" " DEBUG ((
"PointerOffset=0x%x PointeeOffset=0x%x PointerSize=%d\n", __FUNCTION__, DEBUG_VERBOSE,
WritePointer->PointerFile, WritePointer->PointeeFile, "%a: PointerFile=\"%a\" PointeeFile=\"%a\" "
WritePointer->PointerOffset, WritePointer->PointeeOffset, "PointerOffset=0x%x PointeeOffset=0x%x PointerSize=%d\n",
WritePointer->PointerSize)); __FUNCTION__,
WritePointer->PointerFile,
WritePointer->PointeeFile,
WritePointer->PointerOffset,
WritePointer->PointeeOffset,
WritePointer->PointerSize
));
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Undo a QEMU_LOADER_WRITE_POINTER command. Undo a QEMU_LOADER_WRITE_POINTER command.
@ -700,8 +790,11 @@ UndoCmdWritePointer (
UINTN PointerItemSize; UINTN PointerItemSize;
UINT64 PointerValue; UINT64 PointerValue;
Status = QemuFwCfgFindFile ((CONST CHAR8 *)WritePointer->PointerFile, Status = QemuFwCfgFindFile (
&PointerItem, &PointerItemSize); (CONST CHAR8 *)WritePointer->PointerFile,
&PointerItem,
&PointerItemSize
);
ASSERT_RETURN_ERROR (Status); ASSERT_RETURN_ERROR (Status);
PointerValue = 0; PointerValue = 0;
@ -709,13 +802,16 @@ UndoCmdWritePointer (
QemuFwCfgSkipBytes (WritePointer->PointerOffset); QemuFwCfgSkipBytes (WritePointer->PointerOffset);
QemuFwCfgWriteBytes (WritePointer->PointerSize, &PointerValue); QemuFwCfgWriteBytes (WritePointer->PointerSize, &PointerValue);
DEBUG ((DEBUG_VERBOSE, DEBUG ((
"%a: PointerFile=\"%a\" PointerOffset=0x%x PointerSize=%d\n", __FUNCTION__, DEBUG_VERBOSE,
WritePointer->PointerFile, WritePointer->PointerOffset, "%a: PointerFile=\"%a\" PointerOffset=0x%x PointerSize=%d\n",
WritePointer->PointerSize)); __FUNCTION__,
WritePointer->PointerFile,
WritePointer->PointerOffset,
WritePointer->PointerSize
));
} }
// //
// We'll be saving the keys of installed tables so that we can roll them back // We'll be saving the keys of installed tables so that we can roll them back
// in case of failure. 128 tables should be enough for anyone (TM). // in case of failure. 128 tables should be enough for anyone (TM).
@ -806,7 +902,7 @@ Process2ndPassCmdAddPointer (
CONST EFI_ACPI_DESCRIPTION_HEADER *Header; CONST EFI_ACPI_DESCRIPTION_HEADER *Header;
EFI_STATUS Status; EFI_STATUS Status;
if (*NumInstalled < 0 || *NumInstalled > INSTALLED_TABLES_MAX) { if ((*NumInstalled < 0) || (*NumInstalled > INSTALLED_TABLES_MAX)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -823,7 +919,7 @@ Process2ndPassCmdAddPointer (
// by the Blob2->Size check and later checks in ProcessCmdAddPointer(). // by the Blob2->Size check and later checks in ProcessCmdAddPointer().
// //
Blob2Remaining = (UINTN)Blob2->Base; Blob2Remaining = (UINTN)Blob2->Base;
ASSERT(PointerValue >= Blob2Remaining); ASSERT (PointerValue >= Blob2Remaining);
Blob2Remaining += Blob2->Size; Blob2Remaining += Blob2->Size;
ASSERT (PointerValue < Blob2Remaining); ASSERT (PointerValue < Blob2Remaining);
@ -845,13 +941,20 @@ Process2ndPassCmdAddPointer (
)); ));
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} }
return Status; return Status;
} }
Blob2Remaining -= (UINTN) PointerValue; Blob2Remaining -= (UINTN)PointerValue;
DEBUG ((DEBUG_VERBOSE, "%a: checking for ACPI header in \"%a\" at 0x%Lx " DEBUG ((
"(remaining: 0x%Lx): ", __FUNCTION__, AddPointer->PointeeFile, DEBUG_VERBOSE,
PointerValue, (UINT64)Blob2Remaining)); "%a: checking for ACPI header in \"%a\" at 0x%Lx "
"(remaining: 0x%Lx): ",
__FUNCTION__,
AddPointer->PointeeFile,
PointerValue,
(UINT64)Blob2Remaining
));
TableSize = 0; TableSize = 0;
@ -861,12 +964,17 @@ Process2ndPassCmdAddPointer (
if (sizeof *Facs <= Blob2Remaining) { if (sizeof *Facs <= Blob2Remaining) {
Facs = (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)PointerValue; Facs = (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)PointerValue;
if (Facs->Length >= sizeof *Facs && if ((Facs->Length >= sizeof *Facs) &&
Facs->Length <= Blob2Remaining && (Facs->Length <= Blob2Remaining) &&
Facs->Signature == (Facs->Signature ==
EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) { EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE))
DEBUG ((DEBUG_VERBOSE, "found \"%-4.4a\" size 0x%x\n", {
(CONST CHAR8 *)&Facs->Signature, Facs->Length)); DEBUG ((
DEBUG_VERBOSE,
"found \"%-4.4a\" size 0x%x\n",
(CONST CHAR8 *)&Facs->Signature,
Facs->Length
));
TableSize = Facs->Length; TableSize = Facs->Length;
} }
} }
@ -874,28 +982,34 @@ Process2ndPassCmdAddPointer (
// //
// check for the uniform tables // check for the uniform tables
// //
if (TableSize == 0 && sizeof *Header <= Blob2Remaining) { if ((TableSize == 0) && (sizeof *Header <= Blob2Remaining)) {
Header = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)PointerValue; Header = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)PointerValue;
if (Header->Length >= sizeof *Header && if ((Header->Length >= sizeof *Header) &&
Header->Length <= Blob2Remaining && (Header->Length <= Blob2Remaining) &&
CalculateSum8 ((CONST UINT8 *)Header, Header->Length) == 0) { (CalculateSum8 ((CONST UINT8 *)Header, Header->Length) == 0))
{
// //
// This looks very much like an ACPI table from QEMU: // This looks very much like an ACPI table from QEMU:
// - Length field consistent with both ACPI and containing blob size // - Length field consistent with both ACPI and containing blob size
// - checksum is correct // - checksum is correct
// //
DEBUG ((DEBUG_VERBOSE, "found \"%-4.4a\" size 0x%x\n", DEBUG ((
(CONST CHAR8 *)&Header->Signature, Header->Length)); DEBUG_VERBOSE,
"found \"%-4.4a\" size 0x%x\n",
(CONST CHAR8 *)&Header->Signature,
Header->Length
));
TableSize = Header->Length; TableSize = Header->Length;
// //
// Skip RSDT and XSDT because those are handled by // Skip RSDT and XSDT because those are handled by
// EFI_ACPI_TABLE_PROTOCOL automatically. // EFI_ACPI_TABLE_PROTOCOL automatically.
if (Header->Signature == if ((Header->Signature ==
EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE || EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) ||
Header->Signature == (Header->Signature ==
EFI_ACPI_2_0_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) { EFI_ACPI_2_0_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE))
{
return EFI_SUCCESS; return EFI_SUCCESS;
} }
} }
@ -908,20 +1022,32 @@ Process2ndPassCmdAddPointer (
} }
if (*NumInstalled == INSTALLED_TABLES_MAX) { if (*NumInstalled == INSTALLED_TABLES_MAX) {
DEBUG ((DEBUG_ERROR, "%a: can't install more than %d tables\n", DEBUG ((
__FUNCTION__, INSTALLED_TABLES_MAX)); DEBUG_ERROR,
"%a: can't install more than %d tables\n",
__FUNCTION__,
INSTALLED_TABLES_MAX
));
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto RollbackSeenPointer; goto RollbackSeenPointer;
} }
Status = AcpiProtocol->InstallAcpiTable (AcpiProtocol, Status = AcpiProtocol->InstallAcpiTable (
(VOID *)(UINTN)PointerValue, TableSize, AcpiProtocol,
&InstalledKey[*NumInstalled]); (VOID *)(UINTN)PointerValue,
TableSize,
&InstalledKey[*NumInstalled]
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: InstallAcpiTable(): %r\n", __FUNCTION__, DEBUG ((
Status)); DEBUG_ERROR,
"%a: InstallAcpiTable(): %r\n",
__FUNCTION__,
Status
));
goto RollbackSeenPointer; goto RollbackSeenPointer;
} }
++*NumInstalled; ++*NumInstalled;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -930,7 +1056,6 @@ RollbackSeenPointer:
return Status; return Status;
} }
/** /**
Download, process, and install ACPI table data from the QEMU loader Download, process, and install ACPI table data from the QEMU loader
interface. interface.
@ -980,9 +1105,14 @@ InstallQemuFwCfgTables (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
if (FwCfgSize % sizeof *LoaderEntry != 0) { if (FwCfgSize % sizeof *LoaderEntry != 0) {
DEBUG ((DEBUG_ERROR, "%a: \"etc/table-loader\" has invalid size 0x%Lx\n", DEBUG ((
__FUNCTION__, (UINT64)FwCfgSize)); DEBUG_ERROR,
"%a: \"etc/table-loader\" has invalid size 0x%Lx\n",
__FUNCTION__,
(UINT64)FwCfgSize
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -990,6 +1120,7 @@ InstallQemuFwCfgTables (
if (LoaderStart == NULL) { if (LoaderStart == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
EnablePciDecoding (&OriginalPciAttributes, &OriginalPciAttributesCount); EnablePciDecoding (&OriginalPciAttributes, &OriginalPciAttributesCount);
QemuFwCfgSelectItem (FwCfgItem); QemuFwCfgSelectItem (FwCfgItem);
QemuFwCfgReadBytes (FwCfgSize, LoaderStart); QemuFwCfgReadBytes (FwCfgSize, LoaderStart);
@ -1043,26 +1174,38 @@ InstallQemuFwCfgTables (
break; break;
case QemuLoaderCmdAddPointer: case QemuLoaderCmdAddPointer:
Status = ProcessCmdAddPointer (&LoaderEntry->Command.AddPointer, Status = ProcessCmdAddPointer (
Tracker); &LoaderEntry->Command.AddPointer,
Tracker
);
break; break;
case QemuLoaderCmdAddChecksum: case QemuLoaderCmdAddChecksum:
Status = ProcessCmdAddChecksum (&LoaderEntry->Command.AddChecksum, Status = ProcessCmdAddChecksum (
Tracker); &LoaderEntry->Command.AddChecksum,
Tracker
);
break; break;
case QemuLoaderCmdWritePointer: case QemuLoaderCmdWritePointer:
Status = ProcessCmdWritePointer (&LoaderEntry->Command.WritePointer, Status = ProcessCmdWritePointer (
Tracker, S3Context); &LoaderEntry->Command.WritePointer,
Tracker,
S3Context
);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
WritePointerSubsetEnd = LoaderEntry + 1; WritePointerSubsetEnd = LoaderEntry + 1;
} }
break; break;
default: default:
DEBUG ((DEBUG_VERBOSE, "%a: unknown loader command: 0x%x\n", DEBUG ((
__FUNCTION__, LoaderEntry->Type)); DEBUG_VERBOSE,
"%a: unknown loader command: 0x%x\n",
__FUNCTION__,
LoaderEntry->Type
));
break; break;
} }
@ -1113,6 +1256,7 @@ InstallQemuFwCfgTables (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto UninstallAcpiTables; goto UninstallAcpiTables;
} }
// //
// Ownership of S3Context has been transferred. // Ownership of S3Context has been transferred.
// //
@ -1134,10 +1278,12 @@ UninstallAcpiTables:
for (SeenPointerEntry = OrderedCollectionMin (SeenPointers); for (SeenPointerEntry = OrderedCollectionMin (SeenPointers);
SeenPointerEntry != NULL; SeenPointerEntry != NULL;
SeenPointerEntry = SeenPointerEntry2) { SeenPointerEntry = SeenPointerEntry2)
{
SeenPointerEntry2 = OrderedCollectionNext (SeenPointerEntry); SeenPointerEntry2 = OrderedCollectionNext (SeenPointerEntry);
OrderedCollectionDelete (SeenPointers, SeenPointerEntry, NULL); OrderedCollectionDelete (SeenPointers, SeenPointerEntry, NULL);
} }
OrderedCollectionUninit (SeenPointers); OrderedCollectionUninit (SeenPointers);
FreeKeys: FreeKeys:
@ -1164,7 +1310,8 @@ RollbackWritePointersAndFreeTracker:
// not directly part of some ACPI table. // not directly part of some ACPI table.
// //
for (TrackerEntry = OrderedCollectionMin (Tracker); TrackerEntry != NULL; for (TrackerEntry = OrderedCollectionMin (Tracker); TrackerEntry != NULL;
TrackerEntry = TrackerEntry2) { TrackerEntry = TrackerEntry2)
{
VOID *UserStruct; VOID *UserStruct;
BLOB *Blob; BLOB *Blob;
@ -1173,12 +1320,18 @@ RollbackWritePointersAndFreeTracker:
Blob = UserStruct; Blob = UserStruct;
if (EFI_ERROR (Status) || Blob->HostsOnlyTableData) { if (EFI_ERROR (Status) || Blob->HostsOnlyTableData) {
DEBUG ((DEBUG_VERBOSE, "%a: freeing \"%a\"\n", __FUNCTION__, DEBUG ((
Blob->File)); DEBUG_VERBOSE,
"%a: freeing \"%a\"\n",
__FUNCTION__,
Blob->File
));
gBS->FreePages ((UINTN)Blob->Base, EFI_SIZE_TO_PAGES (Blob->Size)); gBS->FreePages ((UINTN)Blob->Base, EFI_SIZE_TO_PAGES (Blob->Size));
} }
FreePool (Blob); FreePool (Blob);
} }
OrderedCollectionUninit (Tracker); OrderedCollectionUninit (Tracker);
FreeS3Context: FreeS3Context:

View File

@ -58,7 +58,7 @@ STATIC HASH_TABLE *mHashesTable;
STATIC UINT16 mHashesTableSize; STATIC UINT16 mHashesTableSize;
STATIC STATIC
CONST GUID* CONST GUID *
FindBlobEntryGuid ( FindBlobEntryGuid (
IN CONST CHAR16 *BlobName IN CONST CHAR16 *BlobName
) )
@ -97,17 +97,23 @@ VerifyBlob (
INT32 Remaining; INT32 Remaining;
HASH_TABLE *Entry; HASH_TABLE *Entry;
if (mHashesTable == NULL || mHashesTableSize == 0) { if ((mHashesTable == NULL) || (mHashesTableSize == 0)) {
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"%a: Verifier called but no hashes table discoverd in MEMFD\n", "%a: Verifier called but no hashes table discoverd in MEMFD\n",
__FUNCTION__)); __FUNCTION__
));
return EFI_ACCESS_DENIED; return EFI_ACCESS_DENIED;
} }
Guid = FindBlobEntryGuid (BlobName); Guid = FindBlobEntryGuid (BlobName);
if (Guid == NULL) { if (Guid == NULL) {
DEBUG ((DEBUG_ERROR, "%a: Unknown blob name \"%s\"\n", __FUNCTION__, DEBUG ((
BlobName)); DEBUG_ERROR,
"%a: Unknown blob name \"%s\"\n",
__FUNCTION__,
BlobName
));
return EFI_ACCESS_DENIED; return EFI_ACCESS_DENIED;
} }
@ -118,7 +124,8 @@ VerifyBlob (
for (Entry = mHashesTable, Remaining = mHashesTableSize; for (Entry = mHashesTable, Remaining = mHashesTableSize;
Remaining >= sizeof *Entry && Remaining >= Entry->Len; Remaining >= sizeof *Entry && Remaining >= Entry->Len;
Remaining -= Entry->Len, Remaining -= Entry->Len,
Entry = (HASH_TABLE *)((UINT8 *)Entry + Entry->Len)) { Entry = (HASH_TABLE *)((UINT8 *)Entry + Entry->Len))
{
UINTN EntrySize; UINTN EntrySize;
EFI_STATUS Status; EFI_STATUS Status;
UINT8 Hash[SHA256_DIGEST_SIZE]; UINT8 Hash[SHA256_DIGEST_SIZE];
@ -131,8 +138,13 @@ VerifyBlob (
EntrySize = Entry->Len - sizeof Entry->Guid - sizeof Entry->Len; EntrySize = Entry->Len - sizeof Entry->Guid - sizeof Entry->Len;
if (EntrySize != SHA256_DIGEST_SIZE) { if (EntrySize != SHA256_DIGEST_SIZE) {
DEBUG ((DEBUG_ERROR, "%a: Hash has the wrong size %d != %d\n", DEBUG ((
__FUNCTION__, EntrySize, SHA256_DIGEST_SIZE)); DEBUG_ERROR,
"%a: Hash has the wrong size %d != %d\n",
__FUNCTION__,
EntrySize,
SHA256_DIGEST_SIZE
));
return EFI_ACCESS_DENIED; return EFI_ACCESS_DENIED;
} }
@ -144,18 +156,31 @@ VerifyBlob (
if (CompareMem (Entry->Data, Hash, EntrySize) == 0) { if (CompareMem (Entry->Data, Hash, EntrySize) == 0) {
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
DEBUG ((DEBUG_INFO, "%a: Hash comparison succeeded for \"%s\"\n", DEBUG ((
__FUNCTION__, BlobName)); DEBUG_INFO,
"%a: Hash comparison succeeded for \"%s\"\n",
__FUNCTION__,
BlobName
));
} else { } else {
Status = EFI_ACCESS_DENIED; Status = EFI_ACCESS_DENIED;
DEBUG ((DEBUG_ERROR, "%a: Hash comparison failed for \"%s\"\n", DEBUG ((
__FUNCTION__, BlobName)); DEBUG_ERROR,
"%a: Hash comparison failed for \"%s\"\n",
__FUNCTION__,
BlobName
));
} }
return Status; return Status;
} }
DEBUG ((DEBUG_ERROR, "%a: Hash GUID %g not found in table\n", __FUNCTION__, DEBUG ((
Guid)); DEBUG_ERROR,
"%a: Hash GUID %g not found in table\n",
__FUNCTION__,
Guid
));
return EFI_ACCESS_DENIED; return EFI_ACCESS_DENIED;
} }
@ -183,20 +208,29 @@ BlobVerifierLibSevHashesConstructor (
Ptr = (void *)(UINTN)FixedPcdGet64 (PcdQemuHashTableBase); Ptr = (void *)(UINTN)FixedPcdGet64 (PcdQemuHashTableBase);
Size = FixedPcdGet32 (PcdQemuHashTableSize); Size = FixedPcdGet32 (PcdQemuHashTableSize);
if (Ptr == NULL || Size < sizeof *Ptr || if ((Ptr == NULL) || (Size < sizeof *Ptr) ||
!CompareGuid (&Ptr->Guid, &SEV_HASH_TABLE_GUID) || !CompareGuid (&Ptr->Guid, &SEV_HASH_TABLE_GUID) ||
Ptr->Len < sizeof *Ptr || Ptr->Len > Size) { (Ptr->Len < sizeof *Ptr) || (Ptr->Len > Size))
{
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
DEBUG ((DEBUG_INFO, "%a: Found injected hashes table in secure location\n", DEBUG ((
__FUNCTION__)); DEBUG_INFO,
"%a: Found injected hashes table in secure location\n",
__FUNCTION__
));
mHashesTable = (HASH_TABLE *)Ptr->Data; mHashesTable = (HASH_TABLE *)Ptr->Data;
mHashesTableSize = Ptr->Len - sizeof Ptr->Guid - sizeof Ptr->Len; mHashesTableSize = Ptr->Len - sizeof Ptr->Guid - sizeof Ptr->Len;
DEBUG ((DEBUG_VERBOSE, "%a: mHashesTable=0x%p, Size=%u\n", __FUNCTION__, DEBUG ((
mHashesTable, mHashesTableSize)); DEBUG_VERBOSE,
"%a: mHashesTable=0x%p, Size=%u\n",
__FUNCTION__,
mHashesTable,
mHashesTableSize
));
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -15,7 +15,7 @@ STATIC CONFIDENTIAL_COMPUTING_SECRET_LOCATION mSecretDxeTable = {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeSecretDxe( InitializeSecretDxe (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )

View File

@ -51,8 +51,9 @@ AmdSevDxeEntryPoint (
CONST EFI_GCD_MEMORY_SPACE_DESCRIPTOR *Desc; CONST EFI_GCD_MEMORY_SPACE_DESCRIPTOR *Desc;
Desc = &AllDescMap[Index]; Desc = &AllDescMap[Index];
if (Desc->GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo || if ((Desc->GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo) ||
Desc->GcdMemoryType == EfiGcdMemoryTypeNonExistent) { (Desc->GcdMemoryType == EfiGcdMemoryTypeNonExistent))
{
Status = MemEncryptSevClearMmioPageEncMask ( Status = MemEncryptSevClearMmioPageEncMask (
0, 0,
Desc->BaseAddress, Desc->BaseAddress,
@ -123,8 +124,12 @@ AmdSevDxeEntryPoint (
MapPagesCount // NumPages MapPagesCount // NumPages
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: MemEncryptSevClearPageEncMask(): %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_ERROR,
"%a: MemEncryptSevClearPageEncMask(): %r\n",
__FUNCTION__,
Status
));
ASSERT (FALSE); ASSERT (FALSE);
CpuDeadLoop (); CpuDeadLoop ();
} }

View File

@ -27,7 +27,6 @@ InstallAcpiTable (
); );
} }
/** /**
Locate the first instance of a protocol. If the protocol requested is an Locate the first instance of a protocol. If the protocol requested is an
FV protocol, then it will return the first FV that contains the ACPI table FV protocol, then it will return the first FV that contains the ACPI table
@ -85,7 +84,7 @@ LocateFvInstanceWithTables (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
HandleBuffer[Index], HandleBuffer[Index],
&gEfiFirmwareVolume2ProtocolGuid, &gEfiFirmwareVolume2ProtocolGuid,
(VOID**) &FvInstance (VOID **)&FvInstance
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -94,7 +93,7 @@ LocateFvInstanceWithTables (
// //
Status = FvInstance->ReadFile ( Status = FvInstance->ReadFile (
FvInstance, FvInstance,
(EFI_GUID*)PcdGetPtr (PcdAcpiTableStorageFile), (EFI_GUID *)PcdGetPtr (PcdAcpiTableStorageFile),
NULL, NULL,
&Size, &Size,
&FileType, &FileType,
@ -124,7 +123,6 @@ LocateFvInstanceWithTables (
return Status; return Status;
} }
/** /**
Find ACPI tables in an FV and install them. Find ACPI tables in an FV and install them.
@ -171,19 +169,19 @@ InstallOvmfFvTables (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_ABORTED; return EFI_ABORTED;
} }
ASSERT (FwVol != NULL); ASSERT (FwVol != NULL);
// //
// Read tables from the storage file. // Read tables from the storage file.
// //
while (Status == EFI_SUCCESS) { while (Status == EFI_SUCCESS) {
Status = FwVol->ReadSection ( Status = FwVol->ReadSection (
FwVol, FwVol,
(EFI_GUID*)PcdGetPtr (PcdAcpiTableStorageFile), (EFI_GUID *)PcdGetPtr (PcdAcpiTableStorageFile),
EFI_SECTION_RAW, EFI_SECTION_RAW,
Instance, Instance,
(VOID**) &CurrentTable, (VOID **)&CurrentTable,
&Size, &Size,
&FvStatus &FvStatus
); );
@ -193,7 +191,7 @@ InstallOvmfFvTables (
// //
TableHandle = 0; TableHandle = 0;
TableSize = ((EFI_ACPI_DESCRIPTION_HEADER *) CurrentTable)->Length; TableSize = ((EFI_ACPI_DESCRIPTION_HEADER *)CurrentTable)->Length;
ASSERT (Size >= TableSize); ASSERT (Size >= TableSize);
// //
@ -249,4 +247,3 @@ InstallAcpiTables (
return Status; return Status;
} }

View File

@ -39,7 +39,7 @@ InstallAcpiTable (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
BhyveInstallAcpiTable( BhyveInstallAcpiTable (
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol, IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,
IN VOID *AcpiTableBuffer, IN VOID *AcpiTableBuffer,
IN UINTN AcpiTableBufferSize, IN UINTN AcpiTableBufferSize,

View File

@ -37,7 +37,7 @@ BhyveInstallAcpiMadtTable (
// Query the host for the number of vCPUs // Query the host for the number of vCPUs
CpuCount = 0; CpuCount = 0;
cSize = sizeof(CpuCount); cSize = sizeof (CpuCount);
if (BhyveFwCtlGet ("hw.ncpu", &CpuCount, &cSize) == RETURN_SUCCESS) { if (BhyveFwCtlGet ("hw.ncpu", &CpuCount, &cSize) == RETURN_SUCCESS) {
DEBUG ((DEBUG_INFO, "Retrieved CpuCount %d\n", CpuCount)); DEBUG ((DEBUG_INFO, "Retrieved CpuCount %d\n", CpuCount));
ASSERT (CpuCount >= 1); ASSERT (CpuCount >= 1);
@ -57,7 +57,7 @@ BhyveInstallAcpiMadtTable (
} }
CopyMem (&(Madt->Header), AcpiTableBuffer, sizeof (EFI_ACPI_DESCRIPTION_HEADER)); CopyMem (&(Madt->Header), AcpiTableBuffer, sizeof (EFI_ACPI_DESCRIPTION_HEADER));
Madt->Header.Length = (UINT32) NewBufferSize; Madt->Header.Length = (UINT32)NewBufferSize;
Madt->LocalApicAddress = 0xFEE00000; Madt->LocalApicAddress = 0xFEE00000;
Madt->Flags = EFI_ACPI_1_0_PCAT_COMPAT; Madt->Flags = EFI_ACPI_1_0_PCAT_COMPAT;
Ptr = Madt + 1; Ptr = Madt + 1;
@ -66,17 +66,18 @@ BhyveInstallAcpiMadtTable (
for (Loop = 0; Loop < CpuCount; ++Loop) { for (Loop = 0; Loop < CpuCount; ++Loop) {
LocalApic->Type = EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC; LocalApic->Type = EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC;
LocalApic->Length = sizeof (*LocalApic); LocalApic->Length = sizeof (*LocalApic);
LocalApic->AcpiProcessorId = (UINT8) Loop; LocalApic->AcpiProcessorId = (UINT8)Loop;
LocalApic->ApicId = (UINT8) Loop; LocalApic->ApicId = (UINT8)Loop;
LocalApic->Flags = 1; // enabled LocalApic->Flags = 1; // enabled
++LocalApic; ++LocalApic;
} }
Ptr = LocalApic; Ptr = LocalApic;
IoApic = Ptr; IoApic = Ptr;
IoApic->Type = EFI_ACPI_1_0_IO_APIC; IoApic->Type = EFI_ACPI_1_0_IO_APIC;
IoApic->Length = sizeof (*IoApic); IoApic->Length = sizeof (*IoApic);
IoApic->IoApicId = (UINT8) CpuCount; IoApic->IoApicId = (UINT8)CpuCount;
IoApic->Reserved = EFI_ACPI_RESERVED_BYTE; IoApic->Reserved = EFI_ACPI_RESERVED_BYTE;
IoApic->IoApicAddress = 0xFEC00000; IoApic->IoApicAddress = 0xFEC00000;
IoApic->SystemVectorBase = 0x00000000; IoApic->SystemVectorBase = 0x00000000;
@ -94,7 +95,7 @@ BhyveInstallAcpiMadtTable (
Iso->Flags = 0x0000; // Conforms to specs of the bus Iso->Flags = 0x0000; // Conforms to specs of the bus
Ptr = Iso + 1; Ptr = Iso + 1;
ASSERT ((UINTN) ((UINT8 *)Ptr - (UINT8 *)Madt) == NewBufferSize); ASSERT ((UINTN)((UINT8 *)Ptr - (UINT8 *)Madt) == NewBufferSize);
Status = InstallAcpiTable (AcpiProtocol, Madt, NewBufferSize, TableKey); Status = InstallAcpiTable (AcpiProtocol, Madt, NewBufferSize, TableKey);
FreePool (Madt); FreePool (Madt);
@ -114,7 +115,7 @@ BhyveInstallAcpiTable (
EFI_ACPI_DESCRIPTION_HEADER *Hdr; EFI_ACPI_DESCRIPTION_HEADER *Hdr;
EFI_ACPI_TABLE_INSTALL_ACPI_TABLE TableInstallFunction; EFI_ACPI_TABLE_INSTALL_ACPI_TABLE TableInstallFunction;
Hdr = (EFI_ACPI_DESCRIPTION_HEADER*) AcpiTableBuffer; Hdr = (EFI_ACPI_DESCRIPTION_HEADER *)AcpiTableBuffer;
switch (Hdr->Signature) { switch (Hdr->Signature) {
case EFI_ACPI_1_0_APIC_SIGNATURE: case EFI_ACPI_1_0_APIC_SIGNATURE:
TableInstallFunction = BhyveInstallAcpiMadtTable; TableInstallFunction = BhyveInstallAcpiMadtTable;

View File

@ -22,13 +22,12 @@ FindAcpiTableProtocol (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiAcpiTableProtocolGuid, &gEfiAcpiTableProtocolGuid,
NULL, NULL,
(VOID**)&AcpiTable (VOID **)&AcpiTable
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return AcpiTable; return AcpiTable;
} }
STATIC STATIC
VOID VOID
EFIAPI EFIAPI
@ -39,17 +38,19 @@ OnRootBridgesConnected (
{ {
EFI_STATUS Status; EFI_STATUS Status;
DEBUG ((DEBUG_INFO, DEBUG ((
DEBUG_INFO,
"%a: root bridges have been connected, installing ACPI tables\n", "%a: root bridges have been connected, installing ACPI tables\n",
__FUNCTION__)); __FUNCTION__
));
Status = InstallAcpiTables (FindAcpiTableProtocol ()); Status = InstallAcpiTables (FindAcpiTableProtocol ());
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: InstallAcpiTables: %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: InstallAcpiTables: %r\n", __FUNCTION__, Status));
} }
gBS->CloseEvent (Event); gBS->CloseEvent (Event);
} }
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AcpiPlatformEntryPoint ( AcpiPlatformEntryPoint (
@ -66,8 +67,12 @@ AcpiPlatformEntryPoint (
// the full functionality. // the full functionality.
// //
if (PcdGetBool (PcdPciDisableBusEnumeration)) { if (PcdGetBool (PcdPciDisableBusEnumeration)) {
DEBUG ((DEBUG_INFO, "%a: PCI or its enumeration disabled, installing " DEBUG ((
"ACPI tables\n", __FUNCTION__)); DEBUG_INFO,
"%a: PCI or its enumeration disabled, installing "
"ACPI tables\n",
__FUNCTION__
));
return InstallAcpiTables (FindAcpiTableProtocol ()); return InstallAcpiTables (FindAcpiTableProtocol ());
} }
@ -77,13 +82,20 @@ AcpiPlatformEntryPoint (
// setup. (Note that we're a DXE_DRIVER; our entry point function is invoked // setup. (Note that we're a DXE_DRIVER; our entry point function is invoked
// strictly before BDS is entered and can connect the root bridges.) // strictly before BDS is entered and can connect the root bridges.)
// //
Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, Status = gBS->CreateEventEx (
OnRootBridgesConnected, NULL /* Context */, EVT_NOTIFY_SIGNAL,
&gRootBridgesConnectedEventGroupGuid, &RootBridgesConnected); TPL_CALLBACK,
OnRootBridgesConnected,
NULL /* Context */,
&gRootBridgesConnectedEventGroupGuid,
&RootBridgesConnected
);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, DEBUG ((
DEBUG_INFO,
"%a: waiting for root bridges to be connected, registered callback\n", "%a: waiting for root bridges to be connected, registered callback\n",
__FUNCTION__)); __FUNCTION__
));
} }
return Status; return Status;

View File

@ -11,7 +11,6 @@
#include "AcpiPlatform.h" #include "AcpiPlatform.h"
/** /**
Collect all PciIo protocol instances in the system. Save their original Collect all PciIo protocol instances in the system. Save their original
attributes, and enable IO and MMIO decoding for each. attributes, and enable IO and MMIO decoding for each.
@ -59,8 +58,13 @@ EnablePciDecoding (
return; return;
} }
Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiPciIoProtocolGuid, Status = gBS->LocateHandleBuffer (
NULL /* SearchKey */, &NoHandles, &Handles); ByProtocol,
&gEfiPciIoProtocolGuid,
NULL /* SearchKey */,
&NoHandles,
&Handles
);
if (Status == EFI_NOT_FOUND) { if (Status == EFI_NOT_FOUND) {
// //
// No PCI devices were found on either of the root bridges. We're done. // No PCI devices were found on either of the root bridges. We're done.
@ -69,15 +73,22 @@ EnablePciDecoding (
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: LocateHandleBuffer(): %r\n", __FUNCTION__, DEBUG ((
Status)); DEBUG_WARN,
"%a: LocateHandleBuffer(): %r\n",
__FUNCTION__,
Status
));
return; return;
} }
OrigAttrs = AllocatePool (NoHandles * sizeof *OrigAttrs); OrigAttrs = AllocatePool (NoHandles * sizeof *OrigAttrs);
if (OrigAttrs == NULL) { if (OrigAttrs == NULL) {
DEBUG ((DEBUG_WARN, "%a: AllocatePool(): out of resources\n", DEBUG ((
__FUNCTION__)); DEBUG_WARN,
"%a: AllocatePool(): out of resources\n",
__FUNCTION__
));
goto FreeHandles; goto FreeHandles;
} }
@ -88,30 +99,49 @@ EnablePciDecoding (
// //
// Look up PciIo on the handle and stash it // Look up PciIo on the handle and stash it
// //
Status = gBS->HandleProtocol (Handles[Idx], &gEfiPciIoProtocolGuid, Status = gBS->HandleProtocol (
(VOID**)&PciIo); Handles[Idx],
&gEfiPciIoProtocolGuid,
(VOID **)&PciIo
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
OrigAttrs[Idx].PciIo = PciIo; OrigAttrs[Idx].PciIo = PciIo;
// //
// Stash the current attributes // Stash the current attributes
// //
Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationGet, 0, Status = PciIo->Attributes (
&OrigAttrs[Idx].PciAttributes); PciIo,
EfiPciIoAttributeOperationGet,
0,
&OrigAttrs[Idx].PciAttributes
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: EfiPciIoAttributeOperationGet: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_WARN,
"%a: EfiPciIoAttributeOperationGet: %r\n",
__FUNCTION__,
Status
));
goto RestoreAttributes; goto RestoreAttributes;
} }
// //
// Retrieve supported attributes // Retrieve supported attributes
// //
Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationSupported, 0, Status = PciIo->Attributes (
&Attributes); PciIo,
EfiPciIoAttributeOperationSupported,
0,
&Attributes
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: EfiPciIoAttributeOperationSupported: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_WARN,
"%a: EfiPciIoAttributeOperationSupported: %r\n",
__FUNCTION__,
Status
));
goto RestoreAttributes; goto RestoreAttributes;
} }
@ -119,11 +149,19 @@ EnablePciDecoding (
// Enable IO and MMIO decoding // Enable IO and MMIO decoding
// //
Attributes &= EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY; Attributes &= EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY;
Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationEnable, Status = PciIo->Attributes (
Attributes, NULL); PciIo,
EfiPciIoAttributeOperationEnable,
Attributes,
NULL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: EfiPciIoAttributeOperationEnable: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_WARN,
"%a: EfiPciIoAttributeOperationEnable: %r\n",
__FUNCTION__,
Status
));
goto RestoreAttributes; goto RestoreAttributes;
} }
} }
@ -139,19 +177,20 @@ EnablePciDecoding (
RestoreAttributes: RestoreAttributes:
while (Idx > 0) { while (Idx > 0) {
--Idx; --Idx;
OrigAttrs[Idx].PciIo->Attributes (OrigAttrs[Idx].PciIo, OrigAttrs[Idx].PciIo->Attributes (
OrigAttrs[Idx].PciIo,
EfiPciIoAttributeOperationSet, EfiPciIoAttributeOperationSet,
OrigAttrs[Idx].PciAttributes, OrigAttrs[Idx].PciAttributes,
NULL NULL
); );
} }
FreePool (OrigAttrs); FreePool (OrigAttrs);
FreeHandles: FreeHandles:
FreePool (Handles); FreePool (Handles);
} }
/** /**
Restore the original PCI attributes saved with EnablePciDecoding(). Restore the original PCI attributes saved with EnablePciDecoding().
@ -188,5 +227,6 @@ RestorePciDecoding (
NULL NULL
); );
} }
FreePool (OriginalAttributes); FreePool (OriginalAttributes);
} }

View File

@ -50,18 +50,16 @@ EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName = {
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EmuGopComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)EmuGopComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EmuGopComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)EmuGopComponentNameGetControllerName,
"en" "en"
}; };
EFI_UNICODE_STRING_TABLE mEmuGopDriverNameTable[] = { EFI_UNICODE_STRING_TABLE mEmuGopDriverNameTable[] = {
{ "eng", L"Emulator GOP Driver" }, { "eng", L"Emulator GOP Driver" },
{ NULL , NULL } { NULL, NULL }
}; };
/** /**
Retrieves a Unicode string that is the user readable name of the driver. Retrieves a Unicode string that is the user readable name of the driver.
@ -118,7 +116,6 @@ EmuGopComponentNameGetDriverName (
); );
} }
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.

View File

@ -87,7 +87,6 @@ typedef struct {
UINT32 FbSize; UINT32 FbSize;
} GOP_PRIVATE_DATA; } GOP_PRIVATE_DATA;
#define GOP_PRIVATE_DATA_FROM_THIS(a) \ #define GOP_PRIVATE_DATA_FROM_THIS(a) \
CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE) CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)

View File

@ -19,7 +19,6 @@ BhyveGetGraphicsMode (
UINT16 *Depth UINT16 *Depth
); );
/** /**
Tests to see if this driver supports a given controller. If a child device is provided, Tests to see if this driver supports a given controller. If a child device is provided,
it further tests to see if this driver supports creating a handle for the specified child device. it further tests to see if this driver supports creating a handle for the specified child device.
@ -81,7 +80,7 @@ EmuGopDriverBindingSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID **) &PciIo, (VOID **)&PciIo,
This->DriverBindingHandle, This->DriverBindingHandle,
Handle, Handle,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -107,11 +106,11 @@ EmuGopDriverBindingSupported (
} }
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
if (Pci.Hdr.VendorId == 0xFB5D && Pci.Hdr.DeviceId == 0x40FB) { if ((Pci.Hdr.VendorId == 0xFB5D) && (Pci.Hdr.DeviceId == 0x40FB)) {
DEBUG((DEBUG_INFO, "BHYVE framebuffer device detected\n")); DEBUG ((DEBUG_INFO, "BHYVE framebuffer device detected\n"));
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
BhyveGetGraphicsMode(PciIo, &Width, &Height, &Depth); BhyveGetGraphicsMode (PciIo, &Width, &Height, &Depth);
PcdSet32S (PcdVideoHorizontalResolution, Width); PcdSet32S (PcdVideoHorizontalResolution, Width);
PcdSet32S (PcdVideoVerticalResolution, Height); PcdSet32S (PcdVideoVerticalResolution, Height);
} }
@ -130,7 +129,6 @@ Done:
return Status; return Status;
} }
/** /**
Starts a device controller or a bus controller. Starts a device controller or a bus controller.
@ -204,7 +202,7 @@ EmuGopDriverBindingStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID **) &Private->PciIo, (VOID **)&Private->PciIo,
This->DriverBindingHandle, This->DriverBindingHandle,
Handle, Handle,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -221,20 +219,26 @@ EmuGopDriverBindingStart (
Private->PciIo, Private->PciIo,
PCI_BAR_IDX0, PCI_BAR_IDX0,
NULL, NULL,
(VOID**) &MmioDesc (VOID **)&MmioDesc
); );
if (EFI_ERROR (Status) || if (EFI_ERROR (Status) ||
MmioDesc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM) { (MmioDesc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM))
{
DEBUG ((DEBUG_INFO, "BHYVE GOP: No mmio bar\n")); DEBUG ((DEBUG_INFO, "BHYVE GOP: No mmio bar\n"));
} else { } else {
DEBUG ((DEBUG_INFO, "BHYVE GOP: Using mmio bar @ 0x%lx\n", DEBUG ((
MmioDesc->AddrRangeMin)); DEBUG_INFO,
BhyveGetMemregs(Private, &Memregs); "BHYVE GOP: Using mmio bar @ 0x%lx\n",
MmioDesc->AddrRangeMin
));
BhyveGetMemregs (Private, &Memregs);
Private->FbSize = Memregs.FbSize; Private->FbSize = Memregs.FbSize;
} }
if (MmioDesc != NULL) { if (MmioDesc != NULL) {
FreePool (MmioDesc); FreePool (MmioDesc);
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Done; goto Done;
} }
@ -247,14 +251,18 @@ EmuGopDriverBindingStart (
Private->PciIo, Private->PciIo,
PCI_BAR_IDX1, PCI_BAR_IDX1,
NULL, NULL,
(VOID**) &MmioDesc (VOID **)&MmioDesc
); );
if (EFI_ERROR (Status) || if (EFI_ERROR (Status) ||
MmioDesc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM) { (MmioDesc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM))
{
DEBUG ((DEBUG_INFO, "BHYVE GOP: No frame-buffer bar\n")); DEBUG ((DEBUG_INFO, "BHYVE GOP: No frame-buffer bar\n"));
} else { } else {
DEBUG ((DEBUG_INFO, "BHYVE GOP: Using frame-buffer bar @ 0x%lx\n", DEBUG ((
MmioDesc->AddrRangeMin)); DEBUG_INFO,
"BHYVE GOP: Using frame-buffer bar @ 0x%lx\n",
MmioDesc->AddrRangeMin
));
Private->FbAddr = MmioDesc->AddrRangeMin; Private->FbAddr = MmioDesc->AddrRangeMin;
// XXX assert BAR is >= size // XXX assert BAR is >= size
} }
@ -262,12 +270,17 @@ EmuGopDriverBindingStart (
if (MmioDesc != NULL) { if (MmioDesc != NULL) {
FreePool (MmioDesc); FreePool (MmioDesc);
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Done; goto Done;
} }
DEBUG ((DEBUG_INFO, "BHYVE GOP: Framebuf addr 0x%lx, size %x\n", DEBUG ((
Private->FbAddr, Private->FbSize)); DEBUG_INFO,
"BHYVE GOP: Framebuf addr 0x%lx, size %x\n",
Private->FbAddr,
Private->FbSize
));
Status = EmuGopConstructor (Private); Status = EmuGopConstructor (Private);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -279,18 +292,19 @@ EmuGopDriverBindingStart (
// //
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&Private->Handle, &Private->Handle,
&gEfiGraphicsOutputProtocolGuid, &Private->GraphicsOutput, &gEfiGraphicsOutputProtocolGuid,
&Private->GraphicsOutput,
NULL NULL
); );
DEBUG((DEBUG_INFO, "BHYVE framebuffer device started\n")); DEBUG ((DEBUG_INFO, "BHYVE framebuffer device started\n"));
// //
// Install int10 handler // Install int10 handler
// //
#ifndef CSM_ENABLE #ifndef CSM_ENABLE
InstallVbeShim (L"Framebuffer", Private->FbAddr); InstallVbeShim (L"Framebuffer", Private->FbAddr);
#endif #endif
Done: Done:
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -309,8 +323,6 @@ Done:
return Status; return Status;
} }
/** /**
Stops a device controller or a bus controller. Stops a device controller or a bus controller.
@ -350,7 +362,7 @@ EmuGopDriverBindingStop (
EFI_STATUS Status; EFI_STATUS Status;
GOP_PRIVATE_DATA *Private; GOP_PRIVATE_DATA *Private;
DEBUG((DEBUG_INFO, "BHYVE framebuffer device stopping\n")); DEBUG ((DEBUG_INFO, "BHYVE framebuffer device stopping\n"));
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
@ -377,7 +389,8 @@ EmuGopDriverBindingStop (
// //
Status = gBS->UninstallMultipleProtocolInterfaces ( Status = gBS->UninstallMultipleProtocolInterfaces (
Private->Handle, Private->Handle,
&gEfiGraphicsOutputProtocolGuid, &Private->GraphicsOutput, &gEfiGraphicsOutputProtocolGuid,
&Private->GraphicsOutput,
NULL NULL
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
@ -402,13 +415,11 @@ EmuGopDriverBindingStop (
FreeUnicodeStringTable (Private->ControllerNameTable); FreeUnicodeStringTable (Private->ControllerNameTable);
gBS->FreePool (Private); gBS->FreePool (Private);
} }
return Status; return Status;
} }
/// ///
/// This protocol provides the services required to determine if a driver supports a given controller. /// This protocol provides the services required to determine if a driver supports a given controller.
/// If a controller is supported, then it also provides routines to start and stop the controller. /// If a controller is supported, then it also provides routines to start and stop the controller.
@ -422,8 +433,6 @@ EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding = {
NULL NULL
}; };
/** /**
The user Entry Point for module EmuGop. The user code starts with this function. The user Entry Point for module EmuGop. The user code starts with this function.
@ -453,7 +462,6 @@ InitializeEmuGop (
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }
@ -469,7 +477,6 @@ BhyveGetGraphicsMode (
UINT64 Offset; UINT64 Offset;
EFI_STATUS Status; EFI_STATUS Status;
Offset = (UINT64)&BhyveRegs.Width - (UINT64)&BhyveRegs; Offset = (UINT64)&BhyveRegs.Width - (UINT64)&BhyveRegs;
Status = PciIo->Mem.Read ( Status = PciIo->Mem.Read (
@ -538,6 +545,11 @@ BhyveGetMemregs (
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
DEBUG ((DEBUG_INFO, "BHYVE Get Memregs, size %d width %d height %d\n", DEBUG ((
Memregs->FbSize, Memregs->Width, Memregs->Height)); DEBUG_INFO,
"BHYVE Get Memregs, size %d width %d height %d\n",
Memregs->FbSize,
Memregs->Width,
Memregs->Height
));
} }

View File

@ -22,7 +22,6 @@ Abstract:
#include "Gop.h" #include "Gop.h"
#include <Library/FrameBufferBltLib.h> #include <Library/FrameBufferBltLib.h>
EFI_EVENT mGopScreenExitBootServicesEvent; EFI_EVENT mGopScreenExitBootServicesEvent;
GOP_MODE_DATA mGopModeData[] = { GOP_MODE_DATA mGopModeData[] = {
@ -30,7 +29,7 @@ GOP_MODE_DATA mGopModeData[] = {
{ 1024, 768, 32, 0 }, { 1024, 768, 32, 0 },
{ 800, 600, 32, 0 }, { 800, 600, 32, 0 },
{ 640, 480, 32, 0 } { 640, 480, 32, 0 }
}; };
STATIC STATIC
VOID VOID
@ -53,14 +52,18 @@ BhyveGopCompleteModeInfo (
Info->PixelInformation.BlueMask = PIXEL24_BLUE_MASK; Info->PixelInformation.BlueMask = PIXEL24_BLUE_MASK;
Info->PixelInformation.ReservedMask = 0; Info->PixelInformation.ReservedMask = 0;
} else if (ModeData->ColorDepth == 32) { } else if (ModeData->ColorDepth == 32) {
DEBUG ((DEBUG_INFO, "%dx%d PixelBlueGreenRedReserved8BitPerColor\n", DEBUG ((
ModeData->HorizontalResolution, ModeData->VerticalResolution)); DEBUG_INFO,
"%dx%d PixelBlueGreenRedReserved8BitPerColor\n",
ModeData->HorizontalResolution,
ModeData->VerticalResolution
));
Info->PixelFormat = PixelBlueGreenRedReserved8BitPerColor; Info->PixelFormat = PixelBlueGreenRedReserved8BitPerColor;
} }
Info->PixelsPerScanLine = Info->HorizontalResolution; Info->PixelsPerScanLine = Info->HorizontalResolution;
} }
/** /**
Returns information for an available graphics mode that the graphics device Returns information for an available graphics mode that the graphics device
and the set of active video output devices supports. and the set of active video output devices supports.
@ -91,7 +94,7 @@ EmuGopQuerytMode (
Private = GOP_PRIVATE_DATA_FROM_THIS (This); Private = GOP_PRIVATE_DATA_FROM_THIS (This);
if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) { if ((Info == NULL) || (SizeOfInfo == NULL) || ((UINTN)ModeNumber >= This->Mode->MaxMode)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -108,12 +111,10 @@ EmuGopQuerytMode (
(*Info)->VerticalResolution = ModeData->VerticalResolution; (*Info)->VerticalResolution = ModeData->VerticalResolution;
(*Info)->PixelFormat = PixelBitMask; (*Info)->PixelFormat = PixelBitMask;
(*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution; (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
BhyveGopCompleteModeInfo(ModeData, *Info); BhyveGopCompleteModeInfo (ModeData, *Info);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Set the video device into the specified mode and clears the visible portions of Set the video device into the specified mode and clears the visible portions of
the output display to black. the output display to black.
@ -142,13 +143,14 @@ EmuGopSetMode (
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
UINTN confsize = 0; UINTN confsize = 0;
fbconf = NULL; fbconf = NULL;
Private = GOP_PRIVATE_DATA_FROM_THIS (This); Private = GOP_PRIVATE_DATA_FROM_THIS (This);
if (ModeNumber >= This->Mode->MaxMode) { if (ModeNumber >= This->Mode->MaxMode) {
// Tell bhyve that we are switching out of vesa // Tell bhyve that we are switching out of vesa
BhyveSetGraphicsMode(Private, 0, 0, 0); BhyveSetGraphicsMode (Private, 0, 0, 0);
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -161,11 +163,11 @@ EmuGopSetMode (
Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution; Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
Info = This->Mode->Info; Info = This->Mode->Info;
BhyveGopCompleteModeInfo(ModeData, Info); BhyveGopCompleteModeInfo (ModeData, Info);
This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution; This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
This->Mode->Info->VerticalResolution = ModeData->VerticalResolution; This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;
This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); This->Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
This->Mode->FrameBufferBase = Private->GraphicsOutput.Mode->FrameBufferBase; This->Mode->FrameBufferBase = Private->GraphicsOutput.Mode->FrameBufferBase;
/* /*
@ -175,18 +177,24 @@ EmuGopSetMode (
This->Mode->FrameBufferSize = Private->FbSize; This->Mode->FrameBufferSize = Private->FbSize;
DEBUG ((DEBUG_INFO, "BHYVE GOP FrameBufferBase: 0x%x, FrameBufferSize: 0x%x\n", This->Mode->FrameBufferBase, This->Mode->FrameBufferSize)); DEBUG ((DEBUG_INFO, "BHYVE GOP FrameBufferBase: 0x%x, FrameBufferSize: 0x%x\n", This->Mode->FrameBufferBase, This->Mode->FrameBufferSize));
BhyveSetGraphicsMode(Private, (UINT16)ModeData->HorizontalResolution, (UINT16)ModeData->VerticalResolution, (UINT16)ModeData->ColorDepth); BhyveSetGraphicsMode (Private, (UINT16)ModeData->HorizontalResolution, (UINT16)ModeData->VerticalResolution, (UINT16)ModeData->ColorDepth);
RETURN_STATUS ret = FrameBufferBltConfigure ( RETURN_STATUS ret = FrameBufferBltConfigure (
(VOID*)(UINTN) This->Mode->FrameBufferBase, (VOID *)(UINTN)This->Mode->FrameBufferBase,
This->Mode->Info, fbconf, &confsize This->Mode->Info,
fbconf,
&confsize
); );
if (ret == EFI_BUFFER_TOO_SMALL || ret == EFI_INVALID_PARAMETER) {
fbconf = AllocatePool(confsize); if ((ret == EFI_BUFFER_TOO_SMALL) || (ret == EFI_INVALID_PARAMETER)) {
ret = FrameBufferBltConfigure( fbconf = AllocatePool (confsize);
(VOID*)(UINTN)This->Mode->FrameBufferBase, ret = FrameBufferBltConfigure (
This->Mode->Info, fbconf, &confsize); (VOID *)(UINTN)This->Mode->FrameBufferBase,
ASSERT(ret == EFI_SUCCESS); This->Mode->Info,
fbconf,
&confsize
);
ASSERT (ret == EFI_SUCCESS);
} }
Fill.Red = 0; Fill.Red = 0;
@ -207,8 +215,6 @@ EmuGopSetMode (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer. Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
@ -251,7 +257,7 @@ EmuGopBlt (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (Width == 0 || Height == 0) { if ((Width == 0) || (Height == 0)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -291,7 +297,6 @@ EmuGopBlt (
return Status; return Status;
} }
// //
// Construction and Destruction functions // Construction and Destruction functions
// //
@ -302,8 +307,8 @@ EmuGopConstructor (
) )
{ {
// Set mode 0 to be the requested resolution // Set mode 0 to be the requested resolution
mGopModeData[0].HorizontalResolution = PcdGet32 ( PcdVideoHorizontalResolution); mGopModeData[0].HorizontalResolution = PcdGet32 (PcdVideoHorizontalResolution);
mGopModeData[0].VerticalResolution = PcdGet32 ( PcdVideoVerticalResolution ); mGopModeData[0].VerticalResolution = PcdGet32 (PcdVideoVerticalResolution);
Private->ModeData = mGopModeData; Private->ModeData = mGopModeData;
@ -318,15 +323,15 @@ EmuGopConstructor (
if (Private->GraphicsOutput.Mode == NULL) { if (Private->GraphicsOutput.Mode == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
if (Private->GraphicsOutput.Mode->Info == NULL) { if (Private->GraphicsOutput.Mode->Info == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
DEBUG ((DEBUG_INFO, "BHYVE Gop Constructor\n")); DEBUG ((DEBUG_INFO, "BHYVE Gop Constructor\n"));
Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA); Private->GraphicsOutput.Mode->MaxMode = sizeof (mGopModeData) / sizeof (GOP_MODE_DATA);
// //
// Till now, we have no idea about the window size. // Till now, we have no idea about the window size.
// //
@ -336,14 +341,12 @@ EmuGopConstructor (
Private->GraphicsOutput.Mode->Info->VerticalResolution = 0; Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBitMask; Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBitMask;
Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) Private->FbAddr; Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS)Private->FbAddr;
Private->GraphicsOutput.Mode->FrameBufferSize = Private->FbSize; Private->GraphicsOutput.Mode->FrameBufferSize = Private->FbSize;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS EFI_STATUS
EmuGopDestructor ( EmuGopDestructor (
GOP_PRIVATE_DATA *Private GOP_PRIVATE_DATA *Private
@ -356,6 +359,7 @@ EmuGopDestructor (
if (Private->GraphicsOutput.Mode->Info != NULL) { if (Private->GraphicsOutput.Mode->Info != NULL) {
FreePool (Private->GraphicsOutput.Mode->Info); FreePool (Private->GraphicsOutput.Mode->Info);
} }
FreePool (Private->GraphicsOutput.Mode); FreePool (Private->GraphicsOutput.Mode);
Private->GraphicsOutput.Mode = NULL; Private->GraphicsOutput.Mode = NULL;
} }
@ -363,13 +367,13 @@ EmuGopDestructor (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
VOID VOID
EFIAPI EFIAPI
ShutdownGopEvent ( ShutdownGopEvent (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
/*++ /*++
Routine Description: Routine Description:

View File

@ -52,7 +52,6 @@ STATIC CONST UINT16 vbeModeIds[] = {
STATIC VBE2_MODE_INFO vbeModes[] = { STATIC VBE2_MODE_INFO vbeModes[] = {
{ // 0x13f 640x480x32 { // 0x13f 640x480x32
// ModeAttr - BytesPerScanLine // ModeAttr - BytesPerScanLine
VBE_MODE_DISABLED, 0x07, 0x00, 0x40, 0x40, 0xA000, 0x00, 0x0000, 640*4, VBE_MODE_DISABLED, 0x07, 0x00, 0x40, 0x40, 0xA000, 0x00, 0x0000, 640*4,
// Width, Height..., Vbe3 // Width, Height..., Vbe3
@ -63,7 +62,6 @@ STATIC VBE2_MODE_INFO vbeModes[] = {
0xdeadbeef, 0x0000, 0x0000 0xdeadbeef, 0x0000, 0x0000
}, },
{ // 0x140 800x600x32 { // 0x140 800x600x32
// ModeAttr - BytesPerScanLine // ModeAttr - BytesPerScanLine
VBE_MODE_DISABLED, 0x07, 0x00, 0x40, 0x40, 0xA000, 0x00, 0x0000, 800*4, VBE_MODE_DISABLED, 0x07, 0x00, 0x40, 0x40, 0xA000, 0x00, 0x0000, 800*4,
// Width, Height..., Vbe3 // Width, Height..., Vbe3
@ -74,7 +72,6 @@ STATIC VBE2_MODE_INFO vbeModes[] = {
0xdeadbeef, 0x0000, 0x0000 0xdeadbeef, 0x0000, 0x0000
}, },
{ // 0x141 1024x768x32 { // 0x141 1024x768x32
// ModeAttr - BytesPerScanLine // ModeAttr - BytesPerScanLine
VBE_MODE_ENABLED, 0x07, 0x00, 0x40, 0x40, 0xA000, 0x00, 0x0000, 1024*4, VBE_MODE_ENABLED, 0x07, 0x00, 0x40, 0x40, 0xA000, 0x00, 0x0000, 1024*4,
// Width, Height..., Vbe3 // Width, Height..., Vbe3
@ -130,8 +127,12 @@ InstallVbeShim (
// //
Segment0Pages = 1; Segment0Pages = 1;
Int0x10 = (IVT_ENTRY *)(UINTN)Segment0 + 0x10; Int0x10 = (IVT_ENTRY *)(UINTN)Segment0 + 0x10;
Status = gBS->AllocatePages (AllocateAddress, EfiBootServicesCode, Status = gBS->AllocatePages (
Segment0Pages, &Segment0); AllocateAddress,
EfiBootServicesCode,
Segment0Pages,
&Segment0
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
EFI_PHYSICAL_ADDRESS Handler; EFI_PHYSICAL_ADDRESS Handler;
@ -142,9 +143,14 @@ InstallVbeShim (
// it's already present. // it's already present.
// //
Handler = (Int0x10->Segment << 4) + Int0x10->Offset; Handler = (Int0x10->Segment << 4) + Int0x10->Offset;
if (Handler >= SegmentC && Handler < SegmentF) { if ((Handler >= SegmentC) && (Handler < SegmentF)) {
DEBUG ((DEBUG_VERBOSE, "%a: Video BIOS handler found at %04x:%04x\n", DEBUG ((
__FUNCTION__, Int0x10->Segment, Int0x10->Offset)); DEBUG_VERBOSE,
"%a: Video BIOS handler found at %04x:%04x\n",
__FUNCTION__,
Int0x10->Segment,
Int0x10->Offset
));
return; return;
} }
@ -152,8 +158,12 @@ InstallVbeShim (
// Otherwise we'll overwrite the Int10h vector, even though we may not own // Otherwise we'll overwrite the Int10h vector, even though we may not own
// the page at zero. // the page at zero.
// //
DEBUG ((DEBUG_VERBOSE, "%a: failed to allocate page at zero: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_VERBOSE,
"%a: failed to allocate page at zero: %r\n",
__FUNCTION__,
Status
));
} else { } else {
// //
// We managed to allocate the page at zero. SVN r14218 guarantees that it // We managed to allocate the page at zero. SVN r14218 guarantees that it
@ -203,11 +213,12 @@ InstallVbeShim (
VbeInfo->Capabilities = BIT1 | BIT0; // DAC can be switched into 8-bit mode VbeInfo->Capabilities = BIT1 | BIT0; // DAC can be switched into 8-bit mode
VbeInfo->ModeListAddress = (UINT32)SegmentC << 12 | (UINT16)((UINTN)Ptr-SegmentC); VbeInfo->ModeListAddress = (UINT32)SegmentC << 12 | (UINT16)((UINTN)Ptr-SegmentC);
for (i = 0; i < NUM_VBE_MODES; i ++) { for (i = 0; i < NUM_VBE_MODES; i++) {
*(UINT16*)Ptr = vbeModeIds[i]; // mode number *(UINT16 *)Ptr = vbeModeIds[i]; // mode number
Ptr += 2; Ptr += 2;
} }
*(UINT16*)Ptr = 0xFFFF; // mode list terminator
*(UINT16 *)Ptr = 0xFFFF; // mode list terminator
Ptr += 2; Ptr += 2;
VbeInfo->VideoMem64K = (UINT16)((1024 * 768 * 4 + 65535) / 65536); VbeInfo->VideoMem64K = (UINT16)((1024 * 768 * 4 + 65535) / 65536);
@ -218,9 +229,12 @@ InstallVbeShim (
Ptr += 5; Ptr += 5;
VbeInfo->ProductNameAddress = (UINT32)SegmentC << 12 | (UINT16)((UINTN)Ptr-SegmentC); VbeInfo->ProductNameAddress = (UINT32)SegmentC << 12 | (UINT16)((UINTN)Ptr-SegmentC);
Printed = AsciiSPrint ((CHAR8 *)Ptr, Printed = AsciiSPrint (
sizeof VbeInfoFull->Buffer - (Ptr - VbeInfoFull->Buffer), "%s", (CHAR8 *)Ptr,
CardName); sizeof VbeInfoFull->Buffer - (Ptr - VbeInfoFull->Buffer),
"%s",
CardName
);
Ptr += Printed + 1; Ptr += Printed + 1;
VbeInfo->ProductRevAddress = (UINT32)SegmentC << 12 | (UINT16)((UINTN)Ptr-SegmentC); VbeInfo->ProductRevAddress = (UINT32)SegmentC << 12 | (UINT16)((UINTN)Ptr-SegmentC);
@ -251,9 +265,14 @@ InstallVbeShim (
// //
// Second, point the Int10h vector at the shim. // Second, point the Int10h vector at the shim.
// //
Int0x10->Segment = (UINT16) ((UINT32)SegmentC >> 4); Int0x10->Segment = (UINT16)((UINT32)SegmentC >> 4);
Int0x10->Offset = (UINT16) ((UINTN) (VbeModeInfo + 1) - SegmentC); Int0x10->Offset = (UINT16)((UINTN)(VbeModeInfo + 1) - SegmentC);
DEBUG ((DEBUG_INFO, "%a: VBE shim installed to %x:%x\n", DEBUG ((
__FUNCTION__, Int0x10->Segment, Int0x10->Offset)); DEBUG_INFO,
"%a: VBE shim installed to %x:%x\n",
__FUNCTION__,
Int0x10->Segment,
Int0x10->Offset
));
} }

View File

@ -1,6 +1,7 @@
// //
// THIS FILE WAS GENERATED BY "VbeShim.sh". DO NOT EDIT. // THIS FILE WAS GENERATED BY "VbeShim.sh". DO NOT EDIT.
// //
#ifndef _VBE_SHIM_H_ #ifndef _VBE_SHIM_H_
#define _VBE_SHIM_H_ #define _VBE_SHIM_H_
STATIC CONST UINT8 mVbeShim[] = { STATIC CONST UINT8 mVbeShim[] = {
@ -516,397 +517,397 @@ STATIC CONST UINT8 mVbeShim[] = {
/* 000001FD nop */ 0x90, /* 000001FD nop */ 0x90,
/* 000001FE nop */ 0x90, /* 000001FE nop */ 0x90,
/* 000001FF nop */ 0x90, /* 000001FF nop */ 0x90,
/* 00000200 cmp ax,0x4f00 */ 0x3D, 0x00, 0x4F, /* 00000200 cmp ax,0x4f00 */ 0x3D,0x00, 0x4F,
/* 00000203 jz 0x237 */ 0x74, 0x32, /* 00000203 jz 0x237 */ 0x74,0x32,
/* 00000205 cmp ax,0x4f01 */ 0x3D, 0x01, 0x4F, /* 00000205 cmp ax,0x4f01 */ 0x3D,0x01, 0x4F,
/* 00000208 jz 0x257 */ 0x74, 0x4D, /* 00000208 jz 0x257 */ 0x74,0x4D,
/* 0000020A cmp ax,0x4f02 */ 0x3D, 0x02, 0x4F, /* 0000020A cmp ax,0x4f02 */ 0x3D,0x02, 0x4F,
/* 0000020D jz word 0x2c8 */ 0x0F, 0x84, 0xB7, 0x00, /* 0000020D jz word 0x2c8 */ 0x0F,0x84, 0xB7,0x00,
/* 00000211 cmp ax,0x4f03 */ 0x3D, 0x03, 0x4F, /* 00000211 cmp ax,0x4f03 */ 0x3D,0x03, 0x4F,
/* 00000214 jz word 0x325 */ 0x0F, 0x84, 0x0D, 0x01, /* 00000214 jz word 0x325 */ 0x0F,0x84, 0x0D,0x01,
/* 00000218 cmp ax,0x4f10 */ 0x3D, 0x10, 0x4F, /* 00000218 cmp ax,0x4f10 */ 0x3D,0x10, 0x4F,
/* 0000021B jz word 0x337 */ 0x0F, 0x84, 0x18, 0x01, /* 0000021B jz word 0x337 */ 0x0F,0x84, 0x18,0x01,
/* 0000021F cmp ax,0x4f15 */ 0x3D, 0x15, 0x4F, /* 0000021F cmp ax,0x4f15 */ 0x3D,0x15, 0x4F,
/* 00000222 jz word 0x344 */ 0x0F, 0x84, 0x1E, 0x01, /* 00000222 jz word 0x344 */ 0x0F,0x84, 0x1E,0x01,
/* 00000226 cmp ah,0x0 */ 0x80, 0xFC, 0x00, /* 00000226 cmp ah,0x0 */ 0x80,0xFC, 0x00,
/* 00000229 jz word 0x363 */ 0x0F, 0x84, 0x36, 0x01, /* 00000229 jz word 0x363 */ 0x0F,0x84, 0x36,0x01,
/* 0000022D push si */ 0x56, /* 0000022D push si */ 0x56,
/* 0000022E mov si,0x3d7 */ 0xBE, 0xD7, 0x03, /* 0000022E mov si,0x3d7 */ 0xBE,0xD7, 0x03,
/* 00000231 call word 0x3ad */ 0xE8, 0x79, 0x01, /* 00000231 call word 0x3ad */ 0xE8,0x79, 0x01,
/* 00000234 pop si */ 0x5E, /* 00000234 pop si */ 0x5E,
/* 00000235 jmp short 0x235 */ 0xEB, 0xFE, /* 00000235 jmp short 0x235 */ 0xEB,0xFE,
/* 00000237 push es */ 0x06, /* 00000237 push es */ 0x06,
/* 00000238 push di */ 0x57, /* 00000238 push di */ 0x57,
/* 00000239 push ds */ 0x1E, /* 00000239 push ds */ 0x1E,
/* 0000023A push si */ 0x56, /* 0000023A push si */ 0x56,
/* 0000023B push cx */ 0x51, /* 0000023B push cx */ 0x51,
/* 0000023C push si */ 0x56, /* 0000023C push si */ 0x56,
/* 0000023D mov si,0x3eb */ 0xBE, 0xEB, 0x03, /* 0000023D mov si,0x3eb */ 0xBE,0xEB, 0x03,
/* 00000240 call word 0x3ad */ 0xE8, 0x6A, 0x01, /* 00000240 call word 0x3ad */ 0xE8,0x6A, 0x01,
/* 00000243 pop si */ 0x5E, /* 00000243 pop si */ 0x5E,
/* 00000244 push cs */ 0x0E, /* 00000244 push cs */ 0x0E,
/* 00000245 pop ds */ 0x1F, /* 00000245 pop ds */ 0x1F,
/* 00000246 mov si,0x0 */ 0xBE, 0x00, 0x00, /* 00000246 mov si,0x0 */ 0xBE,0x00, 0x00,
/* 00000249 mov cx,0x100 */ 0xB9, 0x00, 0x01, /* 00000249 mov cx,0x100 */ 0xB9,0x00, 0x01,
/* 0000024C cld */ 0xFC, /* 0000024C cld */ 0xFC,
/* 0000024D rep movsb */ 0xF3, 0xA4, /* 0000024D rep movsb */ 0xF3,0xA4,
/* 0000024F pop cx */ 0x59, /* 0000024F pop cx */ 0x59,
/* 00000250 pop si */ 0x5E, /* 00000250 pop si */ 0x5E,
/* 00000251 pop ds */ 0x1F, /* 00000251 pop ds */ 0x1F,
/* 00000252 pop di */ 0x5F, /* 00000252 pop di */ 0x5F,
/* 00000253 pop es */ 0x07, /* 00000253 pop es */ 0x07,
/* 00000254 jmp word 0x395 */ 0xE9, 0x3E, 0x01, /* 00000254 jmp word 0x395 */ 0xE9,0x3E, 0x01,
/* 00000257 push es */ 0x06, /* 00000257 push es */ 0x06,
/* 00000258 push di */ 0x57, /* 00000258 push di */ 0x57,
/* 00000259 push ds */ 0x1E, /* 00000259 push ds */ 0x1E,
/* 0000025A push si */ 0x56, /* 0000025A push si */ 0x56,
/* 0000025B push cx */ 0x51, /* 0000025B push cx */ 0x51,
/* 0000025C push si */ 0x56, /* 0000025C push si */ 0x56,
/* 0000025D mov si,0x3f6 */ 0xBE, 0xF6, 0x03, /* 0000025D mov si,0x3f6 */ 0xBE,0xF6, 0x03,
/* 00000260 call word 0x3ad */ 0xE8, 0x4A, 0x01, /* 00000260 call word 0x3ad */ 0xE8,0x4A, 0x01,
/* 00000263 pop si */ 0x5E, /* 00000263 pop si */ 0x5E,
/* 00000264 and cx,0xbfff */ 0x81, 0xE1, 0xFF, 0xBF, /* 00000264 and cx,0xbfff */ 0x81,0xE1, 0xFF,0xBF,
/* 00000268 cmp cx,0x13f */ 0x81, 0xF9, 0x3F, 0x01, /* 00000268 cmp cx,0x13f */ 0x81,0xF9, 0x3F,0x01,
/* 0000026C jz 0x284 */ 0x74, 0x16, /* 0000026C jz 0x284 */ 0x74,0x16,
/* 0000026E cmp cx,0x140 */ 0x81, 0xF9, 0x40, 0x01, /* 0000026E cmp cx,0x140 */ 0x81,0xF9, 0x40,0x01,
/* 00000272 jz 0x291 */ 0x74, 0x1D, /* 00000272 jz 0x291 */ 0x74,0x1D,
/* 00000274 cmp cx,0x141 */ 0x81, 0xF9, 0x41, 0x01, /* 00000274 cmp cx,0x141 */ 0x81,0xF9, 0x41,0x01,
/* 00000278 jz 0x29e */ 0x74, 0x24, /* 00000278 jz 0x29e */ 0x74,0x24,
/* 0000027A push si */ 0x56, /* 0000027A push si */ 0x56,
/* 0000027B mov si,0x42c */ 0xBE, 0x2C, 0x04, /* 0000027B mov si,0x42c */ 0xBE,0x2C, 0x04,
/* 0000027E call word 0x3ad */ 0xE8, 0x2C, 0x01, /* 0000027E call word 0x3ad */ 0xE8,0x2C, 0x01,
/* 00000281 pop si */ 0x5E, /* 00000281 pop si */ 0x5E,
/* 00000282 jmp short 0x235 */ 0xEB, 0xB1, /* 00000282 jmp short 0x235 */ 0xEB,0xB1,
/* 00000284 push si */ 0x56, /* 00000284 push si */ 0x56,
/* 00000285 mov si,0x46b */ 0xBE, 0x6B, 0x04, /* 00000285 mov si,0x46b */ 0xBE,0x6B, 0x04,
/* 00000288 call word 0x3ad */ 0xE8, 0x22, 0x01, /* 00000288 call word 0x3ad */ 0xE8,0x22, 0x01,
/* 0000028B pop si */ 0x5E, /* 0000028B pop si */ 0x5E,
/* 0000028C mov si,0x100 */ 0xBE, 0x00, 0x01, /* 0000028C mov si,0x100 */ 0xBE,0x00, 0x01,
/* 0000028F jmp short 0x2b8 */ 0xEB, 0x27, /* 0000028F jmp short 0x2b8 */ 0xEB,0x27,
/* 00000291 push si */ 0x56, /* 00000291 push si */ 0x56,
/* 00000292 mov si,0x47d */ 0xBE, 0x7D, 0x04, /* 00000292 mov si,0x47d */ 0xBE,0x7D, 0x04,
/* 00000295 call word 0x3ad */ 0xE8, 0x15, 0x01, /* 00000295 call word 0x3ad */ 0xE8,0x15, 0x01,
/* 00000298 pop si */ 0x5E, /* 00000298 pop si */ 0x5E,
/* 00000299 mov si,0x132 */ 0xBE, 0x32, 0x01, /* 00000299 mov si,0x132 */ 0xBE,0x32, 0x01,
/* 0000029C jmp short 0x2b8 */ 0xEB, 0x1A, /* 0000029C jmp short 0x2b8 */ 0xEB,0x1A,
/* 0000029E push si */ 0x56, /* 0000029E push si */ 0x56,
/* 0000029F mov si,0x48f */ 0xBE, 0x8F, 0x04, /* 0000029F mov si,0x48f */ 0xBE,0x8F, 0x04,
/* 000002A2 call word 0x3ad */ 0xE8, 0x08, 0x01, /* 000002A2 call word 0x3ad */ 0xE8,0x08, 0x01,
/* 000002A5 pop si */ 0x5E, /* 000002A5 pop si */ 0x5E,
/* 000002A6 mov si,0x164 */ 0xBE, 0x64, 0x01, /* 000002A6 mov si,0x164 */ 0xBE,0x64, 0x01,
/* 000002A9 jmp short 0x2b8 */ 0xEB, 0x0D, /* 000002A9 jmp short 0x2b8 */ 0xEB,0x0D,
/* 000002AB push si */ 0x56, /* 000002AB push si */ 0x56,
/* 000002AC mov si,0x4a2 */ 0xBE, 0xA2, 0x04, /* 000002AC mov si,0x4a2 */ 0xBE,0xA2, 0x04,
/* 000002AF call word 0x3ad */ 0xE8, 0xFB, 0x00, /* 000002AF call word 0x3ad */ 0xE8,0xFB, 0x00,
/* 000002B2 pop si */ 0x5E, /* 000002B2 pop si */ 0x5E,
/* 000002B3 mov si,0x196 */ 0xBE, 0x96, 0x01, /* 000002B3 mov si,0x196 */ 0xBE,0x96, 0x01,
/* 000002B6 jmp short 0x2b8 */ 0xEB, 0x00, /* 000002B6 jmp short 0x2b8 */ 0xEB,0x00,
/* 000002B8 push cs */ 0x0E, /* 000002B8 push cs */ 0x0E,
/* 000002B9 pop ds */ 0x1F, /* 000002B9 pop ds */ 0x1F,
/* 000002BA mov cx,0x32 */ 0xB9, 0x32, 0x00, /* 000002BA mov cx,0x32 */ 0xB9,0x32, 0x00,
/* 000002BD cld */ 0xFC, /* 000002BD cld */ 0xFC,
/* 000002BE rep movsb */ 0xF3, 0xA4, /* 000002BE rep movsb */ 0xF3,0xA4,
/* 000002C0 pop cx */ 0x59, /* 000002C0 pop cx */ 0x59,
/* 000002C1 pop si */ 0x5E, /* 000002C1 pop si */ 0x5E,
/* 000002C2 pop ds */ 0x1F, /* 000002C2 pop ds */ 0x1F,
/* 000002C3 pop di */ 0x5F, /* 000002C3 pop di */ 0x5F,
/* 000002C4 pop es */ 0x07, /* 000002C4 pop es */ 0x07,
/* 000002C5 jmp word 0x395 */ 0xE9, 0xCD, 0x00, /* 000002C5 jmp word 0x395 */ 0xE9,0xCD, 0x00,
/* 000002C8 push dx */ 0x52, /* 000002C8 push dx */ 0x52,
/* 000002C9 push ax */ 0x50, /* 000002C9 push ax */ 0x50,
/* 000002CA push si */ 0x56, /* 000002CA push si */ 0x56,
/* 000002CB mov si,0x410 */ 0xBE, 0x10, 0x04, /* 000002CB mov si,0x410 */ 0xBE,0x10, 0x04,
/* 000002CE call word 0x3ad */ 0xE8, 0xDC, 0x00, /* 000002CE call word 0x3ad */ 0xE8,0xDC, 0x00,
/* 000002D1 pop si */ 0x5E, /* 000002D1 pop si */ 0x5E,
/* 000002D2 and bx,0xbfff */ 0x81, 0xE3, 0xFF, 0xBF, /* 000002D2 and bx,0xbfff */ 0x81,0xE3, 0xFF,0xBF,
/* 000002D6 cmp bx,0x13f */ 0x81, 0xFB, 0x3F, 0x01, /* 000002D6 cmp bx,0x13f */ 0x81,0xFB, 0x3F,0x01,
/* 000002DA jz 0x2f3 */ 0x74, 0x17, /* 000002DA jz 0x2f3 */ 0x74,0x17,
/* 000002DC cmp bx,0x140 */ 0x81, 0xFB, 0x40, 0x01, /* 000002DC cmp bx,0x140 */ 0x81,0xFB, 0x40,0x01,
/* 000002E0 jz 0x2fd */ 0x74, 0x1B, /* 000002E0 jz 0x2fd */ 0x74,0x1B,
/* 000002E2 cmp bx,0x141 */ 0x81, 0xFB, 0x41, 0x01, /* 000002E2 cmp bx,0x141 */ 0x81,0xFB, 0x41,0x01,
/* 000002E6 jz 0x307 */ 0x74, 0x1F, /* 000002E6 jz 0x307 */ 0x74,0x1F,
/* 000002E8 push si */ 0x56, /* 000002E8 push si */ 0x56,
/* 000002E9 mov si,0x42c */ 0xBE, 0x2C, 0x04, /* 000002E9 mov si,0x42c */ 0xBE,0x2C, 0x04,
/* 000002EC call word 0x3ad */ 0xE8, 0xBE, 0x00, /* 000002EC call word 0x3ad */ 0xE8,0xBE, 0x00,
/* 000002EF pop si */ 0x5E, /* 000002EF pop si */ 0x5E,
/* 000002F0 jmp word 0x235 */ 0xE9, 0x42, 0xFF, /* 000002F0 jmp word 0x235 */ 0xE9,0x42, 0xFF,
/* 000002F3 push si */ 0x56, /* 000002F3 push si */ 0x56,
/* 000002F4 mov si,0x46b */ 0xBE, 0x6B, 0x04, /* 000002F4 mov si,0x46b */ 0xBE,0x6B, 0x04,
/* 000002F7 call word 0x3ad */ 0xE8, 0xB3, 0x00, /* 000002F7 call word 0x3ad */ 0xE8,0xB3, 0x00,
/* 000002FA pop si */ 0x5E, /* 000002FA pop si */ 0x5E,
/* 000002FB jmp short 0x319 */ 0xEB, 0x1C, /* 000002FB jmp short 0x319 */ 0xEB,0x1C,
/* 000002FD push si */ 0x56, /* 000002FD push si */ 0x56,
/* 000002FE mov si,0x47d */ 0xBE, 0x7D, 0x04, /* 000002FE mov si,0x47d */ 0xBE,0x7D, 0x04,
/* 00000301 call word 0x3ad */ 0xE8, 0xA9, 0x00, /* 00000301 call word 0x3ad */ 0xE8,0xA9, 0x00,
/* 00000304 pop si */ 0x5E, /* 00000304 pop si */ 0x5E,
/* 00000305 jmp short 0x319 */ 0xEB, 0x12, /* 00000305 jmp short 0x319 */ 0xEB,0x12,
/* 00000307 push si */ 0x56, /* 00000307 push si */ 0x56,
/* 00000308 mov si,0x48f */ 0xBE, 0x8F, 0x04, /* 00000308 mov si,0x48f */ 0xBE,0x8F, 0x04,
/* 0000030B call word 0x3ad */ 0xE8, 0x9F, 0x00, /* 0000030B call word 0x3ad */ 0xE8,0x9F, 0x00,
/* 0000030E pop si */ 0x5E, /* 0000030E pop si */ 0x5E,
/* 0000030F jmp short 0x319 */ 0xEB, 0x08, /* 0000030F jmp short 0x319 */ 0xEB,0x08,
/* 00000311 push si */ 0x56, /* 00000311 push si */ 0x56,
/* 00000312 mov si,0x4a2 */ 0xBE, 0xA2, 0x04, /* 00000312 mov si,0x4a2 */ 0xBE,0xA2, 0x04,
/* 00000315 call word 0x3ad */ 0xE8, 0x95, 0x00, /* 00000315 call word 0x3ad */ 0xE8,0x95, 0x00,
/* 00000318 pop si */ 0x5E, /* 00000318 pop si */ 0x5E,
/* 00000319 mov [0x4b0],bl */ 0x88, 0x1E, 0xB0, 0x04, /* 00000319 mov [0x4b0],bl */ 0x88,0x1E, 0xB0,0x04,
/* 0000031D mov [0x4b1],bh */ 0x88, 0x3E, 0xB1, 0x04, /* 0000031D mov [0x4b1],bh */ 0x88,0x3E, 0xB1,0x04,
/* 00000321 pop ax */ 0x58, /* 00000321 pop ax */ 0x58,
/* 00000322 pop dx */ 0x5A, /* 00000322 pop dx */ 0x5A,
/* 00000323 jmp short 0x395 */ 0xEB, 0x70, /* 00000323 jmp short 0x395 */ 0xEB,0x70,
/* 00000325 push si */ 0x56, /* 00000325 push si */ 0x56,
/* 00000326 mov si,0x405 */ 0xBE, 0x05, 0x04, /* 00000326 mov si,0x405 */ 0xBE,0x05, 0x04,
/* 00000329 call word 0x3ad */ 0xE8, 0x81, 0x00, /* 00000329 call word 0x3ad */ 0xE8,0x81, 0x00,
/* 0000032C pop si */ 0x5E, /* 0000032C pop si */ 0x5E,
/* 0000032D mov bl,[0x4b0] */ 0x8A, 0x1E, 0xB0, 0x04, /* 0000032D mov bl,[0x4b0] */ 0x8A,0x1E, 0xB0,0x04,
/* 00000331 mov bh,[0x4b1] */ 0x8A, 0x3E, 0xB1, 0x04, /* 00000331 mov bh,[0x4b1] */ 0x8A,0x3E, 0xB1,0x04,
/* 00000335 jmp short 0x395 */ 0xEB, 0x5E, /* 00000335 jmp short 0x395 */ 0xEB,0x5E,
/* 00000337 push si */ 0x56, /* 00000337 push si */ 0x56,
/* 00000338 mov si,0x43b */ 0xBE, 0x3B, 0x04, /* 00000338 mov si,0x43b */ 0xBE,0x3B, 0x04,
/* 0000033B call word 0x3ad */ 0xE8, 0x6F, 0x00, /* 0000033B call word 0x3ad */ 0xE8,0x6F, 0x00,
/* 0000033E pop si */ 0x5E, /* 0000033E pop si */ 0x5E,
/* 0000033F mov bx,0x80 */ 0xBB, 0x80, 0x00, /* 0000033F mov bx,0x80 */ 0xBB,0x80, 0x00,
/* 00000342 jmp short 0x395 */ 0xEB, 0x51, /* 00000342 jmp short 0x395 */ 0xEB,0x51,
/* 00000344 push es */ 0x06, /* 00000344 push es */ 0x06,
/* 00000345 push di */ 0x57, /* 00000345 push di */ 0x57,
/* 00000346 push ds */ 0x1E, /* 00000346 push ds */ 0x1E,
/* 00000347 push si */ 0x56, /* 00000347 push si */ 0x56,
/* 00000348 push cx */ 0x51, /* 00000348 push cx */ 0x51,
/* 00000349 push si */ 0x56, /* 00000349 push si */ 0x56,
/* 0000034A mov si,0x450 */ 0xBE, 0x50, 0x04, /* 0000034A mov si,0x450 */ 0xBE,0x50, 0x04,
/* 0000034D call word 0x3ad */ 0xE8, 0x5D, 0x00, /* 0000034D call word 0x3ad */ 0xE8,0x5D, 0x00,
/* 00000350 pop si */ 0x5E, /* 00000350 pop si */ 0x5E,
/* 00000351 push cs */ 0x0E, /* 00000351 push cs */ 0x0E,
/* 00000352 pop ds */ 0x1F, /* 00000352 pop ds */ 0x1F,
/* 00000353 mov si,0x4b2 */ 0xBE, 0xB2, 0x04, /* 00000353 mov si,0x4b2 */ 0xBE,0xB2, 0x04,
/* 00000356 mov cx,0x80 */ 0xB9, 0x80, 0x00, /* 00000356 mov cx,0x80 */ 0xB9,0x80, 0x00,
/* 00000359 cld */ 0xFC, /* 00000359 cld */ 0xFC,
/* 0000035A rep movsb */ 0xF3, 0xA4, /* 0000035A rep movsb */ 0xF3,0xA4,
/* 0000035C pop cx */ 0x59, /* 0000035C pop cx */ 0x59,
/* 0000035D pop si */ 0x5E, /* 0000035D pop si */ 0x5E,
/* 0000035E pop ds */ 0x1F, /* 0000035E pop ds */ 0x1F,
/* 0000035F pop di */ 0x5F, /* 0000035F pop di */ 0x5F,
/* 00000360 pop es */ 0x07, /* 00000360 pop es */ 0x07,
/* 00000361 jmp short 0x395 */ 0xEB, 0x32, /* 00000361 jmp short 0x395 */ 0xEB,0x32,
/* 00000363 push si */ 0x56, /* 00000363 push si */ 0x56,
/* 00000364 mov si,0x41b */ 0xBE, 0x1B, 0x04, /* 00000364 mov si,0x41b */ 0xBE,0x1B, 0x04,
/* 00000367 call word 0x3ad */ 0xE8, 0x43, 0x00, /* 00000367 call word 0x3ad */ 0xE8,0x43, 0x00,
/* 0000036A pop si */ 0x5E, /* 0000036A pop si */ 0x5E,
/* 0000036B cmp al,0x3 */ 0x3C, 0x03, /* 0000036B cmp al,0x3 */ 0x3C,0x03,
/* 0000036D jz 0x37e */ 0x74, 0x0F, /* 0000036D jz 0x37e */ 0x74,0x0F,
/* 0000036F cmp al,0x12 */ 0x3C, 0x12, /* 0000036F cmp al,0x12 */ 0x3C,0x12,
/* 00000371 jz 0x38a */ 0x74, 0x17, /* 00000371 jz 0x38a */ 0x74,0x17,
/* 00000373 push si */ 0x56, /* 00000373 push si */ 0x56,
/* 00000374 mov si,0x42c */ 0xBE, 0x2C, 0x04, /* 00000374 mov si,0x42c */ 0xBE,0x2C, 0x04,
/* 00000377 call word 0x3ad */ 0xE8, 0x33, 0x00, /* 00000377 call word 0x3ad */ 0xE8,0x33, 0x00,
/* 0000037A pop si */ 0x5E, /* 0000037A pop si */ 0x5E,
/* 0000037B jmp word 0x235 */ 0xE9, 0xB7, 0xFE, /* 0000037B jmp word 0x235 */ 0xE9,0xB7, 0xFE,
/* 0000037E push si */ 0x56, /* 0000037E push si */ 0x56,
/* 0000037F mov si,0x45c */ 0xBE, 0x5C, 0x04, /* 0000037F mov si,0x45c */ 0xBE,0x5C, 0x04,
/* 00000382 call word 0x3ad */ 0xE8, 0x28, 0x00, /* 00000382 call word 0x3ad */ 0xE8,0x28, 0x00,
/* 00000385 pop si */ 0x5E, /* 00000385 pop si */ 0x5E,
/* 00000386 mov al,0x0 */ 0xB0, 0x00, /* 00000386 mov al,0x0 */ 0xB0,0x00,
/* 00000388 jmp short 0x38c */ 0xEB, 0x02, /* 00000388 jmp short 0x38c */ 0xEB,0x02,
/* 0000038A mov al,0x0 */ 0xB0, 0x00, /* 0000038A mov al,0x0 */ 0xB0,0x00,
/* 0000038C push si */ 0x56, /* 0000038C push si */ 0x56,
/* 0000038D mov si,0x3c2 */ 0xBE, 0xC2, 0x03, /* 0000038D mov si,0x3c2 */ 0xBE,0xC2, 0x03,
/* 00000390 call word 0x3ad */ 0xE8, 0x1A, 0x00, /* 00000390 call word 0x3ad */ 0xE8,0x1A, 0x00,
/* 00000393 pop si */ 0x5E, /* 00000393 pop si */ 0x5E,
/* 00000394 iretw */ 0xCF, /* 00000394 iretw */ 0xCF,
/* 00000395 push si */ 0x56, /* 00000395 push si */ 0x56,
/* 00000396 mov si,0x3c2 */ 0xBE, 0xC2, 0x03, /* 00000396 mov si,0x3c2 */ 0xBE,0xC2, 0x03,
/* 00000399 call word 0x3ad */ 0xE8, 0x11, 0x00, /* 00000399 call word 0x3ad */ 0xE8,0x11, 0x00,
/* 0000039C pop si */ 0x5E, /* 0000039C pop si */ 0x5E,
/* 0000039D mov ax,0x4f */ 0xB8, 0x4F, 0x00, /* 0000039D mov ax,0x4f */ 0xB8,0x4F, 0x00,
/* 000003A0 iretw */ 0xCF, /* 000003A0 iretw */ 0xCF,
/* 000003A1 push si */ 0x56, /* 000003A1 push si */ 0x56,
/* 000003A2 mov si,0x3c8 */ 0xBE, 0xC8, 0x03, /* 000003A2 mov si,0x3c8 */ 0xBE,0xC8, 0x03,
/* 000003A5 call word 0x3ad */ 0xE8, 0x05, 0x00, /* 000003A5 call word 0x3ad */ 0xE8,0x05, 0x00,
/* 000003A8 pop si */ 0x5E, /* 000003A8 pop si */ 0x5E,
/* 000003A9 mov ax,0x24f */ 0xB8, 0x4F, 0x02, /* 000003A9 mov ax,0x24f */ 0xB8,0x4F, 0x02,
/* 000003AC iretw */ 0xCF, /* 000003AC iretw */ 0xCF,
/* 000003AD pushaw */ 0x60, /* 000003AD pushaw */ 0x60,
/* 000003AE push ds */ 0x1E, /* 000003AE push ds */ 0x1E,
/* 000003AF push cs */ 0x0E, /* 000003AF push cs */ 0x0E,
/* 000003B0 pop ds */ 0x1F, /* 000003B0 pop ds */ 0x1F,
/* 000003B1 mov dx,0x220 */ 0xBA, 0x20, 0x02, /* 000003B1 mov dx,0x220 */ 0xBA,0x20, 0x02,
/* 000003B4 mov ax,0x0 */ 0xB8, 0x00, 0x00, /* 000003B4 mov ax,0x0 */ 0xB8,0x00, 0x00,
/* 000003B7 lodsb */ 0xAC, /* 000003B7 lodsb */ 0xAC,
/* 000003B8 cmp al,0x0 */ 0x3C, 0x00, /* 000003B8 cmp al,0x0 */ 0x3C,0x00,
/* 000003BA jz 0x3bf */ 0x74, 0x03, /* 000003BA jz 0x3bf */ 0x74,0x03,
/* 000003BC out dx,al */ 0xEE, /* 000003BC out dx,al */ 0xEE,
/* 000003BD jmp short 0x3b7 */ 0xEB, 0xF8, /* 000003BD jmp short 0x3b7 */ 0xEB,0xF8,
/* 000003BF pop ds */ 0x1F, /* 000003BF pop ds */ 0x1F,
/* 000003C0 popaw */ 0x61, /* 000003C0 popaw */ 0x61,
/* 000003C1 ret */ 0xC3, /* 000003C1 ret */ 0xC3,
/* 000003C2 jna 0x413 */ 0x76, 0x4F, /* 000003C2 jna 0x413 */ 0x76,0x4F,
/* 000003C4 imul cx,[di],byte +0xa */ 0x6B, 0x0D, 0x0A, /* 000003C4 imul cx,[di],byte +0xa */ 0x6B,0x0D, 0x0A,
/* 000003C7 add [bp+0x55],dh */ 0x00, 0x76, 0x55, /* 000003C7 add [bp+0x55],dh */ 0x00,0x76, 0x55,
/* 000003CA outsb */ 0x6E, /* 000003CA outsb */ 0x6E,
/* 000003CB jnc 0x442 */ 0x73, 0x75, /* 000003CB jnc 0x442 */ 0x73,0x75,
/* 000003CD jo 0x43f */ 0x70, 0x70, /* 000003CD jo 0x43f */ 0x70,0x70,
/* 000003CF outsw */ 0x6F, /* 000003CF outsw */ 0x6F,
/* 000003D0 jc 0x446 */ 0x72, 0x74, /* 000003D0 jc 0x446 */ 0x72,0x74,
/* 000003D2 fs or ax,0xa */ 0x65, 0x64, 0x0D, 0x0A, 0x00, /* 000003D2 fs or ax,0xa */ 0x65,0x64, 0x0D,0x0A, 0x00,
/* 000003D7 jna 0x42e */ 0x76, 0x55, /* 000003D7 jna 0x42e */ 0x76,0x55,
/* 000003D9 outsb */ 0x6E, /* 000003D9 outsb */ 0x6E,
/* 000003DA imul bp,[bp+0x6f],byte +0x77 */ 0x6B, 0x6E, 0x6F, 0x77, /* 000003DA imul bp,[bp+0x6f],byte +0x77 */ 0x6B,0x6E, 0x6F,0x77,
/* 000003DE outsb */ 0x6E, /* 000003DE outsb */ 0x6E,
/* 000003DF and [bp+0x75],al */ 0x20, 0x46, 0x75, /* 000003DF and [bp+0x75],al */ 0x20,0x46, 0x75,
/* 000003E2 outsb */ 0x6E, /* 000003E2 outsb */ 0x6E,
/* 000003E3 arpl [si+0x69],si */ 0x63, 0x74, 0x69, /* 000003E3 arpl [si+0x69],si */ 0x63,0x74, 0x69,
/* 000003E6 outsw */ 0x6F, /* 000003E6 outsw */ 0x6F,
/* 000003E7 outsb */ 0x6E, /* 000003E7 outsb */ 0x6E,
/* 000003E8 or ax,0xa */ 0x0D, 0x0A, 0x00, /* 000003E8 or ax,0xa */ 0x0D,0x0A, 0x00,
/* 000003EB jna 0x434 */ 0x76, 0x47, /* 000003EB jna 0x434 */ 0x76,0x47,
/* 000003ED gs jz 0x439 */ 0x65, 0x74, 0x49, /* 000003ED gs jz 0x439 */ 0x65,0x74, 0x49,
/* 000003F0 outsb */ 0x6E, /* 000003F0 outsb */ 0x6E,
/* 000003F1 outsd */ 0x66, 0x6F, /* 000003F1 outsd */ 0x66,0x6F,
/* 000003F3 or ax,0xa */ 0x0D, 0x0A, 0x00, /* 000003F3 or ax,0xa */ 0x0D,0x0A, 0x00,
/* 000003F6 jna 0x43f */ 0x76, 0x47, /* 000003F6 jna 0x43f */ 0x76,0x47,
/* 000003F8 gs jz 0x448 */ 0x65, 0x74, 0x4D, /* 000003F8 gs jz 0x448 */ 0x65,0x74, 0x4D,
/* 000003FB outsw */ 0x6F, /* 000003FB outsw */ 0x6F,
/* 000003FC gs dec cx */ 0x64, 0x65, 0x49, /* 000003FC gs dec cx */ 0x64,0x65, 0x49,
/* 000003FF outsb */ 0x6E, /* 000003FF outsb */ 0x6E,
/* 00000400 outsd */ 0x66, 0x6F, /* 00000400 outsd */ 0x66,0x6F,
/* 00000402 or ax,0xa */ 0x0D, 0x0A, 0x00, /* 00000402 or ax,0xa */ 0x0D,0x0A, 0x00,
/* 00000405 jna 0x44e */ 0x76, 0x47, /* 00000405 jna 0x44e */ 0x76,0x47,
/* 00000407 gs jz 0x457 */ 0x65, 0x74, 0x4D, /* 00000407 gs jz 0x457 */ 0x65,0x74, 0x4D,
/* 0000040A outsw */ 0x6F, /* 0000040A outsw */ 0x6F,
/* 0000040B gs or ax,0xa */ 0x64, 0x65, 0x0D, 0x0A, 0x00, /* 0000040B gs or ax,0xa */ 0x64,0x65, 0x0D,0x0A, 0x00,
/* 00000410 jna 0x465 */ 0x76, 0x53, /* 00000410 jna 0x465 */ 0x76,0x53,
/* 00000412 gs jz 0x462 */ 0x65, 0x74, 0x4D, /* 00000412 gs jz 0x462 */ 0x65,0x74, 0x4D,
/* 00000415 outsw */ 0x6F, /* 00000415 outsw */ 0x6F,
/* 00000416 gs or ax,0xa */ 0x64, 0x65, 0x0D, 0x0A, 0x00, /* 00000416 gs or ax,0xa */ 0x64,0x65, 0x0D,0x0A, 0x00,
/* 0000041B jna 0x470 */ 0x76, 0x53, /* 0000041B jna 0x470 */ 0x76,0x53,
/* 0000041D gs jz 0x46d */ 0x65, 0x74, 0x4D, /* 0000041D gs jz 0x46d */ 0x65,0x74, 0x4D,
/* 00000420 outsw */ 0x6F, /* 00000420 outsw */ 0x6F,
/* 00000421 gs dec sp */ 0x64, 0x65, 0x4C, /* 00000421 gs dec sp */ 0x64,0x65, 0x4C,
/* 00000424 gs a32 popaw */ 0x65, 0x67, 0x61, /* 00000424 gs a32 popaw */ 0x65,0x67, 0x61,
/* 00000427 arpl [bx+di+0xd],di */ 0x63, 0x79, 0x0D, /* 00000427 arpl [bx+di+0xd],di */ 0x63,0x79, 0x0D,
/* 0000042A or al,[bx+si] */ 0x0A, 0x00, /* 0000042A or al,[bx+si] */ 0x0A,0x00,
/* 0000042C jna 0x483 */ 0x76, 0x55, /* 0000042C jna 0x483 */ 0x76,0x55,
/* 0000042E outsb */ 0x6E, /* 0000042E outsb */ 0x6E,
/* 0000042F imul bp,[bx+0x77],byte +0x6e */ 0x6B, 0x6F, 0x77, 0x6E, /* 0000042F imul bp,[bx+0x77],byte +0x6e */ 0x6B,0x6F, 0x77,0x6E,
/* 00000433 and [di+0x6f],cl */ 0x20, 0x4D, 0x6F, /* 00000433 and [di+0x6f],cl */ 0x20,0x4D, 0x6F,
/* 00000436 gs or ax,0xa */ 0x64, 0x65, 0x0D, 0x0A, 0x00, /* 00000436 gs or ax,0xa */ 0x64,0x65, 0x0D,0x0A, 0x00,
/* 0000043B jna 0x484 */ 0x76, 0x47, /* 0000043B jna 0x484 */ 0x76,0x47,
/* 0000043D gs jz 0x490 */ 0x65, 0x74, 0x50, /* 0000043D gs jz 0x490 */ 0x65,0x74, 0x50,
/* 00000440 insw */ 0x6D, /* 00000440 insw */ 0x6D,
/* 00000441 inc bx */ 0x43, /* 00000441 inc bx */ 0x43,
/* 00000442 popaw */ 0x61, /* 00000442 popaw */ 0x61,
/* 00000443 jo 0x4a6 */ 0x70, 0x61, /* 00000443 jo 0x4a6 */ 0x70,0x61,
/* 00000445 bound bp,[bx+di+0x6c] */ 0x62, 0x69, 0x6C, /* 00000445 bound bp,[bx+di+0x6c] */ 0x62,0x69, 0x6C,
/* 00000448 imul si,[si+0x69],word 0x7365 */ 0x69, 0x74, 0x69, 0x65, 0x73, /* 00000448 imul si,[si+0x69],word 0x7365 */ 0x69,0x74, 0x69,0x65, 0x73,
/* 0000044D or ax,0xa */ 0x0D, 0x0A, 0x00, /* 0000044D or ax,0xa */ 0x0D,0x0A, 0x00,
/* 00000450 jna 0x4a4 */ 0x76, 0x52, /* 00000450 jna 0x4a4 */ 0x76,0x52,
/* 00000452 gs popaw */ 0x65, 0x61, /* 00000452 gs popaw */ 0x65,0x61,
/* 00000454 fs inc bp */ 0x64, 0x45, /* 00000454 fs inc bp */ 0x64,0x45,
/* 00000456 imul sp,[fs:si+0xd],word 0xa */ 0x64, 0x69, 0x64, 0x0D, 0x0A, 0x00, /* 00000456 imul sp,[fs:si+0xd],word 0xa */ 0x64,0x69, 0x64,0x0D, 0x0A, 0x00,
/* 0000045C jna 0x4aa */ 0x76, 0x4C, /* 0000045C jna 0x4aa */ 0x76,0x4C,
/* 0000045E gs a32 popaw */ 0x65, 0x67, 0x61, /* 0000045E gs a32 popaw */ 0x65,0x67, 0x61,
/* 00000461 arpl [bx+di+0x4d],di */ 0x63, 0x79, 0x4D, /* 00000461 arpl [bx+di+0x4d],di */ 0x63,0x79, 0x4D,
/* 00000464 outsw */ 0x6F, /* 00000464 outsw */ 0x6F,
/* 00000465 xor cx,[gs:di] */ 0x64, 0x65, 0x33, 0x0D, /* 00000465 xor cx,[gs:di] */ 0x64,0x65, 0x33,0x0D,
/* 00000469 or al,[bx+si] */ 0x0A, 0x00, /* 00000469 or al,[bx+si] */ 0x0A,0x00,
/* 0000046B insw */ 0x6D, /* 0000046B insw */ 0x6D,
/* 0000046C outsw */ 0x6F, /* 0000046C outsw */ 0x6F,
/* 0000046D gs pop di */ 0x64, 0x65, 0x5F, /* 0000046D gs pop di */ 0x64,0x65, 0x5F,
/* 00000470 ss xor al,0x30 */ 0x36, 0x34, 0x30, /* 00000470 ss xor al,0x30 */ 0x36,0x34, 0x30,
/* 00000473 js 0x4a9 */ 0x78, 0x34, /* 00000473 js 0x4a9 */ 0x78,0x34,
/* 00000475 cmp [bx+si],dh */ 0x38, 0x30, /* 00000475 cmp [bx+si],dh */ 0x38,0x30,
/* 00000477 js 0x4ac */ 0x78, 0x33, /* 00000477 js 0x4ac */ 0x78,0x33,
/* 00000479 xor cl,[di] */ 0x32, 0x0D, /* 00000479 xor cl,[di] */ 0x32,0x0D,
/* 0000047B or al,[bx+si] */ 0x0A, 0x00, /* 0000047B or al,[bx+si] */ 0x0A,0x00,
/* 0000047D insw */ 0x6D, /* 0000047D insw */ 0x6D,
/* 0000047E outsw */ 0x6F, /* 0000047E outsw */ 0x6F,
/* 0000047F gs pop di */ 0x64, 0x65, 0x5F, /* 0000047F gs pop di */ 0x64,0x65, 0x5F,
/* 00000482 cmp [bx+si],dh */ 0x38, 0x30, /* 00000482 cmp [bx+si],dh */ 0x38,0x30,
/* 00000484 xor [bx+si+0x36],bh */ 0x30, 0x78, 0x36, /* 00000484 xor [bx+si+0x36],bh */ 0x30,0x78, 0x36,
/* 00000487 xor [bx+si],dh */ 0x30, 0x30, /* 00000487 xor [bx+si],dh */ 0x30,0x30,
/* 00000489 js 0x4be */ 0x78, 0x33, /* 00000489 js 0x4be */ 0x78,0x33,
/* 0000048B xor cl,[di] */ 0x32, 0x0D, /* 0000048B xor cl,[di] */ 0x32,0x0D,
/* 0000048D or al,[bx+si] */ 0x0A, 0x00, /* 0000048D or al,[bx+si] */ 0x0A,0x00,
/* 0000048F insw */ 0x6D, /* 0000048F insw */ 0x6D,
/* 00000490 outsw */ 0x6F, /* 00000490 outsw */ 0x6F,
/* 00000491 gs pop di */ 0x64, 0x65, 0x5F, /* 00000491 gs pop di */ 0x64,0x65, 0x5F,
/* 00000494 xor [bx+si],si */ 0x31, 0x30, /* 00000494 xor [bx+si],si */ 0x31,0x30,
/* 00000496 xor dh,[si] */ 0x32, 0x34, /* 00000496 xor dh,[si] */ 0x32,0x34,
/* 00000498 js 0x4d1 */ 0x78, 0x37, /* 00000498 js 0x4d1 */ 0x78,0x37,
/* 0000049A cmp [ss:bx+si+0x33],bh */ 0x36, 0x38, 0x78, 0x33, /* 0000049A cmp [ss:bx+si+0x33],bh */ 0x36,0x38, 0x78,0x33,
/* 0000049E xor cl,[di] */ 0x32, 0x0D, /* 0000049E xor cl,[di] */ 0x32,0x0D,
/* 000004A0 or al,[bx+si] */ 0x0A, 0x00, /* 000004A0 or al,[bx+si] */ 0x0A,0x00,
/* 000004A2 insw */ 0x6D, /* 000004A2 insw */ 0x6D,
/* 000004A3 outsw */ 0x6F, /* 000004A3 outsw */ 0x6F,
/* 000004A4 gs pop di */ 0x64, 0x65, 0x5F, /* 000004A4 gs pop di */ 0x64,0x65, 0x5F,
/* 000004A7 jnz 0x517 */ 0x75, 0x6E, /* 000004A7 jnz 0x517 */ 0x75,0x6E,
/* 000004A9 jnz 0x51e */ 0x75, 0x73, /* 000004A9 jnz 0x51e */ 0x75,0x73,
/* 000004AB fs or ax,0xa */ 0x65, 0x64, 0x0D, 0x0A, 0x00, /* 000004AB fs or ax,0xa */ 0x65,0x64, 0x0D,0x0A, 0x00,
/* 000004B0 add [bx+si],al */ 0x00, 0x00, /* 000004B0 add [bx+si],al */ 0x00,0x00,
/* 000004B2 add [bx+si],al */ 0x00, 0x00, /* 000004B2 add [bx+si],al */ 0x00,0x00,
/* 000004B4 add [bx+si],al */ 0x00, 0x00, /* 000004B4 add [bx+si],al */ 0x00,0x00,
/* 000004B6 add [bx+si],al */ 0x00, 0x00, /* 000004B6 add [bx+si],al */ 0x00,0x00,
/* 000004B8 add [bx+si],al */ 0x00, 0x00, /* 000004B8 add [bx+si],al */ 0x00,0x00,
/* 000004BA add [bx+si],al */ 0x00, 0x00, /* 000004BA add [bx+si],al */ 0x00,0x00,
/* 000004BC add [bx+si],al */ 0x00, 0x00, /* 000004BC add [bx+si],al */ 0x00,0x00,
/* 000004BE add [bx+si],al */ 0x00, 0x00, /* 000004BE add [bx+si],al */ 0x00,0x00,
/* 000004C0 add [bx+si],al */ 0x00, 0x00, /* 000004C0 add [bx+si],al */ 0x00,0x00,
/* 000004C2 add [bx+si],al */ 0x00, 0x00, /* 000004C2 add [bx+si],al */ 0x00,0x00,
/* 000004C4 add [bx+si],al */ 0x00, 0x00, /* 000004C4 add [bx+si],al */ 0x00,0x00,
/* 000004C6 add [bx+si],al */ 0x00, 0x00, /* 000004C6 add [bx+si],al */ 0x00,0x00,
/* 000004C8 add [bx+si],al */ 0x00, 0x00, /* 000004C8 add [bx+si],al */ 0x00,0x00,
/* 000004CA add [bx+si],al */ 0x00, 0x00, /* 000004CA add [bx+si],al */ 0x00,0x00,
/* 000004CC add [bx+si],al */ 0x00, 0x00, /* 000004CC add [bx+si],al */ 0x00,0x00,
/* 000004CE add [bx+si],al */ 0x00, 0x00, /* 000004CE add [bx+si],al */ 0x00,0x00,
/* 000004D0 add [bx+si],al */ 0x00, 0x00, /* 000004D0 add [bx+si],al */ 0x00,0x00,
/* 000004D2 add [bx+si],al */ 0x00, 0x00, /* 000004D2 add [bx+si],al */ 0x00,0x00,
/* 000004D4 add [bx+si],al */ 0x00, 0x00, /* 000004D4 add [bx+si],al */ 0x00,0x00,
/* 000004D6 add [bx+si],al */ 0x00, 0x00, /* 000004D6 add [bx+si],al */ 0x00,0x00,
/* 000004D8 add [bx+si],al */ 0x00, 0x00, /* 000004D8 add [bx+si],al */ 0x00,0x00,
/* 000004DA add [bx+si],al */ 0x00, 0x00, /* 000004DA add [bx+si],al */ 0x00,0x00,
/* 000004DC add [bx+si],al */ 0x00, 0x00, /* 000004DC add [bx+si],al */ 0x00,0x00,
/* 000004DE add [bx+si],al */ 0x00, 0x00, /* 000004DE add [bx+si],al */ 0x00,0x00,
/* 000004E0 add [bx+si],al */ 0x00, 0x00, /* 000004E0 add [bx+si],al */ 0x00,0x00,
/* 000004E2 add [bx+si],al */ 0x00, 0x00, /* 000004E2 add [bx+si],al */ 0x00,0x00,
/* 000004E4 add [bx+si],al */ 0x00, 0x00, /* 000004E4 add [bx+si],al */ 0x00,0x00,
/* 000004E6 add [bx+si],al */ 0x00, 0x00, /* 000004E6 add [bx+si],al */ 0x00,0x00,
/* 000004E8 add [bx+si],al */ 0x00, 0x00, /* 000004E8 add [bx+si],al */ 0x00,0x00,
/* 000004EA add [bx+si],al */ 0x00, 0x00, /* 000004EA add [bx+si],al */ 0x00,0x00,
/* 000004EC add [bx+si],al */ 0x00, 0x00, /* 000004EC add [bx+si],al */ 0x00,0x00,
/* 000004EE add [bx+si],al */ 0x00, 0x00, /* 000004EE add [bx+si],al */ 0x00,0x00,
/* 000004F0 add [bx+si],al */ 0x00, 0x00, /* 000004F0 add [bx+si],al */ 0x00,0x00,
/* 000004F2 add [bx+si],al */ 0x00, 0x00, /* 000004F2 add [bx+si],al */ 0x00,0x00,
/* 000004F4 add [bx+si],al */ 0x00, 0x00, /* 000004F4 add [bx+si],al */ 0x00,0x00,
/* 000004F6 add [bx+si],al */ 0x00, 0x00, /* 000004F6 add [bx+si],al */ 0x00,0x00,
/* 000004F8 add [bx+si],al */ 0x00, 0x00, /* 000004F8 add [bx+si],al */ 0x00,0x00,
/* 000004FA add [bx+si],al */ 0x00, 0x00, /* 000004FA add [bx+si],al */ 0x00,0x00,
/* 000004FC add [bx+si],al */ 0x00, 0x00, /* 000004FC add [bx+si],al */ 0x00,0x00,
/* 000004FE add [bx+si],al */ 0x00, 0x00, /* 000004FE add [bx+si],al */ 0x00,0x00,
/* 00000500 add [bx+si],al */ 0x00, 0x00, /* 00000500 add [bx+si],al */ 0x00,0x00,
/* 00000502 add [bx+si],al */ 0x00, 0x00, /* 00000502 add [bx+si],al */ 0x00,0x00,
/* 00000504 add [bx+si],al */ 0x00, 0x00, /* 00000504 add [bx+si],al */ 0x00,0x00,
/* 00000506 add [bx+si],al */ 0x00, 0x00, /* 00000506 add [bx+si],al */ 0x00,0x00,
/* 00000508 add [bx+si],al */ 0x00, 0x00, /* 00000508 add [bx+si],al */ 0x00,0x00,
/* 0000050A add [bx+si],al */ 0x00, 0x00, /* 0000050A add [bx+si],al */ 0x00,0x00,
/* 0000050C add [bx+si],al */ 0x00, 0x00, /* 0000050C add [bx+si],al */ 0x00,0x00,
/* 0000050E add [bx+si],al */ 0x00, 0x00, /* 0000050E add [bx+si],al */ 0x00,0x00,
/* 00000510 add [bx+si],al */ 0x00, 0x00, /* 00000510 add [bx+si],al */ 0x00,0x00,
/* 00000512 add [bx+si],al */ 0x00, 0x00, /* 00000512 add [bx+si],al */ 0x00,0x00,
/* 00000514 add [bx+si],al */ 0x00, 0x00, /* 00000514 add [bx+si],al */ 0x00,0x00,
/* 00000516 add [bx+si],al */ 0x00, 0x00, /* 00000516 add [bx+si],al */ 0x00,0x00,
/* 00000518 add [bx+si],al */ 0x00, 0x00, /* 00000518 add [bx+si],al */ 0x00,0x00,
/* 0000051A add [bx+si],al */ 0x00, 0x00, /* 0000051A add [bx+si],al */ 0x00,0x00,
/* 0000051C add [bx+si],al */ 0x00, 0x00, /* 0000051C add [bx+si],al */ 0x00,0x00,
/* 0000051E add [bx+si],al */ 0x00, 0x00, /* 0000051E add [bx+si],al */ 0x00,0x00,
/* 00000520 add [bx+si],al */ 0x00, 0x00, /* 00000520 add [bx+si],al */ 0x00,0x00,
/* 00000522 add [bx+si],al */ 0x00, 0x00, /* 00000522 add [bx+si],al */ 0x00,0x00,
/* 00000524 add [bx+si],al */ 0x00, 0x00, /* 00000524 add [bx+si],al */ 0x00,0x00,
/* 00000526 add [bx+si],al */ 0x00, 0x00, /* 00000526 add [bx+si],al */ 0x00,0x00,
/* 00000528 add [bx+si],al */ 0x00, 0x00, /* 00000528 add [bx+si],al */ 0x00,0x00,
/* 0000052A add [bx+si],al */ 0x00, 0x00, /* 0000052A add [bx+si],al */ 0x00,0x00,
/* 0000052C add [bx+si],al */ 0x00, 0x00, /* 0000052C add [bx+si],al */ 0x00,0x00,
/* 0000052E add [bx+si],al */ 0x00, 0x00, /* 0000052E add [bx+si],al */ 0x00,0x00,
/* 00000530 add [bx+si],al */ 0x00, 0x00, /* 00000530 add [bx+si],al */ 0x00,0x00,
/* 00000532 add [bx+si],al */ 0x00, 0x00, /* 00000532 add [bx+si],al */ 0x00,0x00,
}; };
#endif #endif

View File

@ -73,7 +73,7 @@ ClearCacheOnMpServicesAvailable (
0, // TimeoutInMicroSeconds: inf. 0, // TimeoutInMicroSeconds: inf.
NULL // ProcedureArgument NULL // ProcedureArgument
); );
if (EFI_ERROR (Status) && Status != EFI_NOT_STARTED) { if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {
DEBUG ((DEBUG_ERROR, "%a: StartupAllAps(): %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: StartupAllAps(): %r\n", __FUNCTION__, Status));
return Status; return Status;
} }
@ -105,7 +105,11 @@ InstallClearCacheCallback (
Status = PeiServicesNotifyPpi (&mMpServicesNotify); Status = PeiServicesNotifyPpi (&mMpServicesNotify);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: failed to set up MP Services callback: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_ERROR,
"%a: failed to set up MP Services callback: %r\n",
__FUNCTION__,
Status
));
} }
} }

View File

@ -6,7 +6,6 @@
**/ **/
#include "Cmos.h" #include "Cmos.h"
#include "Library/IoLib.h" #include "Library/IoLib.h"
@ -27,11 +26,10 @@ CmosRead8 (
IN UINTN Index IN UINTN Index
) )
{ {
IoWrite8 (0x70, (UINT8) Index); IoWrite8 (0x70, (UINT8)Index);
return IoRead8 (0x71); return IoRead8 (0x71);
} }
/** /**
Writes 8-bits of CMOS data. Writes 8-bits of CMOS data.
@ -51,8 +49,7 @@ CmosWrite8 (
IN UINT8 Value IN UINT8 Value
) )
{ {
IoWrite8 (0x70, (UINT8) Index); IoWrite8 (0x70, (UINT8)Index);
IoWrite8 (0x71, Value); IoWrite8 (0x71, Value);
return Value; return Value;
} }

View File

@ -45,6 +45,4 @@ CmosWrite8 (
IN UINT8 Value IN UINT8 Value
); );
#endif /* _CMOS_H_ */ #endif /* _CMOS_H_ */

View File

@ -13,7 +13,6 @@
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
#include <Library/PeiServicesLib.h> #include <Library/PeiServicesLib.h>
/** /**
Publish PEI & DXE (Decompressed) Memory based FVs to let PEI Publish PEI & DXE (Decompressed) Memory based FVs to let PEI
and DXE know about them. and DXE know about them.
@ -83,7 +82,7 @@ PeiFvInitialization (
// //
PeiServicesInstallFvInfoPpi ( PeiServicesInstallFvInfoPpi (
NULL, NULL,
(VOID *)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase), (VOID *)(UINTN)PcdGet32 (PcdOvmfDxeMemFvBase),
PcdGet32 (PcdOvmfDxeMemFvSize), PcdGet32 (PcdOvmfDxeMemFvSize),
NULL, NULL,
NULL NULL
@ -91,4 +90,3 @@ PeiFvInitialization (
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -100,7 +100,6 @@ Q35TsegMbytesInitialization (
mQ35TsegMbytes = ExtendedTsegMbytes; mQ35TsegMbytes = ExtendedTsegMbytes;
} }
UINT32 UINT32
GetSystemMemorySizeBelow4gb ( GetSystemMemorySizeBelow4gb (
VOID VOID
@ -118,13 +117,12 @@ GetSystemMemorySizeBelow4gb (
// into the calculation to get the total memory size. // into the calculation to get the total memory size.
// //
Cmos0x34 = (UINT8) CmosRead8 (0x34); Cmos0x34 = (UINT8)CmosRead8 (0x34);
Cmos0x35 = (UINT8) CmosRead8 (0x35); Cmos0x35 = (UINT8)CmosRead8 (0x35);
return (UINT32) (((UINTN)((Cmos0x35 << 8) + Cmos0x34) << 16) + SIZE_16MB); return (UINT32)(((UINTN)((Cmos0x35 << 8) + Cmos0x34) << 16) + SIZE_16MB);
} }
STATIC STATIC
UINT64 UINT64
GetSystemMemorySizeAbove4gb ( GetSystemMemorySizeAbove4gb (
@ -143,13 +141,12 @@ GetSystemMemorySizeAbove4gb (
Size = 0; Size = 0;
for (CmosIndex = 0x5d; CmosIndex >= 0x5b; CmosIndex--) { for (CmosIndex = 0x5d; CmosIndex >= 0x5b; CmosIndex--) {
Size = (UINT32) (Size << 8) + (UINT32) CmosRead8 (CmosIndex); Size = (UINT32)(Size << 8) + (UINT32)CmosRead8 (CmosIndex);
} }
return LShiftU64 (Size, 16); return LShiftU64 (Size, 16);
} }
/** /**
Return the highest address that DXE could possibly use, plus one. Return the highest address that DXE could possibly use, plus one.
**/ **/
@ -170,11 +167,12 @@ GetFirstNonAddress (
// resources to 32-bit anyway. See DegradeResource() in // resources to 32-bit anyway. See DegradeResource() in
// "PciResourceSupport.c". // "PciResourceSupport.c".
// //
#ifdef MDE_CPU_IA32 #ifdef MDE_CPU_IA32
if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) { if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
return FirstNonAddress; return FirstNonAddress;
} }
#endif
#endif
// //
// Otherwise, in order to calculate the highest address plus one, we must // Otherwise, in order to calculate the highest address plus one, we must
@ -184,8 +182,11 @@ GetFirstNonAddress (
if (Pci64Size == 0) { if (Pci64Size == 0) {
if (mBootMode != BOOT_ON_S3_RESUME) { if (mBootMode != BOOT_ON_S3_RESUME) {
DEBUG ((DEBUG_INFO, "%a: disabling 64-bit PCI host aperture\n", DEBUG ((
__FUNCTION__)); DEBUG_INFO,
"%a: disabling 64-bit PCI host aperture\n",
__FUNCTION__
));
PcdStatus = PcdSet64S (PcdPciMmio64Size, 0); PcdStatus = PcdSet64S (PcdPciMmio64Size, 0);
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
} }
@ -224,8 +225,13 @@ GetFirstNonAddress (
PcdStatus = PcdSet64S (PcdPciMmio64Size, Pci64Size); PcdStatus = PcdSet64S (PcdPciMmio64Size, Pci64Size);
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
DEBUG ((DEBUG_INFO, "%a: Pci64Base=0x%Lx Pci64Size=0x%Lx\n", DEBUG ((
__FUNCTION__, Pci64Base, Pci64Size)); DEBUG_INFO,
"%a: Pci64Base=0x%Lx Pci64Size=0x%Lx\n",
__FUNCTION__,
Pci64Base,
Pci64Size
));
} }
// //
@ -235,7 +241,6 @@ GetFirstNonAddress (
return FirstNonAddress; return FirstNonAddress;
} }
/** /**
Initialize the mPhysMemAddressWidth variable, based on guest RAM size. Initialize the mPhysMemAddressWidth variable, based on guest RAM size.
**/ **/
@ -272,10 +277,10 @@ AddressWidthInitialization (
if (mPhysMemAddressWidth <= 36) { if (mPhysMemAddressWidth <= 36) {
mPhysMemAddressWidth = 36; mPhysMemAddressWidth = 36;
} }
ASSERT (mPhysMemAddressWidth <= 48); ASSERT (mPhysMemAddressWidth <= 48);
} }
/** /**
Calculate the cap for the permanent PEI memory. Calculate the cap for the permanent PEI memory.
**/ **/
@ -295,11 +300,12 @@ GetPeiMemoryCap (
// //
// If DXE is 32-bit, then just return the traditional 64 MB cap. // If DXE is 32-bit, then just return the traditional 64 MB cap.
// //
#ifdef MDE_CPU_IA32 #ifdef MDE_CPU_IA32
if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) { if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
return SIZE_64MB; return SIZE_64MB;
} }
#endif
#endif
// //
// Dependent on physical address width, PEI memory allocations can be // Dependent on physical address width, PEI memory allocations can be
@ -340,7 +346,6 @@ GetPeiMemoryCap (
return (UINT32)(EFI_PAGES_TO_SIZE (TotalPages) + SIZE_64MB); return (UINT32)(EFI_PAGES_TO_SIZE (TotalPages) + SIZE_64MB);
} }
/** /**
Publish PEI core memory Publish PEI core memory
@ -384,8 +389,13 @@ PublishPeiMemory (
MemorySize = mS3AcpiReservedMemorySize; MemorySize = mS3AcpiReservedMemorySize;
} else { } else {
PeiMemoryCap = GetPeiMemoryCap (); PeiMemoryCap = GetPeiMemoryCap ();
DEBUG ((DEBUG_INFO, "%a: mPhysMemAddressWidth=%d PeiMemoryCap=%u KB\n", DEBUG ((
__FUNCTION__, mPhysMemAddressWidth, PeiMemoryCap >> 10)); DEBUG_INFO,
"%a: mPhysMemAddressWidth=%d PeiMemoryCap=%u KB\n",
__FUNCTION__,
mPhysMemAddressWidth,
PeiMemoryCap >> 10
));
// //
// Determine the range of memory to use during PEI // Determine the range of memory to use during PEI
@ -410,13 +420,12 @@ PublishPeiMemory (
// //
// Publish this memory to the PEI Core // Publish this memory to the PEI Core
// //
Status = PublishSystemMemory(MemoryBase, MemorySize); Status = PublishSystemMemory (MemoryBase, MemorySize);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }
/** /**
Peform Memory Detection for QEMU / KVM Peform Memory Detection for QEMU / KVM
@ -473,8 +482,11 @@ QemuInitializeRam (
TsegSize = mQ35TsegMbytes * SIZE_1MB; TsegSize = mQ35TsegMbytes * SIZE_1MB;
AddMemoryRangeHob (BASE_1MB, LowerMemorySize - TsegSize); AddMemoryRangeHob (BASE_1MB, LowerMemorySize - TsegSize);
AddReservedMemoryBaseSizeHob (LowerMemorySize - TsegSize, TsegSize, AddReservedMemoryBaseSizeHob (
TRUE); LowerMemorySize - TsegSize,
TsegSize,
TRUE
);
} else { } else {
AddMemoryRangeHob (BASE_1MB, LowerMemorySize); AddMemoryRangeHob (BASE_1MB, LowerMemorySize);
} }
@ -516,16 +528,22 @@ QemuInitializeRam (
// //
// Set memory range from 640KB to 1MB to uncacheable // Set memory range from 640KB to 1MB to uncacheable
// //
Status = MtrrSetMemoryAttribute (BASE_512KB + BASE_128KB, Status = MtrrSetMemoryAttribute (
BASE_1MB - (BASE_512KB + BASE_128KB), CacheUncacheable); BASE_512KB + BASE_128KB,
BASE_1MB - (BASE_512KB + BASE_128KB),
CacheUncacheable
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
// Set memory range from the "top of lower RAM" (RAM below 4GB) to 4GB as // Set memory range from the "top of lower RAM" (RAM below 4GB) to 4GB as
// uncacheable // uncacheable
// //
Status = MtrrSetMemoryAttribute (LowerMemorySize, Status = MtrrSetMemoryAttribute (
SIZE_4GB - LowerMemorySize, CacheUncacheable); LowerMemorySize,
SIZE_4GB - LowerMemorySize,
CacheUncacheable
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }
} }
@ -541,7 +559,7 @@ InitializeRamRegions (
{ {
QemuInitializeRam (); QemuInitializeRam ();
if (mS3Supported && mBootMode != BOOT_ON_S3_RESUME) { if (mS3Supported && (mBootMode != BOOT_ON_S3_RESUME)) {
// //
// This is the memory range that will be used for PEI on S3 resume // This is the memory range that will be used for PEI on S3 resume
// //
@ -571,7 +589,7 @@ InitializeRamRegions (
EfiACPIMemoryNVS EfiACPIMemoryNVS
); );
#ifdef MDE_CPU_X64 #ifdef MDE_CPU_X64
// //
// Reserve the initial page tables built by the reset vector code. // Reserve the initial page tables built by the reset vector code.
// //
@ -579,11 +597,11 @@ InitializeRamRegions (
// resume, it must be reserved as ACPI NVS. // resume, it must be reserved as ACPI NVS.
// //
BuildMemoryAllocationHob ( BuildMemoryAllocationHob (
(EFI_PHYSICAL_ADDRESS)(UINTN) PcdGet32 (PcdOvmfSecPageTablesBase), (EFI_PHYSICAL_ADDRESS)(UINTN)PcdGet32 (PcdOvmfSecPageTablesBase),
(UINT64)(UINTN) PcdGet32 (PcdOvmfSecPageTablesSize), (UINT64)(UINTN)PcdGet32 (PcdOvmfSecPageTablesSize),
EfiACPIMemoryNVS EfiACPIMemoryNVS
); );
#endif #endif
} }
if (mBootMode != BOOT_ON_S3_RESUME) { if (mBootMode != BOOT_ON_S3_RESUME) {
@ -599,12 +617,12 @@ InitializeRamRegions (
// such that they would overlap the LockBox storage. // such that they would overlap the LockBox storage.
// //
ZeroMem ( ZeroMem (
(VOID*)(UINTN) PcdGet32 (PcdOvmfLockBoxStorageBase), (VOID *)(UINTN)PcdGet32 (PcdOvmfLockBoxStorageBase),
(UINTN) PcdGet32 (PcdOvmfLockBoxStorageSize) (UINTN)PcdGet32 (PcdOvmfLockBoxStorageSize)
); );
BuildMemoryAllocationHob ( BuildMemoryAllocationHob (
(EFI_PHYSICAL_ADDRESS)(UINTN) PcdGet32 (PcdOvmfLockBoxStorageBase), (EFI_PHYSICAL_ADDRESS)(UINTN)PcdGet32 (PcdOvmfLockBoxStorageBase),
(UINT64)(UINTN) PcdGet32 (PcdOvmfLockBoxStorageSize), (UINT64)(UINTN)PcdGet32 (PcdOvmfLockBoxStorageSize),
mS3Supported ? EfiACPIMemoryNVS : EfiBootServicesData mS3Supported ? EfiACPIMemoryNVS : EfiBootServicesData
); );
} }
@ -618,7 +636,7 @@ InitializeRamRegions (
// //
TsegSize = mQ35TsegMbytes * SIZE_1MB; TsegSize = mQ35TsegMbytes * SIZE_1MB;
BuildMemoryAllocationHob ( BuildMemoryAllocationHob (
GetSystemMemorySizeBelow4gb() - TsegSize, GetSystemMemorySizeBelow4gb () - TsegSize,
TsegSize, TsegSize,
EfiReservedMemoryType EfiReservedMemoryType
); );

View File

@ -47,7 +47,6 @@ EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
{ EfiMaxMemoryType, 0x000 } { EfiMaxMemoryType, 0x000 }
}; };
EFI_PEI_PPI_DESCRIPTOR mPpiBootMode[] = { EFI_PEI_PPI_DESCRIPTOR mPpiBootMode[] = {
{ {
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
@ -56,7 +55,6 @@ EFI_PEI_PPI_DESCRIPTOR mPpiBootMode[] = {
} }
}; };
UINT16 mHostBridgeDevId; UINT16 mHostBridgeDevId;
EFI_BOOT_MODE mBootMode = BOOT_WITH_FULL_CONFIGURATION; EFI_BOOT_MODE mBootMode = BOOT_WITH_FULL_CONFIGURATION;
@ -115,7 +113,6 @@ AddIoMemoryRangeHob (
AddIoMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase)); AddIoMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));
} }
VOID VOID
AddMemoryBaseSizeHob ( AddMemoryBaseSizeHob (
EFI_PHYSICAL_ADDRESS MemoryBase, EFI_PHYSICAL_ADDRESS MemoryBase,
@ -136,7 +133,6 @@ AddMemoryBaseSizeHob (
); );
} }
VOID VOID
AddMemoryRangeHob ( AddMemoryRangeHob (
EFI_PHYSICAL_ADDRESS MemoryBase, EFI_PHYSICAL_ADDRESS MemoryBase,
@ -146,7 +142,6 @@ AddMemoryRangeHob (
AddMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase)); AddMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));
} }
VOID VOID
MemMapInitialization ( MemMapInitialization (
VOID VOID
@ -165,7 +160,7 @@ MemMapInitialization (
BuildGuidDataHob ( BuildGuidDataHob (
&gEfiMemoryTypeInformationGuid, &gEfiMemoryTypeInformationGuid,
mDefaultMemoryTypeInformation, mDefaultMemoryTypeInformation,
sizeof(mDefaultMemoryTypeInformation) sizeof (mDefaultMemoryTypeInformation)
); );
// //
@ -192,9 +187,10 @@ MemMapInitialization (
PciBase = (UINT32)(PciExBarBase + SIZE_256MB); PciBase = (UINT32)(PciExBarBase + SIZE_256MB);
} else { } else {
PciBase = (UINT32)PcdGet64 (PcdPciMmio32Base); PciBase = (UINT32)PcdGet64 (PcdPciMmio32Base);
if (PciBase == 0) if (PciBase == 0) {
PciBase = (TopOfLowRam < BASE_2GB) ? BASE_2GB : TopOfLowRam; PciBase = (TopOfLowRam < BASE_2GB) ? BASE_2GB : TopOfLowRam;
} }
}
// //
// address purpose size // address purpose size
@ -242,10 +238,14 @@ MemMapInitialization (
// uncacheable reserved memory right here. // uncacheable reserved memory right here.
// //
AddReservedMemoryBaseSizeHob (PciExBarBase, SIZE_256MB, FALSE); AddReservedMemoryBaseSizeHob (PciExBarBase, SIZE_256MB, FALSE);
BuildMemoryAllocationHob (PciExBarBase, SIZE_256MB, BuildMemoryAllocationHob (
EfiReservedMemoryType); PciExBarBase,
SIZE_256MB,
EfiReservedMemoryType
);
} }
AddIoMemoryBaseSizeHob (PcdGet32(PcdCpuLocalApicBaseAddress), SIZE_1MB);
AddIoMemoryBaseSizeHob (PcdGet32 (PcdCpuLocalApicBaseAddress), SIZE_1MB);
// //
// On Q35, the IO Port space is available for PCI resource allocations from // On Q35, the IO Port space is available for PCI resource allocations from
@ -370,11 +370,16 @@ MiscInitialization (
AcpiEnBit = ICH9_ACPI_CNTL_ACPI_EN; AcpiEnBit = ICH9_ACPI_CNTL_ACPI_EN;
break; break;
default: default:
DEBUG ((DEBUG_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", DEBUG ((
__FUNCTION__, mHostBridgeDevId)); DEBUG_ERROR,
"%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__,
mHostBridgeDevId
));
ASSERT (FALSE); ASSERT (FALSE);
return; return;
} }
PcdStatus = PcdSet16S (PcdOvmfHostBridgePciDevId, mHostBridgeDevId); PcdStatus = PcdSet16S (PcdOvmfHostBridgePciDevId, mHostBridgeDevId);
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
@ -417,7 +422,6 @@ MiscInitialization (
} }
} }
VOID VOID
BootModeInitialization ( BootModeInitialization (
VOID VOID
@ -428,6 +432,7 @@ BootModeInitialization (
if (CmosRead8 (0xF) == 0xFE) { if (CmosRead8 (0xF) == 0xFE) {
mBootMode = BOOT_ON_S3_RESUME; mBootMode = BOOT_ON_S3_RESUME;
} }
CmosWrite8 (0xF, 0x00); CmosWrite8 (0xF, 0x00);
Status = PeiServicesSetBootMode (mBootMode); Status = PeiServicesSetBootMode (mBootMode);
@ -437,7 +442,6 @@ BootModeInitialization (
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }
VOID VOID
ReserveEmuVariableNvStore ( ReserveEmuVariableNvStore (
) )
@ -456,7 +460,8 @@ ReserveEmuVariableNvStore (
AllocateRuntimePages ( AllocateRuntimePages (
EFI_SIZE_TO_PAGES (2 * PcdGet32 (PcdFlashNvStorageFtwSpareSize)) EFI_SIZE_TO_PAGES (2 * PcdGet32 (PcdFlashNvStorageFtwSpareSize))
); );
DEBUG ((DEBUG_INFO, DEBUG ((
DEBUG_INFO,
"Reserved variable store memory: 0x%lX; size: %dkb\n", "Reserved variable store memory: 0x%lX; size: %dkb\n",
VariableStore, VariableStore,
(2 * PcdGet32 (PcdFlashNvStorageFtwSpareSize)) / 1024 (2 * PcdGet32 (PcdFlashNvStorageFtwSpareSize)) / 1024
@ -465,7 +470,6 @@ ReserveEmuVariableNvStore (
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
} }
VOID VOID
DebugDumpCmos ( DebugDumpCmos (
VOID VOID
@ -479,6 +483,7 @@ DebugDumpCmos (
if ((Loop % 0x10) == 0) { if ((Loop % 0x10) == 0) {
DEBUG ((DEBUG_INFO, "%02x:", Loop)); DEBUG ((DEBUG_INFO, "%02x:", Loop));
} }
DEBUG ((DEBUG_INFO, " %02x", CmosRead8 (Loop))); DEBUG ((DEBUG_INFO, " %02x", CmosRead8 (Loop)));
if ((Loop % 0x10) == 0xf) { if ((Loop % 0x10) == 0xf) {
DEBUG ((DEBUG_INFO, "\n")); DEBUG ((DEBUG_INFO, "\n"));
@ -486,27 +491,34 @@ DebugDumpCmos (
} }
} }
VOID VOID
S3Verification ( S3Verification (
VOID VOID
) )
{ {
#if defined (MDE_CPU_X64) #if defined (MDE_CPU_X64)
if (FeaturePcdGet (PcdSmmSmramRequire) && mS3Supported) { if (FeaturePcdGet (PcdSmmSmramRequire) && mS3Supported) {
DEBUG ((DEBUG_ERROR, DEBUG ((
"%a: S3Resume2Pei doesn't support X64 PEI + SMM yet.\n", __FUNCTION__)); DEBUG_ERROR,
DEBUG ((DEBUG_ERROR, "%a: S3Resume2Pei doesn't support X64 PEI + SMM yet.\n",
__FUNCTION__
));
DEBUG ((
DEBUG_ERROR,
"%a: Please disable S3 on the QEMU command line (see the README),\n", "%a: Please disable S3 on the QEMU command line (see the README),\n",
__FUNCTION__)); __FUNCTION__
DEBUG ((DEBUG_ERROR, ));
"%a: or build OVMF with \"OvmfPkgIa32X64.dsc\".\n", __FUNCTION__)); DEBUG ((
DEBUG_ERROR,
"%a: or build OVMF with \"OvmfPkgIa32X64.dsc\".\n",
__FUNCTION__
));
ASSERT (FALSE); ASSERT (FALSE);
CpuDeadLoop (); CpuDeadLoop ();
} }
#endif
}
#endif
}
/** /**
Fetch the number of boot CPUs from QEMU and expose it to UefiCpuPkg modules. Fetch the number of boot CPUs from QEMU and expose it to UefiCpuPkg modules.
@ -528,6 +540,7 @@ MaxCpuCountInitialization (
mMaxCpuCount = PcdGet32 (PcdCpuMaxLogicalProcessorNumber); mMaxCpuCount = PcdGet32 (PcdCpuMaxLogicalProcessorNumber);
return; return;
} }
// //
// Otherwise, set mMaxCpuCount to the value reported by QEMU. // Otherwise, set mMaxCpuCount to the value reported by QEMU.
// //
@ -542,11 +555,14 @@ MaxCpuCountInitialization (
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
PcdStatus = PcdSet32S (PcdCpuApInitTimeOutInMicroSeconds, MAX_UINT32); PcdStatus = PcdSet32S (PcdCpuApInitTimeOutInMicroSeconds, MAX_UINT32);
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
DEBUG ((DEBUG_INFO, "%a: QEMU reports %d processor(s)\n", __FUNCTION__, DEBUG ((
ProcessorCount)); DEBUG_INFO,
"%a: QEMU reports %d processor(s)\n",
__FUNCTION__,
ProcessorCount
));
} }
/** /**
Perform Platform PEI initialization. Perform Platform PEI initialization.
@ -596,6 +612,7 @@ InitializePlatform (
if (!FeaturePcdGet (PcdSmmSmramRequire)) { if (!FeaturePcdGet (PcdSmmSmramRequire)) {
ReserveEmuVariableNvStore (); ReserveEmuVariableNvStore ();
} }
PeiFvInitialization (); PeiFvInitialization ();
MemMapInitialization (); MemMapInitialization ();
NoexecDxeInitialization (); NoexecDxeInitialization ();

View File

@ -24,18 +24,17 @@ GetBhyveSmbiosTables (
UINT8 *BhyveSmbiosPtr; UINT8 *BhyveSmbiosPtr;
SMBIOS_TABLE_ENTRY_POINT *BhyveSmbiosEntryPointStructure; SMBIOS_TABLE_ENTRY_POINT *BhyveSmbiosEntryPointStructure;
for (BhyveSmbiosPtr = (UINT8*)(UINTN) BHYVE_SMBIOS_PHYSICAL_ADDRESS; for (BhyveSmbiosPtr = (UINT8 *)(UINTN)BHYVE_SMBIOS_PHYSICAL_ADDRESS;
BhyveSmbiosPtr < (UINT8*)(UINTN) BHYVE_SMBIOS_PHYSICAL_END; BhyveSmbiosPtr < (UINT8 *)(UINTN)BHYVE_SMBIOS_PHYSICAL_END;
BhyveSmbiosPtr += 0x10) { BhyveSmbiosPtr += 0x10)
{
BhyveSmbiosEntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) BhyveSmbiosPtr; BhyveSmbiosEntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *)BhyveSmbiosPtr;
if (!AsciiStrnCmp ((CHAR8 *) BhyveSmbiosEntryPointStructure->AnchorString, "_SM_", 4) &&
!AsciiStrnCmp ((CHAR8 *) BhyveSmbiosEntryPointStructure->IntermediateAnchorString, "_DMI_", 5) &&
IsEntryPointStructureValid (BhyveSmbiosEntryPointStructure)) {
if (!AsciiStrnCmp ((CHAR8 *)BhyveSmbiosEntryPointStructure->AnchorString, "_SM_", 4) &&
!AsciiStrnCmp ((CHAR8 *)BhyveSmbiosEntryPointStructure->IntermediateAnchorString, "_DMI_", 5) &&
IsEntryPointStructureValid (BhyveSmbiosEntryPointStructure))
{
return BhyveSmbiosEntryPointStructure; return BhyveSmbiosEntryPointStructure;
} }
} }

View File

@ -21,7 +21,7 @@
#pragma pack(1) #pragma pack(1)
typedef struct { typedef struct {
SMBIOS_TABLE_TYPE0 Base; SMBIOS_TABLE_TYPE0 Base;
UINT8 Strings[sizeof(TYPE0_STRINGS)]; UINT8 Strings[sizeof (TYPE0_STRINGS)];
} OVMF_TYPE0; } OVMF_TYPE0;
#pragma pack() #pragma pack()
@ -34,7 +34,7 @@ STATIC CONST OVMF_TYPE0 mOvmfDefaultType0 = {
}, },
1, // SMBIOS_TABLE_STRING Vendor 1, // SMBIOS_TABLE_STRING Vendor
2, // SMBIOS_TABLE_STRING BiosVersion 2, // SMBIOS_TABLE_STRING BiosVersion
0xE800,// UINT16 BiosSegment 0xE800, // UINT16 BiosSegment
3, // SMBIOS_TABLE_STRING BiosReleaseDate 3, // SMBIOS_TABLE_STRING BiosReleaseDate
0, // UINT8 BiosSize 0, // UINT8 BiosSize
{ // MISC_BIOS_CHARACTERISTICS BiosCharacteristics { // MISC_BIOS_CHARACTERISTICS BiosCharacteristics
@ -58,7 +58,6 @@ STATIC CONST OVMF_TYPE0 mOvmfDefaultType0 = {
TYPE0_STRINGS TYPE0_STRINGS
}; };
/** /**
Validates the SMBIOS entry point structure Validates the SMBIOS entry point structure
@ -78,12 +77,12 @@ IsEntryPointStructureValid (
UINT8 Checksum; UINT8 Checksum;
UINT8 *BytePtr; UINT8 *BytePtr;
BytePtr = (UINT8*) EntryPointStructure; BytePtr = (UINT8 *)EntryPointStructure;
Length = EntryPointStructure->EntryPointLength; Length = EntryPointStructure->EntryPointLength;
Checksum = 0; Checksum = 0;
for (Index = 0; Index < Length; Index++) { for (Index = 0; Index < Length; Index++) {
Checksum = Checksum + (UINT8) BytePtr[Index]; Checksum = Checksum + (UINT8)BytePtr[Index];
} }
if (Checksum != 0) { if (Checksum != 0) {
@ -93,7 +92,6 @@ IsEntryPointStructureValid (
} }
} }
/** /**
Get SMBIOS record length. Get SMBIOS record length.
@ -114,14 +112,14 @@ SmbiosTableLength (
// Each structure shall be terminated by a double-null (SMBIOS spec.7.1) // Each structure shall be terminated by a double-null (SMBIOS spec.7.1)
// //
while ((*AChar != 0) || (*(AChar + 1) != 0)) { while ((*AChar != 0) || (*(AChar + 1) != 0)) {
AChar ++; AChar++;
} }
Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2); Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);
return Length; return Length;
} }
/** /**
Install all structures from the given SMBIOS structures block Install all structures from the given SMBIOS structures block
@ -156,7 +154,7 @@ InstallAllStructures (
Smbios, Smbios,
NULL, NULL,
&SmbiosHandle, &SmbiosHandle,
(EFI_SMBIOS_TABLE_HEADER*) SmbiosTable.Raw (EFI_SMBIOS_TABLE_HEADER *)SmbiosTable.Raw
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -179,7 +177,7 @@ InstallAllStructures (
Smbios, Smbios,
NULL, NULL,
&SmbiosHandle, &SmbiosHandle,
(EFI_SMBIOS_TABLE_HEADER*) &mOvmfDefaultType0 (EFI_SMBIOS_TABLE_HEADER *)&mOvmfDefaultType0
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }
@ -187,7 +185,6 @@ InstallAllStructures (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Installs SMBIOS information for OVMF Installs SMBIOS information for OVMF
@ -216,7 +213,7 @@ SmbiosTablePublishEntry (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiSmbiosProtocolGuid, &gEfiSmbiosProtocolGuid,
NULL, NULL,
(VOID**)&Smbios (VOID **)&Smbios
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
@ -227,7 +224,7 @@ SmbiosTablePublishEntry (
// //
EntryPointStructure = GetBhyveSmbiosTables (); EntryPointStructure = GetBhyveSmbiosTables ();
if (EntryPointStructure != NULL) { if (EntryPointStructure != NULL) {
SmbiosTables = (UINT8*)(UINTN)EntryPointStructure->TableAddress; SmbiosTables = (UINT8 *)(UINTN)EntryPointStructure->TableAddress;
} }
if (SmbiosTables != NULL) { if (SmbiosTables != NULL) {

View File

@ -21,7 +21,6 @@
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h>
/** /**
Locates the bhyve SMBIOS data if it exists Locates the bhyve SMBIOS data if it exists
@ -33,7 +32,6 @@ GetBhyveSmbiosTables (
VOID VOID
); );
/** /**
Validates the SMBIOS entry point structure Validates the SMBIOS entry point structure

View File

@ -74,18 +74,21 @@ GetCompatEntryPoint (
PeCompatEnd = (UINTN)(VOID *)PeCompat + Section->Misc.VirtualSize; PeCompatEnd = (UINTN)(VOID *)PeCompat + Section->Misc.VirtualSize;
while (PeCompat->Type != 0 && (UINTN)(VOID *)PeCompat < PeCompatEnd) { while (PeCompat->Type != 0 && (UINTN)(VOID *)PeCompat < PeCompatEnd) {
if (PeCompat->Type == 1 && if ((PeCompat->Type == 1) &&
PeCompat->Size >= sizeof (PE_COMPAT_TYPE1) && (PeCompat->Size >= sizeof (PE_COMPAT_TYPE1)) &&
EFI_IMAGE_MACHINE_TYPE_SUPPORTED (PeCompat->MachineType)) { EFI_IMAGE_MACHINE_TYPE_SUPPORTED (PeCompat->MachineType))
{
return (EFI_IMAGE_ENTRY_POINT)((UINTN)ImageBase + PeCompat->EntryPoint); return (EFI_IMAGE_ENTRY_POINT)((UINTN)ImageBase + PeCompat->EntryPoint);
} }
PeCompat = (PE_COMPAT_TYPE1 *)((UINTN)PeCompat + PeCompat->Size); PeCompat = (PE_COMPAT_TYPE1 *)((UINTN)PeCompat + PeCompat->Size);
ASSERT ((UINTN)(VOID *)PeCompat < PeCompatEnd); ASSERT ((UINTN)(VOID *)PeCompat < PeCompatEnd);
} }
} }
Section++; Section++;
} }
return NULL; return NULL;
} }
@ -136,8 +139,10 @@ CompatImageLoaderDxeEntryPoint (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
return gBS->InstallProtocolInterface (&ImageHandle, return gBS->InstallProtocolInterface (
&ImageHandle,
&gEdkiiPeCoffImageEmulatorProtocolGuid, &gEdkiiPeCoffImageEmulatorProtocolGuid,
EFI_NATIVE_INTERFACE, EFI_NATIVE_INTERFACE,
&mCompatLoaderPeCoffEmuProtocol); &mCompatLoaderPeCoffEmuProtocol
);
} }

View File

@ -123,14 +123,21 @@ ProcessHotAddedCpus (
// //
for (CheckSlot = 0; for (CheckSlot = 0;
CheckSlot < mCpuHotPlugData->ArrayLength; CheckSlot < mCpuHotPlugData->ArrayLength;
CheckSlot++) { CheckSlot++)
{
if (mCpuHotPlugData->ApicId[CheckSlot] == NewApicId) { if (mCpuHotPlugData->ApicId[CheckSlot] == NewApicId) {
break; break;
} }
} }
if (CheckSlot < mCpuHotPlugData->ArrayLength) { if (CheckSlot < mCpuHotPlugData->ArrayLength) {
DEBUG ((DEBUG_VERBOSE, "%a: APIC ID " FMT_APIC_ID " was hot-plugged " DEBUG ((
"before; ignoring it\n", __FUNCTION__, NewApicId)); DEBUG_VERBOSE,
"%a: APIC ID " FMT_APIC_ID " was hot-plugged "
"before; ignoring it\n",
__FUNCTION__,
NewApicId
));
PluggedIdx++; PluggedIdx++;
continue; continue;
} }
@ -139,12 +146,18 @@ ProcessHotAddedCpus (
// Find the first empty slot in CPU_HOT_PLUG_DATA. // Find the first empty slot in CPU_HOT_PLUG_DATA.
// //
while (NewSlot < mCpuHotPlugData->ArrayLength && while (NewSlot < mCpuHotPlugData->ArrayLength &&
mCpuHotPlugData->ApicId[NewSlot] != MAX_UINT64) { mCpuHotPlugData->ApicId[NewSlot] != MAX_UINT64)
{
NewSlot++; NewSlot++;
} }
if (NewSlot == mCpuHotPlugData->ArrayLength) { if (NewSlot == mCpuHotPlugData->ArrayLength) {
DEBUG ((DEBUG_ERROR, "%a: no room for APIC ID " FMT_APIC_ID "\n", DEBUG ((
__FUNCTION__, NewApicId)); DEBUG_ERROR,
"%a: no room for APIC ID " FMT_APIC_ID "\n",
__FUNCTION__,
NewApicId
));
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -156,8 +169,11 @@ ProcessHotAddedCpus (
// //
// Relocate the SMBASE of the new CPU. // Relocate the SMBASE of the new CPU.
// //
Status = SmbaseRelocate (NewApicId, mCpuHotPlugData->SmBase[NewSlot], Status = SmbaseRelocate (
mPostSmmPenAddress); NewApicId,
mCpuHotPlugData->SmBase[NewSlot],
mPostSmmPenAddress
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto RevokeNewSlot; goto RevokeNewSlot;
} }
@ -165,18 +181,31 @@ ProcessHotAddedCpus (
// //
// Add the new CPU with EFI_SMM_CPU_SERVICE_PROTOCOL. // Add the new CPU with EFI_SMM_CPU_SERVICE_PROTOCOL.
// //
Status = mMmCpuService->AddProcessor (mMmCpuService, NewApicId, Status = mMmCpuService->AddProcessor (
&NewProcessorNumberByProtocol); mMmCpuService,
NewApicId,
&NewProcessorNumberByProtocol
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: AddProcessor(" FMT_APIC_ID "): %r\n", DEBUG ((
__FUNCTION__, NewApicId, Status)); DEBUG_ERROR,
"%a: AddProcessor(" FMT_APIC_ID "): %r\n",
__FUNCTION__,
NewApicId,
Status
));
goto RevokeNewSlot; goto RevokeNewSlot;
} }
DEBUG ((DEBUG_INFO, "%a: hot-added APIC ID " FMT_APIC_ID ", SMBASE 0x%Lx, " DEBUG ((
"EFI_SMM_CPU_SERVICE_PROTOCOL assigned number %Lu\n", __FUNCTION__, DEBUG_INFO,
NewApicId, (UINT64)mCpuHotPlugData->SmBase[NewSlot], "%a: hot-added APIC ID " FMT_APIC_ID ", SMBASE 0x%Lx, "
(UINT64)NewProcessorNumberByProtocol)); "EFI_SMM_CPU_SERVICE_PROTOCOL assigned number %Lu\n",
__FUNCTION__,
NewApicId,
(UINT64)mCpuHotPlugData->SmBase[NewSlot],
(UINT64)NewProcessorNumberByProtocol
));
NewSlot++; NewSlot++;
PluggedIdx++; PluggedIdx++;
@ -258,7 +287,7 @@ EjectCpu (
// //
// Tell QEMU to context-switch it out. // Tell QEMU to context-switch it out.
// //
QemuCpuhpWriteCpuSelector (mMmCpuIo, (UINT32) QemuSelector); QemuCpuhpWriteCpuSelector (mMmCpuIo, (UINT32)QemuSelector);
QemuCpuhpWriteCpuStatus (mMmCpuIo, QEMU_CPUHP_STAT_EJECT); QemuCpuhpWriteCpuStatus (mMmCpuIo, QEMU_CPUHP_STAT_EJECT);
// //
@ -277,8 +306,14 @@ EjectCpu (
mCpuHotEjectData->QemuSelectorMap[Idx] = mCpuHotEjectData->QemuSelectorMap[Idx] =
CPU_EJECT_QEMU_SELECTOR_INVALID; CPU_EJECT_QEMU_SELECTOR_INVALID;
DEBUG ((DEBUG_INFO, "%a: Unplugged ProcessorNum %u, " DEBUG ((
"QemuSelector %Lu\n", __FUNCTION__, Idx, QemuSelector)); DEBUG_INFO,
"%a: Unplugged ProcessorNum %u, "
"QemuSelector %Lu\n",
__FUNCTION__,
Idx,
QemuSelector
));
} }
} }
@ -330,7 +365,7 @@ EjectCpu (
// //
// Keep them penned here until the BSP tells QEMU to eject them. // Keep them penned here until the BSP tells QEMU to eject them.
// //
for (;;) { for ( ; ;) {
DisableInterrupts (); DisableInterrupts ();
CpuSleep (); CpuSleep ();
} }
@ -404,7 +439,8 @@ UnplugCpus (
for (ProcessorNum = 0; for (ProcessorNum = 0;
ProcessorNum < mCpuHotPlugData->ArrayLength; ProcessorNum < mCpuHotPlugData->ArrayLength;
ProcessorNum++) { ProcessorNum++)
{
if (mCpuHotPlugData->ApicId[ProcessorNum] == RemoveApicId) { if (mCpuHotPlugData->ApicId[ProcessorNum] == RemoveApicId) {
break; break;
} }
@ -414,8 +450,13 @@ UnplugCpus (
// Ignore the unplug if APIC ID not found // Ignore the unplug if APIC ID not found
// //
if (ProcessorNum == mCpuHotPlugData->ArrayLength) { if (ProcessorNum == mCpuHotPlugData->ArrayLength) {
DEBUG ((DEBUG_VERBOSE, "%a: did not find APIC ID " FMT_APIC_ID DEBUG ((
" to unplug\n", __FUNCTION__, RemoveApicId)); DEBUG_VERBOSE,
"%a: did not find APIC ID " FMT_APIC_ID
" to unplug\n",
__FUNCTION__,
RemoveApicId
));
ToUnplugIdx++; ToUnplugIdx++;
continue; continue;
} }
@ -425,13 +466,19 @@ UnplugCpus (
// //
Status = mMmCpuService->RemoveProcessor (mMmCpuService, ProcessorNum); Status = mMmCpuService->RemoveProcessor (mMmCpuService, ProcessorNum);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: RemoveProcessor(" FMT_APIC_ID "): %r\n", DEBUG ((
__FUNCTION__, RemoveApicId, Status)); DEBUG_ERROR,
"%a: RemoveProcessor(" FMT_APIC_ID "): %r\n",
__FUNCTION__,
RemoveApicId,
Status
));
return Status; return Status;
} }
if (mCpuHotEjectData->QemuSelectorMap[ProcessorNum] != if (mCpuHotEjectData->QemuSelectorMap[ProcessorNum] !=
CPU_EJECT_QEMU_SELECTOR_INVALID) { CPU_EJECT_QEMU_SELECTOR_INVALID)
{
// //
// mCpuHotEjectData->QemuSelectorMap[ProcessorNum] is set to // mCpuHotEjectData->QemuSelectorMap[ProcessorNum] is set to
// CPU_EJECT_QEMU_SELECTOR_INVALID when mCpuHotEjectData->QemuSelectorMap // CPU_EJECT_QEMU_SELECTOR_INVALID when mCpuHotEjectData->QemuSelectorMap
@ -442,9 +489,15 @@ UnplugCpus (
// never match more than one APIC ID -- nor, by transitivity, designate // never match more than one APIC ID -- nor, by transitivity, designate
// more than one QemuSelector -- in a single invocation of UnplugCpus(). // more than one QemuSelector -- in a single invocation of UnplugCpus().
// //
DEBUG ((DEBUG_ERROR, "%a: ProcessorNum %Lu maps to QemuSelector %Lu, " DEBUG ((
"cannot also map to %u\n", __FUNCTION__, (UINT64)ProcessorNum, DEBUG_ERROR,
mCpuHotEjectData->QemuSelectorMap[ProcessorNum], QemuSelector)); "%a: ProcessorNum %Lu maps to QemuSelector %Lu, "
"cannot also map to %u\n",
__FUNCTION__,
(UINT64)ProcessorNum,
mCpuHotEjectData->QemuSelectorMap[ProcessorNum],
QemuSelector
));
return EFI_ALREADY_STARTED; return EFI_ALREADY_STARTED;
} }
@ -454,9 +507,15 @@ UnplugCpus (
// //
mCpuHotEjectData->QemuSelectorMap[ProcessorNum] = (UINT64)QemuSelector; mCpuHotEjectData->QemuSelectorMap[ProcessorNum] = (UINT64)QemuSelector;
DEBUG ((DEBUG_INFO, "%a: Started hot-unplug on ProcessorNum %Lu, APIC ID " DEBUG ((
FMT_APIC_ID ", QemuSelector %u\n", __FUNCTION__, (UINT64)ProcessorNum, DEBUG_INFO,
RemoveApicId, QemuSelector)); "%a: Started hot-unplug on ProcessorNum %Lu, APIC ID "
FMT_APIC_ID ", QemuSelector %u\n",
__FUNCTION__,
(UINT64)ProcessorNum,
RemoveApicId,
QemuSelector
));
EjectCount++; EjectCount++;
ToUnplugIdx++; ToUnplugIdx++;
@ -565,11 +624,20 @@ CpuHotplugMmi (
// Read the MMI command value from the APM Control Port, to see if this is an // Read the MMI command value from the APM Control Port, to see if this is an
// MMI we should care about. // MMI we should care about.
// //
Status = mMmCpuIo->Io.Read (mMmCpuIo, MM_IO_UINT8, ICH9_APM_CNT, 1, Status = mMmCpuIo->Io.Read (
&ApmControl); mMmCpuIo,
MM_IO_UINT8,
ICH9_APM_CNT,
1,
&ApmControl
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: failed to read ICH9_APM_CNT: %r\n", __FUNCTION__, DEBUG ((
Status)); DEBUG_ERROR,
"%a: failed to read ICH9_APM_CNT: %r\n",
__FUNCTION__,
Status
));
// //
// We couldn't even determine if the MMI was for us or not. // We couldn't even determine if the MMI was for us or not.
// //
@ -628,7 +696,6 @@ Fatal:
return EFI_INTERRUPT_PENDING; return EFI_INTERRUPT_PENDING;
} }
// //
// Entry point function of this driver. // Entry point function of this driver.
// //
@ -663,17 +730,28 @@ CpuHotplugEntry (
// First, collect the protocols needed later. All of these protocols are // First, collect the protocols needed later. All of these protocols are
// listed in our module DEPEX. // listed in our module DEPEX.
// //
Status = gMmst->MmLocateProtocol (&gEfiMmCpuIoProtocolGuid, Status = gMmst->MmLocateProtocol (
NULL /* Registration */, (VOID **)&mMmCpuIo); &gEfiMmCpuIoProtocolGuid,
NULL /* Registration */,
(VOID **)&mMmCpuIo
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: locate MmCpuIo: %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: locate MmCpuIo: %r\n", __FUNCTION__, Status));
goto Fatal; goto Fatal;
} }
Status = gMmst->MmLocateProtocol (&gEfiSmmCpuServiceProtocolGuid,
NULL /* Registration */, (VOID **)&mMmCpuService); Status = gMmst->MmLocateProtocol (
&gEfiSmmCpuServiceProtocolGuid,
NULL /* Registration */,
(VOID **)&mMmCpuService
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: locate MmCpuService: %r\n", __FUNCTION__, DEBUG ((
Status)); DEBUG_ERROR,
"%a: locate MmCpuService: %r\n",
__FUNCTION__,
Status
));
goto Fatal; goto Fatal;
} }
@ -692,6 +770,7 @@ CpuHotplugEntry (
DEBUG ((DEBUG_ERROR, "%a: CPU_HOT_PLUG_DATA: %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: CPU_HOT_PLUG_DATA: %r\n", __FUNCTION__, Status));
goto Fatal; goto Fatal;
} }
// //
// If the possible CPU count is 1, there's nothing for this driver to do. // If the possible CPU count is 1, there's nothing for this driver to do.
// //
@ -706,6 +785,7 @@ CpuHotplugEntry (
} else { } else {
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: CPU_HOT_EJECT_DATA: %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: CPU_HOT_EJECT_DATA: %r\n", __FUNCTION__, Status));
goto Fatal; goto Fatal;
@ -716,25 +796,38 @@ CpuHotplugEntry (
// //
if (RETURN_ERROR (SafeUintnSub (mCpuHotPlugData->ArrayLength, 1, &Len)) || if (RETURN_ERROR (SafeUintnSub (mCpuHotPlugData->ArrayLength, 1, &Len)) ||
RETURN_ERROR (SafeUintnMult (sizeof (APIC_ID), Len, &Size)) || RETURN_ERROR (SafeUintnMult (sizeof (APIC_ID), Len, &Size)) ||
RETURN_ERROR (SafeUintnMult (sizeof (UINT32), Len, &SizeSel))) { RETURN_ERROR (SafeUintnMult (sizeof (UINT32), Len, &SizeSel)))
{
Status = EFI_ABORTED; Status = EFI_ABORTED;
DEBUG ((DEBUG_ERROR, "%a: invalid CPU_HOT_PLUG_DATA\n", __FUNCTION__)); DEBUG ((DEBUG_ERROR, "%a: invalid CPU_HOT_PLUG_DATA\n", __FUNCTION__));
goto Fatal; goto Fatal;
} }
Status = gMmst->MmAllocatePool (EfiRuntimeServicesData, Size,
(VOID **)&mPluggedApicIds); Status = gMmst->MmAllocatePool (
EfiRuntimeServicesData,
Size,
(VOID **)&mPluggedApicIds
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: MmAllocatePool(): %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: MmAllocatePool(): %r\n", __FUNCTION__, Status));
goto Fatal; goto Fatal;
} }
Status = gMmst->MmAllocatePool (EfiRuntimeServicesData, Size,
(VOID **)&mToUnplugApicIds); Status = gMmst->MmAllocatePool (
EfiRuntimeServicesData,
Size,
(VOID **)&mToUnplugApicIds
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: MmAllocatePool(): %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: MmAllocatePool(): %r\n", __FUNCTION__, Status));
goto ReleasePluggedApicIds; goto ReleasePluggedApicIds;
} }
Status = gMmst->MmAllocatePool (EfiRuntimeServicesData, SizeSel,
(VOID **)&mToUnplugSelectors); Status = gMmst->MmAllocatePool (
EfiRuntimeServicesData,
SizeSel,
(VOID **)&mToUnplugSelectors
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: MmAllocatePool(): %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: MmAllocatePool(): %r\n", __FUNCTION__, Status));
goto ReleaseToUnplugApicIds; goto ReleaseToUnplugApicIds;
@ -743,8 +836,10 @@ CpuHotplugEntry (
// //
// Allocate the Post-SMM Pen for hot-added CPUs. // Allocate the Post-SMM Pen for hot-added CPUs.
// //
Status = SmbaseAllocatePostSmmPen (&mPostSmmPenAddress, Status = SmbaseAllocatePostSmmPen (
SystemTable->BootServices); &mPostSmmPenAddress,
SystemTable->BootServices
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto ReleaseToUnplugSelectors; goto ReleaseToUnplugSelectors;
} }
@ -776,8 +871,12 @@ CpuHotplugEntry (
QemuCpuhpWriteCommand (mMmCpuIo, QEMU_CPUHP_CMD_GET_PENDING); QemuCpuhpWriteCommand (mMmCpuIo, QEMU_CPUHP_CMD_GET_PENDING);
if (QemuCpuhpReadCommandData2 (mMmCpuIo) != 0) { if (QemuCpuhpReadCommandData2 (mMmCpuIo) != 0) {
Status = EFI_NOT_FOUND; Status = EFI_NOT_FOUND;
DEBUG ((DEBUG_ERROR, "%a: modern CPU hotplug interface: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_ERROR,
"%a: modern CPU hotplug interface: %r\n",
__FUNCTION__,
Status
));
goto ReleasePostSmmPen; goto ReleasePostSmmPen;
} }
@ -790,8 +889,12 @@ CpuHotplugEntry (
&mDispatchHandle &mDispatchHandle
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: MmiHandlerRegister(): %r\n", __FUNCTION__, DEBUG ((
Status)); DEBUG_ERROR,
"%a: MmiHandlerRegister(): %r\n",
__FUNCTION__,
Status
));
goto ReleasePostSmmPen; goto ReleasePostSmmPen;
} }

View File

@ -40,6 +40,7 @@ QemuCpuhpReadCommandData2 (
ASSERT (FALSE); ASSERT (FALSE);
CpuDeadLoop (); CpuDeadLoop ();
} }
return CommandData2; return CommandData2;
} }
@ -64,6 +65,7 @@ QemuCpuhpReadCpuStatus (
ASSERT (FALSE); ASSERT (FALSE);
CpuDeadLoop (); CpuDeadLoop ();
} }
return CpuStatus; return CpuStatus;
} }
@ -88,6 +90,7 @@ QemuCpuhpReadCommandData (
ASSERT (FALSE); ASSERT (FALSE);
CpuDeadLoop (); CpuDeadLoop ();
} }
return CommandData; return CommandData;
} }
@ -218,7 +221,7 @@ QemuCpuhpCollectApicIds (
{ {
UINT32 CurrentSelector; UINT32 CurrentSelector;
if (PossibleCpuCount == 0 || ApicIdCount == 0) { if ((PossibleCpuCount == 0) || (ApicIdCount == 0)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -259,10 +262,17 @@ QemuCpuhpCollectApicIds (
QemuCpuhpWriteCommand (MmCpuIo, QEMU_CPUHP_CMD_GET_PENDING); QemuCpuhpWriteCommand (MmCpuIo, QEMU_CPUHP_CMD_GET_PENDING);
PendingSelector = QemuCpuhpReadCommandData (MmCpuIo); PendingSelector = QemuCpuhpReadCommandData (MmCpuIo);
if (PendingSelector < CurrentSelector) { if (PendingSelector < CurrentSelector) {
DEBUG ((DEBUG_VERBOSE, "%a: CurrentSelector=%u PendingSelector=%u: " DEBUG ((
"wrap-around\n", __FUNCTION__, CurrentSelector, PendingSelector)); DEBUG_VERBOSE,
"%a: CurrentSelector=%u PendingSelector=%u: "
"wrap-around\n",
__FUNCTION__,
CurrentSelector,
PendingSelector
));
break; break;
} }
CurrentSelector = PendingSelector; CurrentSelector = PendingSelector;
// //
@ -274,16 +284,26 @@ QemuCpuhpCollectApicIds (
// The "insert" event guarantees the "enabled" status; plus it excludes // The "insert" event guarantees the "enabled" status; plus it excludes
// the "fw_remove" event. // the "fw_remove" event.
// //
if ((CpuStatus & QEMU_CPUHP_STAT_ENABLED) == 0 || if (((CpuStatus & QEMU_CPUHP_STAT_ENABLED) == 0) ||
(CpuStatus & QEMU_CPUHP_STAT_FW_REMOVE) != 0) { ((CpuStatus & QEMU_CPUHP_STAT_FW_REMOVE) != 0))
DEBUG ((DEBUG_ERROR, "%a: CurrentSelector=%u CpuStatus=0x%x: " {
"inconsistent CPU status\n", __FUNCTION__, CurrentSelector, DEBUG ((
CpuStatus)); DEBUG_ERROR,
"%a: CurrentSelector=%u CpuStatus=0x%x: "
"inconsistent CPU status\n",
__FUNCTION__,
CurrentSelector,
CpuStatus
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
DEBUG ((DEBUG_VERBOSE, "%a: CurrentSelector=%u: insert\n", __FUNCTION__, DEBUG ((
CurrentSelector)); DEBUG_VERBOSE,
"%a: CurrentSelector=%u: insert\n",
__FUNCTION__,
CurrentSelector
));
ExtendIds = PluggedApicIds; ExtendIds = PluggedApicIds;
ExtendSels = NULL; ExtendSels = NULL;
@ -293,14 +313,23 @@ QemuCpuhpCollectApicIds (
// "fw_remove" event guarantees "enabled". // "fw_remove" event guarantees "enabled".
// //
if ((CpuStatus & QEMU_CPUHP_STAT_ENABLED) == 0) { if ((CpuStatus & QEMU_CPUHP_STAT_ENABLED) == 0) {
DEBUG ((DEBUG_ERROR, "%a: CurrentSelector=%u CpuStatus=0x%x: " DEBUG ((
"inconsistent CPU status\n", __FUNCTION__, CurrentSelector, DEBUG_ERROR,
CpuStatus)); "%a: CurrentSelector=%u CpuStatus=0x%x: "
"inconsistent CPU status\n",
__FUNCTION__,
CurrentSelector,
CpuStatus
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
DEBUG ((DEBUG_VERBOSE, "%a: CurrentSelector=%u: fw_remove\n", DEBUG ((
__FUNCTION__, CurrentSelector)); DEBUG_VERBOSE,
"%a: CurrentSelector=%u: fw_remove\n",
__FUNCTION__,
CurrentSelector
));
ExtendIds = ToUnplugApicIds; ExtendIds = ToUnplugApicIds;
ExtendSels = ToUnplugSelectors; ExtendSels = ToUnplugSelectors;
@ -309,15 +338,23 @@ QemuCpuhpCollectApicIds (
// //
// Let the OSPM deal with the "remove" event. // Let the OSPM deal with the "remove" event.
// //
DEBUG ((DEBUG_VERBOSE, "%a: CurrentSelector=%u: remove (ignored)\n", DEBUG ((
__FUNCTION__, CurrentSelector)); DEBUG_VERBOSE,
"%a: CurrentSelector=%u: remove (ignored)\n",
__FUNCTION__,
CurrentSelector
));
ExtendIds = NULL; ExtendIds = NULL;
ExtendSels = NULL; ExtendSels = NULL;
ExtendCount = NULL; ExtendCount = NULL;
} else { } else {
DEBUG ((DEBUG_VERBOSE, "%a: CurrentSelector=%u: no event\n", DEBUG ((
__FUNCTION__, CurrentSelector)); DEBUG_VERBOSE,
"%a: CurrentSelector=%u: no event\n",
__FUNCTION__,
CurrentSelector
));
break; break;
} }
@ -334,15 +371,22 @@ QemuCpuhpCollectApicIds (
DEBUG ((DEBUG_ERROR, "%a: APIC ID array too small\n", __FUNCTION__)); DEBUG ((DEBUG_ERROR, "%a: APIC ID array too small\n", __FUNCTION__));
return EFI_BUFFER_TOO_SMALL; return EFI_BUFFER_TOO_SMALL;
} }
QemuCpuhpWriteCommand (MmCpuIo, QEMU_CPUHP_CMD_GET_ARCH_ID); QemuCpuhpWriteCommand (MmCpuIo, QEMU_CPUHP_CMD_GET_ARCH_ID);
NewApicId = QemuCpuhpReadCommandData (MmCpuIo); NewApicId = QemuCpuhpReadCommandData (MmCpuIo);
DEBUG ((DEBUG_VERBOSE, "%a: ApicId=" FMT_APIC_ID "\n", __FUNCTION__, DEBUG ((
NewApicId)); DEBUG_VERBOSE,
"%a: ApicId=" FMT_APIC_ID "\n",
__FUNCTION__,
NewApicId
));
if (ExtendSels != NULL) { if (ExtendSels != NULL) {
ExtendSels[(*ExtendCount)] = CurrentSelector; ExtendSels[(*ExtendCount)] = CurrentSelector;
} }
ExtendIds[(*ExtendCount)++] = NewApicId; ExtendIds[(*ExtendCount)++] = NewApicId;
} }
// //
// We've processed the CPU with (known) pending events, but we must never // We've processed the CPU with (known) pending events, but we must never
// clear events. Therefore we need to advance past this CPU manually; // clear events. Therefore we need to advance past this CPU manually;
@ -352,7 +396,12 @@ QemuCpuhpCollectApicIds (
CurrentSelector++; CurrentSelector++;
} while (CurrentSelector < PossibleCpuCount); } while (CurrentSelector < PossibleCpuCount);
DEBUG ((DEBUG_VERBOSE, "%a: PluggedCount=%u ToUnplugCount=%u\n", DEBUG ((
__FUNCTION__, *PluggedCount, *ToUnplugCount)); DEBUG_VERBOSE,
"%a: PluggedCount=%u ToUnplugCount=%u\n",
__FUNCTION__,
*PluggedCount,
*ToUnplugCount
));
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -59,14 +59,23 @@ SmbaseAllocatePostSmmPen (
// //
if (mPostSmmPenSize >= EFI_PAGE_SIZE) { if (mPostSmmPenSize >= EFI_PAGE_SIZE) {
Status = EFI_BAD_BUFFER_SIZE; Status = EFI_BAD_BUFFER_SIZE;
DEBUG ((DEBUG_ERROR, "%a: mPostSmmPenSize=%u: %r\n", __FUNCTION__, DEBUG ((
mPostSmmPenSize, Status)); DEBUG_ERROR,
"%a: mPostSmmPenSize=%u: %r\n",
__FUNCTION__,
mPostSmmPenSize,
Status
));
return Status; return Status;
} }
Address = BASE_1MB - 1; Address = BASE_1MB - 1;
Status = BootServices->AllocatePages (AllocateMaxAddress, Status = BootServices->AllocatePages (
EfiReservedMemoryType, 1, &Address); AllocateMaxAddress,
EfiReservedMemoryType,
1,
&Address
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: AllocatePages(): %r\n", __FUNCTION__, Status)); DEBUG ((DEBUG_ERROR, "%a: AllocatePages(): %r\n", __FUNCTION__, Status));
return Status; return Status;
@ -135,8 +144,11 @@ SmbaseInstallFirstSmiHandler (
{ {
FIRST_SMI_HANDLER_CONTEXT *Context; FIRST_SMI_HANDLER_CONTEXT *Context;
CopyMem ((VOID *)(UINTN)(SMM_DEFAULT_SMBASE + SMM_HANDLER_OFFSET), CopyMem (
mFirstSmiHandler, mFirstSmiHandlerSize); (VOID *)(UINTN)(SMM_DEFAULT_SMBASE + SMM_HANDLER_OFFSET),
mFirstSmiHandler,
mFirstSmiHandlerSize
);
Context = (VOID *)(UINTN)SMM_DEFAULT_SMBASE; Context = (VOID *)(UINTN)SMM_DEFAULT_SMBASE;
Context->ApicIdGate = MAX_UINT64; Context->ApicIdGate = MAX_UINT64;
@ -196,8 +208,14 @@ SmbaseRelocate (
if (Smbase > MAX_UINT32) { if (Smbase > MAX_UINT32) {
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
DEBUG ((DEBUG_ERROR, "%a: ApicId=" FMT_APIC_ID " Smbase=0x%Lx: %r\n", DEBUG ((
__FUNCTION__, ApicId, (UINT64)Smbase, Status)); DEBUG_ERROR,
"%a: ApicId=" FMT_APIC_ID " Smbase=0x%Lx: %r\n",
__FUNCTION__,
ApicId,
(UINT64)Smbase,
Status
));
return Status; return Status;
} }
@ -261,12 +279,21 @@ SmbaseRelocate (
// //
// Un-gate SMBASE relocation for the hot-added CPU whose APIC ID is ApicId. // Un-gate SMBASE relocation for the hot-added CPU whose APIC ID is ApicId.
// //
ExchangeResult = InterlockedCompareExchange64 (&Context->ApicIdGate, ExchangeResult = InterlockedCompareExchange64 (
MAX_UINT64, ApicId); &Context->ApicIdGate,
MAX_UINT64,
ApicId
);
if (ExchangeResult != MAX_UINT64) { if (ExchangeResult != MAX_UINT64) {
Status = EFI_PROTOCOL_ERROR; Status = EFI_PROTOCOL_ERROR;
DEBUG ((DEBUG_ERROR, "%a: ApicId=" FMT_APIC_ID " ApicIdGate=0x%Lx: %r\n", DEBUG ((
__FUNCTION__, ApicId, ExchangeResult, Status)); DEBUG_ERROR,
"%a: ApicId=" FMT_APIC_ID " ApicIdGate=0x%Lx: %r\n",
__FUNCTION__,
ApicId,
ExchangeResult,
Status
));
return Status; return Status;
} }

View File

@ -95,6 +95,7 @@ AllocateZeroPages (
return Buffer; return Buffer;
} }
/** /**
Callback function executed when the EndOfDxe event group is signaled. Callback function executed when the EndOfDxe event group is signaled.
@ -113,7 +114,7 @@ CpuS3DataOnEndOfDxe (
EFI_STATUS Status; EFI_STATUS Status;
ACPI_CPU_DATA_EX *AcpiCpuDataEx; ACPI_CPU_DATA_EX *AcpiCpuDataEx;
AcpiCpuDataEx = (ACPI_CPU_DATA_EX *) Context; AcpiCpuDataEx = (ACPI_CPU_DATA_EX *)Context;
// //
// Allocate a 4KB reserved page below 1MB // Allocate a 4KB reserved page below 1MB
// //
@ -178,7 +179,7 @@ CpuS3DataInitialize (
// //
// Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure // Set PcdCpuS3DataAddress to the base address of the ACPI_CPU_DATA structure
// //
OldAcpiCpuData = (ACPI_CPU_DATA *) (UINTN) PcdGet64 (PcdCpuS3DataAddress); OldAcpiCpuData = (ACPI_CPU_DATA *)(UINTN)PcdGet64 (PcdCpuS3DataAddress);
AcpiCpuDataEx = AllocateZeroPages (sizeof (ACPI_CPU_DATA_EX)); AcpiCpuDataEx = AllocateZeroPages (sizeof (ACPI_CPU_DATA_EX));
ASSERT (AcpiCpuDataEx != NULL); ASSERT (AcpiCpuDataEx != NULL);
@ -209,6 +210,7 @@ CpuS3DataInitialize (
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }
AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus; AcpiCpuData->NumberOfCpus = (UINT32)NumberOfCpus;
// //

File diff suppressed because it is too large Load Diff

View File

@ -164,7 +164,6 @@ BiosVideoDriverBindingSupported (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
Install Graphics Output Protocol onto VGA device handles. Install Graphics Output Protocol onto VGA device handles.
@ -184,7 +183,6 @@ BiosVideoDriverBindingStart (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
Stop. Stop.
@ -223,7 +221,6 @@ BiosVideoCheckForVbe (
IN OUT BIOS_VIDEO_DEV *BiosVideoPrivate IN OUT BIOS_VIDEO_DEV *BiosVideoPrivate
); );
/** /**
Check for VGA device. Check for VGA device.
@ -237,9 +234,6 @@ BiosVideoCheckForVga (
IN OUT BIOS_VIDEO_DEV *BiosVideoPrivate IN OUT BIOS_VIDEO_DEV *BiosVideoPrivate
); );
/** /**
Release resource for BIOS video instance. Release resource for BIOS video instance.
@ -282,7 +276,6 @@ BiosVideoGraphicsOutputQueryMode (
OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
); );
/** /**
Graphics Output protocol interface to set video mode. Graphics Output protocol interface to set video mode.
@ -298,11 +291,10 @@ BiosVideoGraphicsOutputQueryMode (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
BiosVideoGraphicsOutputSetMode ( BiosVideoGraphicsOutputSetMode (
IN EFI_GRAPHICS_OUTPUT_PROTOCOL * This, IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
IN UINT32 ModeNumber IN UINT32 ModeNumber
); );
/** /**
Graphics Output protocol instance to block transfer for VBE device. Graphics Output protocol instance to block transfer for VBE device.
@ -345,7 +337,6 @@ BiosVideoGraphicsOutputVbeBlt (
IN UINTN Delta IN UINTN Delta
); );
/** /**
Graphics Output protocol instance to block transfer for VGA device. Graphics Output protocol instance to block transfer for VGA device.
@ -529,4 +520,5 @@ BOOLEAN
HasChildHandle ( HasChildHandle (
IN EFI_HANDLE Controller IN EFI_HANDLE Controller
); );
#endif #endif

View File

@ -11,6 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// //
// EFI Component Name Functions // EFI Component Name Functions
// //
/** /**
Retrieves a Unicode string that is the user readable name of the driver. Retrieves a Unicode string that is the user readable name of the driver.
@ -58,7 +59,6 @@ BiosVideoComponentNameGetDriverName (
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -137,7 +137,6 @@ BiosVideoComponentNameGetControllerName (
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
// //
// EFI Component Name Protocol // EFI Component Name Protocol
// //
@ -151,12 +150,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gBiosVideoComponentNa
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gBiosVideoComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gBiosVideoComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) BiosVideoComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)BiosVideoComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) BiosVideoComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)BiosVideoComponentNameGetControllerName,
"en" "en"
}; };
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mBiosVideoDriverNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mBiosVideoDriverNameTable[] = {
{ {
"eng;en", "eng;en",

View File

@ -188,33 +188,33 @@ typedef struct {
} VESA_BIOS_EXTENSIONS_VALID_EDID_TIMING; } VESA_BIOS_EXTENSIONS_VALID_EDID_TIMING;
typedef struct { typedef struct {
UINT8 Header[8]; //EDID header "00 FF FF FF FF FF FF 00" UINT8 Header[8]; // EDID header "00 FF FF FF FF FF FF 00"
UINT16 ManufactureName; //EISA 3-character ID UINT16 ManufactureName; // EISA 3-character ID
UINT16 ProductCode; //Vendor assigned code UINT16 ProductCode; // Vendor assigned code
UINT32 SerialNumber; //32-bit serial number UINT32 SerialNumber; // 32-bit serial number
UINT8 WeekOfManufacture; //Week number UINT8 WeekOfManufacture; // Week number
UINT8 YearOfManufacture; //Year UINT8 YearOfManufacture; // Year
UINT8 EdidVersion; //EDID Structure Version UINT8 EdidVersion; // EDID Structure Version
UINT8 EdidRevision; //EDID Structure Revision UINT8 EdidRevision; // EDID Structure Revision
UINT8 VideoInputDefinition; UINT8 VideoInputDefinition;
UINT8 MaxHorizontalImageSize; //cm UINT8 MaxHorizontalImageSize; // cm
UINT8 MaxVerticalImageSize; //cm UINT8 MaxVerticalImageSize; // cm
UINT8 DisplayTransferCharacteristic; UINT8 DisplayTransferCharacteristic;
UINT8 FeatureSupport; UINT8 FeatureSupport;
UINT8 RedGreenLowBits; //Rx1 Rx0 Ry1 Ry0 Gx1 Gx0 Gy1Gy0 UINT8 RedGreenLowBits; // Rx1 Rx0 Ry1 Ry0 Gx1 Gx0 Gy1Gy0
UINT8 BlueWhiteLowBits; //Bx1 Bx0 By1 By0 Wx1 Wx0 Wy1 Wy0 UINT8 BlueWhiteLowBits; // Bx1 Bx0 By1 By0 Wx1 Wx0 Wy1 Wy0
UINT8 RedX; //Red-x Bits 9 - 2 UINT8 RedX; // Red-x Bits 9 - 2
UINT8 RedY; //Red-y Bits 9 - 2 UINT8 RedY; // Red-y Bits 9 - 2
UINT8 GreenX; //Green-x Bits 9 - 2 UINT8 GreenX; // Green-x Bits 9 - 2
UINT8 GreenY; //Green-y Bits 9 - 2 UINT8 GreenY; // Green-y Bits 9 - 2
UINT8 BlueX; //Blue-x Bits 9 - 2 UINT8 BlueX; // Blue-x Bits 9 - 2
UINT8 BlueY; //Blue-y Bits 9 - 2 UINT8 BlueY; // Blue-y Bits 9 - 2
UINT8 WhiteX; //White-x Bits 9 - 2 UINT8 WhiteX; // White-x Bits 9 - 2
UINT8 WhiteY; //White-x Bits 9 - 2 UINT8 WhiteY; // White-x Bits 9 - 2
UINT8 EstablishedTimings[VESA_BIOS_EXTENSIONS_ESTABLISHED_TIMING_SIZE]; UINT8 EstablishedTimings[VESA_BIOS_EXTENSIONS_ESTABLISHED_TIMING_SIZE];
UINT8 StandardTimingIdentification[VESA_BIOS_EXTENSIONS_STANDARD_TIMING_SIZE]; UINT8 StandardTimingIdentification[VESA_BIOS_EXTENSIONS_STANDARD_TIMING_SIZE];
UINT8 DetailedTimingDescriptions[VESA_BIOS_EXTENSIONS_DETAILED_TIMING_DESCRIPTOR_MAX_SIZE]; UINT8 DetailedTimingDescriptions[VESA_BIOS_EXTENSIONS_DETAILED_TIMING_DESCRIPTOR_MAX_SIZE];
UINT8 ExtensionFlag; //Number of (optional) 128-byte EDID extension blocks to follow UINT8 ExtensionFlag; // Number of (optional) 128-byte EDID extension blocks to follow
UINT8 Checksum; UINT8 Checksum;
} VESA_BIOS_EXTENSIONS_EDID_DATA_BLOCK; } VESA_BIOS_EXTENSIONS_EDID_DATA_BLOCK;
@ -420,8 +420,8 @@ typedef struct {
typedef enum { typedef enum {
MemPL = 3, // Planar memory model MemPL = 3, // Planar memory model
MemPK = 4, // Packed pixel memory model MemPK = 4, // Packed pixel memory model
MemRGB= 6, // Direct color RGB memory model MemRGB = 6, // Direct color RGB memory model
MemYUV= 7 // Direct color YUV memory model MemYUV = 7 // Direct color YUV memory model
} VESA_BIOS_EXTENSIONS_MEMORY_MODELS; } VESA_BIOS_EXTENSIONS_MEMORY_MODELS;
// //

View File

@ -29,4 +29,3 @@ CsmSupportLibConstructor (
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -46,4 +46,3 @@ LegacyBiosPlatformInstall (
); );
#endif #endif

View File

@ -31,7 +31,6 @@ STATIC EFI_LEGACY_INTERRUPT_PROTOCOL mLegacyInterrupt = {
STATIC UINT8 PirqReg[MAX_PIRQ_NUMBER] = { PIRQA, PIRQB, PIRQC, PIRQD, PIRQE, PIRQF, PIRQG, PIRQH }; STATIC UINT8 PirqReg[MAX_PIRQ_NUMBER] = { PIRQA, PIRQB, PIRQC, PIRQD, PIRQE, PIRQF, PIRQG, PIRQH };
/** /**
Return the number of PIRQs supported by this chipset. Return the number of PIRQs supported by this chipset.
@ -53,7 +52,6 @@ GetNumberPirqs (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Return PCI location of this device. Return PCI location of this device.
$PIR table requires this info. $PIR table requires this info.
@ -82,7 +80,6 @@ GetLocation (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Builds the PCI configuration address for the register specified by PirqNumber Builds the PCI configuration address for the register specified by PirqNumber
@ -95,7 +92,7 @@ GetAddress (
UINT8 PirqNumber UINT8 PirqNumber
) )
{ {
return PCI_LIB_ADDRESS( return PCI_LIB_ADDRESS (
LEGACY_INT_BUS, LEGACY_INT_BUS,
mLegacyInterruptDevice, mLegacyInterruptDevice,
LEGACY_INT_FUNC, LEGACY_INT_FUNC,
@ -127,12 +124,11 @@ ReadPirq (
} }
*PirqData = PciRead8 (GetAddress (PirqNumber)); *PirqData = PciRead8 (GetAddress (PirqNumber));
*PirqData = (UINT8) (*PirqData & 0x7f); *PirqData = (UINT8)(*PirqData & 0x7f);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Write the given PIRQ register Write the given PIRQ register
@ -160,7 +156,6 @@ WritePirq (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Initialize Legacy Interrupt support Initialize Legacy Interrupt support
@ -178,7 +173,7 @@ LegacyInterruptInstall (
// //
// Make sure the Legacy Interrupt Protocol is not already installed in the system // Make sure the Legacy Interrupt Protocol is not already installed in the system
// //
ASSERT_PROTOCOL_ALREADY_INSTALLED(NULL, &gEfiLegacyInterruptProtocolGuid); ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiLegacyInterruptProtocolGuid);
// //
// Query Host Bridge DID to determine platform type, then set device number // Query Host Bridge DID to determine platform type, then set device number
@ -192,8 +187,12 @@ LegacyInterruptInstall (
mLegacyInterruptDevice = LEGACY_INT_DEV_Q35; mLegacyInterruptDevice = LEGACY_INT_DEV_Q35;
break; break;
default: default:
DEBUG ((DEBUG_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", DEBUG ((
__FUNCTION__, HostBridgeDevId)); DEBUG_ERROR,
"%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__,
HostBridgeDevId
));
ASSERT (FALSE); ASSERT (FALSE);
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -207,8 +206,7 @@ LegacyInterruptInstall (
&mLegacyInterrupt, &mLegacyInterrupt,
NULL NULL
); );
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }

View File

@ -20,7 +20,6 @@
#include <Library/UefiBootServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h>
#include <OvmfPlatforms.h> #include <OvmfPlatforms.h>
#define LEGACY_INT_BUS 0 #define LEGACY_INT_BUS 0
#define LEGACY_INT_DEV_PIIX4 0x01 #define LEGACY_INT_DEV_PIIX4 0x01
#define LEGACY_INT_DEV_Q35 0x1f #define LEGACY_INT_DEV_Q35 0x1f
@ -114,4 +113,3 @@ WritePirq (
); );
#endif #endif

View File

@ -39,13 +39,13 @@ EFI_HANDLE mDiskHandles[0x20];
EFI_HANDLE mIsaHandles[0x20]; EFI_HANDLE mIsaHandles[0x20];
EFI_LEGACY_IRQ_PRIORITY_TABLE_ENTRY IrqPriorityTable[MAX_IRQ_PRIORITY_ENTRIES] = { EFI_LEGACY_IRQ_PRIORITY_TABLE_ENTRY IrqPriorityTable[MAX_IRQ_PRIORITY_ENTRIES] = {
{0x0B,0}, { 0x0B, 0 },
{0x09,0}, { 0x09, 0 },
{0x0A,0}, { 0x0A, 0 },
{0x05,0}, { 0x05, 0 },
{0x07,0}, { 0x07, 0 },
{0x00,0}, { 0x00, 0 },
{0x00,0} { 0x00, 0 }
}; };
// //
@ -76,12 +76,24 @@ EFI_LEGACY_PIRQ_TABLE PirqTableHead = {
// -- Pin 1 -- -- Pin 2 -- -- Pin 3 -- -- Pin 4 -- // -- Pin 1 -- -- Pin 2 -- -- Pin 3 -- -- Pin 4 --
// Bus Dev Reg Map Reg Map Reg Map Reg Map // Bus Dev Reg Map Reg Map Reg Map Reg Map
// //
{0x00,0x08,{{0x60,0xDEB8},{0x61,0xDEB8},{0x62,0xDEB8},{0x63,0xDEB8}},0x00,0x00}, { 0x00, 0x08, {
{0x00,0x10,{{0x61,0xDEB8},{0x62,0xDEB8},{0x63,0xDEB8},{0x60,0xDEB8}},0x01,0x00}, { 0x60, 0xDEB8 }, { 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }
{0x00,0x18,{{0x62,0xDEB8},{0x63,0xDEB8},{0x60,0xDEB8},{0x61,0xDEB8}},0x02,0x00}, }, 0x00, 0x00 },
{0x00,0x20,{{0x63,0xDEB8},{0x60,0xDEB8},{0x61,0xDEB8},{0x62,0xDEB8}},0x03,0x00}, { 0x00, 0x10, {
{0x00,0x28,{{0x60,0xDEB8},{0x61,0xDEB8},{0x62,0xDEB8},{0x63,0xDEB8}},0x04,0x00}, { 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }, { 0x60, 0xDEB8 }
{0x00,0x30,{{0x61,0xDEB8},{0x62,0xDEB8},{0x63,0xDEB8},{0x60,0xDEB8}},0x05,0x00}, }, 0x01, 0x00 },
{ 0x00, 0x18, {
{ 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }, { 0x60, 0xDEB8 }, { 0x61, 0xDEB8 }
}, 0x02, 0x00 },
{ 0x00, 0x20, {
{ 0x63, 0xDEB8 }, { 0x60, 0xDEB8 }, { 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }
}, 0x03, 0x00 },
{ 0x00, 0x28, {
{ 0x60, 0xDEB8 }, { 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }
}, 0x04, 0x00 },
{ 0x00, 0x30, {
{ 0x61, 0xDEB8 }, { 0x62, 0xDEB8 }, { 0x63, 0xDEB8 }, { 0x60, 0xDEB8 }
}, 0x05, 0x00 },
} }
}; };
@ -126,7 +138,7 @@ FindAllDeviceTypes (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiLegacyBiosProtocolGuid, &gEfiLegacyBiosProtocolGuid,
NULL, NULL,
(VOID**)&LegacyBios (VOID **)&LegacyBios
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -144,7 +156,7 @@ FindAllDeviceTypes (
gBS->HandleProtocol ( gBS->HandleProtocol (
HandleBuffer[Index], HandleBuffer[Index],
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID**)&PciIo (VOID **)&PciIo
); );
PciIo->Pci.Read ( PciIo->Pci.Read (
PciIo, PciIo,
@ -155,7 +167,8 @@ FindAllDeviceTypes (
); );
for (Index2 = 0; PciClasses[Index2].Class != 0xff; Index2++) { for (Index2 = 0; PciClasses[Index2].Class != 0xff; Index2++) {
if ((PciConfigHeader.Hdr.ClassCode[2] == PciClasses[Index2].Class) && if ((PciConfigHeader.Hdr.ClassCode[2] == PciClasses[Index2].Class) &&
(PciConfigHeader.Hdr.ClassCode[1] == PciClasses[Index2].SubClass)) { (PciConfigHeader.Hdr.ClassCode[1] == PciClasses[Index2].SubClass))
{
LegacyBios->CheckPciRom ( LegacyBios->CheckPciRom (
LegacyBios, LegacyBios,
HandleBuffer[Index], HandleBuffer[Index],
@ -173,13 +186,14 @@ FindAllDeviceTypes (
if ( if (
((DeviceFlags != 0) && (Flags == NO_ROM)) || ((DeviceFlags != 0) && (Flags == NO_ROM)) ||
((Flags & (ROM_FOUND | VALID_LEGACY_ROM)) == (ROM_FOUND | VALID_LEGACY_ROM)) ((Flags & (ROM_FOUND | VALID_LEGACY_ROM)) == (ROM_FOUND | VALID_LEGACY_ROM))
) { )
{
DeviceTable->Handle = HandleBuffer[Index]; DeviceTable->Handle = HandleBuffer[Index];
DeviceTable->Vid = PciConfigHeader.Hdr.VendorId; DeviceTable->Vid = PciConfigHeader.Hdr.VendorId;
DeviceTable->Did = PciConfigHeader.Hdr.DeviceId; DeviceTable->Did = PciConfigHeader.Hdr.DeviceId;
DeviceTable->SvId = PciConfigHeader.Device.SubsystemVendorID; DeviceTable->SvId = PciConfigHeader.Device.SubsystemVendorID;
DeviceTable->SysId = PciConfigHeader.Device.SubsystemID; DeviceTable->SysId = PciConfigHeader.Device.SubsystemID;
++ *DeviceIndex; ++*DeviceIndex;
DeviceTable++; DeviceTable++;
} }
} }
@ -255,7 +269,7 @@ GetSelectedVgaDeviceInfo (
// //
HandleCount = 0; HandleCount = 0;
HandleBuffer = NULL; HandleBuffer = NULL;
SelectedAddress = PCI_LIB_ADDRESS(0xff, 0x1f, 0x7, 0); SelectedAddress = PCI_LIB_ADDRESS (0xff, 0x1f, 0x7, 0);
// //
// The bus range to search for a VGA device in. // The bus range to search for a VGA device in.
@ -279,13 +293,13 @@ GetSelectedVgaDeviceInfo (
} }
for (Index = 0; Index < HandleCount; Index++) { for (Index = 0; Index < HandleCount; Index++) {
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiPciIoProtocolGuid, (VOID**)&PciIo); Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiPciIoProtocolGuid, (VOID **)&PciIo);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
// //
// Determine if this is in the correct bus range. // Determine if this is in the correct bus range.
// //
Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function); Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);
if (EFI_ERROR(Status) || (Bus < MinBus || Bus > MaxBus)) { if (EFI_ERROR (Status) || ((Bus < MinBus) || (Bus > MaxBus))) {
continue; continue;
} }
@ -309,7 +323,9 @@ GetSelectedVgaDeviceInfo (
if (!IS_PCI_VGA (&Pci)) { if (!IS_PCI_VGA (&Pci)) {
continue; continue;
} }
DEBUG ((DEBUG_INFO,
DEBUG ((
DEBUG_INFO,
"PCI VGA: 0x%04x:0x%04x\n", "PCI VGA: 0x%04x:0x%04x\n",
Pci.Hdr.VendorId, Pci.Hdr.VendorId,
Pci.Hdr.DeviceId Pci.Hdr.DeviceId
@ -319,7 +335,7 @@ GetSelectedVgaDeviceInfo (
// Currently we use the lowest numbered bus/device/function if multiple // Currently we use the lowest numbered bus/device/function if multiple
// devices are found in the target bus range. // devices are found in the target bus range.
// //
CurrentAddress = PCI_LIB_ADDRESS(Bus, Device, Function, 0); CurrentAddress = PCI_LIB_ADDRESS (Bus, Device, Function, 0);
if (CurrentAddress < SelectedAddress) { if (CurrentAddress < SelectedAddress) {
SelectedAddress = CurrentAddress; SelectedAddress = CurrentAddress;
*VgaHandle = HandleBuffer[Index]; *VgaHandle = HandleBuffer[Index];
@ -330,7 +346,6 @@ GetSelectedVgaDeviceInfo (
FreePool (HandleBuffer); FreePool (HandleBuffer);
} }
/** /**
Returns a buffer of handles for the requested subfunction. Returns a buffer of handles for the requested subfunction.
@ -384,7 +399,7 @@ GetPlatformHandle (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiLegacyBiosProtocolGuid, &gEfiLegacyBiosProtocolGuid,
NULL, NULL,
(VOID**)&LegacyBios (VOID **)&LegacyBios
); );
// //
@ -402,7 +417,7 @@ GetPlatformHandle (
case EfiGetPlatformIdeHandle: case EfiGetPlatformIdeHandle:
IdeHandle = NULL; IdeHandle = NULL;
if (AdditionalData != NULL) { if (AdditionalData != NULL) {
HddInfo = (HDD_INFO *) *AdditionalData; HddInfo = (HDD_INFO *)*AdditionalData;
} }
// //
@ -417,7 +432,7 @@ GetPlatformHandle (
ClassLists[3].Class = PCI_CLASS_MASS_STORAGE; ClassLists[3].Class = PCI_CLASS_MASS_STORAGE;
ClassLists[3].SubClass = PCI_CLASS_MASS_STORAGE_SATADPA; ClassLists[3].SubClass = PCI_CLASS_MASS_STORAGE_SATADPA;
ClassLists[4].Class = 0xff; ClassLists[4].Class = 0xff;
FindAllDeviceTypes (ClassLists, LocalDevice, (UINT16 *) &LocalIndex, TRUE); FindAllDeviceTypes (ClassLists, LocalDevice, (UINT16 *)&LocalIndex, TRUE);
if (LocalIndex == 0) { if (LocalIndex == 0) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -449,7 +464,7 @@ GetPlatformHandle (
// //
PriorityIndex = 0; PriorityIndex = 0;
for (Index = 0; Index < LocalIndex; Index++) { for (Index = 0; Index < LocalIndex; Index++) {
if (LocalDevice[Index].Handle == IdeHandle && PriorityIndex == 0) { if ((LocalDevice[Index].Handle == IdeHandle) && (PriorityIndex == 0)) {
TempDevice = LocalDevice[PriorityIndex]; TempDevice = LocalDevice[PriorityIndex];
LocalDevice[PriorityIndex] = LocalDevice[Index]; LocalDevice[PriorityIndex] = LocalDevice[Index];
LocalDevice[Index] = TempDevice; LocalDevice[Index] = TempDevice;
@ -464,6 +479,7 @@ GetPlatformHandle (
for (Index = 0; Index < LocalIndex; Index++) { for (Index = 0; Index < LocalIndex; Index++) {
mDiskHandles[Index] = LocalDevice[Index].Handle; mDiskHandles[Index] = LocalDevice[Index].Handle;
} }
*HandleBuffer = &mDiskHandles[0]; *HandleBuffer = &mDiskHandles[0];
*HandleCount = LocalIndex; *HandleCount = LocalIndex;
@ -477,11 +493,12 @@ GetPlatformHandle (
// //
for (Index = 0; (Index < LocalIndex) && (AdditionalData != NULL); Index++) { for (Index = 0; (Index < LocalIndex) && (AdditionalData != NULL); Index++) {
if ((LocalDevice[Index].Handle != NULL) && if ((LocalDevice[Index].Handle != NULL) &&
(LocalDevice[Index].Handle == IdeHandle)) { (LocalDevice[Index].Handle == IdeHandle))
{
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
LocalDevice[Index].Handle, LocalDevice[Index].Handle,
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID **) &PciIo (VOID **)&PciIo
); );
PciIo->Pci.Read ( PciIo->Pci.Read (
PciIo, PciIo,
@ -529,6 +546,7 @@ GetPlatformHandle (
HddInfo[HddIndex].ControlBaseAddress = 0x3f6; HddInfo[HddIndex].ControlBaseAddress = 0x3f6;
HddInfo[HddIndex].BusMasterAddress = 0; HddInfo[HddIndex].BusMasterAddress = 0;
} }
HddIndex++; HddIndex++;
// //
@ -548,22 +566,24 @@ GetPlatformHandle (
HddInfo[HddIndex].ControlBaseAddress = 0x376; HddInfo[HddIndex].ControlBaseAddress = 0x376;
HddInfo[HddIndex].BusMasterAddress = 0; HddInfo[HddIndex].BusMasterAddress = 0;
} }
HddIndex++; HddIndex++;
} }
} }
} }
return EFI_SUCCESS; return EFI_SUCCESS;
case EfiGetPlatformIsaBusHandle: case EfiGetPlatformIsaBusHandle:
ClassLists[0].Class = (UINT8) PCI_CLASS_BRIDGE; ClassLists[0].Class = (UINT8)PCI_CLASS_BRIDGE;
ClassLists[0].SubClass = (UINT8) PCI_CLASS_BRIDGE_ISA_PDECODE; ClassLists[0].SubClass = (UINT8)PCI_CLASS_BRIDGE_ISA_PDECODE;
ClassLists[1].Class = (UINT8) PCI_CLASS_BRIDGE; ClassLists[1].Class = (UINT8)PCI_CLASS_BRIDGE;
ClassLists[1].SubClass = (UINT8) PCI_CLASS_BRIDGE_ISA; ClassLists[1].SubClass = (UINT8)PCI_CLASS_BRIDGE_ISA;
ClassLists[2].Class = 0xff; ClassLists[2].Class = 0xff;
// //
// Locate all found block io devices // Locate all found block io devices
// //
FindAllDeviceTypes (ClassLists, LocalDevice, (UINT16 *) (&LocalIndex), TRUE); FindAllDeviceTypes (ClassLists, LocalDevice, (UINT16 *)(&LocalIndex), TRUE);
if (LocalIndex == 0) { if (LocalIndex == 0) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -585,13 +605,14 @@ GetPlatformHandle (
for (Index = 0; Index < LocalIndex; Index++) { for (Index = 0; Index < LocalIndex; Index++) {
mIsaHandles[Index] = LocalDevice[Index].Handle; mIsaHandles[Index] = LocalDevice[Index].Handle;
} }
*HandleBuffer = &mIsaHandles[0]; *HandleBuffer = &mIsaHandles[0];
*HandleCount = LocalIndex; *HandleCount = LocalIndex;
return EFI_SUCCESS; return EFI_SUCCESS;
case EfiGetPlatformUsbHandle: case EfiGetPlatformUsbHandle:
default: default:
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
}; }
} }
/** /**
@ -631,7 +652,7 @@ PlatformHooks (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiLegacyBiosProtocolGuid, &gEfiLegacyBiosProtocolGuid,
NULL, NULL,
(VOID**)&LegacyBios (VOID **)&LegacyBios
); );
// //
@ -646,7 +667,7 @@ PlatformHooks (
case EfiPlatformHookAfterRomInit: case EfiPlatformHookAfterRomInit:
default: default:
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
}; }
} }
/** /**
@ -699,7 +720,7 @@ GetRoutingTable (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiLegacyInterruptProtocolGuid, &gEfiLegacyInterruptProtocolGuid,
NULL, NULL,
(VOID**)&LegacyInterrupt (VOID **)&LegacyInterrupt
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
LegacyInterrupt->GetLocation ( LegacyInterrupt->GetLocation (
@ -714,23 +735,24 @@ GetRoutingTable (
// //
PirqTableHead.PirqTable.TableSize = PTableSize; PirqTableHead.PirqTable.TableSize = PTableSize;
PirqTableHead.PirqTable.Bus = Bus; PirqTableHead.PirqTable.Bus = Bus;
PirqTableHead.PirqTable.DevFun = (UINT8) ((Device << 3) + Function); PirqTableHead.PirqTable.DevFun = (UINT8)((Device << 3) + Function);
Ptr = (UINT8 *) (&PirqTableHead); Ptr = (UINT8 *)(&PirqTableHead);
// //
// Calculate checksum. // Calculate checksum.
// //
for (Index = 0; Index < PTableSize; Index++) { for (Index = 0; Index < PTableSize; Index++) {
Checksum = (UINT8) (Checksum + (UINT8) *Ptr); Checksum = (UINT8)(Checksum + (UINT8)*Ptr);
Ptr += 1; Ptr += 1;
} }
Checksum = (UINT8) (0x00 - Checksum);
Checksum = (UINT8)(0x00 - Checksum);
PirqTableHead.PirqTable.Checksum = Checksum; PirqTableHead.PirqTable.Checksum = Checksum;
// //
// Update return values. // Update return values.
// //
*LocalPirqTable = (VOID *) (&PirqTableHead); *LocalPirqTable = (VOID *)(&PirqTableHead);
*PirqTableSize = PTableSize; *PirqTableSize = PTableSize;
} }
@ -791,11 +813,12 @@ GetPlatformInfo (
EFI_SECTION_RAW, EFI_SECTION_RAW,
0, 0,
Table, Table,
(UINTN *) TableSize (UINTN *)TableSize
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
continue; continue;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -808,7 +831,7 @@ GetPlatformInfo (
case EfiGetPlatformPciExpressBase: case EfiGetPlatformPciExpressBase:
default: default:
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
}; }
} }
/** /**
@ -849,15 +872,16 @@ TranslatePirq (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiLegacyInterruptProtocolGuid, &gEfiLegacyInterruptProtocolGuid,
NULL, NULL,
(VOID**)&LegacyInterrupt (VOID **)&LegacyInterrupt
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
LocalPirq = (UINT8) (*Pirq); LocalPirq = (UINT8)(*Pirq);
for (Index = 0; Index < MAX_IRQ_ROUTING_ENTRIES; Index++) { for (Index = 0; Index < MAX_IRQ_ROUTING_ENTRIES; Index++) {
if ((PirqTableHead.IrqRoutingEntry[Index].Bus == PciBus) && if ((PirqTableHead.IrqRoutingEntry[Index].Bus == PciBus) &&
(PirqTableHead.IrqRoutingEntry[Index].Device == PciDevice)) { (PirqTableHead.IrqRoutingEntry[Index].Device == PciDevice))
LocalPirq = (UINT8) (PirqTableHead.IrqRoutingEntry[Index].PirqEntry[LocalPirq].Pirq & 0x0f); {
LocalPirq = (UINT8)(PirqTableHead.IrqRoutingEntry[Index].PirqEntry[LocalPirq].Pirq & 0x0f);
if (LocalPirq > 4) { if (LocalPirq > 4) {
LocalPirq -= 4; LocalPirq -= 4;
} }
@ -867,7 +891,8 @@ TranslatePirq (
while (PirqData == 0) { while (PirqData == 0) {
for (Index1 = 0; Index1 < MAX_IRQ_PRIORITY_ENTRIES; Index1++) { for (Index1 = 0; Index1 < MAX_IRQ_PRIORITY_ENTRIES; Index1++) {
if ((IrqPriorityTable[Index1].Used == MatchData) && if ((IrqPriorityTable[Index1].Used == MatchData) &&
(IrqPriorityTable[Index1].Irq != 0)) { (IrqPriorityTable[Index1].Irq != 0))
{
PirqData = IrqPriorityTable[Index1].Irq; PirqData = IrqPriorityTable[Index1].Irq;
IrqPriorityTable[Index1].Used = 0xff; IrqPriorityTable[Index1].Used = 0xff;
LegacyInterrupt->WritePirq ( LegacyInterrupt->WritePirq (
@ -880,11 +905,10 @@ TranslatePirq (
} }
if (PirqData == 0) { if (PirqData == 0) {
// //
// No unused interrupts, so start reusing them. // No unused interrupts, so start reusing them.
// //
MatchData = (UINT8) (~MatchData); MatchData = (UINT8)(~MatchData);
} }
} }
@ -896,7 +920,6 @@ TranslatePirq (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Attempt to legacy boot the BootOption. If the EFI contexted has been Attempt to legacy boot the BootOption. If the EFI contexted has been
compromised this function will not return. compromised this function will not return.
@ -933,7 +956,7 @@ PrepareToBoot (
// Initialize values // Initialize values
// //
Priority = 0; Priority = 0;
Legacy16BootTable = (EFI_TO_COMPATIBILITY16_BOOT_TABLE*) EfiToLegacy16BootTable; Legacy16BootTable = (EFI_TO_COMPATIBILITY16_BOOT_TABLE *)EfiToLegacy16BootTable;
// //
// Set how Gate A20 is gated by hardware // Set how Gate A20 is gated by hardware
@ -966,8 +989,9 @@ PrepareToBoot (
if ((LocalBbsTable[Index].BootPriority != BBS_UNPRIORITIZED_ENTRY) && if ((LocalBbsTable[Index].BootPriority != BBS_UNPRIORITIZED_ENTRY) &&
(LocalBbsTable[Index].BootPriority != BBS_IGNORE_ENTRY) && (LocalBbsTable[Index].BootPriority != BBS_IGNORE_ENTRY) &&
(LocalBbsTable[Index].BootPriority != BBS_LOWEST_PRIORITY) && (LocalBbsTable[Index].BootPriority != BBS_LOWEST_PRIORITY) &&
(Priority <= LocalBbsTable[Index].BootPriority)) { (Priority <= LocalBbsTable[Index].BootPriority))
Priority = (UINT16) (LocalBbsTable[Index].BootPriority + 1); {
Priority = (UINT16)(LocalBbsTable[Index].BootPriority + 1);
} }
} }
@ -978,28 +1002,32 @@ PrepareToBoot (
case BBS_EMBED_NETWORK: case BBS_EMBED_NETWORK:
for (Index = 0; Index < Legacy16BootTable->NumberBbsEntries; Index++) { for (Index = 0; Index < Legacy16BootTable->NumberBbsEntries; Index++) {
if ((LocalBbsTable[Index].BootPriority == BBS_UNPRIORITIZED_ENTRY) && if ((LocalBbsTable[Index].BootPriority == BBS_UNPRIORITIZED_ENTRY) &&
(LocalBbsTable[Index].DeviceType == DevicePathType)) { (LocalBbsTable[Index].DeviceType == DevicePathType))
{
LocalBbsTable[Index].BootPriority = Priority; LocalBbsTable[Index].BootPriority = Priority;
++Priority; ++Priority;
} }
} }
break; break;
case BBS_BEV_DEVICE: case BBS_BEV_DEVICE:
for (Index = 0; Index < Legacy16BootTable->NumberBbsEntries; Index++) { for (Index = 0; Index < Legacy16BootTable->NumberBbsEntries; Index++) {
if ((LocalBbsTable[Index].BootPriority == BBS_UNPRIORITIZED_ENTRY) && if ((LocalBbsTable[Index].BootPriority == BBS_UNPRIORITIZED_ENTRY) &&
(LocalBbsTable[Index].Class == 01) && (LocalBbsTable[Index].Class == 01) &&
(LocalBbsTable[Index].SubClass == 01)) { (LocalBbsTable[Index].SubClass == 01))
{
LocalBbsTable[Index].BootPriority = Priority; LocalBbsTable[Index].BootPriority = Priority;
++Priority; ++Priority;
} }
} }
break; break;
case BBS_USB: case BBS_USB:
case BBS_PCMCIA: case BBS_PCMCIA:
case BBS_UNKNOWN: case BBS_UNKNOWN:
default: default:
break; break;
}; }
// //
// Set priority for rest of devices // Set priority for rest of devices
@ -1014,7 +1042,6 @@ PrepareToBoot (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Initialize Legacy Platform support Initialize Legacy Platform support

View File

@ -95,4 +95,3 @@ typedef struct {
) )
#endif #endif

View File

@ -30,51 +30,51 @@
// 0xF0000-0xFFFFF 0x59 0x90 5:4 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal // 0xF0000-0xFFFFF 0x59 0x90 5:4 00 = DRAM Disabled, 01= Read Only, 10 = Write Only, 11 = Normal
// //
STATIC LEGACY_MEMORY_SECTION_INFO mSectionArray[] = { STATIC LEGACY_MEMORY_SECTION_INFO mSectionArray[] = {
{0xC0000, SIZE_16KB, FALSE, FALSE}, { 0xC0000, SIZE_16KB, FALSE, FALSE },
{0xC4000, SIZE_16KB, FALSE, FALSE}, { 0xC4000, SIZE_16KB, FALSE, FALSE },
{0xC8000, SIZE_16KB, FALSE, FALSE}, { 0xC8000, SIZE_16KB, FALSE, FALSE },
{0xCC000, SIZE_16KB, FALSE, FALSE}, { 0xCC000, SIZE_16KB, FALSE, FALSE },
{0xD0000, SIZE_16KB, FALSE, FALSE}, { 0xD0000, SIZE_16KB, FALSE, FALSE },
{0xD4000, SIZE_16KB, FALSE, FALSE}, { 0xD4000, SIZE_16KB, FALSE, FALSE },
{0xD8000, SIZE_16KB, FALSE, FALSE}, { 0xD8000, SIZE_16KB, FALSE, FALSE },
{0xDC000, SIZE_16KB, FALSE, FALSE}, { 0xDC000, SIZE_16KB, FALSE, FALSE },
{0xE0000, SIZE_16KB, FALSE, FALSE}, { 0xE0000, SIZE_16KB, FALSE, FALSE },
{0xE4000, SIZE_16KB, FALSE, FALSE}, { 0xE4000, SIZE_16KB, FALSE, FALSE },
{0xE8000, SIZE_16KB, FALSE, FALSE}, { 0xE8000, SIZE_16KB, FALSE, FALSE },
{0xEC000, SIZE_16KB, FALSE, FALSE}, { 0xEC000, SIZE_16KB, FALSE, FALSE },
{0xF0000, SIZE_64KB, FALSE, FALSE} { 0xF0000, SIZE_64KB, FALSE, FALSE }
}; };
STATIC PAM_REGISTER_VALUE mRegisterValues440[] = { STATIC PAM_REGISTER_VALUE mRegisterValues440[] = {
{PMC_REGISTER_PIIX4 (PIIX4_PAM1), 0x01, 0x02}, { PMC_REGISTER_PIIX4 (PIIX4_PAM1), 0x01, 0x02 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM1), 0x10, 0x20}, { PMC_REGISTER_PIIX4 (PIIX4_PAM1), 0x10, 0x20 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM2), 0x01, 0x02}, { PMC_REGISTER_PIIX4 (PIIX4_PAM2), 0x01, 0x02 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM2), 0x10, 0x20}, { PMC_REGISTER_PIIX4 (PIIX4_PAM2), 0x10, 0x20 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM3), 0x01, 0x02}, { PMC_REGISTER_PIIX4 (PIIX4_PAM3), 0x01, 0x02 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM3), 0x10, 0x20}, { PMC_REGISTER_PIIX4 (PIIX4_PAM3), 0x10, 0x20 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM4), 0x01, 0x02}, { PMC_REGISTER_PIIX4 (PIIX4_PAM4), 0x01, 0x02 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM4), 0x10, 0x20}, { PMC_REGISTER_PIIX4 (PIIX4_PAM4), 0x10, 0x20 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM5), 0x01, 0x02}, { PMC_REGISTER_PIIX4 (PIIX4_PAM5), 0x01, 0x02 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM5), 0x10, 0x20}, { PMC_REGISTER_PIIX4 (PIIX4_PAM5), 0x10, 0x20 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM6), 0x01, 0x02}, { PMC_REGISTER_PIIX4 (PIIX4_PAM6), 0x01, 0x02 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM6), 0x10, 0x20}, { PMC_REGISTER_PIIX4 (PIIX4_PAM6), 0x10, 0x20 },
{PMC_REGISTER_PIIX4 (PIIX4_PAM0), 0x10, 0x20} { PMC_REGISTER_PIIX4 (PIIX4_PAM0), 0x10, 0x20 }
}; };
STATIC PAM_REGISTER_VALUE mRegisterValuesQ35[] = { STATIC PAM_REGISTER_VALUE mRegisterValuesQ35[] = {
{DRAMC_REGISTER_Q35 (MCH_PAM1), 0x01, 0x02}, { DRAMC_REGISTER_Q35 (MCH_PAM1), 0x01, 0x02 },
{DRAMC_REGISTER_Q35 (MCH_PAM1), 0x10, 0x20}, { DRAMC_REGISTER_Q35 (MCH_PAM1), 0x10, 0x20 },
{DRAMC_REGISTER_Q35 (MCH_PAM2), 0x01, 0x02}, { DRAMC_REGISTER_Q35 (MCH_PAM2), 0x01, 0x02 },
{DRAMC_REGISTER_Q35 (MCH_PAM2), 0x10, 0x20}, { DRAMC_REGISTER_Q35 (MCH_PAM2), 0x10, 0x20 },
{DRAMC_REGISTER_Q35 (MCH_PAM3), 0x01, 0x02}, { DRAMC_REGISTER_Q35 (MCH_PAM3), 0x01, 0x02 },
{DRAMC_REGISTER_Q35 (MCH_PAM3), 0x10, 0x20}, { DRAMC_REGISTER_Q35 (MCH_PAM3), 0x10, 0x20 },
{DRAMC_REGISTER_Q35 (MCH_PAM4), 0x01, 0x02}, { DRAMC_REGISTER_Q35 (MCH_PAM4), 0x01, 0x02 },
{DRAMC_REGISTER_Q35 (MCH_PAM4), 0x10, 0x20}, { DRAMC_REGISTER_Q35 (MCH_PAM4), 0x10, 0x20 },
{DRAMC_REGISTER_Q35 (MCH_PAM5), 0x01, 0x02}, { DRAMC_REGISTER_Q35 (MCH_PAM5), 0x01, 0x02 },
{DRAMC_REGISTER_Q35 (MCH_PAM5), 0x10, 0x20}, { DRAMC_REGISTER_Q35 (MCH_PAM5), 0x10, 0x20 },
{DRAMC_REGISTER_Q35 (MCH_PAM6), 0x01, 0x02}, { DRAMC_REGISTER_Q35 (MCH_PAM6), 0x01, 0x02 },
{DRAMC_REGISTER_Q35 (MCH_PAM6), 0x10, 0x20}, { DRAMC_REGISTER_Q35 (MCH_PAM6), 0x10, 0x20 },
{DRAMC_REGISTER_Q35 (MCH_PAM0), 0x10, 0x20} { DRAMC_REGISTER_Q35 (MCH_PAM0), 0x10, 0x20 }
}; };
STATIC PAM_REGISTER_VALUE *mRegisterValues; STATIC PAM_REGISTER_VALUE *mRegisterValues;
@ -112,11 +112,12 @@ LegacyRegionManipulationInternal (
// //
// Validate input parameters. // Validate input parameters.
// //
if (Length == 0 || Granularity == NULL) { if ((Length == 0) || (Granularity == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
EndAddress = Start + Length - 1; EndAddress = Start + Length - 1;
if ((Start < PAM_BASE_ADDRESS) || EndAddress > PAM_LIMIT_ADDRESS) { if ((Start < PAM_BASE_ADDRESS) || (EndAddress > PAM_LIMIT_ADDRESS)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -130,6 +131,7 @@ LegacyRegionManipulationInternal (
break; break;
} }
} }
ASSERT (Index < ARRAY_SIZE (mSectionArray)); ASSERT (Index < ARRAY_SIZE (mSectionArray));
// //
@ -145,10 +147,11 @@ LegacyRegionManipulationInternal (
} else { } else {
PciAnd8 ( PciAnd8 (
mRegisterValues[Index].PAMRegPciLibAddress, mRegisterValues[Index].PAMRegPciLibAddress,
(UINT8) (~mRegisterValues[Index].ReadEnableData) (UINT8)(~mRegisterValues[Index].ReadEnableData)
); );
} }
} }
if (WriteEnable != NULL) { if (WriteEnable != NULL) {
if (*WriteEnable) { if (*WriteEnable) {
PciOr8 ( PciOr8 (
@ -158,7 +161,7 @@ LegacyRegionManipulationInternal (
} else { } else {
PciAnd8 ( PciAnd8 (
mRegisterValues[Index].PAMRegPciLibAddress, mRegisterValues[Index].PAMRegPciLibAddress,
(UINT8) (~mRegisterValues[Index].WriteEnableData) (UINT8)(~mRegisterValues[Index].WriteEnableData)
); );
} }
} }
@ -171,6 +174,7 @@ LegacyRegionManipulationInternal (
break; break;
} }
} }
ASSERT (Index < ARRAY_SIZE (mSectionArray)); ASSERT (Index < ARRAY_SIZE (mSectionArray));
return EFI_SUCCESS; return EFI_SUCCESS;
@ -189,20 +193,21 @@ LegacyRegionGetInfoInternal (
// //
// Check input parameters // Check input parameters
// //
if (DescriptorCount == NULL || Descriptor == NULL) { if ((DescriptorCount == NULL) || (Descriptor == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
// //
// Fill in current status of legacy region. // Fill in current status of legacy region.
// //
*DescriptorCount = sizeof(mSectionArray) / sizeof (mSectionArray[0]); *DescriptorCount = sizeof (mSectionArray) / sizeof (mSectionArray[0]);
for (Index = 0; Index < *DescriptorCount; Index++) { for (Index = 0; Index < *DescriptorCount; Index++) {
PamValue = PciRead8 (mRegisterValues[Index].PAMRegPciLibAddress); PamValue = PciRead8 (mRegisterValues[Index].PAMRegPciLibAddress);
mSectionArray[Index].ReadEnabled = FALSE; mSectionArray[Index].ReadEnabled = FALSE;
if ((PamValue & mRegisterValues[Index].ReadEnableData) != 0) { if ((PamValue & mRegisterValues[Index].ReadEnableData) != 0) {
mSectionArray[Index].ReadEnabled = TRUE; mSectionArray[Index].ReadEnabled = TRUE;
} }
mSectionArray[Index].WriteEnabled = FALSE; mSectionArray[Index].WriteEnabled = FALSE;
if ((PamValue & mRegisterValues[Index].WriteEnableData) != 0) { if ((PamValue & mRegisterValues[Index].WriteEnableData) != 0) {
mSectionArray[Index].WriteEnabled = TRUE; mSectionArray[Index].WriteEnabled = TRUE;
@ -250,7 +255,6 @@ LegacyRegion2Decode (
return LegacyRegionManipulationInternal (Start, Length, On, NULL, Granularity); return LegacyRegionManipulationInternal (Start, Length, On, NULL, Granularity);
} }
/** /**
Modify the hardware to disallow memory attribute changes in a region. Modify the hardware to disallow memory attribute changes in a region.
@ -292,7 +296,6 @@ LegacyRegion2BootLock (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
/** /**
Modify the hardware to disallow memory writes in a region. Modify the hardware to disallow memory writes in a region.
@ -328,7 +331,6 @@ LegacyRegion2Lock (
return LegacyRegionManipulationInternal (Start, Length, NULL, &WriteEnable, Granularity); return LegacyRegionManipulationInternal (Start, Length, NULL, &WriteEnable, Granularity);
} }
/** /**
Modify the hardware to allow memory writes in a region. Modify the hardware to allow memory writes in a region.
@ -420,6 +422,7 @@ LegacyRegionGetInfo (
} else { } else {
DescriptorArray[DescriptorIndex].Attribute = LegacyRegionNotDecoded; DescriptorArray[DescriptorIndex].Attribute = LegacyRegionNotDecoded;
} }
DescriptorIndex++; DescriptorIndex++;
// //
@ -433,6 +436,7 @@ LegacyRegionGetInfo (
} else { } else {
DescriptorArray[DescriptorIndex].Attribute = LegacyRegionWriteDisabled; DescriptorArray[DescriptorIndex].Attribute = LegacyRegionWriteDisabled;
} }
DescriptorIndex++; DescriptorIndex++;
// //
@ -445,7 +449,7 @@ LegacyRegionGetInfo (
DescriptorIndex++; DescriptorIndex++;
} }
*DescriptorCount = (UINT32) DescriptorIndex; *DescriptorCount = (UINT32)DescriptorIndex;
*Descriptor = DescriptorArray; *Descriptor = DescriptorArray;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -477,8 +481,12 @@ LegacyRegionInit (
mRegisterValues = mRegisterValuesQ35; mRegisterValues = mRegisterValuesQ35;
break; break;
default: default:
DEBUG ((DEBUG_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", DEBUG ((
__FUNCTION__, HostBridgeDevId)); DEBUG_ERROR,
"%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__,
HostBridgeDevId
));
ASSERT (FALSE); ASSERT (FALSE);
return RETURN_UNSUPPORTED; return RETURN_UNSUPPORTED;
} }
@ -488,11 +496,11 @@ LegacyRegionInit (
// //
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&mHandle, &mHandle,
&gEfiLegacyRegion2ProtocolGuid, &mLegacyRegion2, &gEfiLegacyRegion2ProtocolGuid,
&mLegacyRegion2,
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }

View File

@ -200,4 +200,3 @@ LegacyRegionGetInfo (
); );
#endif #endif

View File

@ -37,5 +37,4 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
/// ///
#define FRAMEWORK_EFI_BOOT_SCRIPT_TERMINATE_OPCODE 0xFF #define FRAMEWORK_EFI_BOOT_SCRIPT_TERMINATE_OPCODE 0xFF
#endif #endif

View File

@ -167,4 +167,3 @@ typedef struct {
#define EFI_EVENT_SIGNAL_LEGACY_BOOT 0x00000204 #define EFI_EVENT_SIGNAL_LEGACY_BOOT 0x00000204
#endif #endif

View File

@ -68,7 +68,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
* @param Bit A value indicating the bit(s) to test. * @param Bit A value indicating the bit(s) to test.
* If multiple bits are set, the logical OR of their tests is the expression's value. * If multiple bits are set, the logical OR of their tests is the expression's value.
**/ **/
#define EFI_TEST_FFS_ATTRIBUTES_BIT( FvbAttributes, TestAttributes, Bit) \ #define EFI_TEST_FFS_ATTRIBUTES_BIT(FvbAttributes, TestAttributes, Bit) \
((BOOLEAN) \ ((BOOLEAN) \
((FvbAttributes & EFI_FVB_ERASE_POLARITY) ? (((~TestAttributes) & Bit) == Bit) : ((TestAttributes & Bit) == Bit)) \ ((FvbAttributes & EFI_FVB_ERASE_POLARITY) ? (((~TestAttributes) & Bit) == Bit) : ((TestAttributes & Bit) == Bit)) \
) )

View File

@ -96,7 +96,6 @@ typedef UINT16 STRING_REF;
/// ///
#define EFI_IFR_FLAG_CREATED 128 #define EFI_IFR_FLAG_CREATED 128
#pragma pack(1) #pragma pack(1)
// //
// IFR Structure definitions // IFR Structure definitions
@ -236,7 +235,7 @@ typedef struct {
typedef struct { typedef struct {
FRAMEWORK_EFI_IFR_OP_HEADER Header; FRAMEWORK_EFI_IFR_OP_HEADER Header;
UINT16 QuestionId;///< The ID designating what the question is about... UINT16 QuestionId; ///< The ID designating what the question is about...
UINT8 Width; ///< The Size of the Data being saved. UINT8 Width; ///< The Size of the Data being saved.
STRING_REF Prompt; ///< The String Token for the Prompt. STRING_REF Prompt; ///< The String Token for the Prompt.
STRING_REF Help; ///< The string Token for the context-help. STRING_REF Help; ///< The string Token for the context-help.

View File

@ -19,7 +19,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _FIRMWARE_VOLUME_H_ #ifndef _FIRMWARE_VOLUME_H_
#define _FIRMWARE_VOLUME_H_ #define _FIRMWARE_VOLUME_H_
// //
// Firmware Volume Protocol GUID definition // Firmware Volume Protocol GUID definition
// //

View File

@ -105,7 +105,7 @@ typedef struct {
/// ///
/// EFI system resources table. Type EFI_SYSTEM_TABLE is defined in the IntelPlatform /// EFI system resources table. Type EFI_SYSTEM_TABLE is defined in the IntelPlatform
///Innovation Framework for EFI Driver Execution Environment Core Interface Specification (DXE CIS). /// Innovation Framework for EFI Driver Execution Environment Core Interface Specification (DXE CIS).
/// ///
UINT32 EfiSystemTable; UINT32 EfiSystemTable;
@ -363,7 +363,6 @@ typedef enum {
Legacy16InstallPciHandler = 0x0008 Legacy16InstallPciHandler = 0x0008
} EFI_COMPATIBILITY_FUNCTIONS; } EFI_COMPATIBILITY_FUNCTIONS;
/// ///
/// EFI_DISPATCH_OPROM_TABLE /// EFI_DISPATCH_OPROM_TABLE
/// ///
@ -382,7 +381,6 @@ typedef struct {
///< Inconsistent with specification here: ///< Inconsistent with specification here:
///< The member's name "OpromDestinationSegment" [defined in Intel Framework Compatibility Support Module Specification / 0.97 version] ///< The member's name "OpromDestinationSegment" [defined in Intel Framework Compatibility Support Module Specification / 0.97 version]
///< has been changed to "RuntimeSegment" since keeping backward compatible. ///< has been changed to "RuntimeSegment" since keeping backward compatible.
} EFI_DISPATCH_OPROM_TABLE; } EFI_DISPATCH_OPROM_TABLE;
/// ///
@ -462,7 +460,7 @@ typedef struct {
#define DEVICE_SERIAL_MODE_ASK_IR 0x02 #define DEVICE_SERIAL_MODE_ASK_IR 0x02
#define DEVICE_SERIAL_MODE_DUPLEX_HALF 0x00 #define DEVICE_SERIAL_MODE_DUPLEX_HALF 0x00
#define DEVICE_SERIAL_MODE_DUPLEX_FULL 0x10 #define DEVICE_SERIAL_MODE_DUPLEX_FULL 0x10
///@) /// @)
/// ///
/// DEVICE_PRODUCER_PARALLEL. /// DEVICE_PRODUCER_PARALLEL.
@ -1017,23 +1015,23 @@ typedef struct _EFI_LEGACY_BIOS_PROTOCOL EFI_LEGACY_BIOS_PROTOCOL;
/// EFI_EFLAGS_REG /// EFI_EFLAGS_REG
/// ///
typedef struct { typedef struct {
UINT32 CF:1; UINT32 CF : 1;
UINT32 Reserved1:1; UINT32 Reserved1 : 1;
UINT32 PF:1; UINT32 PF : 1;
UINT32 Reserved2:1; UINT32 Reserved2 : 1;
UINT32 AF:1; UINT32 AF : 1;
UINT32 Reserved3:1; UINT32 Reserved3 : 1;
UINT32 ZF:1; UINT32 ZF : 1;
UINT32 SF:1; UINT32 SF : 1;
UINT32 TF:1; UINT32 TF : 1;
UINT32 IF:1; UINT32 IF : 1;
UINT32 DF:1; UINT32 DF : 1;
UINT32 OF:1; UINT32 OF : 1;
UINT32 IOPL:2; UINT32 IOPL : 2;
UINT32 NT:1; UINT32 NT : 1;
UINT32 Reserved4:2; UINT32 Reserved4 : 2;
UINT32 VM:1; UINT32 VM : 1;
UINT32 Reserved5:14; UINT32 Reserved5 : 14;
} EFI_EFLAGS_REG; } EFI_EFLAGS_REG;
/// ///
@ -1061,21 +1059,21 @@ typedef struct {
/// EFI_FLAGS_REG /// EFI_FLAGS_REG
/// ///
typedef struct { typedef struct {
UINT16 CF:1; UINT16 CF : 1;
UINT16 Reserved1:1; UINT16 Reserved1 : 1;
UINT16 PF:1; UINT16 PF : 1;
UINT16 Reserved2:1; UINT16 Reserved2 : 1;
UINT16 AF:1; UINT16 AF : 1;
UINT16 Reserved3:1; UINT16 Reserved3 : 1;
UINT16 ZF:1; UINT16 ZF : 1;
UINT16 SF:1; UINT16 SF : 1;
UINT16 TF:1; UINT16 TF : 1;
UINT16 IF:1; UINT16 IF : 1;
UINT16 DF:1; UINT16 DF : 1;
UINT16 OF:1; UINT16 OF : 1;
UINT16 IOPL:2; UINT16 IOPL : 2;
UINT16 NT:1; UINT16 NT : 1;
UINT16 Reserved4:1; UINT16 Reserved4 : 1;
} EFI_FLAGS_REG; } EFI_FLAGS_REG;
/// ///

View File

@ -147,56 +147,56 @@ typedef enum {
/// EFI_UNSUPPORTED Oem16 is not supported on this platform. /// EFI_UNSUPPORTED Oem16 is not supported on this platform.
/// ///
EfiGetPlatformBinaryOem16Data = 2, EfiGetPlatformBinaryOem16Data = 2,
/// ///
/// This mode returns a block of data. The content and usage are IBV defined. OEMs or /// This mode returns a block of data. The content and usage are IBV defined. OEMs or
/// IBVs normally use this mode for nonstandard Compatibility16 runtime 32 bit routines. It /// IBVs normally use this mode for nonstandard Compatibility16 runtime 32 bit routines. It
/// is the responsibility of this routine to coalesce multiple OEM 32 bit functions, if they /// is the responsibility of this routine to coalesce multiple OEM 32 bit functions, if they
/// exist, into one coherent package that is understandable by the Compatibility16 code. /// exist, into one coherent package that is understandable by the Compatibility16 code.
/// ///
/// Example usage: A legacy mobile BIOS that has a pre existing runtime /// Example usage: A legacy mobile BIOS that has a pre existing runtime
/// interface to return the battery status to calling applications. /// interface to return the battery status to calling applications.
/// ///
/// This mode is invoked twice. The first invocation has LegacySegment and /// This mode is invoked twice. The first invocation has LegacySegment and
/// LegacyOffset set to 0. The mode returns the table address in EFI memory and its size. /// LegacyOffset set to 0. The mode returns the table address in EFI memory and its size.
/// ///
/// The second invocation has LegacySegment and LegacyOffset set to the location /// The second invocation has LegacySegment and LegacyOffset set to the location
/// in the 0xF0000 or 0xE0000 block to which the table is to be copied. The second /// in the 0xF0000 or 0xE0000 block to which the table is to be copied. The second
/// invocation allows any table address fix ups to occur in the EFI memory copy of the table. /// invocation allows any table address fix ups to occur in the EFI memory copy of the table.
/// The caller, not EfiGetPlatformBinaryOem32Data, copies the modified table to /// The caller, not EfiGetPlatformBinaryOem32Data, copies the modified table to
/// the allocated region in 0xF0000 or 0xE0000 block after the second invocation.. /// the allocated region in 0xF0000 or 0xE0000 block after the second invocation..
/// ///
/// Note: There are two generic mechanisms by which this mode can be used. /// Note: There are two generic mechanisms by which this mode can be used.
/// Mechanism 1: This mode returns the data and the Legacy BIOS Protocol copies /// Mechanism 1: This mode returns the data and the Legacy BIOS Protocol copies
/// the data into the F0000 or E0000 block in the Compatibility16 code. The /// the data into the F0000 or E0000 block in the Compatibility16 code. The
/// EFI_COMPATIBILITY16_TABLE entries Oem32Segment and Oem32Offset can /// EFI_COMPATIBILITY16_TABLE entries Oem32Segment and Oem32Offset can
/// be viewed as two UINT16 entries. /// be viewed as two UINT16 entries.
/// Mechanism 2: This mode directly fills in the EFI_COMPATIBILITY16_TABLE with /// Mechanism 2: This mode directly fills in the EFI_COMPATIBILITY16_TABLE with
/// a pointer to the INT15 E820 region containing the 32 bit code. It returns /// a pointer to the INT15 E820 region containing the 32 bit code. It returns
/// EFI_UNSUPPORTED. The EFI_COMPATIBILITY16_TABLE entries, /// EFI_UNSUPPORTED. The EFI_COMPATIBILITY16_TABLE entries,
/// Oem32Segment and Oem32Offset, can be viewed as two UINT16 entries or /// Oem32Segment and Oem32Offset, can be viewed as two UINT16 entries or
/// as a single UINT32 entry as determined by the IBV. /// as a single UINT32 entry as determined by the IBV.
/// ///
/// The function parameters associated with this mode are: /// The function parameters associated with this mode are:
/// ///
/// TableSize Size of data. /// TableSize Size of data.
/// ///
/// Location Location to place the table. 0x00 or 0xE0000 or 0xF0000 64 KB blocks. /// Location Location to place the table. 0x00 or 0xE0000 or 0xF0000 64 KB blocks.
/// Bit 0 = 1 0xF0000 64 KB block. /// Bit 0 = 1 0xF0000 64 KB block.
/// Bit 1 = 1 0xE0000 64 KB block. /// Bit 1 = 1 0xE0000 64 KB block.
/// Multiple bits can be set. /// Multiple bits can be set.
/// ///
/// Alignment Bit mapped address alignment granularity. /// Alignment Bit mapped address alignment granularity.
/// The first nonzero bit from the right is the address granularity. /// The first nonzero bit from the right is the address granularity.
/// ///
/// LegacySegment Segment in which EfiCompatibility code will place the table or data. /// LegacySegment Segment in which EfiCompatibility code will place the table or data.
/// ///
/// LegacyOffset Offset in which EfiCompatibility code will place the table or data. /// LegacyOffset Offset in which EfiCompatibility code will place the table or data.
/// ///
/// The return values associated with this mode are: /// The return values associated with this mode are:
/// EFI_SUCCESS The data was returned successfully. /// EFI_SUCCESS The data was returned successfully.
/// EFI_UNSUPPORTED Oem32 is not supported on this platform. /// EFI_UNSUPPORTED Oem32 is not supported on this platform.
/// ///
EfiGetPlatformBinaryOem32Data = 3, EfiGetPlatformBinaryOem32Data = 3,
/// ///
/// This mode returns a TPM binary image for the onboard TPM device. /// This mode returns a TPM binary image for the onboard TPM device.
/// ///
@ -387,7 +387,7 @@ typedef enum {
/// ///
/// AdditionalData NULL. /// AdditionalData NULL.
/// ///
EfiPlatformHookShadowServiceRoms= 1, EfiPlatformHookShadowServiceRoms = 1,
/// ///
/// This mode allows platform to perform any required operation after an OpROM has /// This mode allows platform to perform any required operation after an OpROM has
/// completed its initialization. /// completed its initialization.
@ -496,7 +496,6 @@ typedef struct {
UINT8 Checksum; UINT8 Checksum;
} EFI_LEGACY_PIRQ_TABLE_HEADER; } EFI_LEGACY_PIRQ_TABLE_HEADER;
typedef struct { typedef struct {
/// ///
/// If nonzero, a value assigned by the IBV. /// If nonzero, a value assigned by the IBV.
@ -533,7 +532,6 @@ typedef struct {
#pragma pack() #pragma pack()
/** /**
Finds the binary data or other platform information. Finds the binary data or other platform information.

View File

@ -13,7 +13,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _EFI_LEGACY_INTERRUPT_H_ #ifndef _EFI_LEGACY_INTERRUPT_H_
#define _EFI_LEGACY_INTERRUPT_H_ #define _EFI_LEGACY_INTERRUPT_H_
#define EFI_LEGACY_INTERRUPT_PROTOCOL_GUID \ #define EFI_LEGACY_INTERRUPT_PROTOCOL_GUID \
{ \ { \
0x31ce593d, 0x108a, 0x485d, {0xad, 0xb2, 0x78, 0xf2, 0x1f, 0x29, 0x66, 0xbe } \ 0x31ce593d, 0x108a, 0x485d, {0xad, 0xb2, 0x78, 0xf2, 0x1f, 0x29, 0x66, 0xbe } \

View File

@ -76,7 +76,7 @@ HasMediaInFloppy (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
HandleBuffer[Index], HandleBuffer[Index],
&gEfiIsaIoProtocolGuid, &gEfiIsaIoProtocolGuid,
(VOID **) &IsaIo (VOID **)&IsaIo
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
continue; continue;
@ -85,6 +85,7 @@ HasMediaInFloppy (
if (IsaIo->ResourceList->Device.HID != EISA_PNP_ID (0x604)) { if (IsaIo->ResourceList->Device.HID != EISA_PNP_ID (0x604)) {
continue; continue;
} }
// //
// Update blockio in case the floppy is inserted in during BdsTimeout // Update blockio in case the floppy is inserted in during BdsTimeout
// //
@ -103,7 +104,7 @@ HasMediaInFloppy (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
HandleBuffer[Index], HandleBuffer[Index],
&gEfiBlockIoProtocolGuid, &gEfiBlockIoProtocolGuid,
(VOID **) &BlkIo (VOID **)&BlkIo
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
continue; continue;
@ -121,10 +122,8 @@ HasMediaInFloppy (
FreePool (HandleBuffer); FreePool (HandleBuffer);
return FLOPPY_NOT_PRESENT; return FLOPPY_NOT_PRESENT;
} }
/** /**
Complete build of BBS TABLE. Complete build of BBS TABLE.
@ -196,10 +195,8 @@ LegacyBiosBuildBbs (
LegacyBiosBuildIdeData (Private, &HddInfo, 0); LegacyBiosBuildIdeData (Private, &HddInfo, 0);
for (HddIndex = 0; HddIndex < MAX_IDE_CONTROLLER; HddIndex++) { for (HddIndex = 0; HddIndex < MAX_IDE_CONTROLLER; HddIndex++) {
BbsIndex = HddIndex * 2 + 1; BbsIndex = HddIndex * 2 + 1;
for (Index = 0; Index < 2; ++Index) { for (Index = 0; Index < 2; ++Index) {
BbsTable[BbsIndex + Index].Bus = HddInfo[HddIndex].Bus; BbsTable[BbsIndex + Index].Bus = HddInfo[HddIndex].Bus;
BbsTable[BbsIndex + Index].Device = HddInfo[HddIndex].Device; BbsTable[BbsIndex + Index].Device = HddInfo[HddIndex].Device;
BbsTable[BbsIndex + Index].Function = HddInfo[HddIndex].Function; BbsTable[BbsIndex + Index].Function = HddInfo[HddIndex].Function;
@ -286,7 +283,7 @@ LegacyBiosBuildBbs (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
BlockIoHandles[BlockIndex], BlockIoHandles[BlockIndex],
&gEfiBlockIoProtocolGuid, &gEfiBlockIoProtocolGuid,
(VOID **) &BlkIo (VOID **)&BlkIo
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -313,7 +310,7 @@ LegacyBiosBuildBbs (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
BlockIoHandles[BlockIndex], BlockIoHandles[BlockIndex],
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &DevicePath (VOID **)&DevicePath
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
continue; continue;
@ -324,12 +321,15 @@ LegacyBiosBuildBbs (
// //
DevicePathNode = DevicePath; DevicePathNode = DevicePath;
while (!IsDevicePathEnd (DevicePathNode)) { while (!IsDevicePathEnd (DevicePathNode)) {
if (DevicePathType (DevicePathNode) == MESSAGING_DEVICE_PATH && if ((DevicePathType (DevicePathNode) == MESSAGING_DEVICE_PATH) &&
DevicePathSubType (DevicePathNode) == MSG_ATAPI_DP) { (DevicePathSubType (DevicePathNode) == MSG_ATAPI_DP))
{
break; break;
} }
DevicePathNode = NextDevicePathNode (DevicePathNode); DevicePathNode = NextDevicePathNode (DevicePathNode);
} }
if (!IsDevicePathEnd (DevicePathNode)) { if (!IsDevicePathEnd (DevicePathNode)) {
continue; continue;
} }
@ -349,7 +349,7 @@ LegacyBiosBuildBbs (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
PciHandle, PciHandle,
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID **) &PciIo (VOID **)&PciIo
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
continue; continue;
@ -367,13 +367,21 @@ LegacyBiosBuildBbs (
} }
if (SegNum != 0) { if (SegNum != 0) {
DEBUG ((DEBUG_WARN, "CSM cannot use PCI devices in segment %Lu\n", DEBUG ((
(UINT64) SegNum)); DEBUG_WARN,
"CSM cannot use PCI devices in segment %Lu\n",
(UINT64)SegNum
));
continue; continue;
} }
DEBUG ((DEBUG_INFO, "Add Legacy Bbs entry for PCI %d/%d/%d\n", DEBUG ((
BusNum, DevNum, FuncNum)); DEBUG_INFO,
"Add Legacy Bbs entry for PCI %d/%d/%d\n",
BusNum,
DevNum,
FuncNum
));
BbsTable[BbsIndex].Bus = BusNum; BbsTable[BbsIndex].Bus = BusNum;
BbsTable[BbsIndex].Device = DevNum; BbsTable[BbsIndex].Device = DevNum;
@ -403,7 +411,6 @@ LegacyBiosBuildBbs (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Get all BBS info Get all BBS info
@ -431,8 +438,8 @@ LegacyBiosGetBbsInfo (
LEGACY_BIOS_INSTANCE *Private; LEGACY_BIOS_INSTANCE *Private;
EFI_IA32_REGISTER_SET Regs; EFI_IA32_REGISTER_SET Regs;
EFI_TO_COMPATIBILITY16_BOOT_TABLE *EfiToLegacy16BootTable; EFI_TO_COMPATIBILITY16_BOOT_TABLE *EfiToLegacy16BootTable;
// HDD_INFO *LocalHddInfo; // HDD_INFO *LocalHddInfo;
// IN BBS_TABLE *LocalBbsTable; // IN BBS_TABLE *LocalBbsTable;
UINTN NumHandles; UINTN NumHandles;
EFI_HANDLE *HandleBuffer; EFI_HANDLE *HandleBuffer;
UINTN Index; UINTN Index;
@ -443,8 +450,8 @@ LegacyBiosGetBbsInfo (
Private = LEGACY_BIOS_INSTANCE_FROM_THIS (This); Private = LEGACY_BIOS_INSTANCE_FROM_THIS (This);
EfiToLegacy16BootTable = &Private->IntThunk->EfiToLegacy16BootTable; EfiToLegacy16BootTable = &Private->IntThunk->EfiToLegacy16BootTable;
// LocalHddInfo = EfiToLegacy16BootTable->HddInfo; // LocalHddInfo = EfiToLegacy16BootTable->HddInfo;
// LocalBbsTable = (BBS_TABLE*)(UINTN)EfiToLegacy16BootTable->BbsTable; // LocalBbsTable = (BBS_TABLE*)(UINTN)EfiToLegacy16BootTable->BbsTable;
if (!mBbsTableDoneFlag) { if (!mBbsTableDoneFlag) {
mBbsTable = Private->BbsTablePtr; mBbsTable = Private->BbsTablePtr;
@ -475,7 +482,6 @@ LegacyBiosGetBbsInfo (
// PCI bus driver enumerate all subsequent handles // PCI bus driver enumerate all subsequent handles
// //
gBS->ConnectController (HandleBuffer[Index], NULL, NULL, FALSE); gBS->ConnectController (HandleBuffer[Index], NULL, NULL, FALSE);
} }
LegacyBiosBuildBbs (Private, mBbsTable); LegacyBiosBuildBbs (Private, mBbsTable);
@ -491,9 +497,9 @@ LegacyBiosGetBbsInfo (
// //
// Pass in handoff data // Pass in handoff data
// //
TempData = (UINTN) EfiToLegacy16BootTable; TempData = (UINTN)EfiToLegacy16BootTable;
Regs.X.ES = NORMALIZE_EFI_SEGMENT ((UINT32) TempData); Regs.X.ES = NORMALIZE_EFI_SEGMENT ((UINT32)TempData);
Regs.X.BX = NORMALIZE_EFI_OFFSET ((UINT32) TempData); Regs.X.BX = NORMALIZE_EFI_OFFSET ((UINT32)TempData);
Private->LegacyBios.FarCall86 ( Private->LegacyBios.FarCall86 (
This, This,
@ -518,7 +524,7 @@ LegacyBiosGetBbsInfo (
*HddCount = MAX_IDE_CONTROLLER; *HddCount = MAX_IDE_CONTROLLER;
*HddInfo = EfiToLegacy16BootTable->HddInfo; *HddInfo = EfiToLegacy16BootTable->HddInfo;
*BbsTable = (BBS_TABLE*)(UINTN)EfiToLegacy16BootTable->BbsTable; *BbsTable = (BBS_TABLE *)(UINTN)EfiToLegacy16BootTable->BbsTable;
*BbsCount = (UINT16) (sizeof (Private->IntThunk->BbsTable) / sizeof (BBS_TABLE)); *BbsCount = (UINT16)(sizeof (Private->IntThunk->BbsTable) / sizeof (BBS_TABLE));
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -27,8 +27,8 @@ LegacyBiosInitBda (
BDA_STRUC *Bda; BDA_STRUC *Bda;
UINT8 *Ebda; UINT8 *Ebda;
Bda = (BDA_STRUC *) ((UINTN) 0x400); Bda = (BDA_STRUC *)((UINTN)0x400);
Ebda = (UINT8 *) ((UINTN) 0x9fc00); Ebda = (UINT8 *)((UINTN)0x9fc00);
ACCESS_PAGE0_CODE ( ACCESS_PAGE0_CODE (
ZeroMem (Bda, 0x100); ZeroMem (Bda, 0x100);

View File

@ -64,7 +64,7 @@ AllocateLegacyMemory (
// //
// Allocate Pages of memory less <= StartPageAddress // Allocate Pages of memory less <= StartPageAddress
// //
MemPage = (EFI_PHYSICAL_ADDRESS) (UINTN) StartPageAddress; MemPage = (EFI_PHYSICAL_ADDRESS)(UINTN)StartPageAddress;
Status = gBS->AllocatePages ( Status = gBS->AllocatePages (
AllocateType, AllocateType,
MemoryType, MemoryType,
@ -81,13 +81,14 @@ AllocateLegacyMemory (
// Make sure that the buffer can be used to store code. // Make sure that the buffer can be used to store code.
// //
Status = gDS->GetMemorySpaceDescriptor (MemPage, &MemDesc); Status = gDS->GetMemorySpaceDescriptor (MemPage, &MemDesc);
if (!EFI_ERROR (Status) && (MemDesc.Attributes & EFI_MEMORY_XP) != 0) { if (!EFI_ERROR (Status) && ((MemDesc.Attributes & EFI_MEMORY_XP) != 0)) {
Status = gDS->SetMemorySpaceAttributes ( Status = gDS->SetMemorySpaceAttributes (
MemPage, MemPage,
EFI_PAGES_TO_SIZE (Pages), EFI_PAGES_TO_SIZE (Pages),
MemDesc.Attributes & (~EFI_MEMORY_XP) MemDesc.Attributes & (~EFI_MEMORY_XP)
); );
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
gBS->FreePages (MemPage, Pages); gBS->FreePages (MemPage, Pages);
} }
@ -95,13 +96,12 @@ AllocateLegacyMemory (
} }
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
*Result = (EFI_PHYSICAL_ADDRESS) (UINTN) MemPage; *Result = (EFI_PHYSICAL_ADDRESS)(UINTN)MemPage;
} }
return Status; return Status;
} }
/** /**
This function is called when EFI needs to reserve an area in the 0xE0000 or 0xF0000 This function is called when EFI needs to reserve an area in the 0xE0000 or 0xF0000
64 KB blocks. 64 KB blocks.
@ -133,7 +133,6 @@ LegacyBiosGetLegacyRegion (
OUT VOID **LegacyMemoryAddress OUT VOID **LegacyMemoryAddress
) )
{ {
LEGACY_BIOS_INSTANCE *Private; LEGACY_BIOS_INSTANCE *Private;
EFI_IA32_REGISTER_SET Regs; EFI_IA32_REGISTER_SET Regs;
EFI_STATUS Status; EFI_STATUS Status;
@ -144,9 +143,9 @@ LegacyBiosGetLegacyRegion (
ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET)); ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET));
Regs.X.AX = Legacy16GetTableAddress; Regs.X.AX = Legacy16GetTableAddress;
Regs.X.BX = (UINT16) Region; Regs.X.BX = (UINT16)Region;
Regs.X.CX = (UINT16) LegacyMemorySize; Regs.X.CX = (UINT16)LegacyMemorySize;
Regs.X.DX = (UINT16) Alignment; Regs.X.DX = (UINT16)Alignment;
Private->LegacyBios.FarCall86 ( Private->LegacyBios.FarCall86 (
&Private->LegacyBios, &Private->LegacyBios,
Private->Legacy16CallSegment, Private->Legacy16CallSegment,
@ -157,7 +156,7 @@ LegacyBiosGetLegacyRegion (
); );
if (Regs.X.AX == 0) { if (Regs.X.AX == 0) {
*LegacyMemoryAddress = (VOID *) (((UINTN) Regs.X.DS << 4) + Regs.X.BX); *LegacyMemoryAddress = (VOID *)(((UINTN)Regs.X.DS << 4) + Regs.X.BX);
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} else { } else {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
@ -169,7 +168,6 @@ LegacyBiosGetLegacyRegion (
return Status; return Status;
} }
/** /**
This function is called when copying data to the region assigned by This function is called when copying data to the region assigned by
EFI_LEGACY_BIOS_PROTOCOL.GetLegacyRegion(). EFI_LEGACY_BIOS_PROTOCOL.GetLegacyRegion().
@ -193,15 +191,16 @@ LegacyBiosCopyLegacyRegion (
IN VOID *LegacyMemorySourceAddress IN VOID *LegacyMemorySourceAddress
) )
{ {
LEGACY_BIOS_INSTANCE *Private; LEGACY_BIOS_INSTANCE *Private;
UINT32 Granularity; UINT32 Granularity;
if ((LegacyMemoryAddress < (VOID *)(UINTN)0xE0000 ) || if ((LegacyMemoryAddress < (VOID *)(UINTN)0xE0000) ||
((UINTN) LegacyMemoryAddress + LegacyMemorySize > (UINTN) 0x100000) ((UINTN)LegacyMemoryAddress + LegacyMemorySize > (UINTN)0x100000)
) { )
{
return EFI_ACCESS_DENIED; return EFI_ACCESS_DENIED;
} }
// //
// There is no protection from writes over lapping if this function is // There is no protection from writes over lapping if this function is
// called multiple times. // called multiple times.
@ -216,7 +215,6 @@ LegacyBiosCopyLegacyRegion (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Find Legacy16 BIOS image in the FLASH device and shadow it into memory. Find Find Legacy16 BIOS image in the FLASH device and shadow it into memory. Find
the $EFI table in the shadow area. Thunk into the Legacy16 code after it had the $EFI table in the shadow area. Thunk into the Legacy16 code after it had
@ -314,9 +312,9 @@ ShadowAndStartLegacy16 (
return Status; return Status;
} }
Private->BiosStart = (UINT32) (0x100000 - LegacyBiosImageSize); Private->BiosStart = (UINT32)(0x100000 - LegacyBiosImageSize);
Private->OptionRom = 0xc0000; Private->OptionRom = 0xc0000;
Private->LegacyBiosImageSize = (UINT32) LegacyBiosImageSize; Private->LegacyBiosImageSize = (UINT32)LegacyBiosImageSize;
// //
// Can only shadow into memory allocated for legacy usage. // Can only shadow into memory allocated for legacy usage.
@ -328,20 +326,20 @@ ShadowAndStartLegacy16 (
// //
Private->LegacyRegion->UnLock (Private->LegacyRegion, 0xc0000, 0x40000, &Granularity); Private->LegacyRegion->UnLock (Private->LegacyRegion, 0xc0000, 0x40000, &Granularity);
ClearPtr = (VOID *) ((UINTN) 0xc0000); ClearPtr = (VOID *)((UINTN)0xc0000);
// //
// Initialize region from 0xc0000 to start of BIOS to all ffs. This allows unused // Initialize region from 0xc0000 to start of BIOS to all ffs. This allows unused
// regions to be used by EMM386 etc. // regions to be used by EMM386 etc.
// //
SetMem ((VOID *) ClearPtr, (UINTN) (0x40000 - LegacyBiosImageSize), 0xff); SetMem ((VOID *)ClearPtr, (UINTN)(0x40000 - LegacyBiosImageSize), 0xff);
TempData = Private->BiosStart; TempData = Private->BiosStart;
CopyMem ( CopyMem (
(VOID *) TempData, (VOID *)TempData,
LegacyBiosImage, LegacyBiosImage,
(UINTN) LegacyBiosImageSize (UINTN)LegacyBiosImageSize
); );
Private->Cpu->FlushDataCache (Private->Cpu, 0xc0000, 0x40000, EfiCpuFlushTypeWriteBackInvalidate); Private->Cpu->FlushDataCache (Private->Cpu, 0xc0000, 0x40000, EfiCpuFlushTypeWriteBackInvalidate);
@ -351,12 +349,12 @@ ShadowAndStartLegacy16 (
// //
Done = FALSE; Done = FALSE;
Table = NULL; Table = NULL;
for (Ptr = (UINT8 *) TempData; Ptr < (UINT8 *) ((UINTN) 0x100000) && !Done; Ptr += 0x10) { for (Ptr = (UINT8 *)TempData; Ptr < (UINT8 *)((UINTN)0x100000) && !Done; Ptr += 0x10) {
if (*(UINT32 *) Ptr == SIGNATURE_32 ('I', 'F', 'E', '$')) { if (*(UINT32 *)Ptr == SIGNATURE_32 ('I', 'F', 'E', '$')) {
Table = (EFI_COMPATIBILITY16_TABLE *) Ptr; Table = (EFI_COMPATIBILITY16_TABLE *)Ptr;
PtrEnd = Ptr + Table->TableLength; PtrEnd = Ptr + Table->TableLength;
for (CheckSum = 0; Ptr < PtrEnd; Ptr++) { for (CheckSum = 0; Ptr < PtrEnd; Ptr++) {
CheckSum = (UINT8) (CheckSum +*Ptr); CheckSum = (UINT8)(CheckSum +*Ptr);
} }
Done = TRUE; Done = TRUE;
@ -405,7 +403,7 @@ ShadowAndStartLegacy16 (
// //
// Store away a copy of the EFI System Table // Store away a copy of the EFI System Table
// //
Table->EfiSystemTable = (UINT32) (UINTN) gST; Table->EfiSystemTable = (UINT32)(UINTN)gST;
// //
// IPF CSM integration -Bug // IPF CSM integration -Bug
@ -423,17 +421,17 @@ ShadowAndStartLegacy16 (
// //
// All legacy interrupt should be masked when do initialization work from legacy 16 code. // All legacy interrupt should be masked when do initialization work from legacy 16 code.
// //
Private->Legacy8259->GetMask(Private->Legacy8259, &OldMask, NULL, NULL, NULL); Private->Legacy8259->GetMask (Private->Legacy8259, &OldMask, NULL, NULL, NULL);
NewMask = 0xFFFF; NewMask = 0xFFFF;
Private->Legacy8259->SetMask(Private->Legacy8259, &NewMask, NULL, NULL, NULL); Private->Legacy8259->SetMask (Private->Legacy8259, &NewMask, NULL, NULL, NULL);
// //
// Call into Legacy16 code to do an INIT // Call into Legacy16 code to do an INIT
// //
ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET)); ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET));
Regs.X.AX = Legacy16InitializeYourself; Regs.X.AX = Legacy16InitializeYourself;
Regs.X.ES = EFI_SEGMENT (*((UINT32 *) &EfiToLegacy16InitTable)); Regs.X.ES = EFI_SEGMENT (*((UINT32 *)&EfiToLegacy16InitTable));
Regs.X.BX = EFI_OFFSET (*((UINT32 *) &EfiToLegacy16InitTable)); Regs.X.BX = EFI_OFFSET (*((UINT32 *)&EfiToLegacy16InitTable));
Private->LegacyBios.FarCall86 ( Private->LegacyBios.FarCall86 (
&Private->LegacyBios, &Private->LegacyBios,
@ -447,7 +445,7 @@ ShadowAndStartLegacy16 (
// //
// Restore original legacy interrupt mask value // Restore original legacy interrupt mask value
// //
Private->Legacy8259->SetMask(Private->Legacy8259, &OldMask, NULL, NULL, NULL); Private->Legacy8259->SetMask (Private->Legacy8259, &OldMask, NULL, NULL, NULL);
if (Regs.X.AX != 0) { if (Regs.X.AX != 0) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
@ -469,7 +467,7 @@ ShadowAndStartLegacy16 (
// //
ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET)); ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET));
Regs.X.AX = Legacy16GetTableAddress; Regs.X.AX = Legacy16GetTableAddress;
Regs.X.CX = (UINT16) E820Size; Regs.X.CX = (UINT16)E820Size;
Regs.X.DX = 1; Regs.X.DX = 1;
Private->LegacyBios.FarCall86 ( Private->LegacyBios.FarCall86 (
&Private->LegacyBios, &Private->LegacyBios,
@ -480,14 +478,15 @@ ShadowAndStartLegacy16 (
0 0
); );
Table->E820Pointer = (UINT32) (Regs.X.DS * 16 + Regs.X.BX); Table->E820Pointer = (UINT32)(Regs.X.DS * 16 + Regs.X.BX);
Table->E820Length = (UINT32) E820Size; Table->E820Length = (UINT32)E820Size;
if (Regs.X.AX != 0) { if (Regs.X.AX != 0) {
DEBUG ((DEBUG_ERROR, "Legacy16 E820 length insufficient\n")); DEBUG ((DEBUG_ERROR, "Legacy16 E820 length insufficient\n"));
} else { } else {
TempData = Table->E820Pointer; TempData = Table->E820Pointer;
CopyMem ((VOID *) TempData, Private->E820Table, E820Size); CopyMem ((VOID *)TempData, Private->E820Table, E820Size);
} }
// //
// Get PnPInstallationCheck Info. // Get PnPInstallationCheck Info.
// //
@ -511,6 +510,7 @@ ShadowAndStartLegacy16 (
Private->Legacy16Table->PciExpressBase = (UINT32)Location; Private->Legacy16Table->PciExpressBase = (UINT32)Location;
Location = 0; Location = 0;
} }
// //
// Check if TPM is supported. If yes get a region in E0000,F0000 to copy it // Check if TPM is supported. If yes get a region in E0000,F0000 to copy it
// into, copy it and update pointer to binary image. This needs to be // into, copy it and update pointer to binary image. This needs to be
@ -527,10 +527,9 @@ ShadowAndStartLegacy16 (
0 0
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET)); ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET));
Regs.X.AX = Legacy16GetTableAddress; Regs.X.AX = Legacy16GetTableAddress;
Regs.X.CX = (UINT16) TpmBinaryImageSize; Regs.X.CX = (UINT16)TpmBinaryImageSize;
Regs.X.DX = 1; Regs.X.DX = 1;
Private->LegacyBios.FarCall86 ( Private->LegacyBios.FarCall86 (
&Private->LegacyBios, &Private->LegacyBios,
@ -541,21 +540,21 @@ ShadowAndStartLegacy16 (
0 0
); );
TpmPointer = (UINT32) (Regs.X.DS * 16 + Regs.X.BX); TpmPointer = (UINT32)(Regs.X.DS * 16 + Regs.X.BX);
if (Regs.X.AX != 0) { if (Regs.X.AX != 0) {
DEBUG ((DEBUG_ERROR, "TPM cannot be loaded\n")); DEBUG ((DEBUG_ERROR, "TPM cannot be loaded\n"));
} else { } else {
CopyMem ((VOID *) (UINTN)TpmPointer, TpmBinaryImage, TpmBinaryImageSize); CopyMem ((VOID *)(UINTN)TpmPointer, TpmBinaryImage, TpmBinaryImageSize);
Table->TpmSegment = Regs.X.DS; Table->TpmSegment = Regs.X.DS;
Table->TpmOffset = Regs.X.BX; Table->TpmOffset = Regs.X.BX;
}
}
}
}
// //
// Lock the Legacy BIOS region // Lock the Legacy BIOS region
// //
Private->Cpu->FlushDataCache (Private->Cpu, Private->BiosStart, (UINT32) LegacyBiosImageSize, EfiCpuFlushTypeWriteBackInvalidate); Private->Cpu->FlushDataCache (Private->Cpu, Private->BiosStart, (UINT32)LegacyBiosImageSize, EfiCpuFlushTypeWriteBackInvalidate);
Private->LegacyRegion->Lock (Private->LegacyRegion, Private->BiosStart, (UINT32) LegacyBiosImageSize, &Granularity); Private->LegacyRegion->Lock (Private->LegacyRegion, Private->BiosStart, (UINT32)LegacyBiosImageSize, &Granularity);
// //
// Get the BbsTable from LOW_MEMORY_THUNK // Get the BbsTable from LOW_MEMORY_THUNK
@ -564,7 +563,7 @@ ShadowAndStartLegacy16 (
ZeroMem ((VOID *)BbsTable, sizeof (Private->IntThunk->BbsTable)); ZeroMem ((VOID *)BbsTable, sizeof (Private->IntThunk->BbsTable));
EfiToLegacy16BootTable->BbsTable = (UINT32)(UINTN)BbsTable; EfiToLegacy16BootTable->BbsTable = (UINT32)(UINTN)BbsTable;
Private->BbsTablePtr = (VOID *) BbsTable; Private->BbsTablePtr = (VOID *)BbsTable;
// //
// Populate entire table with BBS_IGNORE_ENTRY // Populate entire table with BBS_IGNORE_ENTRY
@ -574,10 +573,11 @@ ShadowAndStartLegacy16 (
for (Index = 0; Index < MAX_BBS_ENTRIES; Index++) { for (Index = 0; Index < MAX_BBS_ENTRIES; Index++) {
BbsTable[Index].BootPriority = BBS_IGNORE_ENTRY; BbsTable[Index].BootPriority = BBS_IGNORE_ENTRY;
} }
// //
// Allocate space for Legacy HDD table // Allocate space for Legacy HDD table
// //
LegacyEfiHddTable = (LEGACY_EFI_HDD_TABLE *) AllocateZeroPool ((UINTN) MAX_HDD_ENTRIES * sizeof (LEGACY_EFI_HDD_TABLE)); LegacyEfiHddTable = (LEGACY_EFI_HDD_TABLE *)AllocateZeroPool ((UINTN)MAX_HDD_ENTRIES * sizeof (LEGACY_EFI_HDD_TABLE));
ASSERT (LegacyEfiHddTable); ASSERT (LegacyEfiHddTable);
Private->LegacyEfiHddTable = LegacyEfiHddTable; Private->LegacyEfiHddTable = LegacyEfiHddTable;
@ -684,6 +684,7 @@ GetPciInterfaceVersion (
PciInterfaceVersion = Reg.X.BX; PciInterfaceVersion = Reg.X.BX;
} }
} }
return PciInterfaceVersion; return PciInterfaceVersion;
} }
@ -717,7 +718,7 @@ InstallSmbiosEventCallback (
return; return;
} }
EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) mRuntimeSmbiosEntryPoint; EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *)mRuntimeSmbiosEntryPoint;
// //
// Allocate memory for SMBIOS Entry Point Structure. // Allocate memory for SMBIOS Entry Point Structure.
@ -731,18 +732,20 @@ InstallSmbiosEventCallback (
Status = gBS->AllocatePages ( Status = gBS->AllocatePages (
AllocateMaxAddress, AllocateMaxAddress,
EfiReservedMemoryType, EfiReservedMemoryType,
EFI_SIZE_TO_PAGES ((UINTN) (EntryPointStructure->EntryPointLength)), EFI_SIZE_TO_PAGES ((UINTN)(EntryPointStructure->EntryPointLength)),
&mReserveSmbiosEntryPoint &mReserveSmbiosEntryPoint
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
mReserveSmbiosEntryPoint = 0; mReserveSmbiosEntryPoint = 0;
return; return;
} }
DEBUG ((DEBUG_INFO, "Allocate memory for Smbios Entry Point Structure\n")); DEBUG ((DEBUG_INFO, "Allocate memory for Smbios Entry Point Structure\n"));
} }
if ((mStructureTableAddress != 0) && if ((mStructureTableAddress != 0) &&
(mStructureTablePages < EFI_SIZE_TO_PAGES ((UINT32)EntryPointStructure->TableLength))) { (mStructureTablePages < EFI_SIZE_TO_PAGES ((UINT32)EntryPointStructure->TableLength)))
{
// //
// If original buffer is not enough for the new SMBIOS table, free original buffer and re-allocate // If original buffer is not enough for the new SMBIOS table, free original buffer and re-allocate
// //
@ -768,13 +771,14 @@ InstallSmbiosEventCallback (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
gBS->FreePages ( gBS->FreePages (
mReserveSmbiosEntryPoint, mReserveSmbiosEntryPoint,
EFI_SIZE_TO_PAGES ((UINTN) (EntryPointStructure->EntryPointLength)) EFI_SIZE_TO_PAGES ((UINTN)(EntryPointStructure->EntryPointLength))
); );
mReserveSmbiosEntryPoint = 0; mReserveSmbiosEntryPoint = 0;
mStructureTableAddress = 0; mStructureTableAddress = 0;
mStructureTablePages = 0; mStructureTablePages = 0;
return; return;
} }
DEBUG ((DEBUG_INFO, "Allocate memory for Smbios Structure Table\n")); DEBUG ((DEBUG_INFO, "Allocate memory for Smbios Structure Table\n"));
} }
} }
@ -850,7 +854,7 @@ LegacyBiosInstall (
// When UEFI Secure Boot is enabled, CSM module will not start any more. // When UEFI Secure Boot is enabled, CSM module will not start any more.
// //
SecureBoot = NULL; SecureBoot = NULL;
GetEfiGlobalVariable2 (EFI_SECURE_BOOT_MODE_NAME, (VOID**)&SecureBoot, NULL); GetEfiGlobalVariable2 (EFI_SECURE_BOOT_MODE_NAME, (VOID **)&SecureBoot, NULL);
if ((SecureBoot != NULL) && (*SecureBoot == SECURE_BOOT_MODE_ENABLE)) { if ((SecureBoot != NULL) && (*SecureBoot == SECURE_BOOT_MODE_ENABLE)) {
FreePool (SecureBoot); FreePool (SecureBoot);
return EFI_SECURITY_VIOLATION; return EFI_SECURITY_VIOLATION;
@ -867,22 +871,22 @@ LegacyBiosInstall (
// Grab a copy of all the protocols we depend on. Any error would // Grab a copy of all the protocols we depend on. Any error would
// be a dispatcher bug!. // be a dispatcher bug!.
// //
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **) &Private->Cpu); Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Private->Cpu);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (&gEfiTimerArchProtocolGuid, NULL, (VOID **) &Private->Timer); Status = gBS->LocateProtocol (&gEfiTimerArchProtocolGuid, NULL, (VOID **)&Private->Timer);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (&gEfiLegacyRegion2ProtocolGuid, NULL, (VOID **) &Private->LegacyRegion); Status = gBS->LocateProtocol (&gEfiLegacyRegion2ProtocolGuid, NULL, (VOID **)&Private->LegacyRegion);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (&gEfiLegacyBiosPlatformProtocolGuid, NULL, (VOID **) &Private->LegacyBiosPlatform); Status = gBS->LocateProtocol (&gEfiLegacyBiosPlatformProtocolGuid, NULL, (VOID **)&Private->LegacyBiosPlatform);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (&gEfiLegacy8259ProtocolGuid, NULL, (VOID **) &Private->Legacy8259); Status = gBS->LocateProtocol (&gEfiLegacy8259ProtocolGuid, NULL, (VOID **)&Private->Legacy8259);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (&gEfiLegacyInterruptProtocolGuid, NULL, (VOID **) &Private->LegacyInterrupt); Status = gBS->LocateProtocol (&gEfiLegacyInterruptProtocolGuid, NULL, (VOID **)&Private->LegacyInterrupt);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
@ -891,7 +895,7 @@ LegacyBiosInstall (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiGenericMemTestProtocolGuid, &gEfiGenericMemTestProtocolGuid,
NULL, NULL,
(VOID **) &Private->GenericMemoryTest (VOID **)&Private->GenericMemoryTest
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -904,6 +908,7 @@ LegacyBiosInstall (
StartAddress = Descriptor.BaseAddress + Descriptor.Length; StartAddress = Descriptor.BaseAddress + Descriptor.Length;
continue; continue;
} }
Length = MIN (Descriptor.Length, 0xa0000 - StartAddress); Length = MIN (Descriptor.Length, 0xa0000 - StartAddress);
Private->GenericMemoryTest->CompatibleRangeTest ( Private->GenericMemoryTest->CompatibleRangeTest (
Private->GenericMemoryTest, Private->GenericMemoryTest,
@ -912,6 +917,7 @@ LegacyBiosInstall (
); );
StartAddress = StartAddress + Length; StartAddress = StartAddress + Length;
} }
// //
// Make sure all memory from 1MB to 16MB is tested and added to memory map // Make sure all memory from 1MB to 16MB is tested and added to memory map
// //
@ -921,6 +927,7 @@ LegacyBiosInstall (
StartAddress = Descriptor.BaseAddress + Descriptor.Length; StartAddress = Descriptor.BaseAddress + Descriptor.Length;
continue; continue;
} }
Length = MIN (Descriptor.Length, BASE_16MB - StartAddress); Length = MIN (Descriptor.Length, BASE_16MB - StartAddress);
Private->GenericMemoryTest->CompatibleRangeTest ( Private->GenericMemoryTest->CompatibleRangeTest (
Private->GenericMemoryTest, Private->GenericMemoryTest,
@ -994,15 +1001,15 @@ LegacyBiosInstall (
); );
ASSERT (MemoryAddress == 0x000000000); ASSERT (MemoryAddress == 0x000000000);
ClearPtr = (VOID *) ((UINTN) 0x0000); ClearPtr = (VOID *)((UINTN)0x0000);
// //
// Initialize region from 0x0000 to 4k. This initializes interrupt vector // Initialize region from 0x0000 to 4k. This initializes interrupt vector
// range. // range.
// //
ACCESS_PAGE0_CODE ( ACCESS_PAGE0_CODE (
gBS->SetMem ((VOID *) ClearPtr, 0x400, INITIAL_VALUE_BELOW_1K); gBS->SetMem ((VOID *)ClearPtr, 0x400, INITIAL_VALUE_BELOW_1K);
ZeroMem ((VOID *) ((UINTN)ClearPtr + 0x400), 0xC00); ZeroMem ((VOID *)((UINTN)ClearPtr + 0x400), 0xC00);
); );
// //
@ -1020,7 +1027,7 @@ LegacyBiosInstall (
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
ZeroMem ((VOID *) ((UINTN) MemoryAddress), MemorySize); ZeroMem ((VOID *)((UINTN)MemoryAddress), MemorySize);
// //
// Allocate all 32k chunks from 0x60000 ~ 0x88000 for Legacy OPROMs that // Allocate all 32k chunks from 0x60000 ~ 0x88000 for Legacy OPROMs that
@ -1048,7 +1055,7 @@ LegacyBiosInstall (
&StartAddress &StartAddress
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
MemoryPtr = (VOID *) ((UINTN) StartAddress); MemoryPtr = (VOID *)((UINTN)StartAddress);
ZeroMem (MemoryPtr, 0x1000); ZeroMem (MemoryPtr, 0x1000);
} else { } else {
DEBUG ((DEBUG_ERROR, "WARNING: Allocate legacy memory fail for SCSI card - %x\n", MemStart)); DEBUG ((DEBUG_ERROR, "WARNING: Allocate legacy memory fail for SCSI card - %x\n", MemStart));
@ -1069,7 +1076,7 @@ LegacyBiosInstall (
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
ZeroMem ((VOID *) ((UINTN) MemoryAddressUnder1MB), MemorySize); ZeroMem ((VOID *)((UINTN)MemoryAddressUnder1MB), MemorySize);
// //
// Allocate space for thunker and Init Thunker // Allocate space for thunker and Init Thunker
@ -1082,10 +1089,10 @@ LegacyBiosInstall (
&MemoryAddress &MemoryAddress
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Private->IntThunk = (LOW_MEMORY_THUNK *) (UINTN) MemoryAddress; Private->IntThunk = (LOW_MEMORY_THUNK *)(UINTN)MemoryAddress;
EfiToLegacy16InitTable = &Private->IntThunk->EfiToLegacy16InitTable; EfiToLegacy16InitTable = &Private->IntThunk->EfiToLegacy16InitTable;
EfiToLegacy16InitTable->ThunkStart = (UINT32) (EFI_PHYSICAL_ADDRESS) (UINTN) MemoryAddress; EfiToLegacy16InitTable->ThunkStart = (UINT32)(EFI_PHYSICAL_ADDRESS)(UINTN)MemoryAddress;
EfiToLegacy16InitTable->ThunkSizeInBytes = (UINT32) (sizeof (LOW_MEMORY_THUNK)); EfiToLegacy16InitTable->ThunkSizeInBytes = (UINT32)(sizeof (LOW_MEMORY_THUNK));
Status = LegacyBiosInitializeThunk (Private); Status = LegacyBiosInitializeThunk (Private);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -1093,8 +1100,8 @@ LegacyBiosInstall (
// //
// Init the legacy memory map in memory < 1 MB. // Init the legacy memory map in memory < 1 MB.
// //
EfiToLegacy16InitTable->BiosLessThan1MB = (UINT32) MemoryAddressUnder1MB; EfiToLegacy16InitTable->BiosLessThan1MB = (UINT32)MemoryAddressUnder1MB;
EfiToLegacy16InitTable->LowPmmMemory = (UINT32) MemoryAddressUnder1MB; EfiToLegacy16InitTable->LowPmmMemory = (UINT32)MemoryAddressUnder1MB;
EfiToLegacy16InitTable->LowPmmMemorySizeInBytes = MemorySize; EfiToLegacy16InitTable->LowPmmMemorySizeInBytes = MemorySize;
MemorySize = PcdGet32 (PcdHighPmmMemorySize); MemorySize = PcdGet32 (PcdHighPmmMemorySize);
@ -1121,8 +1128,9 @@ LegacyBiosInstall (
&MemoryAddress &MemoryAddress
); );
} }
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
EfiToLegacy16InitTable->HiPmmMemory = (UINT32) (EFI_PHYSICAL_ADDRESS) (UINTN) MemoryAddress; EfiToLegacy16InitTable->HiPmmMemory = (UINT32)(EFI_PHYSICAL_ADDRESS)(UINTN)MemoryAddress;
EfiToLegacy16InitTable->HiPmmMemorySizeInBytes = MemorySize; EfiToLegacy16InitTable->HiPmmMemorySizeInBytes = MemorySize;
} }
@ -1135,13 +1143,14 @@ LegacyBiosInstall (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Initialize interrupt redirection code and entries; // Initialize interrupt redirection code and entries;
// IDT Vectors 0x68-0x6f must be redirected to IDT Vectors 0x08-0x0f. // IDT Vectors 0x68-0x6f must be redirected to IDT Vectors 0x08-0x0f.
// //
CopyMem ( CopyMem (
Private->IntThunk->InterruptRedirectionCode, Private->IntThunk->InterruptRedirectionCode,
(VOID *) (UINTN) InterruptRedirectionTemplate, (VOID *)(UINTN)InterruptRedirectionTemplate,
sizeof (Private->IntThunk->InterruptRedirectionCode) sizeof (Private->IntThunk->InterruptRedirectionCode)
); );
@ -1149,18 +1158,19 @@ LegacyBiosInstall (
// Save Unexpected interrupt vector so can restore it just prior to boot // Save Unexpected interrupt vector so can restore it just prior to boot
// //
ACCESS_PAGE0_CODE ( ACCESS_PAGE0_CODE (
BaseVectorMaster = (UINT32 *) (sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER); BaseVectorMaster = (UINT32 *)(sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER);
Private->BiosUnexpectedInt = BaseVectorMaster[0]; Private->BiosUnexpectedInt = BaseVectorMaster[0];
IntRedirCode = (UINT32) (UINTN) Private->IntThunk->InterruptRedirectionCode; IntRedirCode = (UINT32)(UINTN)Private->IntThunk->InterruptRedirectionCode;
for (Index = 0; Index < 8; Index++) { for (Index = 0; Index < 8; Index++) {
BaseVectorMaster[Index] = (EFI_SEGMENT (IntRedirCode + Index * 4) << 16) | EFI_OFFSET (IntRedirCode + Index * 4); BaseVectorMaster[Index] = (EFI_SEGMENT (IntRedirCode + Index * 4) << 16) | EFI_OFFSET (IntRedirCode + Index * 4);
} }
); );
// //
// Save EFI value // Save EFI value
// //
Private->ThunkSeg = (UINT16) (EFI_SEGMENT (IntRedirCode)); Private->ThunkSeg = (UINT16)(EFI_SEGMENT (IntRedirCode));
// //
// Allocate reserved memory for SMBIOS table used in legacy boot if SMBIOS table exists // Allocate reserved memory for SMBIOS table used in legacy boot if SMBIOS table exists
@ -1206,9 +1216,11 @@ LegacyBiosInstall (
); );
Private->Csm16PciInterfaceVersion = GetPciInterfaceVersion (Private); Private->Csm16PciInterfaceVersion = GetPciInterfaceVersion (Private);
DEBUG ((DEBUG_INFO, "CSM16 PCI BIOS Interface Version: %02x.%02x\n", DEBUG ((
(UINT8) (Private->Csm16PciInterfaceVersion >> 8), DEBUG_INFO,
(UINT8) Private->Csm16PciInterfaceVersion "CSM16 PCI BIOS Interface Version: %02x.%02x\n",
(UINT8)(Private->Csm16PciInterfaceVersion >> 8),
(UINT8)Private->Csm16PciInterfaceVersion
)); ));
ASSERT (Private->Csm16PciInterfaceVersion != 0); ASSERT (Private->Csm16PciInterfaceVersion != 0);
return Status; return Status;

View File

@ -9,7 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _LEGACY_BIOS_INTERFACE_ #ifndef _LEGACY_BIOS_INTERFACE_
#define _LEGACY_BIOS_INTERFACE_ #define _LEGACY_BIOS_INTERFACE_
#include <FrameworkDxe.h> #include <FrameworkDxe.h>
#include <IndustryStandard/Pci.h> #include <IndustryStandard/Pci.h>
#include <IndustryStandard/SmBios.h> #include <IndustryStandard/SmBios.h>
@ -591,10 +590,8 @@ typedef struct {
// CSM16 PCI Interface Version // CSM16 PCI Interface Version
// //
UINT16 Csm16PciInterfaceVersion; UINT16 Csm16PciInterfaceVersion;
} LEGACY_BIOS_INSTANCE; } LEGACY_BIOS_INSTANCE;
#pragma pack(1) #pragma pack(1)
/* /*
@ -699,7 +696,6 @@ LegacyBiosInt86 (
IN EFI_IA32_REGISTER_SET *Regs IN EFI_IA32_REGISTER_SET *Regs
); );
/** /**
Thunk to 16-bit real mode and call Segment:Offset. Regs will contain the 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 16-bit register context on entry and exit. Arguments can be passed on
@ -729,7 +725,6 @@ LegacyBiosFarCall86 (
IN UINTN StackSize IN UINTN StackSize
); );
/** /**
Test to see if a legacy PCI ROM exists for this device. Optionally return Test to see if a legacy PCI ROM exists for this device. Optionally return
the Legacy ROM instance for this PCI device. the Legacy ROM instance for this PCI device.
@ -755,7 +750,6 @@ LegacyBiosCheckPciRom (
OUT UINTN *Flags OUT UINTN *Flags
); );
/** /**
Assign drive number to legacy HDD drives prior to booting an EFI Assign drive number to legacy HDD drives prior to booting an EFI
aware OS so the OS can access drives without an EFI driver. aware OS so the OS can access drives without an EFI driver.
@ -777,7 +771,6 @@ LegacyBiosPrepareToBootEfi (
OUT BBS_TABLE **BbsTable OUT BBS_TABLE **BbsTable
); );
/** /**
To boot from an unconventional device like parties and/or execute To boot from an unconventional device like parties and/or execute
HDD diagnostics. HDD diagnostics.
@ -803,7 +796,6 @@ LegacyBiosBootUnconventionalDevice (
IN VOID *ServiceAreaData IN VOID *ServiceAreaData
); );
/** /**
Load a legacy PC-AT OPROM on the PciHandle device. Return information Load a legacy PC-AT OPROM on the PciHandle device. Return information
about how many disks were added by the OPROM and the shadow address and about how many disks were added by the OPROM and the shadow address and
@ -834,7 +826,7 @@ LegacyBiosBootUnconventionalDevice (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
LegacyBiosInstallPciRom ( LegacyBiosInstallPciRom (
IN EFI_LEGACY_BIOS_PROTOCOL * This, IN EFI_LEGACY_BIOS_PROTOCOL *This,
IN EFI_HANDLE PciHandle, IN EFI_HANDLE PciHandle,
IN VOID **RomImage, IN VOID **RomImage,
OUT UINTN *Flags, OUT UINTN *Flags,
@ -844,7 +836,6 @@ LegacyBiosInstallPciRom (
OUT UINT32 *RomShadowedSize OPTIONAL OUT UINT32 *RomShadowedSize OPTIONAL
); );
/** /**
Fill in the standard BDA for Keyboard LEDs Fill in the standard BDA for Keyboard LEDs
@ -861,7 +852,6 @@ LegacyBiosUpdateKeyboardLedStatus (
IN UINT8 Leds IN UINT8 Leds
); );
/** /**
Get all BBS info Get all BBS info
@ -886,7 +876,6 @@ LegacyBiosGetBbsInfo (
OUT BBS_TABLE **BbsTable OUT BBS_TABLE **BbsTable
); );
/** /**
Shadow all legacy16 OPROMs that haven't been shadowed. Shadow all legacy16 OPROMs that haven't been shadowed.
Warning: Use this with caution. This routine disconnects all EFI Warning: Use this with caution. This routine disconnects all EFI
@ -904,7 +893,6 @@ LegacyBiosShadowAllLegacyOproms (
IN EFI_LEGACY_BIOS_PROTOCOL *This IN EFI_LEGACY_BIOS_PROTOCOL *This
); );
/** /**
Attempt to legacy boot the BootOption. If the EFI contexted has been Attempt to legacy boot the BootOption. If the EFI contexted has been
compromised this function will not return. compromised this function will not return.
@ -926,7 +914,6 @@ LegacyBiosLegacyBoot (
IN VOID *LoadOptions IN VOID *LoadOptions
); );
/** /**
Allocate memory < 1 MB and copy the thunker code into low memory. Se up Allocate memory < 1 MB and copy the thunker code into low memory. Se up
all the descriptors. all the descriptors.
@ -941,7 +928,6 @@ LegacyBiosInitializeThunk (
IN LEGACY_BIOS_INSTANCE *Private IN LEGACY_BIOS_INSTANCE *Private
); );
/** /**
Fill in the standard BDA and EBDA stuff before Legacy16 load Fill in the standard BDA and EBDA stuff before Legacy16 load
@ -955,7 +941,6 @@ LegacyBiosInitBda (
IN LEGACY_BIOS_INSTANCE *Private IN LEGACY_BIOS_INSTANCE *Private
); );
/** /**
Collect IDE Inquiry data from the IDE disks Collect IDE Inquiry data from the IDE disks
@ -973,7 +958,6 @@ LegacyBiosBuildIdeData (
IN UINT16 Flag IN UINT16 Flag
); );
/** /**
Enable ide controller. This gets disabled when LegacyBoot.c is about Enable ide controller. This gets disabled when LegacyBoot.c is about
to run the Option ROMs. to run the Option ROMs.
@ -987,7 +971,6 @@ EnableIdeController (
IN LEGACY_BIOS_INSTANCE *Private IN LEGACY_BIOS_INSTANCE *Private
); );
/** /**
If the IDE channel is in compatibility (legacy) mode, remove all If the IDE channel is in compatibility (legacy) mode, remove all
PCI I/O BAR addresses from the controller. PCI I/O BAR addresses from the controller.
@ -1001,7 +984,6 @@ InitLegacyIdeController (
IN EFI_HANDLE IdeController IN EFI_HANDLE IdeController
); );
/** /**
Program the interrupt routing register in all the PCI devices. On a PC AT system Program the interrupt routing register in all the PCI devices. On a PC AT system
this register contains the 8259 IRQ vector that matches its PCI interrupt. this register contains the 8259 IRQ vector that matches its PCI interrupt.
@ -1017,7 +999,6 @@ PciProgramAllInterruptLineRegisters (
IN LEGACY_BIOS_INSTANCE *Private IN LEGACY_BIOS_INSTANCE *Private
); );
/** /**
Collect EFI Info about legacy devices. Collect EFI Info about legacy devices.
@ -1031,7 +1012,6 @@ LegacyBiosBuildSioData (
IN LEGACY_BIOS_INSTANCE *Private IN LEGACY_BIOS_INSTANCE *Private
); );
/** /**
Shadow all the PCI legacy ROMs. Use data from the Legacy BIOS Protocol Shadow all the PCI legacy ROMs. Use data from the Legacy BIOS Protocol
to chose the order. Skip any devices that have already have legacy to chose the order. Skip any devices that have already have legacy
@ -1048,7 +1028,6 @@ PciShadowRoms (
IN LEGACY_BIOS_INSTANCE *Private IN LEGACY_BIOS_INSTANCE *Private
); );
/** /**
Fill in the standard BDA and EBDA stuff prior to legacy Boot Fill in the standard BDA and EBDA stuff prior to legacy Boot
@ -1062,7 +1041,6 @@ LegacyBiosCompleteBdaBeforeBoot (
IN LEGACY_BIOS_INSTANCE *Private IN LEGACY_BIOS_INSTANCE *Private
); );
/** /**
Fill in the standard CMOS stuff before Legacy16 load Fill in the standard CMOS stuff before Legacy16 load
@ -1076,7 +1054,6 @@ LegacyBiosInitCmos (
IN LEGACY_BIOS_INSTANCE *Private IN LEGACY_BIOS_INSTANCE *Private
); );
/** /**
Fill in the standard CMOS stuff prior to legacy Boot Fill in the standard CMOS stuff prior to legacy Boot
@ -1090,7 +1067,6 @@ LegacyBiosCompleteStandardCmosBeforeBoot (
IN LEGACY_BIOS_INSTANCE *Private IN LEGACY_BIOS_INSTANCE *Private
); );
/** /**
Contains the code that is copied into low memory (below 640K). Contains the code that is copied into low memory (below 640K).
This code reflects interrupts 0x68-0x6f to interrupts 0x08-0x0f. This code reflects interrupts 0x68-0x6f to interrupts 0x08-0x0f.
@ -1105,7 +1081,6 @@ InterruptRedirectionTemplate (
VOID VOID
); );
/** /**
Build the E820 table. Build the E820 table.

View File

@ -60,25 +60,25 @@ PrintBbsTable (
DEBUG (( DEBUG ((
DEBUG_INFO, DEBUG_INFO,
" %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x", " %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x",
(UINTN) Index, (UINTN)Index,
(UINTN) BbsTable[Index].BootPriority, (UINTN)BbsTable[Index].BootPriority,
(UINTN) BbsTable[Index].Bus, (UINTN)BbsTable[Index].Bus,
(UINTN) BbsTable[Index].Device, (UINTN)BbsTable[Index].Device,
(UINTN) BbsTable[Index].Function, (UINTN)BbsTable[Index].Function,
(UINTN) BbsTable[Index].Class, (UINTN)BbsTable[Index].Class,
(UINTN) BbsTable[Index].SubClass, (UINTN)BbsTable[Index].SubClass,
(UINTN) BbsTable[Index].DeviceType, (UINTN)BbsTable[Index].DeviceType,
(UINTN) * (UINT16 *) &BbsTable[Index].StatusFlags (UINTN)*(UINT16 *)&BbsTable[Index].StatusFlags
)); ));
DEBUG (( DEBUG ((
DEBUG_INFO, DEBUG_INFO,
" %04x:%04x %04x:%04x %04x:%04x", " %04x:%04x %04x:%04x %04x:%04x",
(UINTN) BbsTable[Index].BootHandlerSegment, (UINTN)BbsTable[Index].BootHandlerSegment,
(UINTN) BbsTable[Index].BootHandlerOffset, (UINTN)BbsTable[Index].BootHandlerOffset,
(UINTN) BbsTable[Index].MfgStringSegment, (UINTN)BbsTable[Index].MfgStringSegment,
(UINTN) BbsTable[Index].MfgStringOffset, (UINTN)BbsTable[Index].MfgStringOffset,
(UINTN) BbsTable[Index].DescStringSegment, (UINTN)BbsTable[Index].DescStringSegment,
(UINTN) BbsTable[Index].DescStringOffset (UINTN)BbsTable[Index].DescStringOffset
)); ));
// //
@ -86,18 +86,20 @@ PrintBbsTable (
// //
String = (CHAR8 *)(((UINTN)BbsTable[Index].DescStringSegment << 4) + BbsTable[Index].DescStringOffset); String = (CHAR8 *)(((UINTN)BbsTable[Index].DescStringSegment << 4) + BbsTable[Index].DescStringOffset);
if (String != NULL) { if (String != NULL) {
DEBUG ((DEBUG_INFO," (")); DEBUG ((DEBUG_INFO, " ("));
for (SubIndex = 0; String[SubIndex] != 0; SubIndex++) { for (SubIndex = 0; String[SubIndex] != 0; SubIndex++) {
DEBUG ((DEBUG_INFO, "%c", String[SubIndex])); DEBUG ((DEBUG_INFO, "%c", String[SubIndex]));
} }
DEBUG ((DEBUG_INFO,")"));
DEBUG ((DEBUG_INFO, ")"));
} }
DEBUG ((DEBUG_INFO,"\n"));
DEBUG ((DEBUG_INFO, "\n"));
} }
DEBUG ((DEBUG_INFO, "\n")); DEBUG ((DEBUG_INFO, "\n"));
return ; return;
} }
/** /**
@ -129,7 +131,7 @@ PrintHddInfo (
DEBUG ((DEBUG_INFO, "\n")); DEBUG ((DEBUG_INFO, "\n"));
return ; return;
} }
/** /**
@ -167,7 +169,7 @@ PrintPciInterruptRegister (
DEBUG ((DEBUG_INFO, " bb/dd/ff interrupt line interrupt pin\n")); DEBUG ((DEBUG_INFO, " bb/dd/ff interrupt line interrupt pin\n"));
DEBUG ((DEBUG_INFO, "======================================\n")); DEBUG ((DEBUG_INFO, "======================================\n"));
for (Index = 0; Index < HandleNum; Index++) { for (Index = 0; Index < HandleNum; Index++) {
Status = gBS->HandleProtocol (Handles[Index], &gEfiPciIoProtocolGuid, (VOID **) &PciIo); Status = gBS->HandleProtocol (Handles[Index], &gEfiPciIoProtocolGuid, (VOID **)&PciIo);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
Status = PciIo->Pci.Read ( Status = PciIo->Pci.Read (
PciIo, PciIo,
@ -177,6 +179,7 @@ PrintPciInterruptRegister (
Interrupt Interrupt
); );
} }
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
Status = PciIo->GetLocation ( Status = PciIo->GetLocation (
PciIo, PciIo,
@ -186,11 +189,20 @@ PrintPciInterruptRegister (
&Function &Function
); );
} }
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, " %02x/%02x/%02x 0x%02x 0x%02x\n", DEBUG ((
Bus, Device, Function, Interrupt[0], Interrupt[1])); DEBUG_INFO,
" %02x/%02x/%02x 0x%02x 0x%02x\n",
Bus,
Device,
Function,
Interrupt[0],
Interrupt[1]
));
} }
} }
DEBUG ((DEBUG_INFO, "\n")); DEBUG ((DEBUG_INFO, "\n"));
if (Handles != NULL) { if (Handles != NULL) {
@ -271,11 +283,11 @@ UpdateSioData (
Private->LegacyBiosPlatform->GetRoutingTable ( Private->LegacyBiosPlatform->GetRoutingTable (
Private->LegacyBiosPlatform, Private->LegacyBiosPlatform,
(VOID *) &RoutingTable, (VOID *)&RoutingTable,
&RoutingTableEntries, &RoutingTableEntries,
NULL, NULL,
NULL, NULL,
(VOID **) &IrqPriorityTable, (VOID **)&IrqPriorityTable,
&NumberPriorityEntries &NumberPriorityEntries
); );
// //
@ -284,7 +296,7 @@ UpdateSioData (
for (Index = 0; Index <= 0x0b; Index++) { for (Index = 0; Index <= 0x0b; Index++) {
for (Index1 = 0; Index1 <= NumberPriorityEntries; Index1++) { for (Index1 = 0; Index1 <= NumberPriorityEntries; Index1++) {
if (LegacyInterrupts[Index] != 0) { if (LegacyInterrupts[Index] != 0) {
LegacyInt = (UINT16) (LegacyInt | (1 << LegacyInterrupts[Index])); LegacyInt = (UINT16)(LegacyInt | (1 << LegacyInterrupts[Index]));
if (LegacyInterrupts[Index] == IrqPriorityTable[Index1].Irq) { if (LegacyInterrupts[Index] == IrqPriorityTable[Index1].Irq) {
IrqPriorityTable[Index1].Used = LEGACY_USED; IrqPriorityTable[Index1].Used = LEGACY_USED;
} }
@ -304,7 +316,7 @@ UpdateSioData (
// Set SIO interrupts and disable mouse. Let mouse driver // Set SIO interrupts and disable mouse. Let mouse driver
// re-enable it. // re-enable it.
// //
LegMask = (UINT16) ((LegMask &~LegacyInt) | 0x1000); LegMask = (UINT16)((LegMask &~LegacyInt) | 0x1000);
Private->Legacy8259->SetMask ( Private->Legacy8259->SetMask (
Private->Legacy8259, Private->Legacy8259,
&LegMask, &LegMask,
@ -332,11 +344,10 @@ UpdateSioData (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
HandleBuffer[Index], HandleBuffer[Index],
&gEfiIsaIoProtocolGuid, &gEfiIsaIoProtocolGuid,
(VOID **) &IsaIo (VOID **)&IsaIo
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, 0x64, 1, &Register); IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, 0x64, 1, &Register);
} }
if (HandleBuffer != NULL) { if (HandleBuffer != NULL) {
@ -344,7 +355,6 @@ UpdateSioData (
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
@ -366,6 +376,7 @@ CalculateIdentifyDriveChecksum (
{ {
UINTN Index; UINTN Index;
UINT8 LocalChecksum; UINT8 LocalChecksum;
LocalChecksum = 0; LocalChecksum = 0;
*Checksum = 0; *Checksum = 0;
if (IdentifyDriveData[510] != 0xA5) { if (IdentifyDriveData[510] != 0xA5) {
@ -373,14 +384,13 @@ CalculateIdentifyDriveChecksum (
} }
for (Index = 0; Index < 512; Index++) { for (Index = 0; Index < 512; Index++) {
LocalChecksum = (UINT8) (LocalChecksum + IdentifyDriveData[Index]); LocalChecksum = (UINT8)(LocalChecksum + IdentifyDriveData[Index]);
} }
*Checksum = LocalChecksum; *Checksum = LocalChecksum;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Identify drive data must be updated to actual parameters before boot. Identify drive data must be updated to actual parameters before boot.
@ -406,11 +416,12 @@ UpdateIdentifyDriveData (
// Status indicates if Integrity byte is correct. Checksum should be // Status indicates if Integrity byte is correct. Checksum should be
// 0 if valid. // 0 if valid.
// //
ReadInfo = (ATAPI_IDENTIFY *) IdentifyDriveData; ReadInfo = (ATAPI_IDENTIFY *)IdentifyDriveData;
Status = CalculateIdentifyDriveChecksum (IdentifyDriveData, &OriginalChecksum); Status = CalculateIdentifyDriveChecksum (IdentifyDriveData, &OriginalChecksum);
if (OriginalChecksum != 0) { if (OriginalChecksum != 0) {
Status = EFI_SECURITY_VIOLATION; Status = EFI_SECURITY_VIOLATION;
} }
// //
// If NumberCylinders = 0 then do data(Controller present but don drive attached). // If NumberCylinders = 0 then do data(Controller present but don drive attached).
// //
@ -427,10 +438,10 @@ UpdateIdentifyDriveData (
// //
// Copy Multisector info and set valid bit. // Copy Multisector info and set valid bit.
// //
ReadInfo->Raw[59] = (UINT16) (ReadInfo->Raw[47] + 0x100); ReadInfo->Raw[59] = (UINT16)(ReadInfo->Raw[47] + 0x100);
CapacityInSectors = (UINT32) ((UINT32) (NumberCylinders) * (UINT32) (NumberHeads) * (UINT32) (NumberSectorsTrack)); CapacityInSectors = (UINT32)((UINT32)(NumberCylinders) * (UINT32)(NumberHeads) * (UINT32)(NumberSectorsTrack));
ReadInfo->Raw[57] = (UINT16) (CapacityInSectors >> 16); ReadInfo->Raw[57] = (UINT16)(CapacityInSectors >> 16);
ReadInfo->Raw[58] = (UINT16) (CapacityInSectors & 0xffff); ReadInfo->Raw[58] = (UINT16)(CapacityInSectors & 0xffff);
if (Status == EFI_SUCCESS) { if (Status == EFI_SUCCESS) {
// //
// Forece checksum byte to 0 and get new checksum. // Forece checksum byte to 0 and get new checksum.
@ -441,8 +452,8 @@ UpdateIdentifyDriveData (
// //
// Force new checksum such that sum is 0. // Force new checksum such that sum is 0.
// //
FinalChecksum = (UINT8) ((UINT8)0 - FinalChecksum); FinalChecksum = (UINT8)((UINT8)0 - FinalChecksum);
ReadInfo->Raw[255] = (UINT16) (ReadInfo->Raw[255] | (FinalChecksum << 8)); ReadInfo->Raw[255] = (UINT16)(ReadInfo->Raw[255] | (FinalChecksum << 8));
} }
} }
} }
@ -470,11 +481,11 @@ UpdateAllIdentifyDriveData (
// Each controller can have 2 devices. Update for each device // Each controller can have 2 devices. Update for each device
// //
if ((HddInfo[Index].Status & HDD_MASTER_IDE) != 0) { if ((HddInfo[Index].Status & HDD_MASTER_IDE) != 0) {
UpdateIdentifyDriveData ((UINT8 *) (&HddInfo[Index].IdentifyDrive[0].Raw[0])); UpdateIdentifyDriveData ((UINT8 *)(&HddInfo[Index].IdentifyDrive[0].Raw[0]));
} }
if ((HddInfo[Index].Status & HDD_SLAVE_IDE) != 0) { if ((HddInfo[Index].Status & HDD_SLAVE_IDE) != 0) {
UpdateIdentifyDriveData ((UINT8 *) (&HddInfo[Index].IdentifyDrive[1].Raw[0])); UpdateIdentifyDriveData ((UINT8 *)(&HddInfo[Index].IdentifyDrive[1].Raw[0]));
} }
} }
} }
@ -512,7 +523,7 @@ EnableIdeController (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
IdeController, IdeController,
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID **) &PciIo (VOID **)&PciIo
); );
ByteBuffer = 0x1f; ByteBuffer = 0x1f;
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
@ -521,7 +532,6 @@ EnableIdeController (
} }
} }
/** /**
Enable ide controller. This gets disabled when LegacyBoot.c is about Enable ide controller. This gets disabled when LegacyBoot.c is about
to run the Option ROMs. to run the Option ROMs.
@ -563,7 +573,7 @@ EnableAllControllers (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
HandleBuffer[Index], HandleBuffer[Index],
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID **) &PciIo (VOID **)&PciIo
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -600,8 +610,8 @@ EnableAllControllers (
IS_PCI_IDE (&PciConfigHeader) || IS_PCI_IDE (&PciConfigHeader) ||
IS_PCI_P2P (&PciConfigHeader) || IS_PCI_P2P (&PciConfigHeader) ||
IS_PCI_P2P_SUB (&PciConfigHeader) || IS_PCI_P2P_SUB (&PciConfigHeader) ||
IS_PCI_LPC (&PciConfigHeader) )) { IS_PCI_LPC (&PciConfigHeader)))
{
PciConfigHeader.Hdr.Command |= 0x1f; PciConfigHeader.Hdr.Command |= 0x1f;
PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 4, 1, &PciConfigHeader.Hdr.Command); PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 4, 1, &PciConfigHeader.Hdr.Command);
@ -660,7 +670,7 @@ LegacyGetDataOrTable (
Status = LegacyBiosPlatform->GetPlatformInfo ( Status = LegacyBiosPlatform->GetPlatformInfo (
LegacyBiosPlatform, LegacyBiosPlatform,
Id, Id,
(VOID *) &Table, (VOID *)&Table,
&TableSize, &TableSize,
&Location, &Location,
&Alignment, &Alignment,
@ -684,9 +694,9 @@ LegacyGetDataOrTable (
ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET)); ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET));
Regs.X.AX = Legacy16GetTableAddress; Regs.X.AX = Legacy16GetTableAddress;
Regs.X.CX = (UINT16) TableSize; Regs.X.CX = (UINT16)TableSize;
Regs.X.BX = (UINT16) Location; Regs.X.BX = (UINT16)Location;
Regs.X.DX = (UINT16) Alignment; Regs.X.DX = (UINT16)Alignment;
Private->LegacyBios.FarCall86 ( Private->LegacyBios.FarCall86 (
This, This,
Private->Legacy16CallSegment, Private->Legacy16CallSegment,
@ -703,13 +713,14 @@ LegacyGetDataOrTable (
break; break;
} }
} }
// //
// Phase 2 Call routine second time with address to allow address adjustment // Phase 2 Call routine second time with address to allow address adjustment
// //
Status = LegacyBiosPlatform->GetPlatformInfo ( Status = LegacyBiosPlatform->GetPlatformInfo (
LegacyBiosPlatform, LegacyBiosPlatform,
Id, Id,
(VOID *) &Table, (VOID *)&Table,
&TableSize, &TableSize,
&Location, &Location,
&Alignment, &Alignment,
@ -719,7 +730,7 @@ LegacyGetDataOrTable (
switch (Id) { switch (Id) {
case EfiGetPlatformBinaryMpTable: case EfiGetPlatformBinaryMpTable:
{ {
Legacy16Table->MpTablePtr = (UINT32) (Regs.X.DS * 16 + Regs.X.BX); Legacy16Table->MpTablePtr = (UINT32)(Regs.X.DS * 16 + Regs.X.BX);
Legacy16Table->MpTableLength = (UINT32)TableSize; Legacy16Table->MpTableLength = (UINT32)TableSize;
DEBUG ((DEBUG_INFO, "MP table in legacy region - %x\n", (UINTN)Legacy16Table->MpTablePtr)); DEBUG ((DEBUG_INFO, "MP table in legacy region - %x\n", (UINTN)Legacy16Table->MpTablePtr));
break; break;
@ -727,7 +738,6 @@ LegacyGetDataOrTable (
case EfiGetPlatformBinaryOemIntData: case EfiGetPlatformBinaryOemIntData:
{ {
Legacy16Table->OemIntSegment = Regs.X.DS; Legacy16Table->OemIntSegment = Regs.X.DS;
Legacy16Table->OemIntOffset = Regs.X.BX; Legacy16Table->OemIntOffset = Regs.X.BX;
DEBUG ((DEBUG_INFO, "OemInt table in legacy region - %04x:%04x\n", (UINTN)Legacy16Table->OemIntSegment, (UINTN)Legacy16Table->OemIntOffset)); DEBUG ((DEBUG_INFO, "OemInt table in legacy region - %04x:%04x\n", (UINTN)Legacy16Table->OemIntSegment, (UINTN)Legacy16Table->OemIntOffset));
@ -760,13 +770,14 @@ LegacyGetDataOrTable (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Phase 3 Copy table to final location // Phase 3 Copy table to final location
// //
TablePtr = (UINT32) (Regs.X.DS * 16 + Regs.X.BX); TablePtr = (UINT32)(Regs.X.DS * 16 + Regs.X.BX);
CopyMem ( CopyMem (
(VOID *) (UINTN)TablePtr, (VOID *)(UINTN)TablePtr,
Table, Table,
TableSize TableSize
); );
@ -787,17 +798,18 @@ CreateSmbiosTableInReservedMemory (
if ((mRuntimeSmbiosEntryPoint == NULL) || if ((mRuntimeSmbiosEntryPoint == NULL) ||
(mReserveSmbiosEntryPoint == 0) || (mReserveSmbiosEntryPoint == 0) ||
(mStructureTableAddress == 0)) { (mStructureTableAddress == 0))
{
return; return;
} }
EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) mRuntimeSmbiosEntryPoint; EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *)mRuntimeSmbiosEntryPoint;
// //
// Copy SMBIOS Entry Point Structure // Copy SMBIOS Entry Point Structure
// //
CopyMem ( CopyMem (
(VOID *)(UINTN) mReserveSmbiosEntryPoint, (VOID *)(UINTN)mReserveSmbiosEntryPoint,
EntryPointStructure, EntryPointStructure,
EntryPointStructure->EntryPointLength EntryPointStructure->EntryPointLength
); );
@ -806,16 +818,16 @@ CreateSmbiosTableInReservedMemory (
// Copy SMBIOS Structure Table into EfiReservedMemoryType memory // Copy SMBIOS Structure Table into EfiReservedMemoryType memory
// //
CopyMem ( CopyMem (
(VOID *)(UINTN) mStructureTableAddress, (VOID *)(UINTN)mStructureTableAddress,
(VOID *)(UINTN) EntryPointStructure->TableAddress, (VOID *)(UINTN)EntryPointStructure->TableAddress,
EntryPointStructure->TableLength EntryPointStructure->TableLength
); );
// //
// Update TableAddress in Entry Point Structure // Update TableAddress in Entry Point Structure
// //
EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *)(UINTN) mReserveSmbiosEntryPoint; EntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *)(UINTN)mReserveSmbiosEntryPoint;
EntryPointStructure->TableAddress = (UINT32)(UINTN) mStructureTableAddress; EntryPointStructure->TableAddress = (UINT32)(UINTN)mStructureTableAddress;
// //
// Fixup checksums in the Entry Point Structure // Fixup checksums in the Entry Point Structure
@ -825,11 +837,11 @@ CreateSmbiosTableInReservedMemory (
EntryPointStructure->IntermediateChecksum = EntryPointStructure->IntermediateChecksum =
CalculateCheckSum8 ( CalculateCheckSum8 (
(UINT8 *) EntryPointStructure + OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString), (UINT8 *)EntryPointStructure + OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString),
EntryPointStructure->EntryPointLength - OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString) EntryPointStructure->EntryPointLength - OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString)
); );
EntryPointStructure->EntryPointStructureChecksum = EntryPointStructure->EntryPointStructureChecksum =
CalculateCheckSum8 ((UINT8 *) EntryPointStructure, EntryPointStructure->EntryPointLength); CalculateCheckSum8 ((UINT8 *)EntryPointStructure, EntryPointStructure->EntryPointLength);
} }
/** /**
@ -911,6 +923,7 @@ GenericLegacyBoot (
IdeController = HandleBuffer[0]; IdeController = HandleBuffer[0];
} }
} }
// //
// Unlock the Legacy BIOS region // Unlock the Legacy BIOS region
// //
@ -928,9 +941,9 @@ GenericLegacyBoot (
if (CopySize > Private->Legacy16Table->E820Length) { if (CopySize > Private->Legacy16Table->E820Length) {
ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET)); ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET));
Regs.X.AX = Legacy16GetTableAddress; Regs.X.AX = Legacy16GetTableAddress;
Regs.X.BX = (UINT16) 0x0; // Any region Regs.X.BX = (UINT16)0x0; // Any region
Regs.X.CX = (UINT16) CopySize; Regs.X.CX = (UINT16)CopySize;
Regs.X.DX = (UINT16) 0x4; // Alignment Regs.X.DX = (UINT16)0x4; // Alignment
Private->LegacyBios.FarCall86 ( Private->LegacyBios.FarCall86 (
&Private->LegacyBios, &Private->LegacyBios,
Private->Legacy16Table->Compatibility16CallSegment, Private->Legacy16Table->Compatibility16CallSegment,
@ -940,25 +953,25 @@ GenericLegacyBoot (
0 0
); );
Private->Legacy16Table->E820Pointer = (UINT32) (Regs.X.DS * 16 + Regs.X.BX); Private->Legacy16Table->E820Pointer = (UINT32)(Regs.X.DS * 16 + Regs.X.BX);
Private->Legacy16Table->E820Length = (UINT32) CopySize; Private->Legacy16Table->E820Length = (UINT32)CopySize;
if (Regs.X.AX != 0) { if (Regs.X.AX != 0) {
DEBUG ((DEBUG_ERROR, "Legacy16 E820 length insufficient\n")); DEBUG ((DEBUG_ERROR, "Legacy16 E820 length insufficient\n"));
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} else { } else {
CopyMem ( CopyMem (
(VOID *)(UINTN) Private->Legacy16Table->E820Pointer, (VOID *)(UINTN)Private->Legacy16Table->E820Pointer,
Private->E820Table, Private->E820Table,
CopySize CopySize
); );
} }
} else { } else {
CopyMem ( CopyMem (
(VOID *)(UINTN) Private->Legacy16Table->E820Pointer, (VOID *)(UINTN)Private->Legacy16Table->E820Pointer,
Private->E820Table, Private->E820Table,
CopySize CopySize
); );
Private->Legacy16Table->E820Length = (UINT32) CopySize; Private->Legacy16Table->E820Length = (UINT32)CopySize;
} }
// //
@ -967,6 +980,7 @@ GenericLegacyBoot (
if (mReserveSmbiosEntryPoint == 0) { if (mReserveSmbiosEntryPoint == 0) {
DEBUG ((DEBUG_INFO, "Smbios table is not found!\n")); DEBUG ((DEBUG_INFO, "Smbios table is not found!\n"));
} }
CreateSmbiosTableInReservedMemory (); CreateSmbiosTableInReservedMemory ();
EfiToLegacy16BootTable->SmbiosTable = (UINT32)(UINTN)mReserveSmbiosEntryPoint; EfiToLegacy16BootTable->SmbiosTable = (UINT32)(UINTN)mReserveSmbiosEntryPoint;
@ -981,12 +995,14 @@ GenericLegacyBoot (
&AcpiTable &AcpiTable
); );
} }
// //
// We do not ASSERT if AcpiTable not found. It is possible that a platform does not produce AcpiTable. // We do not ASSERT if AcpiTable not found. It is possible that a platform does not produce AcpiTable.
// //
if (AcpiTable == NULL) { if (AcpiTable == NULL) {
DEBUG ((DEBUG_INFO, "ACPI table is not found!\n")); DEBUG ((DEBUG_INFO, "ACPI table is not found!\n"));
} }
EfiToLegacy16BootTable->AcpiTable = (UINT32)(UINTN)AcpiTable; EfiToLegacy16BootTable->AcpiTable = (UINT32)(UINTN)AcpiTable;
// //
@ -995,21 +1011,21 @@ GenericLegacyBoot (
// Rev != 0 Length is UINT32 at offset 20 decimal // Rev != 0 Length is UINT32 at offset 20 decimal
// //
if (AcpiTable != NULL) { if (AcpiTable != NULL) {
AcpiPtr = AcpiTable; AcpiPtr = AcpiTable;
if (*((UINT8 *) AcpiPtr + 15) == 0) { if (*((UINT8 *)AcpiPtr + 15) == 0) {
CopySize = 20; CopySize = 20;
} else { } else {
AcpiPtr = ((UINT8 *) AcpiPtr + 20); AcpiPtr = ((UINT8 *)AcpiPtr + 20);
CopySize = (*(UINT32 *) AcpiPtr); CopySize = (*(UINT32 *)AcpiPtr);
} }
CopyMem ( CopyMem (
(VOID *)(UINTN) Private->Legacy16Table->AcpiRsdPtrPointer, (VOID *)(UINTN)Private->Legacy16Table->AcpiRsdPtrPointer,
AcpiTable, AcpiTable,
CopySize CopySize
); );
} }
// //
// Make sure all PCI Interrupt Line register are programmed to match 8259 // Make sure all PCI Interrupt Line register are programmed to match 8259
// //
@ -1034,6 +1050,7 @@ GenericLegacyBoot (
if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) { if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) {
UpdateSioData (Private); UpdateSioData (Private);
} }
// //
// Setup BDA and EBDA standard areas before Legacy Boot // Setup BDA and EBDA standard areas before Legacy Boot
// //
@ -1072,7 +1089,7 @@ GenericLegacyBoot (
// //
LocalTime = (LocalTime * 182) / 10; LocalTime = (LocalTime * 182) / 10;
ACCESS_PAGE0_CODE ( ACCESS_PAGE0_CODE (
BdaPtr = (UINT32 *) (UINTN)0x46C; BdaPtr = (UINT32 *)(UINTN)0x46C;
*BdaPtr = LocalTime; *BdaPtr = LocalTime;
); );
@ -1130,13 +1147,15 @@ GenericLegacyBoot (
for (Index = 0; Index < MAX_IDE_CONTROLLER; Index++) { for (Index = 0; Index < MAX_IDE_CONTROLLER; Index++) {
if ((LocalHddInfo[Index].IdentifyDrive[0].Raw[0] != 0) && if ((LocalHddInfo[Index].IdentifyDrive[0].Raw[0] != 0) &&
(LocalBbsTable[2 * Index + 1].BootPriority == BBS_IGNORE_ENTRY) (LocalBbsTable[2 * Index + 1].BootPriority == BBS_IGNORE_ENTRY)
) { )
{
LocalBbsTable[2 * Index + 1].BootPriority = BBS_UNPRIORITIZED_ENTRY; LocalBbsTable[2 * Index + 1].BootPriority = BBS_UNPRIORITIZED_ENTRY;
} }
if ((LocalHddInfo[Index].IdentifyDrive[1].Raw[0] != 0) && if ((LocalHddInfo[Index].IdentifyDrive[1].Raw[0] != 0) &&
(LocalBbsTable[2 * Index + 2].BootPriority == BBS_IGNORE_ENTRY) (LocalBbsTable[2 * Index + 2].BootPriority == BBS_IGNORE_ENTRY)
) { )
{
LocalBbsTable[2 * Index + 2].BootPriority = BBS_UNPRIORITIZED_ENTRY; LocalBbsTable[2 * Index + 2].BootPriority = BBS_UNPRIORITIZED_ENTRY;
} }
} }
@ -1154,24 +1173,27 @@ GenericLegacyBoot (
mBbsTable, mBbsTable,
mLoadOptionsSize, mLoadOptionsSize,
mLoadOptions, mLoadOptions,
(VOID *) &Private->IntThunk->EfiToLegacy16BootTable (VOID *)&Private->IntThunk->EfiToLegacy16BootTable
); );
// //
// If no boot device return to BDS // If no boot device return to BDS
// //
if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) { if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) {
for (Index = 0; Index < BbsCount; Index++){ for (Index = 0; Index < BbsCount; Index++) {
if ((LocalBbsTable[Index].BootPriority != BBS_DO_NOT_BOOT_FROM) && if ((LocalBbsTable[Index].BootPriority != BBS_DO_NOT_BOOT_FROM) &&
(LocalBbsTable[Index].BootPriority != BBS_UNPRIORITIZED_ENTRY) && (LocalBbsTable[Index].BootPriority != BBS_UNPRIORITIZED_ENTRY) &&
(LocalBbsTable[Index].BootPriority != BBS_IGNORE_ENTRY)) { (LocalBbsTable[Index].BootPriority != BBS_IGNORE_ENTRY))
{
break; break;
} }
} }
if (Index == BbsCount) { if (Index == BbsCount) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
} }
// //
// Let the Legacy16 code know the device path type for legacy boot // Let the Legacy16 code know the device path type for legacy boot
// //
@ -1229,6 +1251,7 @@ GenericLegacyBoot (
if (Regs.X.AX != 0) { if (Regs.X.AX != 0) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
// //
// Lock the Legacy BIOS region // Lock the Legacy BIOS region
// //
@ -1240,13 +1263,18 @@ GenericLegacyBoot (
); );
if ((Private->Legacy16Table->TableLength >= OFFSET_OF (EFI_COMPATIBILITY16_TABLE, HiPermanentMemoryAddress)) && if ((Private->Legacy16Table->TableLength >= OFFSET_OF (EFI_COMPATIBILITY16_TABLE, HiPermanentMemoryAddress)) &&
((Private->Legacy16Table->UmaAddress != 0) && (Private->Legacy16Table->UmaSize != 0))) { ((Private->Legacy16Table->UmaAddress != 0) && (Private->Legacy16Table->UmaSize != 0)))
{
// //
// Here we could reduce UmaAddress down as far as Private->OptionRom, taking into // Here we could reduce UmaAddress down as far as Private->OptionRom, taking into
// account the granularity of the access control. // account the granularity of the access control.
// //
DEBUG((DEBUG_INFO, "Unlocking UMB RAM region 0x%x-0x%x\n", Private->Legacy16Table->UmaAddress, DEBUG ((
Private->Legacy16Table->UmaAddress + Private->Legacy16Table->UmaSize)); DEBUG_INFO,
"Unlocking UMB RAM region 0x%x-0x%x\n",
Private->Legacy16Table->UmaAddress,
Private->Legacy16Table->UmaAddress + Private->Legacy16Table->UmaSize
));
Private->LegacyRegion->UnLock ( Private->LegacyRegion->UnLock (
Private->LegacyRegion, Private->LegacyRegion,
@ -1271,7 +1299,6 @@ GenericLegacyBoot (
// //
EnableAllControllers (Private); EnableAllControllers (Private);
if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) { if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) {
// //
// Signal all the events that are waiting on EVT_SIGNAL_LEGACY_BOOT // Signal all the events that are waiting on EVT_SIGNAL_LEGACY_BOOT
// //
@ -1297,7 +1324,6 @@ GenericLegacyBoot (
// //
SaveAndSetDebugTimerInterrupt (FALSE); SaveAndSetDebugTimerInterrupt (FALSE);
// //
// Put the 8259 into its legacy mode by reprogramming the vector bases // Put the 8259 into its legacy mode by reprogramming the vector bases
// //
@ -1321,13 +1347,14 @@ GenericLegacyBoot (
// //
// //
ACCESS_PAGE0_CODE ( ACCESS_PAGE0_CODE (
BaseVectorMaster = (UINT32 *) (sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER); BaseVectorMaster = (UINT32 *)(sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER);
for (Index = 0; Index < 8; Index++) { for (Index = 0; Index < 8; Index++) {
Private->ThunkSavedInt[Index] = BaseVectorMaster[Index]; Private->ThunkSavedInt[Index] = BaseVectorMaster[Index];
if (Private->ThunkSeg == (UINT16) (BaseVectorMaster[Index] >> 16)) { if (Private->ThunkSeg == (UINT16)(BaseVectorMaster[Index] >> 16)) {
BaseVectorMaster[Index] = (UINT32) (Private->BiosUnexpectedInt); BaseVectorMaster[Index] = (UINT32)(Private->BiosUnexpectedInt);
} }
} }
); );
ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET)); ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET));
@ -1343,12 +1370,14 @@ GenericLegacyBoot (
); );
ACCESS_PAGE0_CODE ( ACCESS_PAGE0_CODE (
BaseVectorMaster = (UINT32 *) (sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER); BaseVectorMaster = (UINT32 *)(sizeof (UINT32) * PROTECTED_MODE_BASE_VECTOR_MASTER);
for (Index = 0; Index < 8; Index++) { for (Index = 0; Index < 8; Index++) {
BaseVectorMaster[Index] = Private->ThunkSavedInt[Index]; BaseVectorMaster[Index] = Private->ThunkSavedInt[Index];
} }
); );
} }
Private->LegacyBootEntered = TRUE; Private->LegacyBootEntered = TRUE;
if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) { if ((mBootMode == BOOT_LEGACY_OS) || (mBootMode == BOOT_UNCONVENTIONAL_DEVICE)) {
// //
@ -1364,7 +1393,6 @@ GenericLegacyBoot (
} }
} }
/** /**
Assign drive number to legacy HDD drives prior to booting an EFI Assign drive number to legacy HDD drives prior to booting an EFI
aware OS so the OS can access drives without an EFI driver. aware OS so the OS can access drives without an EFI driver.
@ -1395,8 +1423,8 @@ LegacyBiosPrepareToBootEfi (
mBootMode = BOOT_EFI_OS; mBootMode = BOOT_EFI_OS;
mBbsDevicePathPtr = NULL; mBbsDevicePathPtr = NULL;
Status = GenericLegacyBoot (This); Status = GenericLegacyBoot (This);
*BbsTable = (BBS_TABLE*)(UINTN)EfiToLegacy16BootTable->BbsTable; *BbsTable = (BBS_TABLE *)(UINTN)EfiToLegacy16BootTable->BbsTable;
*BbsCount = (UINT16) (sizeof (Private->IntThunk->BbsTable) / sizeof (BBS_TABLE)); *BbsCount = (UINT16)(sizeof (Private->IntThunk->BbsTable) / sizeof (BBS_TABLE));
return Status; return Status;
} }
@ -1449,17 +1477,19 @@ LegacyBiosBootUnconventionalDevice (
if ((Attributes.DirectoryServiceValidity == 0) && if ((Attributes.DirectoryServiceValidity == 0) &&
(Attributes.RabcaUsedFlag == 0) && (Attributes.RabcaUsedFlag == 0) &&
(Attributes.ExecuteHddDiagnosticsFlag == 0) (Attributes.ExecuteHddDiagnosticsFlag == 0)
) { )
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (((Attributes.DirectoryServiceValidity != 0) && (ServiceAreaData == NULL)) || if (((Attributes.DirectoryServiceValidity != 0) && (ServiceAreaData == NULL)) ||
(((Attributes.DirectoryServiceValidity | Attributes.RabcaUsedFlag) != 0) && (BeerData == NULL)) (((Attributes.DirectoryServiceValidity | Attributes.RabcaUsedFlag) != 0) && (BeerData == NULL))
) { )
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
UcdTable = (UD_TABLE *) AllocatePool ( UcdTable = (UD_TABLE *)AllocatePool (
sizeof (UD_TABLE) sizeof (UD_TABLE)
); );
if (NULL == UcdTable) { if (NULL == UcdTable) {
@ -1468,39 +1498,41 @@ LegacyBiosBootUnconventionalDevice (
EfiToLegacy16BootTable->UnconventionalDeviceTable = (UINT32)(UINTN)UcdTable; EfiToLegacy16BootTable->UnconventionalDeviceTable = (UINT32)(UINTN)UcdTable;
UcdTable->Attributes = Attributes; UcdTable->Attributes = Attributes;
UcdTable->BbsTableEntryNumberForParentDevice = (UINT8) BbsEntry; UcdTable->BbsTableEntryNumberForParentDevice = (UINT8)BbsEntry;
// //
// Force all existing BBS entries to DoNotBoot. This allows 16-bit CSM // Force all existing BBS entries to DoNotBoot. This allows 16-bit CSM
// to assign drive numbers but bot boot from. Only newly created entries // to assign drive numbers but bot boot from. Only newly created entries
// will be valid. // will be valid.
// //
BbsTable = (BBS_TABLE*)(UINTN)EfiToLegacy16BootTable->BbsTable; BbsTable = (BBS_TABLE *)(UINTN)EfiToLegacy16BootTable->BbsTable;
for (Index = 0; Index < EfiToLegacy16BootTable->NumberBbsEntries; Index++) { for (Index = 0; Index < EfiToLegacy16BootTable->NumberBbsEntries; Index++) {
BbsTable[Index].BootPriority = BBS_DO_NOT_BOOT_FROM; BbsTable[Index].BootPriority = BBS_DO_NOT_BOOT_FROM;
} }
// //
// If parent is onboard IDE then assign controller & device number // If parent is onboard IDE then assign controller & device number
// else they are 0. // else they are 0.
// //
if (BbsEntry < MAX_IDE_CONTROLLER * 2) { if (BbsEntry < MAX_IDE_CONTROLLER * 2) {
UcdTable->DeviceNumber = (UINT8) ((BbsEntry - 1) % 2); UcdTable->DeviceNumber = (UINT8)((BbsEntry - 1) % 2);
} }
if (BeerData != NULL) { if (BeerData != NULL) {
CopyMem ( CopyMem (
(VOID *) UcdTable->BeerData, (VOID *)UcdTable->BeerData,
BeerData, BeerData,
(UINTN) 128 (UINTN)128
); );
} }
if (ServiceAreaData != NULL) { if (ServiceAreaData != NULL) {
CopyMem ( CopyMem (
(VOID *) UcdTable->ServiceAreaData, (VOID *)UcdTable->ServiceAreaData,
ServiceAreaData, ServiceAreaData,
(UINTN) 64 (UINTN)64
); );
} }
// //
// For each new entry do the following: // For each new entry do the following:
// 1. Increment current number of BBS entries // 1. Increment current number of BBS entries
@ -1514,8 +1546,8 @@ LegacyBiosBootUnconventionalDevice (
EfiToLegacy16BootTable->NumberBbsEntries += 1; EfiToLegacy16BootTable->NumberBbsEntries += 1;
CopyMem ( CopyMem (
(VOID *) &BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootPriority, (VOID *)&BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootPriority,
(VOID *) &BbsTable[BbsEntry].BootPriority, (VOID *)&BbsTable[BbsEntry].BootPriority,
sizeof (BBS_TABLE) sizeof (BBS_TABLE)
); );
@ -1523,7 +1555,7 @@ LegacyBiosBootUnconventionalDevice (
BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootHandlerSegment = 0; BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootHandlerSegment = 0;
BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].DeviceType = 0x80; BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].DeviceType = 0x80;
UcdTable->BbsTableEntryNumberForHddDiag = (UINT8) (EfiToLegacy16BootTable->NumberBbsEntries - 1); UcdTable->BbsTableEntryNumberForHddDiag = (UINT8)(EfiToLegacy16BootTable->NumberBbsEntries - 1);
BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootPriority = BootPriority; BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootPriority = BootPriority;
BootPriority += 1; BootPriority += 1;
@ -1537,15 +1569,15 @@ LegacyBiosBootUnconventionalDevice (
if (((Attributes.DirectoryServiceValidity | Attributes.RabcaUsedFlag)) != 0) { if (((Attributes.DirectoryServiceValidity | Attributes.RabcaUsedFlag)) != 0) {
EfiToLegacy16BootTable->NumberBbsEntries += 1; EfiToLegacy16BootTable->NumberBbsEntries += 1;
CopyMem ( CopyMem (
(VOID *) &BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootPriority, (VOID *)&BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootPriority,
(VOID *) &BbsTable[BbsEntry].BootPriority, (VOID *)&BbsTable[BbsEntry].BootPriority,
sizeof (BBS_TABLE) sizeof (BBS_TABLE)
); );
BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootHandlerOffset = 0; BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootHandlerOffset = 0;
BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootHandlerSegment = 0; BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootHandlerSegment = 0;
BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].DeviceType = 0x01; BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].DeviceType = 0x01;
UcdTable->BbsTableEntryNumberForBoot = (UINT8) (EfiToLegacy16BootTable->NumberBbsEntries - 1); UcdTable->BbsTableEntryNumberForBoot = (UINT8)(EfiToLegacy16BootTable->NumberBbsEntries - 1);
BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootPriority = BootPriority; BbsTable[EfiToLegacy16BootTable->NumberBbsEntries].BootPriority = BootPriority;
// //
@ -1553,6 +1585,7 @@ LegacyBiosBootUnconventionalDevice (
// //
mBbsDevicePathNode.DeviceType = BBS_TYPE_FLOPPY; mBbsDevicePathNode.DeviceType = BBS_TYPE_FLOPPY;
} }
// //
// Build the BBS Device Path for this boot selection // Build the BBS Device Path for this boot selection
// //
@ -1689,7 +1722,7 @@ LegacyBiosBuildE820 (
UINTN Above1MIndex; UINTN Above1MIndex;
UINT64 MemoryBlockLength; UINT64 MemoryBlockLength;
E820Table = (EFI_E820_ENTRY64 *) Private->E820Table; E820Table = (EFI_E820_ENTRY64 *)Private->E820Table;
// //
// Get the EFI memory map. // Get the EFI memory map.
@ -1712,7 +1745,7 @@ LegacyBiosBuildE820 (
// EfiMemoryMapEnd which is dependent upon EfiMemoryMapSize. Otherwise // EfiMemoryMapEnd which is dependent upon EfiMemoryMapSize. Otherwise
// we process bogus entries and create bogus E820 entries. // we process bogus entries and create bogus E820 entries.
// //
EfiMemoryMap = (EFI_MEMORY_DESCRIPTOR *) AllocatePool (EfiMemoryMapSize); EfiMemoryMap = (EFI_MEMORY_DESCRIPTOR *)AllocatePool (EfiMemoryMapSize);
ASSERT (EfiMemoryMap != NULL); ASSERT (EfiMemoryMap != NULL);
Status = gBS->GetMemoryMap ( Status = gBS->GetMemoryMap (
&EfiMemoryMapSize, &EfiMemoryMapSize,
@ -1737,7 +1770,7 @@ LegacyBiosBuildE820 (
// //
ACCESS_PAGE0_CODE ( ACCESS_PAGE0_CODE (
E820Table[0].BaseAddr = 0; E820Table[0].BaseAddr = 0;
E820Table[0].Length = (UINT64) ((*(UINT16 *) (UINTN)0x40E) << 4); E820Table[0].Length = (UINT64)((*(UINT16 *)(UINTN)0x40E) << 4);
E820Table[0].Type = EfiAcpiAddressRangeMemory; E820Table[0].Type = EfiAcpiAddressRangeMemory;
); );
@ -1745,7 +1778,7 @@ LegacyBiosBuildE820 (
// Second entry is (640k - EBDA) to 640k // Second entry is (640k - EBDA) to 640k
// //
E820Table[1].BaseAddr = E820Table[0].Length; E820Table[1].BaseAddr = E820Table[0].Length;
E820Table[1].Length = (UINT64) ((640 * 1024) - E820Table[0].Length); E820Table[1].Length = (UINT64)((640 * 1024) - E820Table[0].Length);
E820Table[1].Type = EfiAcpiAddressRangeReserved; E820Table[1].Type = EfiAcpiAddressRangeReserved;
// //
@ -1775,7 +1808,7 @@ LegacyBiosBuildE820 (
// //
EfiEntry = EfiMemoryMap; EfiEntry = EfiMemoryMap;
NextEfiEntry = NEXT_MEMORY_DESCRIPTOR (EfiEntry, EfiDescriptorSize); NextEfiEntry = NEXT_MEMORY_DESCRIPTOR (EfiEntry, EfiDescriptorSize);
EfiMemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) EfiMemoryMap + EfiMemoryMapSize); EfiMemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)EfiMemoryMap + EfiMemoryMapSize);
while (EfiEntry < EfiMemoryMapEnd) { while (EfiEntry < EfiMemoryMapEnd) {
while (NextEfiEntry < EfiMemoryMapEnd) { while (NextEfiEntry < EfiMemoryMapEnd) {
if (EfiEntry->PhysicalStart > NextEfiEntry->PhysicalStart) { if (EfiEntry->PhysicalStart > NextEfiEntry->PhysicalStart) {
@ -1792,9 +1825,9 @@ LegacyBiosBuildE820 (
} }
EfiEntry = EfiMemoryMap; EfiEntry = EfiMemoryMap;
EfiMemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) EfiMemoryMap + EfiMemoryMapSize); EfiMemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)EfiMemoryMap + EfiMemoryMapSize);
for (Index = Above1MIndex; (EfiEntry < EfiMemoryMapEnd) && (Index < EFI_MAX_E820_ENTRY - 1); ) { for (Index = Above1MIndex; (EfiEntry < EfiMemoryMapEnd) && (Index < EFI_MAX_E820_ENTRY - 1); ) {
MemoryBlockLength = (UINT64) (LShiftU64 (EfiEntry->NumberOfPages, 12)); MemoryBlockLength = (UINT64)(LShiftU64 (EfiEntry->NumberOfPages, 12));
if ((EfiEntry->PhysicalStart + MemoryBlockLength) < 0x100000) { if ((EfiEntry->PhysicalStart + MemoryBlockLength) < 0x100000) {
// //
// Skip the memory block if under 1MB // Skip the memory block if under 1MB
@ -1828,6 +1861,7 @@ LegacyBiosBuildE820 (
E820Table[Index].Type = TempType; E820Table[Index].Type = TempType;
} }
} }
EfiEntry = NEXT_MEMORY_DESCRIPTOR (EfiEntry, EfiDescriptorSize); EfiEntry = NEXT_MEMORY_DESCRIPTOR (EfiEntry, EfiDescriptorSize);
} }
@ -1837,13 +1871,14 @@ LegacyBiosBuildE820 (
// Process the reserved memory map to produce E820 map ; // Process the reserved memory map to produce E820 map ;
// //
for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) { for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
if (Hob.Raw != NULL && GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { if ((Hob.Raw != NULL) && (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR)) {
ResourceHob = Hob.ResourceDescriptor; ResourceHob = Hob.ResourceDescriptor;
if (((ResourceHob->ResourceType == EFI_RESOURCE_MEMORY_MAPPED_IO) || if (((ResourceHob->ResourceType == EFI_RESOURCE_MEMORY_MAPPED_IO) ||
(ResourceHob->ResourceType == EFI_RESOURCE_FIRMWARE_DEVICE) || (ResourceHob->ResourceType == EFI_RESOURCE_FIRMWARE_DEVICE) ||
(ResourceHob->ResourceType == EFI_RESOURCE_MEMORY_RESERVED) ) && (ResourceHob->ResourceType == EFI_RESOURCE_MEMORY_RESERVED)) &&
(ResourceHob->PhysicalStart > 0x100000) && (ResourceHob->PhysicalStart > 0x100000) &&
(Index < EFI_MAX_E820_ENTRY - 1)) { (Index < EFI_MAX_E820_ENTRY - 1))
{
++Index; ++Index;
E820Table[Index].BaseAddr = ResourceHob->PhysicalStart; E820Table[Index].BaseAddr = ResourceHob->PhysicalStart;
E820Table[Index].Length = ResourceHob->ResourceLength; E820Table[Index].Length = ResourceHob->ResourceLength;
@ -1852,11 +1887,11 @@ LegacyBiosBuildE820 (
} }
} }
Index ++; Index++;
Private->IntThunk->EfiToLegacy16InitTable.NumberE820Entries = (UINT32)Index; Private->IntThunk->EfiToLegacy16InitTable.NumberE820Entries = (UINT32)Index;
Private->IntThunk->EfiToLegacy16BootTable.NumberE820Entries = (UINT32)Index; Private->IntThunk->EfiToLegacy16BootTable.NumberE820Entries = (UINT32)Index;
Private->NumberE820Entries = (UINT32)Index; Private->NumberE820Entries = (UINT32)Index;
*Size = (UINTN) (Index * sizeof (EFI_E820_ENTRY64)); *Size = (UINTN)(Index * sizeof (EFI_E820_ENTRY64));
// //
// Sort E820Table from low to high // Sort E820Table from low to high
@ -1889,49 +1924,50 @@ LegacyBiosBuildE820 (
// Remove the overlap range // Remove the overlap range
// //
for (TempIndex = 1; TempIndex < Index; TempIndex++) { for (TempIndex = 1; TempIndex < Index; TempIndex++) {
if (E820Table[TempIndex - 1].BaseAddr <= E820Table[TempIndex].BaseAddr && if ((E820Table[TempIndex - 1].BaseAddr <= E820Table[TempIndex].BaseAddr) &&
((E820Table[TempIndex - 1].BaseAddr + E820Table[TempIndex - 1].Length) >= ((E820Table[TempIndex - 1].BaseAddr + E820Table[TempIndex - 1].Length) >=
(E820Table[TempIndex].BaseAddr +E820Table[TempIndex].Length))) { (E820Table[TempIndex].BaseAddr +E820Table[TempIndex].Length)))
{
// //
//Overlap range is found // Overlap range is found
// //
ASSERT (E820Table[TempIndex - 1].Type == E820Table[TempIndex].Type); ASSERT (E820Table[TempIndex - 1].Type == E820Table[TempIndex].Type);
if (TempIndex == Index - 1) { if (TempIndex == Index - 1) {
E820Table[TempIndex].BaseAddr = 0; E820Table[TempIndex].BaseAddr = 0;
E820Table[TempIndex].Length = 0; E820Table[TempIndex].Length = 0;
E820Table[TempIndex].Type = (EFI_ACPI_MEMORY_TYPE) 0; E820Table[TempIndex].Type = (EFI_ACPI_MEMORY_TYPE)0;
Index--; Index--;
break; break;
} else { } else {
for (IndexSort = TempIndex; IndexSort < Index - 1; IndexSort ++) { for (IndexSort = TempIndex; IndexSort < Index - 1; IndexSort++) {
E820Table[IndexSort].BaseAddr = E820Table[IndexSort + 1].BaseAddr; E820Table[IndexSort].BaseAddr = E820Table[IndexSort + 1].BaseAddr;
E820Table[IndexSort].Length = E820Table[IndexSort + 1].Length; E820Table[IndexSort].Length = E820Table[IndexSort + 1].Length;
E820Table[IndexSort].Type = E820Table[IndexSort + 1].Type; E820Table[IndexSort].Type = E820Table[IndexSort + 1].Type;
} }
Index--; Index--;
} }
} }
} }
Private->IntThunk->EfiToLegacy16InitTable.NumberE820Entries = (UINT32)Index; Private->IntThunk->EfiToLegacy16InitTable.NumberE820Entries = (UINT32)Index;
Private->IntThunk->EfiToLegacy16BootTable.NumberE820Entries = (UINT32)Index; Private->IntThunk->EfiToLegacy16BootTable.NumberE820Entries = (UINT32)Index;
Private->NumberE820Entries = (UINT32)Index; Private->NumberE820Entries = (UINT32)Index;
*Size = (UINTN) (Index * sizeof (EFI_E820_ENTRY64)); *Size = (UINTN)(Index * sizeof (EFI_E820_ENTRY64));
// //
// Determine OS usable memory above 1MB // Determine OS usable memory above 1MB
// //
Private->IntThunk->EfiToLegacy16BootTable.OsMemoryAbove1Mb = 0x0000; Private->IntThunk->EfiToLegacy16BootTable.OsMemoryAbove1Mb = 0x0000;
for (TempIndex = Above1MIndex; TempIndex < Index; TempIndex++) { for (TempIndex = Above1MIndex; TempIndex < Index; TempIndex++) {
if (E820Table[TempIndex].BaseAddr >= 0x100000 && E820Table[TempIndex].BaseAddr < 0x100000000ULL) { // not include above 4G memory if ((E820Table[TempIndex].BaseAddr >= 0x100000) && (E820Table[TempIndex].BaseAddr < 0x100000000ULL)) {
// not include above 4G memory
// //
// ACPIReclaimMemory is also usable memory for ACPI OS, after OS dumps all ACPI tables. // ACPIReclaimMemory is also usable memory for ACPI OS, after OS dumps all ACPI tables.
// //
if ((E820Table[TempIndex].Type == EfiAcpiAddressRangeMemory) || (E820Table[TempIndex].Type == EfiAcpiAddressRangeACPI)) { if ((E820Table[TempIndex].Type == EfiAcpiAddressRangeMemory) || (E820Table[TempIndex].Type == EfiAcpiAddressRangeACPI)) {
Private->IntThunk->EfiToLegacy16BootTable.OsMemoryAbove1Mb += (UINT32) (E820Table[TempIndex].Length); Private->IntThunk->EfiToLegacy16BootTable.OsMemoryAbove1Mb += (UINT32)(E820Table[TempIndex].Length);
} else { } else {
break; // break at first not normal memory, because SMM may use reserved memory. break; // break at first not normal memory, because SMM may use reserved memory.
} }
@ -1944,7 +1980,9 @@ LegacyBiosBuildE820 (
// Print DEBUG information // Print DEBUG information
// //
for (TempIndex = 0; TempIndex < Index; TempIndex++) { for (TempIndex = 0; TempIndex < Index; TempIndex++) {
DEBUG((DEBUG_INFO, "E820[%2d]: 0x%016lx - 0x%016lx, Type = %d\n", DEBUG ((
DEBUG_INFO,
"E820[%2d]: 0x%016lx - 0x%016lx, Type = %d\n",
TempIndex, TempIndex,
E820Table[TempIndex].BaseAddr, E820Table[TempIndex].BaseAddr,
(E820Table[TempIndex].BaseAddr + E820Table[TempIndex].Length), (E820Table[TempIndex].BaseAddr + E820Table[TempIndex].Length),
@ -1955,7 +1993,6 @@ LegacyBiosBuildE820 (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Fill in the standard BDA and EBDA stuff prior to legacy Boot Fill in the standard BDA and EBDA stuff prior to legacy Boot
@ -1973,7 +2010,7 @@ LegacyBiosCompleteBdaBeforeBoot (
UINT16 MachineConfig; UINT16 MachineConfig;
DEVICE_PRODUCER_DATA_HEADER *SioPtr; DEVICE_PRODUCER_DATA_HEADER *SioPtr;
Bda = (BDA_STRUC *) ((UINTN) 0x400); Bda = (BDA_STRUC *)((UINTN)0x400);
MachineConfig = 0; MachineConfig = 0;
SioPtr = &(Private->IntThunk->EfiToLegacy16BootTable.SioData); SioPtr = &(Private->IntThunk->EfiToLegacy16BootTable.SioData);
@ -2014,9 +2051,9 @@ LegacyBiosCompleteBdaBeforeBoot (
MachineConfig += 0x4000; MachineConfig += 0x4000;
} }
Bda->NumberOfDrives = (UINT8) (Bda->NumberOfDrives + Private->IdeDriveCount); Bda->NumberOfDrives = (UINT8)(Bda->NumberOfDrives + Private->IdeDriveCount);
if (SioPtr->Floppy.NumberOfFloppy != 0x00) { if (SioPtr->Floppy.NumberOfFloppy != 0x00) {
MachineConfig = (UINT16) (MachineConfig + 0x01 + (SioPtr->Floppy.NumberOfFloppy - 1) * 0x40); MachineConfig = (UINT16)(MachineConfig + 0x01 + (SioPtr->Floppy.NumberOfFloppy - 1) * 0x40);
Bda->FloppyXRate = 0x07; Bda->FloppyXRate = 0x07;
} }
@ -2028,7 +2065,7 @@ LegacyBiosCompleteBdaBeforeBoot (
// //
// Force VGA and Coprocessor, indicate 101/102 keyboard // Force VGA and Coprocessor, indicate 101/102 keyboard
// //
MachineConfig = (UINT16) (MachineConfig + 0x00 + 0x02 + (SioPtr->MousePresent * 0x04)); MachineConfig = (UINT16)(MachineConfig + 0x00 + 0x02 + (SioPtr->MousePresent * 0x04));
Bda->MachineConfig = MachineConfig; Bda->MachineConfig = MachineConfig;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -2058,13 +2095,13 @@ LegacyBiosUpdateKeyboardLedStatus (
Private = LEGACY_BIOS_INSTANCE_FROM_THIS (This); Private = LEGACY_BIOS_INSTANCE_FROM_THIS (This);
ACCESS_PAGE0_CODE ( ACCESS_PAGE0_CODE (
Bda = (BDA_STRUC *) ((UINTN) 0x400); Bda = (BDA_STRUC *)((UINTN)0x400);
LocalLeds = Leds; LocalLeds = Leds;
Bda->LedStatus = (UINT8) ((Bda->LedStatus &~0x07) | LocalLeds); Bda->LedStatus = (UINT8)((Bda->LedStatus &~0x07) | LocalLeds);
LocalLeds = (UINT8) (LocalLeds << 4); LocalLeds = (UINT8)(LocalLeds << 4);
Bda->ShiftStatus = (UINT8) ((Bda->ShiftStatus &~0x70) | LocalLeds); Bda->ShiftStatus = (UINT8)((Bda->ShiftStatus &~0x70) | LocalLeds);
LocalLeds = (UINT8) (Leds & 0x20); LocalLeds = (UINT8)(Leds & 0x20);
Bda->KeyboardStatus = (UINT8) ((Bda->KeyboardStatus &~0x20) | LocalLeds); Bda->KeyboardStatus = (UINT8)((Bda->KeyboardStatus &~0x20) | LocalLeds);
); );
// //
@ -2086,7 +2123,6 @@ LegacyBiosUpdateKeyboardLedStatus (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Fill in the standard CMOS stuff prior to legacy Boot Fill in the standard CMOS stuff prior to legacy Boot

View File

@ -66,12 +66,12 @@ LegacyCalculateWriteStandardCmosChecksum (
for (Checksum = 0, Register = 0x10; Register < 0x2e; Register++) { for (Checksum = 0, Register = 0x10; Register < 0x2e; Register++) {
Checksum = (UINT16)(Checksum + LegacyReadStandardCmos (Register)); Checksum = (UINT16)(Checksum + LegacyReadStandardCmos (Register));
} }
LegacyWriteStandardCmos (CMOS_2E, (UINT8)(Checksum >> 8)); LegacyWriteStandardCmos (CMOS_2E, (UINT8)(Checksum >> 8));
LegacyWriteStandardCmos (CMOS_2F, (UINT8)(Checksum & 0xff)); LegacyWriteStandardCmos (CMOS_2F, (UINT8)(Checksum & 0xff));
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Fill in the standard CMOS stuff before Legacy16 load Fill in the standard CMOS stuff before Legacy16 load

View File

@ -66,7 +66,7 @@ LegacyBiosBuildIdeData (
0, 0,
&HandleBuffer, &HandleBuffer,
&HandleCount, &HandleCount,
(VOID *) &LocalHddInfo (VOID *)&LocalHddInfo
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
IdeController = HandleBuffer[0]; IdeController = HandleBuffer[0];
@ -93,7 +93,7 @@ LegacyBiosBuildIdeData (
0, 0,
&HandleBuffer, &HandleBuffer,
&HandleCount, &HandleCount,
(VOID *) &LocalHddInfo (VOID *)&LocalHddInfo
); );
} }
@ -110,12 +110,12 @@ LegacyBiosBuildIdeData (
&HandleBuffer &HandleBuffer
); );
Private->IdeDriveCount = (UINT8) HandleCount; Private->IdeDriveCount = (UINT8)HandleCount;
for (Index = 0; Index < HandleCount; Index++) { for (Index = 0; Index < HandleCount; Index++) {
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
HandleBuffer[Index], HandleBuffer[Index],
&gEfiDiskInfoProtocolGuid, &gEfiDiskInfoProtocolGuid,
(VOID **) &DiskInfo (VOID **)&DiskInfo
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -126,7 +126,7 @@ LegacyBiosBuildIdeData (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
HandleBuffer[Index], HandleBuffer[Index],
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID *) &DevicePath (VOID *)&DevicePath
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -134,12 +134,14 @@ LegacyBiosBuildIdeData (
while (!IsDevicePathEnd (DevicePathNode)) { while (!IsDevicePathEnd (DevicePathNode)) {
TempDevicePathNode = NextDevicePathNode (DevicePathNode); TempDevicePathNode = NextDevicePathNode (DevicePathNode);
if ((DevicePathType (DevicePathNode) == HARDWARE_DEVICE_PATH) && if ((DevicePathType (DevicePathNode) == HARDWARE_DEVICE_PATH) &&
( DevicePathSubType (DevicePathNode) == HW_PCI_DP) && (DevicePathSubType (DevicePathNode) == HW_PCI_DP) &&
( DevicePathType(TempDevicePathNode) == MESSAGING_DEVICE_PATH) && (DevicePathType (TempDevicePathNode) == MESSAGING_DEVICE_PATH) &&
( DevicePathSubType(TempDevicePathNode) == MSG_ATAPI_DP) ) { (DevicePathSubType (TempDevicePathNode) == MSG_ATAPI_DP))
PciDevicePath = (PCI_DEVICE_PATH *) DevicePathNode; {
PciDevicePath = (PCI_DEVICE_PATH *)DevicePathNode;
break; break;
} }
DevicePathNode = NextDevicePathNode (DevicePathNode); DevicePathNode = NextDevicePathNode (DevicePathNode);
} }
@ -161,7 +163,8 @@ LegacyBiosBuildIdeData (
for (PciIndex = 0; PciIndex < 8; PciIndex++) { for (PciIndex = 0; PciIndex < 8; PciIndex++) {
if ((PciDevicePath->Device == LocalHddInfo[PciIndex].Device) && if ((PciDevicePath->Device == LocalHddInfo[PciIndex].Device) &&
(PciDevicePath->Function == LocalHddInfo[PciIndex].Function) (PciDevicePath->Function == LocalHddInfo[PciIndex].Function)
) { )
{
break; break;
} }
} }
@ -192,7 +195,7 @@ LegacyBiosBuildIdeData (
&InquiryDataSize &InquiryDataSize
); );
if (Status == EFI_BUFFER_TOO_SMALL) { if (Status == EFI_BUFFER_TOO_SMALL) {
InquiryData = (UINT8 *) AllocatePool ( InquiryData = (UINT8 *)AllocatePool (
InquiryDataSize InquiryDataSize
); );
if (InquiryData != NULL) { if (InquiryData != NULL) {
@ -227,6 +230,7 @@ LegacyBiosBuildIdeData (
LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_SLAVE_ATAPI_ZIPDISK; LocalHddInfo[PciIndex + IdeChannel].Status |= HDD_SLAVE_ATAPI_ZIPDISK;
} }
} }
FreePool (InquiryData); FreePool (InquiryData);
} else { } else {
if (IdeDevice == 0) { if (IdeDevice == 0) {
@ -246,7 +250,6 @@ LegacyBiosBuildIdeData (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
If the IDE channel is in compatibility (legacy) mode, remove all If the IDE channel is in compatibility (legacy) mode, remove all
PCI I/O BAR addresses from the controller. PCI I/O BAR addresses from the controller.
@ -277,20 +280,21 @@ InitLegacyIdeController (
(VOID **)&PciIo (VOID **)&PciIo
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return ; return;
} }
Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0, sizeof (PciData), &PciData); Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0, sizeof (PciData), &PciData);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return ; return;
} }
// //
// Check whether this is IDE // Check whether this is IDE
// //
if ((PciData.Hdr.ClassCode[2] != PCI_CLASS_MASS_STORAGE) || if ((PciData.Hdr.ClassCode[2] != PCI_CLASS_MASS_STORAGE) ||
(PciData.Hdr.ClassCode[1] != PCI_CLASS_MASS_STORAGE_IDE)) { (PciData.Hdr.ClassCode[1] != PCI_CLASS_MASS_STORAGE_IDE))
return ; {
return;
} }
// //
@ -301,10 +305,11 @@ InitLegacyIdeController (
PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x10, 1, &IOBarClear); PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x10, 1, &IOBarClear);
PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x14, 1, &IOBarClear); PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x14, 1, &IOBarClear);
} }
if ((PciData.Hdr.ClassCode[0] & IDE_PI_REGISTER_SNE) == 0) { if ((PciData.Hdr.ClassCode[0] & IDE_PI_REGISTER_SNE) == 0) {
PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x18, 1, &IOBarClear); PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x18, 1, &IOBarClear);
PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x1C, 1, &IOBarClear); PciIo->Pci.Write (PciIo, EfiPciIoWidthUint32, 0x1C, 1, &IOBarClear);
} }
return ; return;
} }

File diff suppressed because it is too large Load Diff

View File

@ -61,11 +61,12 @@ LegacyBiosBuildSioDataFromSio (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
// //
// Collect legacy information from each of the ISA controllers in the system // Collect legacy information from each of the ISA controllers in the system
// //
for (Index = 0; Index < HandleCount; Index++) { for (Index = 0; Index < HandleCount; Index++) {
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSioProtocolGuid, (VOID **) &Sio); Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiSioProtocolGuid, (VOID **)&Sio);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
continue; continue;
} }
@ -81,24 +82,24 @@ LegacyBiosBuildSioDataFromSio (
while (Resources.SmallHeader->Byte != ACPI_END_TAG_DESCRIPTOR) { while (Resources.SmallHeader->Byte != ACPI_END_TAG_DESCRIPTOR) {
switch (Resources.SmallHeader->Byte) { switch (Resources.SmallHeader->Byte) {
case ACPI_IO_PORT_DESCRIPTOR: case ACPI_IO_PORT_DESCRIPTOR:
IoResource = (EFI_ACPI_IO_PORT_DESCRIPTOR *) Resources.SmallHeader; IoResource = (EFI_ACPI_IO_PORT_DESCRIPTOR *)Resources.SmallHeader;
Address = IoResource->BaseAddressMin; Address = IoResource->BaseAddressMin;
break; break;
case ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR: case ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR:
FixedIoResource = (EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR *) Resources.SmallHeader; FixedIoResource = (EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR *)Resources.SmallHeader;
Address = FixedIoResource->BaseAddress; Address = FixedIoResource->BaseAddress;
break; break;
case ACPI_DMA_DESCRIPTOR: case ACPI_DMA_DESCRIPTOR:
DmaResource = (EFI_ACPI_DMA_DESCRIPTOR *) Resources.SmallHeader; DmaResource = (EFI_ACPI_DMA_DESCRIPTOR *)Resources.SmallHeader;
Dma = (UINT8) LowBitSet32 (DmaResource->ChannelMask); Dma = (UINT8)LowBitSet32 (DmaResource->ChannelMask);
break; break;
case ACPI_IRQ_DESCRIPTOR: case ACPI_IRQ_DESCRIPTOR:
case ACPI_IRQ_NOFLAG_DESCRIPTOR: case ACPI_IRQ_NOFLAG_DESCRIPTOR:
IrqResource = (EFI_ACPI_IRQ_NOFLAG_DESCRIPTOR *) Resources.SmallHeader; IrqResource = (EFI_ACPI_IRQ_NOFLAG_DESCRIPTOR *)Resources.SmallHeader;
Irq = (UINT8) LowBitSet32 (IrqResource->Mask); Irq = (UINT8)LowBitSet32 (IrqResource->Mask);
break; break;
default: default:
@ -106,11 +107,11 @@ LegacyBiosBuildSioDataFromSio (
} }
if (Resources.SmallHeader->Bits.Type == 0) { if (Resources.SmallHeader->Bits.Type == 0) {
Resources.SmallHeader = (ACPI_SMALL_RESOURCE_HEADER *) ((UINT8 *) Resources.SmallHeader Resources.SmallHeader = (ACPI_SMALL_RESOURCE_HEADER *)((UINT8 *)Resources.SmallHeader
+ Resources.SmallHeader->Bits.Length + Resources.SmallHeader->Bits.Length
+ sizeof (*Resources.SmallHeader)); + sizeof (*Resources.SmallHeader));
} else { } else {
Resources.LargeHeader = (ACPI_LARGE_RESOURCE_HEADER *) ((UINT8 *) Resources.LargeHeader Resources.LargeHeader = (ACPI_LARGE_RESOURCE_HEADER *)((UINT8 *)Resources.LargeHeader
+ Resources.LargeHeader->Length + Resources.LargeHeader->Length
+ sizeof (*Resources.LargeHeader)); + sizeof (*Resources.LargeHeader));
} }
@ -126,13 +127,14 @@ LegacyBiosBuildSioDataFromSio (
Acpi = NULL; Acpi = NULL;
while (!IsDevicePathEnd (DevicePath)) { while (!IsDevicePathEnd (DevicePath)) {
Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath; Acpi = (ACPI_HID_DEVICE_PATH *)DevicePath;
DevicePath = NextDevicePathNode (DevicePath); DevicePath = NextDevicePathNode (DevicePath);
} }
if ((Acpi == NULL) || (DevicePathType (Acpi) != ACPI_DEVICE_PATH) || if ((Acpi == NULL) || (DevicePathType (Acpi) != ACPI_DEVICE_PATH) ||
((DevicePathSubType (Acpi) != ACPI_DP) && (DevicePathSubType (Acpi) != ACPI_EXTENDED_DP)) ((DevicePathSubType (Acpi) != ACPI_DP) && (DevicePathSubType (Acpi) != ACPI_EXTENDED_DP))
) { )
{
continue; continue;
} }
@ -141,9 +143,8 @@ LegacyBiosBuildSioDataFromSio (
// //
// Ignore DMA resource since it is always returned NULL // Ignore DMA resource since it is always returned NULL
// //
if (Acpi->HID == EISA_PNP_ID (0x500) || Acpi->HID == EISA_PNP_ID (0x501)) { if ((Acpi->HID == EISA_PNP_ID (0x500)) || (Acpi->HID == EISA_PNP_ID (0x501))) {
if ((Acpi->UID < 4) && (Address != MAX_UINT16) && (Irq != MAX_UINT8)) {
if (Acpi->UID < 4 && Address != MAX_UINT16 && Irq != MAX_UINT8) {
// //
// Get the handle of the child device that has opened the Super I/O Protocol // Get the handle of the child device that has opened the Super I/O Protocol
// //
@ -156,9 +157,10 @@ LegacyBiosBuildSioDataFromSio (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
continue; continue;
} }
for (ChildIndex = 0; ChildIndex < EntryCount; ChildIndex++) { for (ChildIndex = 0; ChildIndex < EntryCount; ChildIndex++) {
if ((OpenInfoBuffer[ChildIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { if ((OpenInfoBuffer[ChildIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
Status = gBS->HandleProtocol (OpenInfoBuffer[ChildIndex].ControllerHandle, &gEfiSerialIoProtocolGuid, (VOID **) &SerialIo); Status = gBS->HandleProtocol (OpenInfoBuffer[ChildIndex].ControllerHandle, &gEfiSerialIoProtocolGuid, (VOID **)&SerialIo);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
SioSerial = &SioPtr->Serial[Acpi->UID]; SioSerial = &SioPtr->Serial[Acpi->UID];
SioSerial->Address = Address; SioSerial->Address = Address;
@ -172,14 +174,15 @@ LegacyBiosBuildSioDataFromSio (
FreePool (OpenInfoBuffer); FreePool (OpenInfoBuffer);
} }
} }
// //
// See if this is an ISA parallel port // See if this is an ISA parallel port
// //
// Ignore DMA resource since it is always returned NULL, port // Ignore DMA resource since it is always returned NULL, port
// only used in output mode. // only used in output mode.
// //
if (Acpi->HID == EISA_PNP_ID (0x400) || Acpi->HID == EISA_PNP_ID (0x401)) { if ((Acpi->HID == EISA_PNP_ID (0x400)) || (Acpi->HID == EISA_PNP_ID (0x401))) {
if (Acpi->UID < 3 && Address != MAX_UINT16 && Irq != MAX_UINT8 && Dma != MAX_UINT8) { if ((Acpi->UID < 3) && (Address != MAX_UINT16) && (Irq != MAX_UINT8) && (Dma != MAX_UINT8)) {
SioParallel = &SioPtr->Parallel[Acpi->UID]; SioParallel = &SioPtr->Parallel[Acpi->UID];
SioParallel->Address = Address; SioParallel->Address = Address;
SioParallel->Irq = Irq; SioParallel->Irq = Irq;
@ -187,12 +190,13 @@ LegacyBiosBuildSioDataFromSio (
SioParallel->Mode = DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY; SioParallel->Mode = DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY;
} }
} }
// //
// See if this is an ISA floppy controller // See if this is an ISA floppy controller
// //
if (Acpi->HID == EISA_PNP_ID (0x604)) { if (Acpi->HID == EISA_PNP_ID (0x604)) {
if (Address != MAX_UINT16 && Irq != MAX_UINT8 && Dma != MAX_UINT8) { if ((Address != MAX_UINT16) && (Irq != MAX_UINT8) && (Dma != MAX_UINT8)) {
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiBlockIoProtocolGuid, (VOID **) &BlockIo); Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiBlockIoProtocolGuid, (VOID **)&BlockIo);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
SioFloppy = &SioPtr->Floppy; SioFloppy = &SioPtr->Floppy;
SioFloppy->Address = Address; SioFloppy->Address = Address;
@ -202,6 +206,7 @@ LegacyBiosBuildSioDataFromSio (
} }
} }
} }
// //
// See if this is a mouse // See if this is a mouse
// Always set mouse found so USB hot plug will work // Always set mouse found so USB hot plug will work
@ -225,7 +230,6 @@ LegacyBiosBuildSioDataFromSio (
FreePool (HandleBuffer); FreePool (HandleBuffer);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
@ -274,12 +278,12 @@ LegacyBiosBuildSioDataFromIsaIo (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
// //
// Collect legacy information from each of the ISA controllers in the system // Collect legacy information from each of the ISA controllers in the system
// //
for (Index = 0; Index < HandleCount; Index++) { for (Index = 0; Index < HandleCount; Index++) {
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiIsaIoProtocolGuid, (VOID **)&IsaIo);
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiIsaIoProtocolGuid, (VOID **) &IsaIo);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
continue; continue;
} }
@ -289,6 +293,7 @@ LegacyBiosBuildSioDataFromIsaIo (
if (ResourceList == NULL) { if (ResourceList == NULL) {
continue; continue;
} }
// //
// Collect the resource types neededto fill in the SIO data structure // Collect the resource types neededto fill in the SIO data structure
// //
@ -298,7 +303,8 @@ LegacyBiosBuildSioDataFromIsaIo (
for (ResourceIndex = 0; for (ResourceIndex = 0;
ResourceList->ResourceItem[ResourceIndex].Type != EfiIsaAcpiResourceEndOfList; ResourceList->ResourceItem[ResourceIndex].Type != EfiIsaAcpiResourceEndOfList;
ResourceIndex++ ResourceIndex++
) { )
{
switch (ResourceList->ResourceItem[ResourceIndex].Type) { switch (ResourceList->ResourceItem[ResourceIndex].Type) {
case EfiIsaAcpiResourceIo: case EfiIsaAcpiResourceIo:
IoResource = &ResourceList->ResourceItem[ResourceIndex]; IoResource = &ResourceList->ResourceItem[ResourceIndex];
@ -319,17 +325,18 @@ LegacyBiosBuildSioDataFromIsaIo (
break; break;
} }
} }
// //
// See if this is an ISA serial port // See if this is an ISA serial port
// //
// Ignore DMA resource since it is always returned NULL // 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.HID == EISA_PNP_ID (0x500)) || (ResourceList->Device.HID == EISA_PNP_ID (0x501))) {
if ((ResourceList->Device.UID <= 3) &&
if (ResourceList->Device.UID <= 3 && (IoResource != NULL) &&
IoResource != NULL && (InterruptResource != NULL)
InterruptResource != NULL )
) { {
// //
// Get the handle of the child device that has opened the ISA I/O Protocol // Get the handle of the child device that has opened the ISA I/O Protocol
// //
@ -342,16 +349,17 @@ LegacyBiosBuildSioDataFromIsaIo (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
continue; continue;
} }
// //
// We want resource for legacy even if no 32-bit driver installed // We want resource for legacy even if no 32-bit driver installed
// //
for (ChildIndex = 0; ChildIndex < EntryCount; ChildIndex++) { for (ChildIndex = 0; ChildIndex < EntryCount; ChildIndex++) {
if ((OpenInfoBuffer[ChildIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { if ((OpenInfoBuffer[ChildIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
Status = gBS->HandleProtocol (OpenInfoBuffer[ChildIndex].ControllerHandle, &gEfiSerialIoProtocolGuid, (VOID **) &SerialIo); Status = gBS->HandleProtocol (OpenInfoBuffer[ChildIndex].ControllerHandle, &gEfiSerialIoProtocolGuid, (VOID **)&SerialIo);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
SioSerial = &SioPtr->Serial[ResourceList->Device.UID]; SioSerial = &SioPtr->Serial[ResourceList->Device.UID];
SioSerial->Address = (UINT16) IoResource->StartRange; SioSerial->Address = (UINT16)IoResource->StartRange;
SioSerial->Irq = (UINT8) InterruptResource->StartRange; SioSerial->Irq = (UINT8)InterruptResource->StartRange;
SioSerial->Mode = DEVICE_SERIAL_MODE_NORMAL | DEVICE_SERIAL_MODE_DUPLEX_HALF; SioSerial->Mode = DEVICE_SERIAL_MODE_NORMAL | DEVICE_SERIAL_MODE_DUPLEX_HALF;
break; break;
} }
@ -361,40 +369,44 @@ LegacyBiosBuildSioDataFromIsaIo (
FreePool (OpenInfoBuffer); FreePool (OpenInfoBuffer);
} }
} }
// //
// See if this is an ISA parallel port // See if this is an ISA parallel port
// //
// Ignore DMA resource since it is always returned NULL, port // Ignore DMA resource since it is always returned NULL, port
// only used in output mode. // only used in output mode.
// //
if (ResourceList->Device.HID == EISA_PNP_ID (0x400) || ResourceList->Device.HID == EISA_PNP_ID (0x401)) { if ((ResourceList->Device.HID == EISA_PNP_ID (0x400)) || (ResourceList->Device.HID == EISA_PNP_ID (0x401))) {
if (ResourceList->Device.UID <= 2 && if ((ResourceList->Device.UID <= 2) &&
IoResource != NULL && (IoResource != NULL) &&
InterruptResource != NULL && (InterruptResource != NULL) &&
DmaResource != NULL (DmaResource != NULL)
) { )
{
SioParallel = &SioPtr->Parallel[ResourceList->Device.UID]; SioParallel = &SioPtr->Parallel[ResourceList->Device.UID];
SioParallel->Address = (UINT16) IoResource->StartRange; SioParallel->Address = (UINT16)IoResource->StartRange;
SioParallel->Irq = (UINT8) InterruptResource->StartRange; SioParallel->Irq = (UINT8)InterruptResource->StartRange;
SioParallel->Dma = (UINT8) DmaResource->StartRange; SioParallel->Dma = (UINT8)DmaResource->StartRange;
SioParallel->Mode = DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY; SioParallel->Mode = DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY;
} }
} }
// //
// See if this is an ISA floppy controller // See if this is an ISA floppy controller
// //
if (ResourceList->Device.HID == EISA_PNP_ID (0x604)) { if (ResourceList->Device.HID == EISA_PNP_ID (0x604)) {
if (IoResource != NULL && InterruptResource != NULL && DmaResource != NULL) { if ((IoResource != NULL) && (InterruptResource != NULL) && (DmaResource != NULL)) {
Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiBlockIoProtocolGuid, (VOID **) &BlockIo); Status = gBS->HandleProtocol (HandleBuffer[Index], &gEfiBlockIoProtocolGuid, (VOID **)&BlockIo);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
SioFloppy = &SioPtr->Floppy; SioFloppy = &SioPtr->Floppy;
SioFloppy->Address = (UINT16) IoResource->StartRange; SioFloppy->Address = (UINT16)IoResource->StartRange;
SioFloppy->Irq = (UINT8) InterruptResource->StartRange; SioFloppy->Irq = (UINT8)InterruptResource->StartRange;
SioFloppy->Dma = (UINT8) DmaResource->StartRange; SioFloppy->Dma = (UINT8)DmaResource->StartRange;
SioFloppy->NumberOfFloppy++; SioFloppy->NumberOfFloppy++;
} }
} }
} }
// //
// See if this is a mouse // See if this is a mouse
// Always set mouse found so USB hot plug will work // Always set mouse found so USB hot plug will work

View File

@ -23,8 +23,8 @@ SetPitCount (
) )
{ {
IoWrite8 (TIMER_CONTROL_PORT, TIMER0_CONTROL_WORD); IoWrite8 (TIMER_CONTROL_PORT, TIMER0_CONTROL_WORD);
IoWrite8 (TIMER0_COUNT_PORT, (UINT8) (Count & 0xFF)); IoWrite8 (TIMER0_COUNT_PORT, (UINT8)(Count & 0xFF));
IoWrite8 (TIMER0_COUNT_PORT, (UINT8) ((Count>>8) & 0xFF)); IoWrite8 (TIMER0_COUNT_PORT, (UINT8)((Count>>8) & 0xFF));
} }
/** /**
@ -200,7 +200,7 @@ InternalLegacyBiosFarCall (
// Clear the error flag; thunk code may set it. Stack16 should be the high address // 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. // Make Statk16 address the low 16 bit must be not zero.
// //
Stack16 = (UINT16 *)((UINT8 *) mThunkContext.RealModeBuffer + mThunkContext.RealModeBufferSize - sizeof (UINT16)); Stack16 = (UINT16 *)((UINT8 *)mThunkContext.RealModeBuffer + mThunkContext.RealModeBufferSize - sizeof (UINT16));
// //
// Save current rate of DXE Timer // Save current rate of DXE Timer
@ -237,13 +237,16 @@ InternalLegacyBiosFarCall (
if (Status == EFI_ALREADY_STARTED) { if (Status == EFI_ALREADY_STARTED) {
Count++; Count++;
} }
if (Status == EFI_SUCCESS) { if (Status == EFI_SUCCESS) {
Private->Cpu->RegisterInterruptHandler (Private->Cpu, Vector, NULL); Private->Cpu->RegisterInterruptHandler (Private->Cpu, Vector, NULL);
} }
} }
if (Count >= 2) { if (Count >= 2) {
DEBUG ((DEBUG_ERROR, "ERROR: More than one HW interrupt active with CSM enabled\n")); DEBUG ((DEBUG_ERROR, "ERROR: More than one HW interrupt active with CSM enabled\n"));
} }
ASSERT (Count < 2); ASSERT (Count < 2);
DEBUG_CODE_END (); DEBUG_CODE_END ();
@ -252,11 +255,11 @@ InternalLegacyBiosFarCall (
// period is less than the CSM required rate of 54.9254, then force the 8254 // period is less than the CSM required rate of 54.9254, then force the 8254
// PIT counter to 0, which is the CSM required rate of 54.9254 ms // PIT counter to 0, which is the CSM required rate of 54.9254 ms
// //
if (Private->TimerUses8254 && TimerPeriod < 549254) { if (Private->TimerUses8254 && (TimerPeriod < 549254)) {
SetPitCount (0); SetPitCount (0);
} }
if (Stack != NULL && StackSize != 0) { if ((Stack != NULL) && (StackSize != 0)) {
// //
// Copy Stack to low memory stack // Copy Stack to low memory stack
// //
@ -264,8 +267,8 @@ InternalLegacyBiosFarCall (
CopyMem (Stack16, Stack, StackSize); CopyMem (Stack16, Stack, StackSize);
} }
ThunkRegSet.E.SS = (UINT16) (((UINTN) Stack16 >> 16) << 12); ThunkRegSet.E.SS = (UINT16)(((UINTN)Stack16 >> 16) << 12);
ThunkRegSet.E.ESP = (UINT16) (UINTN) Stack16; ThunkRegSet.E.ESP = (UINT16)(UINTN)Stack16;
ThunkRegSet.E.CS = Segment; ThunkRegSet.E.CS = Segment;
ThunkRegSet.E.Eip = Offset; ThunkRegSet.E.Eip = Offset;
@ -279,7 +282,7 @@ InternalLegacyBiosFarCall (
AsmThunk16 (&mThunkContext); AsmThunk16 (&mThunkContext);
if (Stack != NULL && StackSize != 0) { if ((Stack != NULL) && (StackSize != 0)) {
// //
// Copy low memory stack to Stack // Copy low memory stack to Stack
// //
@ -316,7 +319,7 @@ InternalLegacyBiosFarCall (
UINTN ReservedEbdaBaseAddress; UINTN ReservedEbdaBaseAddress;
ACCESS_PAGE0_CODE ( ACCESS_PAGE0_CODE (
EbdaBaseAddress = (*(UINT16 *) (UINTN) 0x40E) << 4; EbdaBaseAddress = (*(UINT16 *)(UINTN)0x40E) << 4;
ReservedEbdaBaseAddress = CONVENTIONAL_MEMORY_TOP ReservedEbdaBaseAddress = CONVENTIONAL_MEMORY_TOP
- PcdGet32 (PcdEbdaReservedMemorySize); - PcdGet32 (PcdEbdaReservedMemorySize);
ASSERT (ReservedEbdaBaseAddress <= EbdaBaseAddress); ASSERT (ReservedEbdaBaseAddress <= EbdaBaseAddress);
@ -343,7 +346,7 @@ InternalLegacyBiosFarCall (
CopyMem (&(Regs->X.Flags), &(ThunkRegSet.E.EFLAGS.UintN), sizeof (Regs->X.Flags)); CopyMem (&(Regs->X.Flags), &(ThunkRegSet.E.EFLAGS.UintN), sizeof (Regs->X.Flags));
return (BOOLEAN) (Regs->X.Flags.CF == 1); return (BOOLEAN)(Regs->X.Flags.CF == 1);
} }
/** /**
@ -364,9 +367,9 @@ LegacyBiosInitializeThunk (
EFI_PHYSICAL_ADDRESS MemoryAddress; EFI_PHYSICAL_ADDRESS MemoryAddress;
UINT8 TimerVector; UINT8 TimerVector;
MemoryAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) Private->IntThunk; MemoryAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Private->IntThunk;
mThunkContext.RealModeBuffer = (VOID *) (UINTN) (MemoryAddress + ((sizeof (LOW_MEMORY_THUNK) / EFI_PAGE_SIZE) + 1) * EFI_PAGE_SIZE); mThunkContext.RealModeBuffer = (VOID *)(UINTN)(MemoryAddress + ((sizeof (LOW_MEMORY_THUNK) / EFI_PAGE_SIZE) + 1) * EFI_PAGE_SIZE);
mThunkContext.RealModeBufferSize = EFI_PAGE_SIZE; mThunkContext.RealModeBufferSize = EFI_PAGE_SIZE;
mThunkContext.ThunkAttributes = THUNK_ATTRIBUTE_BIG_REAL_MODE | THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15; mThunkContext.ThunkAttributes = THUNK_ATTRIBUTE_BIG_REAL_MODE | THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15;

View File

@ -7,22 +7,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#include "LegacyBootMaintUi.h" #include "LegacyBootMaintUi.h"
LEGACY_BOOT_OPTION_CALLBACK_DATA *mLegacyBootOptionPrivate = NULL; LEGACY_BOOT_OPTION_CALLBACK_DATA *mLegacyBootOptionPrivate = NULL;
EFI_GUID mLegacyBootOptionGuid = LEGACY_BOOT_OPTION_FORMSET_GUID; EFI_GUID mLegacyBootOptionGuid = LEGACY_BOOT_OPTION_FORMSET_GUID;
CHAR16 mLegacyBootStorageName[] = L"LegacyBootData"; CHAR16 mLegacyBootStorageName[] = L"LegacyBootData";
BBS_TYPE mBbsType[] = {BBS_FLOPPY, BBS_HARDDISK, BBS_CDROM, BBS_EMBED_NETWORK, BBS_BEV_DEVICE, BBS_UNKNOWN}; BBS_TYPE mBbsType[] = { BBS_FLOPPY, BBS_HARDDISK, BBS_CDROM, BBS_EMBED_NETWORK, BBS_BEV_DEVICE, BBS_UNKNOWN };
BOOLEAN mFirstEnterLegacyForm = FALSE; BOOLEAN mFirstEnterLegacyForm = FALSE;
/// ///
/// Legacy FD Info from LegacyBios.GetBbsInfo() /// Legacy FD Info from LegacyBios.GetBbsInfo()
/// ///
LEGACY_MENU_OPTION LegacyFDMenu = { LEGACY_MENU_OPTION LegacyFDMenu = {
LEGACY_MENU_OPTION_SIGNATURE, LEGACY_MENU_OPTION_SIGNATURE,
{NULL}, { NULL },
0 0
}; };
@ -31,7 +29,7 @@ LEGACY_MENU_OPTION LegacyFDMenu = {
/// ///
LEGACY_MENU_OPTION LegacyHDMenu = { LEGACY_MENU_OPTION LegacyHDMenu = {
LEGACY_MENU_OPTION_SIGNATURE, LEGACY_MENU_OPTION_SIGNATURE,
{NULL}, { NULL },
0 0
}; };
@ -40,7 +38,7 @@ LEGACY_MENU_OPTION LegacyHDMenu = {
/// ///
LEGACY_MENU_OPTION LegacyCDMenu = { LEGACY_MENU_OPTION LegacyCDMenu = {
LEGACY_MENU_OPTION_SIGNATURE, LEGACY_MENU_OPTION_SIGNATURE,
{NULL}, { NULL },
0 0
}; };
@ -49,7 +47,7 @@ LEGACY_MENU_OPTION LegacyCDMenu = {
/// ///
LEGACY_MENU_OPTION LegacyNETMenu = { LEGACY_MENU_OPTION LegacyNETMenu = {
LEGACY_MENU_OPTION_SIGNATURE, LEGACY_MENU_OPTION_SIGNATURE,
{NULL}, { NULL },
0 0
}; };
@ -58,35 +56,34 @@ LEGACY_MENU_OPTION LegacyNETMenu = {
/// ///
LEGACY_MENU_OPTION LegacyBEVMenu = { LEGACY_MENU_OPTION LegacyBEVMenu = {
LEGACY_MENU_OPTION_SIGNATURE, LEGACY_MENU_OPTION_SIGNATURE,
{NULL}, { NULL },
0 0
}; };
VOID *mLegacyStartOpCodeHandle = NULL; VOID *mLegacyStartOpCodeHandle = NULL;
VOID *mLegacyEndOpCodeHandle = NULL; VOID *mLegacyEndOpCodeHandle = NULL;
EFI_IFR_GUID_LABEL *mLegacyStartLabel = NULL; EFI_IFR_GUID_LABEL *mLegacyStartLabel = NULL;
EFI_IFR_GUID_LABEL *mLegacyEndLabel = NULL; EFI_IFR_GUID_LABEL *mLegacyEndLabel = NULL;
HII_VENDOR_DEVICE_PATH mLegacyBootOptionHiiVendorDevicePath = { HII_VENDOR_DEVICE_PATH mLegacyBootOptionHiiVendorDevicePath = {
{ {
{ {
HARDWARE_DEVICE_PATH, HARDWARE_DEVICE_PATH,
HW_VENDOR_DP, HW_VENDOR_DP,
{ {
(UINT8) (sizeof (VENDOR_DEVICE_PATH)), (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
} }
}, },
{ 0x6bc75598, 0x89b4, 0x483d, { 0x91, 0x60, 0x7f, 0x46, 0x9a, 0x96, 0x35, 0x31 } } { 0x6bc75598, 0x89b4, 0x483d, { 0x91, 0x60, 0x7f, 0x46, 0x9a, 0x96, 0x35, 0x31 }
}
}, },
{ {
END_DEVICE_PATH_TYPE, END_DEVICE_PATH_TYPE,
END_ENTIRE_DEVICE_PATH_SUBTYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ {
(UINT8) (END_DEVICE_PATH_LENGTH), (UINT8)(END_DEVICE_PATH_LENGTH),
(UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)
} }
} }
}; };
@ -101,7 +98,6 @@ GetLegacyOptions (
VOID VOID
); );
/** /**
Base on the L"LegacyDevOrder" variable to build the current order data. Base on the L"LegacyDevOrder" variable to build the current order data.
@ -152,7 +148,7 @@ OrderLegacyBootOption4SameType (
UINT16 *BbsIndexArray; UINT16 *BbsIndexArray;
UINT16 *DeviceTypeArray; UINT16 *DeviceTypeArray;
GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrder, &BootOrderSize); GetEfiGlobalVariable2 (L"BootOrder", (VOID **)&BootOrder, &BootOrderSize);
ASSERT (BootOrder != NULL); ASSERT (BootOrder != NULL);
BbsIndexArray = AllocatePool (BootOrderSize); BbsIndexArray = AllocatePool (BootOrderSize);
@ -170,24 +166,25 @@ OrderLegacyBootOption4SameType (
ASSERT (*DisBootOption != NULL); ASSERT (*DisBootOption != NULL);
for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) { for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", BootOrder[Index]); UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", BootOrder[Index]);
Status = EfiBootManagerVariableToLoadOption (OptionName, &BootOption); Status = EfiBootManagerVariableToLoadOption (OptionName, &BootOption);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
if ((DevicePathType (BootOption.FilePath) == BBS_DEVICE_PATH) && if ((DevicePathType (BootOption.FilePath) == BBS_DEVICE_PATH) &&
(DevicePathSubType (BootOption.FilePath) == BBS_BBS_DP)) { (DevicePathSubType (BootOption.FilePath) == BBS_BBS_DP))
{
// //
// Legacy Boot Option // Legacy Boot Option
// //
ASSERT (BootOption.OptionalDataSize == sizeof (LEGACY_BOOT_OPTION_BBS_DATA)); ASSERT (BootOption.OptionalDataSize == sizeof (LEGACY_BOOT_OPTION_BBS_DATA));
DeviceTypeArray[Index] = ((BBS_BBS_DEVICE_PATH *) BootOption.FilePath)->DeviceType; DeviceTypeArray[Index] = ((BBS_BBS_DEVICE_PATH *)BootOption.FilePath)->DeviceType;
BbsIndexArray [Index] = ((LEGACY_BOOT_OPTION_BBS_DATA *) BootOption.OptionalData)->BbsIndex; BbsIndexArray[Index] = ((LEGACY_BOOT_OPTION_BBS_DATA *)BootOption.OptionalData)->BbsIndex;
} else { } else {
DeviceTypeArray[Index] = BBS_TYPE_UNKNOWN; DeviceTypeArray[Index] = BBS_TYPE_UNKNOWN;
BbsIndexArray [Index] = 0xFFFF; BbsIndexArray[Index] = 0xFFFF;
} }
EfiBootManagerFreeLoadOption (&BootOption); EfiBootManagerFreeLoadOption (&BootOption);
} }
@ -211,6 +208,7 @@ OrderLegacyBootOption4SameType (
(*EnBootOption)[*EnBootOptionCount] = BootOrder[Index]; (*EnBootOption)[*EnBootOptionCount] = BootOrder[Index];
(*EnBootOptionCount)++; (*EnBootOptionCount)++;
} }
break; break;
} }
} }
@ -278,37 +276,36 @@ UpdateBBSOption (
UINTN DisBootOptionCount; UINTN DisBootOptionCount;
UINTN BufferSize; UINTN BufferSize;
DisMap = NULL; DisMap = NULL;
NewOrder = NULL; NewOrder = NULL;
CurrentType = 0; CurrentType = 0;
EnBootOption = NULL; EnBootOption = NULL;
DisBootOption = NULL; DisBootOption = NULL;
DisMap = mLegacyBootOptionPrivate->MaintainMapData->DisableMap; DisMap = mLegacyBootOptionPrivate->MaintainMapData->DisableMap;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
// //
// Update the Variable "LegacyDevOrder" // Update the Variable "LegacyDevOrder"
// //
GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **) &VarData, &VarSize); GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **)&VarData, &VarSize);
if (VarData == NULL) { if (VarData == NULL) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
OriginalPtr = VarData; OriginalPtr = VarData;
while (mBbsType[CurrentType] != BBS_UNKNOWN) { while (mBbsType[CurrentType] != BBS_UNKNOWN) {
switch (mBbsType[CurrentType]) { switch (mBbsType[CurrentType]) {
case BBS_FLOPPY: case BBS_FLOPPY:
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyFDMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyFDMenu;
LegacyDev = NVMapData->LegacyFD; LegacyDev = NVMapData->LegacyFD;
InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyFD; InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyFD;
BufferSize = sizeof (NVMapData->LegacyFD); BufferSize = sizeof (NVMapData->LegacyFD);
break; break;
case BBS_HARDDISK: case BBS_HARDDISK:
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyHDMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyHDMenu;
LegacyDev = NVMapData->LegacyHD; LegacyDev = NVMapData->LegacyHD;
InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyHD; InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyHD;
@ -316,14 +313,14 @@ UpdateBBSOption (
break; break;
case BBS_CDROM: case BBS_CDROM:
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyCDMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyCDMenu;
LegacyDev = NVMapData->LegacyCD; LegacyDev = NVMapData->LegacyCD;
InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyCD; InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyCD;
BufferSize = sizeof (NVMapData->LegacyCD); BufferSize = sizeof (NVMapData->LegacyCD);
break; break;
case BBS_EMBED_NETWORK: case BBS_EMBED_NETWORK:
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyNETMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyNETMenu;
LegacyDev = NVMapData->LegacyNET; LegacyDev = NVMapData->LegacyNET;
InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyNET; InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyNET;
BufferSize = sizeof (NVMapData->LegacyNET); BufferSize = sizeof (NVMapData->LegacyNET);
@ -331,7 +328,7 @@ UpdateBBSOption (
default: default:
ASSERT (mBbsType[CurrentType] == BBS_BEV_DEVICE); ASSERT (mBbsType[CurrentType] == BBS_BEV_DEVICE);
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyBEVMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyBEVMenu;
LegacyDev = NVMapData->LegacyBEV; LegacyDev = NVMapData->LegacyBEV;
InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyBEV; InitialLegacyDev = mLegacyBootOptionPrivate->MaintainMapData->InitialNvData.LegacyBEV;
BufferSize = sizeof (NVMapData->LegacyBEV); BufferSize = sizeof (NVMapData->LegacyBEV);
@ -346,14 +343,14 @@ UpdateBBSOption (
continue; continue;
} }
DevOrder = (LEGACY_DEV_ORDER_ENTRY *) OriginalPtr; DevOrder = (LEGACY_DEV_ORDER_ENTRY *)OriginalPtr;
while (VarData < OriginalPtr + VarSize) { while (VarData < OriginalPtr + VarSize) {
if (DevOrder->BbsType == mBbsType[CurrentType]) { if (DevOrder->BbsType == mBbsType[CurrentType]) {
break; break;
} }
VarData += sizeof (BBS_TYPE) + DevOrder->Length; VarData += sizeof (BBS_TYPE) + DevOrder->Length;
DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData; DevOrder = (LEGACY_DEV_ORDER_ENTRY *)VarData;
} }
if (VarData >= OriginalPtr + VarSize) { if (VarData >= OriginalPtr + VarSize) {
@ -382,11 +379,11 @@ UpdateBBSOption (
// so we use DisMap to set en/dis state of each item in NewOrder array // so we use DisMap to set en/dis state of each item in NewOrder array
// //
for (Index2 = 0; Index2 < OptionMenu->MenuNumber; Index2++) { for (Index2 = 0; Index2 < OptionMenu->MenuNumber; Index2++) {
Tmp = (UINT16) (DevOrder->Data[Index2] & 0xFF); Tmp = (UINT16)(DevOrder->Data[Index2] & 0xFF);
Pos = Tmp / 8; Pos = Tmp / 8;
Bit = 7 - (Tmp % 8); Bit = 7 - (Tmp % 8);
if ((DisMap[Pos] & (1 << Bit)) != 0) { if ((DisMap[Pos] & (1 << Bit)) != 0) {
NewOrder[Index] = (UINT16) (0xFF00 | Tmp); NewOrder[Index] = (UINT16)(0xFF00 | Tmp);
Index++; Index++;
} }
} }
@ -413,7 +410,7 @@ UpdateBBSOption (
&DisBootOption, &DisBootOption,
&DisBootOptionCount &DisBootOptionCount
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
goto Fail; goto Fail;
} }
@ -422,9 +419,9 @@ UpdateBBSOption (
// //
for (Index = 0; Index < DisBootOptionCount; Index++) { for (Index = 0; Index < DisBootOptionCount; Index++) {
UnicodeSPrint (VarName, sizeof (VarName), L"Boot%04x", DisBootOption[Index]); UnicodeSPrint (VarName, sizeof (VarName), L"Boot%04x", DisBootOption[Index]);
GetEfiGlobalVariable2 (VarName, (VOID **) &BootOptionVar, &OptionSize); GetEfiGlobalVariable2 (VarName, (VOID **)&BootOptionVar, &OptionSize);
if (BootOptionVar != NULL) { if (BootOptionVar != NULL) {
Attribute = (UINT32 *) BootOptionVar; Attribute = (UINT32 *)BootOptionVar;
*Attribute &= ~LOAD_OPTION_ACTIVE; *Attribute &= ~LOAD_OPTION_ACTIVE;
Status = gRT->SetVariable ( Status = gRT->SetVariable (
@ -441,9 +438,9 @@ UpdateBBSOption (
for (Index = 0; Index < EnBootOptionCount; Index++) { for (Index = 0; Index < EnBootOptionCount; Index++) {
UnicodeSPrint (VarName, sizeof (VarName), L"Boot%04x", EnBootOption[Index]); UnicodeSPrint (VarName, sizeof (VarName), L"Boot%04x", EnBootOption[Index]);
GetEfiGlobalVariable2 (VarName, (VOID **) &BootOptionVar, &OptionSize); GetEfiGlobalVariable2 (VarName, (VOID **)&BootOptionVar, &OptionSize);
if (BootOptionVar != NULL) { if (BootOptionVar != NULL) {
Attribute = (UINT32 *) BootOptionVar; Attribute = (UINT32 *)BootOptionVar;
*Attribute |= LOAD_OPTION_ACTIVE; *Attribute |= LOAD_OPTION_ACTIVE;
Status = gRT->SetVariable ( Status = gRT->SetVariable (
@ -458,7 +455,6 @@ UpdateBBSOption (
} }
} }
FreePool (EnBootOption); FreePool (EnBootOption);
FreePool (DisBootOption); FreePool (DisBootOption);
@ -517,9 +513,10 @@ LegacyBootOptionExtractConfig (
OUT EFI_STRING *Results OUT EFI_STRING *Results
) )
{ {
if (Progress == NULL || Results == NULL) { if ((Progress == NULL) || (Results == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
*Progress = Request; *Progress = Request;
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -553,8 +550,7 @@ LegacyBootOptionRouteConfig (
LEGACY_BOOT_NV_DATA *CurrentNVMapData; LEGACY_BOOT_NV_DATA *CurrentNVMapData;
UINTN BufferSize; UINTN BufferSize;
if ((Configuration == NULL) || (Progress == NULL)) {
if (Configuration == NULL || Progress == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -571,7 +567,7 @@ LegacyBootOptionRouteConfig (
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiHiiConfigRoutingProtocolGuid, &gEfiHiiConfigRoutingProtocolGuid,
NULL, NULL,
(VOID **) &ConfigRouting (VOID **)&ConfigRouting
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
@ -584,7 +580,7 @@ LegacyBootOptionRouteConfig (
Status = ConfigRouting->ConfigToBlock ( Status = ConfigRouting->ConfigToBlock (
ConfigRouting, ConfigRouting,
Configuration, Configuration,
(UINT8 *) CurrentNVMapData, (UINT8 *)CurrentNVMapData,
&BufferSize, &BufferSize,
Progress Progress
); );
@ -610,6 +606,7 @@ RefreshLegacyUpdateData (
if (mLegacyStartOpCodeHandle != NULL) { if (mLegacyStartOpCodeHandle != NULL) {
HiiFreeOpCodeHandle (mLegacyStartOpCodeHandle); HiiFreeOpCodeHandle (mLegacyStartOpCodeHandle);
} }
if (mLegacyEndOpCodeHandle != NULL) { if (mLegacyEndOpCodeHandle != NULL) {
HiiFreeOpCodeHandle (mLegacyEndOpCodeHandle); HiiFreeOpCodeHandle (mLegacyEndOpCodeHandle);
} }
@ -623,7 +620,7 @@ RefreshLegacyUpdateData (
// //
// Create Hii Extend Label OpCode as the start opcode // Create Hii Extend Label OpCode as the start opcode
// //
mLegacyStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( mLegacyStartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (
mLegacyStartOpCodeHandle, mLegacyStartOpCodeHandle,
&gEfiIfrTianoGuid, &gEfiIfrTianoGuid,
NULL, NULL,
@ -636,7 +633,7 @@ RefreshLegacyUpdateData (
// //
// Create Hii Extend Label OpCode as the start opcode // Create Hii Extend Label OpCode as the start opcode
// //
mLegacyEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( mLegacyEndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (
mLegacyEndOpCodeHandle, mLegacyEndOpCodeHandle,
&gEfiIfrTianoGuid, &gEfiIfrTianoGuid,
NULL, NULL,
@ -645,7 +642,6 @@ RefreshLegacyUpdateData (
mLegacyEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; mLegacyEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
mLegacyEndLabel->Number = FORM_BOOT_LEGACY_LABEL_END; mLegacyEndLabel->Number = FORM_BOOT_LEGACY_LABEL_END;
} }
/** /**
@ -756,15 +752,15 @@ UpdateLegacyDeviceOrderPage (
TypeStrHelp = NULL; TypeStrHelp = NULL;
Default = NULL; Default = NULL;
RefreshLegacyUpdateData(); RefreshLegacyUpdateData ();
// //
// Create oneof option list // Create oneof option list
// //
switch (UpdatePageId) { switch (UpdatePageId) {
case FORM_FLOPPY_BOOT_ID: case FORM_FLOPPY_BOOT_ID:
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyFDMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyFDMenu;
Key = (UINT16) LEGACY_FD_QUESTION_ID; Key = (UINT16)LEGACY_FD_QUESTION_ID;
TypeStr = STR_FLOPPY; TypeStr = STR_FLOPPY;
TypeStrHelp = STR_FLOPPY_HELP; TypeStrHelp = STR_FLOPPY_HELP;
FormTitle = STR_FLOPPY_TITLE; FormTitle = STR_FLOPPY_TITLE;
@ -772,8 +768,8 @@ UpdateLegacyDeviceOrderPage (
break; break;
case FORM_HARDDISK_BOOT_ID: case FORM_HARDDISK_BOOT_ID:
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyHDMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyHDMenu;
Key = (UINT16) LEGACY_HD_QUESTION_ID; Key = (UINT16)LEGACY_HD_QUESTION_ID;
TypeStr = STR_HARDDISK; TypeStr = STR_HARDDISK;
TypeStrHelp = STR_HARDDISK_HELP; TypeStrHelp = STR_HARDDISK_HELP;
FormTitle = STR_HARDDISK_TITLE; FormTitle = STR_HARDDISK_TITLE;
@ -781,8 +777,8 @@ UpdateLegacyDeviceOrderPage (
break; break;
case FORM_CDROM_BOOT_ID: case FORM_CDROM_BOOT_ID:
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyCDMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyCDMenu;
Key = (UINT16) LEGACY_CD_QUESTION_ID; Key = (UINT16)LEGACY_CD_QUESTION_ID;
TypeStr = STR_CDROM; TypeStr = STR_CDROM;
TypeStrHelp = STR_CDROM_HELP; TypeStrHelp = STR_CDROM_HELP;
FormTitle = STR_CDROM_TITLE; FormTitle = STR_CDROM_TITLE;
@ -790,8 +786,8 @@ UpdateLegacyDeviceOrderPage (
break; break;
case FORM_NET_BOOT_ID: case FORM_NET_BOOT_ID:
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyNETMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyNETMenu;
Key = (UINT16) LEGACY_NET_QUESTION_ID; Key = (UINT16)LEGACY_NET_QUESTION_ID;
TypeStr = STR_NET; TypeStr = STR_NET;
TypeStrHelp = STR_NET_HELP; TypeStrHelp = STR_NET_HELP;
FormTitle = STR_NET_TITLE; FormTitle = STR_NET_TITLE;
@ -799,8 +795,8 @@ UpdateLegacyDeviceOrderPage (
break; break;
case FORM_BEV_BOOT_ID: case FORM_BEV_BOOT_ID:
OptionMenu = (LEGACY_MENU_OPTION *) &LegacyBEVMenu; OptionMenu = (LEGACY_MENU_OPTION *)&LegacyBEVMenu;
Key = (UINT16) LEGACY_BEV_QUESTION_ID; Key = (UINT16)LEGACY_BEV_QUESTION_ID;
TypeStr = STR_BEV; TypeStr = STR_BEV;
TypeStrHelp = STR_BEV_HELP; TypeStrHelp = STR_BEV_HELP;
FormTitle = STR_BEV_TITLE; FormTitle = STR_BEV_TITLE;
@ -812,14 +808,13 @@ UpdateLegacyDeviceOrderPage (
return; return;
} }
HiiSetString (mLegacyBootOptionPrivate->HiiHandle, STRING_TOKEN(STR_ORDER_CHANGE_PROMPT), FormTitle, NULL); HiiSetString (mLegacyBootOptionPrivate->HiiHandle, STRING_TOKEN (STR_ORDER_CHANGE_PROMPT), FormTitle, NULL);
CreateLegacyMenuStringToken (mLegacyBootOptionPrivate->HiiHandle, OptionMenu); CreateLegacyMenuStringToken (mLegacyBootOptionPrivate->HiiHandle, OptionMenu);
OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT (OptionsOpCodeHandle != NULL); ASSERT (OptionsOpCodeHandle != NULL);
for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
NewMenuEntry = GetMenuEntry (OptionMenu, Index); NewMenuEntry = GetMenuEntry (OptionMenu, Index);
// //
@ -830,7 +825,7 @@ UpdateLegacyDeviceOrderPage (
NewMenuEntry->DisplayStringToken, NewMenuEntry->DisplayStringToken,
0, 0,
EFI_IFR_TYPE_NUM_SIZE_16, EFI_IFR_TYPE_NUM_SIZE_16,
((LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex ((LEGACY_DEVICE_CONTEXT *)NewMenuEntry->VariableContext)->BbsIndex
); );
} }
@ -870,15 +865,15 @@ UpdateLegacyDeviceOrderPage (
HiiCreateOneOfOpCode ( HiiCreateOneOfOpCode (
mLegacyStartOpCodeHandle, mLegacyStartOpCodeHandle,
(EFI_QUESTION_ID) (Key + Index), (EFI_QUESTION_ID)(Key + Index),
VARSTORE_ID_LEGACY_BOOT, VARSTORE_ID_LEGACY_BOOT,
(UINT16) (Key + Index * 2 - CONFIG_OPTION_OFFSET), (UINT16)(Key + Index * 2 - CONFIG_OPTION_OFFSET),
StrRef, StrRef,
StrRefHelp, StrRefHelp,
EFI_IFR_FLAG_CALLBACK, EFI_IFR_FLAG_CALLBACK,
EFI_IFR_NUMERIC_SIZE_2, EFI_IFR_NUMERIC_SIZE_2,
OptionsOpCodeHandle, OptionsOpCodeHandle,
DefaultOpCodeHandle //NULL // DefaultOpCodeHandle // NULL //
); );
HiiFreeOpCodeHandle (DefaultOpCodeHandle); HiiFreeOpCodeHandle (DefaultOpCodeHandle);
@ -895,7 +890,6 @@ UpdateLegacyDeviceOrderPage (
HiiFreeOpCodeHandle (OptionsOpCodeHandle); HiiFreeOpCodeHandle (OptionsOpCodeHandle);
} }
/** /**
Adjust question value when one question value has been changed. Adjust question value when one question value has been changed.
@ -936,27 +930,27 @@ AdjustOptionValue (
ASSERT ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)); ASSERT ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER));
CurrentNVMap = &mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData; CurrentNVMap = &mLegacyBootOptionPrivate->MaintainMapData->CurrentNvData;
HiiGetBrowserData (&mLegacyBootOptionGuid, mLegacyBootStorageName, sizeof (LEGACY_BOOT_NV_DATA), (UINT8 *) CurrentNVMap); HiiGetBrowserData (&mLegacyBootOptionGuid, mLegacyBootStorageName, sizeof (LEGACY_BOOT_NV_DATA), (UINT8 *)CurrentNVMap);
DisMap = mLegacyBootOptionPrivate->MaintainMapData->DisableMap; DisMap = mLegacyBootOptionPrivate->MaintainMapData->DisableMap;
if (QuestionId >= LEGACY_FD_QUESTION_ID && QuestionId < LEGACY_FD_QUESTION_ID + MAX_MENU_NUMBER) { if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_FD_QUESTION_ID + MAX_MENU_NUMBER)) {
Number = (UINT16) LegacyFDMenu.MenuNumber; Number = (UINT16)LegacyFDMenu.MenuNumber;
CurrentVal = CurrentNVMap->LegacyFD; CurrentVal = CurrentNVMap->LegacyFD;
Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyFD; Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyFD;
} else if (QuestionId >= LEGACY_HD_QUESTION_ID && QuestionId < LEGACY_HD_QUESTION_ID + MAX_MENU_NUMBER) { } else if ((QuestionId >= LEGACY_HD_QUESTION_ID) && (QuestionId < LEGACY_HD_QUESTION_ID + MAX_MENU_NUMBER)) {
Number = (UINT16) LegacyHDMenu.MenuNumber; Number = (UINT16)LegacyHDMenu.MenuNumber;
CurrentVal = CurrentNVMap->LegacyHD; CurrentVal = CurrentNVMap->LegacyHD;
Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyHD; Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyHD;
} else if (QuestionId >= LEGACY_CD_QUESTION_ID && QuestionId < LEGACY_CD_QUESTION_ID + MAX_MENU_NUMBER) { } else if ((QuestionId >= LEGACY_CD_QUESTION_ID) && (QuestionId < LEGACY_CD_QUESTION_ID + MAX_MENU_NUMBER)) {
Number = (UINT16) LegacyCDMenu.MenuNumber; Number = (UINT16)LegacyCDMenu.MenuNumber;
CurrentVal = CurrentNVMap->LegacyCD; CurrentVal = CurrentNVMap->LegacyCD;
Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyCD; Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyCD;
} else if (QuestionId >= LEGACY_NET_QUESTION_ID && QuestionId < LEGACY_NET_QUESTION_ID + MAX_MENU_NUMBER) { } else if ((QuestionId >= LEGACY_NET_QUESTION_ID) && (QuestionId < LEGACY_NET_QUESTION_ID + MAX_MENU_NUMBER)) {
Number = (UINT16) LegacyNETMenu.MenuNumber; Number = (UINT16)LegacyNETMenu.MenuNumber;
CurrentVal = CurrentNVMap->LegacyNET; CurrentVal = CurrentNVMap->LegacyNET;
Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyNET; Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyNET;
} else if (QuestionId >= LEGACY_BEV_QUESTION_ID && QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER) { } else if ((QuestionId >= LEGACY_BEV_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {
Number = (UINT16) LegacyBEVMenu.MenuNumber; Number = (UINT16)LegacyBEVMenu.MenuNumber;
CurrentVal = CurrentNVMap->LegacyBEV; CurrentVal = CurrentNVMap->LegacyBEV;
Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyBEV; Default = mLegacyBootOptionPrivate->MaintainMapData->LastTimeNvData.LegacyBEV;
} }
@ -984,7 +978,7 @@ AdjustOptionValue (
// //
Pos = OldValue / 8; Pos = OldValue / 8;
Bit = 7 - (OldValue % 8); Bit = 7 - (OldValue % 8);
DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit)); DisMap[Pos] = (UINT8)(DisMap[Pos] | (UINT8)(1 << Bit));
for (Index2 = Index; Index2 < Number - 1; Index2++) { for (Index2 = Index; Index2 < Number - 1; Index2++) {
CurrentVal[Index2] = CurrentVal[Index2 + 1]; CurrentVal[Index2] = CurrentVal[Index2 + 1];
} }
@ -1027,7 +1021,7 @@ AdjustOptionValue (
// //
Pos = NewValue / 8; Pos = NewValue / 8;
Bit = 7 - (NewValue % 8); Bit = 7 - (NewValue % 8);
DisMap[Pos] = (UINT8) (DisMap[Pos] & (~ (UINT8) (1 << Bit))); DisMap[Pos] = (UINT8)(DisMap[Pos] & (~(UINT8)(1 << Bit)));
if (0xFF != OldValue) { if (0xFF != OldValue) {
// //
// Because NewValue is a item that was disabled before // Because NewValue is a item that was disabled before
@ -1036,10 +1030,11 @@ AdjustOptionValue (
// //
Pos = OldValue / 8; Pos = OldValue / 8;
Bit = 7 - (OldValue % 8); Bit = 7 - (OldValue % 8);
DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit)); DisMap[Pos] = (UINT8)(DisMap[Pos] | (UINT8)(1 << Bit));
} }
} }
} }
// //
// To prevent DISABLE appears in the middle of the list // To prevent DISABLE appears in the middle of the list
// we should perform a re-ordering // we should perform a re-ordering
@ -1080,7 +1075,7 @@ AdjustOptionValue (
// //
// Pass changed uncommitted data back to Form Browser // Pass changed uncommitted data back to Form Browser
// //
HiiSetBrowserData (&mLegacyBootOptionGuid, mLegacyBootStorageName, sizeof (LEGACY_BOOT_NV_DATA), (UINT8 *) CurrentNVMap, NULL); HiiSetBrowserData (&mLegacyBootOptionGuid, mLegacyBootStorageName, sizeof (LEGACY_BOOT_NV_DATA), (UINT8 *)CurrentNVMap, NULL);
} }
/** /**
@ -1112,7 +1107,7 @@ LegacyBootOptionCallback (
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
) )
{ {
if (Action != EFI_BROWSER_ACTION_CHANGED && Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_FORM_OPEN) { if ((Action != EFI_BROWSER_ACTION_CHANGED) && (Action != EFI_BROWSER_ACTION_CHANGING) && (Action != EFI_BROWSER_ACTION_FORM_OPEN)) {
// //
// Do nothing for other UEFI Action. Only do call back when data is changed or the form is open. // Do nothing for other UEFI Action. Only do call back when data is changed or the form is open.
// //
@ -1157,13 +1152,13 @@ LegacyBootOptionCallback (
} }
if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) { if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {
AdjustOptionValue(QuestionId, Value); AdjustOptionValue (QuestionId, Value);
} }
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Create a menu entry by given menu type. Create a menu entry by given menu type.
@ -1229,10 +1224,10 @@ GetLegacyOptionsOrder (
// //
// Get Device Order from variable // Get Device Order from variable
// //
GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **) &VarData, &VarSize); GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **)&VarData, &VarSize);
VarTmp = VarData; VarTmp = VarData;
if (NULL != VarData) { if (NULL != VarData) {
DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData; DevOrder = (LEGACY_DEV_ORDER_ENTRY *)VarData;
while (VarData < VarTmp + VarSize) { while (VarData < VarTmp + VarSize) {
switch (DevOrder->BbsType) { switch (DevOrder->BbsType) {
case BBS_FLOPPY: case BBS_FLOPPY:
@ -1272,21 +1267,21 @@ GetLegacyOptionsOrder (
// //
for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
TotalLength = sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16); TotalLength = sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16);
VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + TotalLength); VarDevOrder = *(UINT16 *)((UINT8 *)DevOrder + TotalLength);
if (0xFF00 == (VarDevOrder & 0xFF00)) { if (0xFF00 == (VarDevOrder & 0xFF00)) {
LegacyDev[Index] = 0xFF; LegacyDev[Index] = 0xFF;
Pos = (VarDevOrder & 0xFF) / 8; Pos = (VarDevOrder & 0xFF) / 8;
Bit = 7 - ((VarDevOrder & 0xFF) % 8); Bit = 7 - ((VarDevOrder & 0xFF) % 8);
DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit)); DisMap[Pos] = (UINT8)(DisMap[Pos] | (UINT8)(1 << Bit));
} else { } else {
LegacyDev[Index] = VarDevOrder & 0xFF; LegacyDev[Index] = VarDevOrder & 0xFF;
} }
} }
VarData ++; VarData++;
VarData += *(UINT16 *) VarData; VarData += *(UINT16 *)VarData;
DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData; DevOrder = (LEGACY_DEV_ORDER_ENTRY *)VarData;
} }
} }
@ -1343,22 +1338,24 @@ GetLegacyOptions (
for (Index = 0; Index < BootOptionCount; Index++) { for (Index = 0; Index < BootOptionCount; Index++) {
if ((DevicePathType (BootOption[Index].FilePath) != BBS_DEVICE_PATH) || if ((DevicePathType (BootOption[Index].FilePath) != BBS_DEVICE_PATH) ||
(DevicePathSubType (BootOption[Index].FilePath) != BBS_BBS_DP) (DevicePathSubType (BootOption[Index].FilePath) != BBS_BBS_DP)
) { )
{
continue; continue;
} }
ASSERT (BootOption[Index].OptionalDataSize == sizeof (LEGACY_BOOT_OPTION_BBS_DATA)); ASSERT (BootOption[Index].OptionalDataSize == sizeof (LEGACY_BOOT_OPTION_BBS_DATA));
NewMenuEntry = CreateMenuEntry (); NewMenuEntry = CreateMenuEntry ();
ASSERT (NewMenuEntry != NULL); ASSERT (NewMenuEntry != NULL);
NewLegacyDevContext = (LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext; NewLegacyDevContext = (LEGACY_DEVICE_CONTEXT *)NewMenuEntry->VariableContext;
NewLegacyDevContext->BbsIndex = ((LEGACY_BOOT_OPTION_BBS_DATA *) BootOption[Index].OptionalData)->BbsIndex; NewLegacyDevContext->BbsIndex = ((LEGACY_BOOT_OPTION_BBS_DATA *)BootOption[Index].OptionalData)->BbsIndex;
NewLegacyDevContext->Description = AllocateCopyPool (StrSize (BootOption[Index].Description), BootOption[Index].Description); NewLegacyDevContext->Description = AllocateCopyPool (StrSize (BootOption[Index].Description), BootOption[Index].Description);
ASSERT (NewLegacyDevContext->Description != NULL); ASSERT (NewLegacyDevContext->Description != NULL);
NewMenuEntry->DisplayString = NewLegacyDevContext->Description; NewMenuEntry->DisplayString = NewLegacyDevContext->Description;
NewMenuEntry->HelpString = NULL; NewMenuEntry->HelpString = NULL;
switch (((BBS_BBS_DEVICE_PATH *) BootOption[Index].FilePath)->DeviceType) { switch (((BBS_BBS_DEVICE_PATH *)BootOption[Index].FilePath)->DeviceType) {
case BBS_TYPE_FLOPPY: case BBS_TYPE_FLOPPY:
InsertTailList (&LegacyFDMenu.Head, &NewMenuEntry->Link); InsertTailList (&LegacyFDMenu.Head, &NewMenuEntry->Link);
FDNum++; FDNum++;
@ -1395,7 +1392,6 @@ GetLegacyOptions (
LegacyBEVMenu.MenuNumber = BEVNum; LegacyBEVMenu.MenuNumber = BEVNum;
} }
/** /**
Install Boot Manager Menu driver. Install Boot Manager Menu driver.
@ -1418,7 +1414,7 @@ LegacyBootMaintUiLibConstructor (
EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
LEGACY_BOOT_OPTION_CALLBACK_DATA *LegacyBootOptionData; LEGACY_BOOT_OPTION_CALLBACK_DATA *LegacyBootOptionData;
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios); Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **)&LegacyBios);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
// //
// Create LegacyBootOptionData structures for Driver Callback // Create LegacyBootOptionData structures for Driver Callback
@ -1483,7 +1479,7 @@ LegacyBootMaintUiLibDestructor (
{ {
EFI_STATUS Status; EFI_STATUS Status;
if (mLegacyBootOptionPrivate != NULL && mLegacyBootOptionPrivate->DriverHandle != NULL) { if ((mLegacyBootOptionPrivate != NULL) && (mLegacyBootOptionPrivate->DriverHandle != NULL)) {
Status = gBS->UninstallMultipleProtocolInterfaces ( Status = gBS->UninstallMultipleProtocolInterfaces (
mLegacyBootOptionPrivate->DriverHandle, mLegacyBootOptionPrivate->DriverHandle,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
@ -1502,4 +1498,3 @@ LegacyBootMaintUiLibDestructor (
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -6,13 +6,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef _EFI_LEGACY_BOOT_OPTION_H_ #ifndef _EFI_LEGACY_BOOT_OPTION_H_
#define _EFI_LEGACY_BOOT_OPTION_H_ #define _EFI_LEGACY_BOOT_OPTION_H_
#include <PiDxe.h> #include <PiDxe.h>
#include <Guid/GlobalVariable.h> #include <Guid/GlobalVariable.h>
#include <Guid/LegacyDevOrder.h> #include <Guid/LegacyDevOrder.h>
#include <Guid/MdeModuleHii.h> #include <Guid/MdeModuleHii.h>
@ -52,14 +50,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// //
#define QUESTION_ID(Field) (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET) #define QUESTION_ID(Field) (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET)
#define LEGACY_FD_QUESTION_ID QUESTION_ID (LegacyFD) #define LEGACY_FD_QUESTION_ID QUESTION_ID (LegacyFD)
#define LEGACY_HD_QUESTION_ID QUESTION_ID (LegacyHD) #define LEGACY_HD_QUESTION_ID QUESTION_ID (LegacyHD)
#define LEGACY_CD_QUESTION_ID QUESTION_ID (LegacyCD) #define LEGACY_CD_QUESTION_ID QUESTION_ID (LegacyCD)
#define LEGACY_NET_QUESTION_ID QUESTION_ID (LegacyNET) #define LEGACY_NET_QUESTION_ID QUESTION_ID (LegacyNET)
#define LEGACY_BEV_QUESTION_ID QUESTION_ID (LegacyBEV) #define LEGACY_BEV_QUESTION_ID QUESTION_ID (LegacyBEV)
// //
// String Constant // String Constant
// //
@ -96,14 +92,11 @@ typedef struct {
EFI_DEVICE_PATH_PROTOCOL End; EFI_DEVICE_PATH_PROTOCOL End;
} HII_VENDOR_DEVICE_PATH; } HII_VENDOR_DEVICE_PATH;
// //
// Variable created with this flag will be "Efi:...." // Variable created with this flag will be "Efi:...."
// //
#define VAR_FLAG EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE #define VAR_FLAG EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE
#define LEGACY_BOOT_OPTION_CALLBACK_DATA_SIGNATURE SIGNATURE_32 ('L', 'G', 'C', 'B') #define LEGACY_BOOT_OPTION_CALLBACK_DATA_SIGNATURE SIGNATURE_32 ('L', 'G', 'C', 'B')
typedef struct { typedef struct {

View File

@ -6,7 +6,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef _EFI_LEGACY_BOOT_OPTION_VFR_H_ #ifndef _EFI_LEGACY_BOOT_OPTION_VFR_H_
#define _EFI_LEGACY_BOOT_OPTION_VFR_H_ #define _EFI_LEGACY_BOOT_OPTION_VFR_H_
@ -18,23 +17,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#define VARSTORE_ID_LEGACY_BOOT 0x0001 #define VARSTORE_ID_LEGACY_BOOT 0x0001
#define LEGACY_BOOT_FORM_ID 0x1000 #define LEGACY_BOOT_FORM_ID 0x1000
#define LEGACY_ORDER_CHANGE_FORM_ID 0x1001 #define LEGACY_ORDER_CHANGE_FORM_ID 0x1001
#define FORM_FLOPPY_BOOT_ID 0x2000 #define FORM_FLOPPY_BOOT_ID 0x2000
#define FORM_HARDDISK_BOOT_ID 0x2001 #define FORM_HARDDISK_BOOT_ID 0x2001
#define FORM_CDROM_BOOT_ID 0x2002 #define FORM_CDROM_BOOT_ID 0x2002
#define FORM_NET_BOOT_ID 0x2003 #define FORM_NET_BOOT_ID 0x2003
#define FORM_BEV_BOOT_ID 0x2004 #define FORM_BEV_BOOT_ID 0x2004
#define FORM_BOOT_LEGACY_DEVICE_ID 0x9000 #define FORM_BOOT_LEGACY_DEVICE_ID 0x9000
#define FORM_BOOT_LEGACY_LABEL_END 0x9001 #define FORM_BOOT_LEGACY_LABEL_END 0x9001
#pragma pack(1) #pragma pack(1)
/// ///

View File

@ -27,7 +27,7 @@ EFIAPI
LegacyBootManagerLibConstructor ( LegacyBootManagerLibConstructor (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EfiBootManagerRegisterLegacyBootSupport ( EfiBootManagerRegisterLegacyBootSupport (
LegacyBmRefreshAllBootOption, LegacyBmRefreshAllBootOption,
@ -48,9 +48,11 @@ LegacyBmDeviceType (
EFI_DEVICE_PATH_PROTOCOL *DevicePath EFI_DEVICE_PATH_PROTOCOL *DevicePath
) )
{ {
ASSERT ((DevicePathType (DevicePath) == BBS_DEVICE_PATH) && ASSERT (
(DevicePathSubType (DevicePath) == BBS_BBS_DP)); (DevicePathType (DevicePath) == BBS_DEVICE_PATH) &&
return ((BBS_BBS_DEVICE_PATH *) DevicePath)->DeviceType; (DevicePathSubType (DevicePath) == BBS_BBS_DP)
);
return ((BBS_BBS_DEVICE_PATH *)DevicePath)->DeviceType;
} }
/** /**
@ -167,10 +169,11 @@ LegacyBmBuildLegacyDevNameString (
Type = L"Unknown"; Type = L"Unknown";
break; break;
} }
// //
// If current BBS entry has its description then use it. // If current BBS entry has its description then use it.
// //
StringDesc = (CHAR8 *) (((UINTN) CurBBSEntry->DescStringSegment << 4) + CurBBSEntry->DescStringOffset); StringDesc = (CHAR8 *)(((UINTN)CurBBSEntry->DescStringSegment << 4) + CurBBSEntry->DescStringOffset);
if (NULL != StringDesc) { if (NULL != StringDesc) {
// //
// Only get first 32 characters, this is suggested by BBS spec // Only get first 32 characters, this is suggested by BBS spec
@ -186,7 +189,7 @@ LegacyBmBuildLegacyDevNameString (
// BbsTable 16 entries are for onboard IDE. // BbsTable 16 entries are for onboard IDE.
// Set description string for SATA harddisks, Harddisk 0 ~ Harddisk 11 // Set description string for SATA harddisks, Harddisk 0 ~ Harddisk 11
// //
if (Index >= 5 && Index <= 16 && (CurBBSEntry->DeviceType == BBS_HARDDISK || CurBBSEntry->DeviceType == BBS_CDROM)) { if ((Index >= 5) && (Index <= 16) && ((CurBBSEntry->DeviceType == BBS_HARDDISK) || (CurBBSEntry->DeviceType == BBS_CDROM))) {
Fmt = L"%s %d"; Fmt = L"%s %d";
UnicodeSPrint (BootString, BufSize, Fmt, Type, Index - 5); UnicodeSPrint (BootString, BufSize, Fmt, Type, Index - 5);
} else { } else {
@ -216,13 +219,14 @@ LegacyBmFuzzyMatch (
LEGACY_BM_BOOT_OPTION_BBS_DATA *BbsData; LEGACY_BM_BOOT_OPTION_BBS_DATA *BbsData;
CHAR16 Description[LEGACY_BM_BOOT_DESCRIPTION_LENGTH + 1]; CHAR16 Description[LEGACY_BM_BOOT_DESCRIPTION_LENGTH + 1];
BbsData = (LEGACY_BM_BOOT_OPTION_BBS_DATA *) BootOption->OptionalData; BbsData = (LEGACY_BM_BOOT_OPTION_BBS_DATA *)BootOption->OptionalData;
// //
// Directly check the BBS index stored in BootOption // Directly check the BBS index stored in BootOption
// //
if ((BbsData->BbsIndex < BbsCount) && if ((BbsData->BbsIndex < BbsCount) &&
(LegacyBmDeviceType (BootOption->FilePath) == BbsTable[BbsData->BbsIndex].DeviceType)) { (LegacyBmDeviceType (BootOption->FilePath) == BbsTable[BbsData->BbsIndex].DeviceType))
{
LegacyBmBuildLegacyDevNameString ( LegacyBmBuildLegacyDevNameString (
&BbsTable[BbsData->BbsIndex], &BbsTable[BbsData->BbsIndex],
BbsData->BbsIndex, BbsData->BbsIndex,
@ -246,7 +250,8 @@ LegacyBmFuzzyMatch (
// //
for (Index = 0; Index < BbsCount; Index++) { for (Index = 0; Index < BbsCount; Index++) {
if (!LegacyBmValidBbsEntry (&BbsTable[Index]) || if (!LegacyBmValidBbsEntry (&BbsTable[Index]) ||
(BbsTable[Index].DeviceType != LegacyBmDeviceType (BootOption->FilePath))) { (BbsTable[Index].DeviceType != LegacyBmDeviceType (BootOption->FilePath)))
{
continue; continue;
} }
@ -299,34 +304,38 @@ LegacyBmUpdateBbsIndex (
LEGACY_DEV_ORDER_ENTRY *Entry; LEGACY_DEV_ORDER_ENTRY *Entry;
UINTN Index; UINTN Index;
ASSERT (((LegacyDevOrder == NULL) && (*LegacyDevOrderSize == 0)) || ASSERT (
((LegacyDevOrder == NULL) && (*LegacyDevOrderSize == 0)) ||
((LegacyDevOrder != NULL) && (*LegacyDevOrderSize != 0)) ((LegacyDevOrder != NULL) && (*LegacyDevOrderSize != 0))
); );
for (Entry = LegacyDevOrder; for (Entry = LegacyDevOrder;
Entry < (LEGACY_DEV_ORDER_ENTRY *) ((UINT8 *) LegacyDevOrder + *LegacyDevOrderSize); Entry < (LEGACY_DEV_ORDER_ENTRY *)((UINT8 *)LegacyDevOrder + *LegacyDevOrderSize);
Entry = (LEGACY_DEV_ORDER_ENTRY *) ((UINTN) Entry + sizeof (BBS_TYPE) + Entry->Length) Entry = (LEGACY_DEV_ORDER_ENTRY *)((UINTN)Entry + sizeof (BBS_TYPE) + Entry->Length)
) { )
{
if (Entry->BbsType == DeviceType) { if (Entry->BbsType == DeviceType) {
for (Index = 0; Index < Entry->Length / sizeof (UINT16) - 1; Index++) { for (Index = 0; Index < Entry->Length / sizeof (UINT16) - 1; Index++) {
if (Entry->Data[Index] == OldBbsIndex) { if (Entry->Data[Index] == OldBbsIndex) {
if (NewBbsIndex == (UINT16) -1) { if (NewBbsIndex == (UINT16)-1) {
// //
// Delete the old entry // Delete the old entry
// //
CopyMem ( CopyMem (
&Entry->Data[Index], &Entry->Data[Index],
&Entry->Data[Index + 1], &Entry->Data[Index + 1],
(UINT8 *) LegacyDevOrder + *LegacyDevOrderSize - (UINT8 *) &Entry->Data[Index + 1] (UINT8 *)LegacyDevOrder + *LegacyDevOrderSize - (UINT8 *)&Entry->Data[Index + 1]
); );
Entry->Length -= sizeof (UINT16); Entry->Length -= sizeof (UINT16);
*LegacyDevOrderSize -= sizeof(UINT16); *LegacyDevOrderSize -= sizeof (UINT16);
} else { } else {
Entry->Data[Index] = NewBbsIndex; Entry->Data[Index] = NewBbsIndex;
} }
break; break;
} }
} }
break; break;
} }
} }
@ -350,7 +359,8 @@ LegacyBmDeleteAllBootOptions (
BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
for (Index = 0; Index < BootOptionCount; Index++) { for (Index = 0; Index < BootOptionCount; Index++) {
if ((DevicePathType (BootOption[Index].FilePath) == BBS_DEVICE_PATH) && if ((DevicePathType (BootOption[Index].FilePath) == BBS_DEVICE_PATH) &&
(DevicePathSubType (BootOption[Index].FilePath) == BBS_BBS_DP)) { (DevicePathSubType (BootOption[Index].FilePath) == BBS_BBS_DP))
{
Status = EfiBootManagerDeleteLoadOptionVariable (BootOption[Index].OptionNumber, BootOption[Index].OptionType); Status = EfiBootManagerDeleteLoadOptionVariable (BootOption[Index].OptionNumber, BootOption[Index].OptionType);
// //
// Deleting variable with current variable implementation shouldn't fail. // Deleting variable with current variable implementation shouldn't fail.
@ -374,7 +384,6 @@ LegacyBmDeleteAllBootOptions (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Delete all the invalid legacy boot options. Delete all the invalid legacy boot options.
@ -406,7 +415,7 @@ LegacyBmDeleteAllInvalidBootOptions (
HddInfo = NULL; HddInfo = NULL;
BbsTable = NULL; BbsTable = NULL;
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios); Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **)&LegacyBios);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -422,7 +431,7 @@ LegacyBmDeleteAllInvalidBootOptions (
return Status; return Status;
} }
GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **) &LegacyDevOrder, &LegacyDevOrderSize); GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **)&LegacyDevOrder, &LegacyDevOrderSize);
BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
@ -434,13 +443,14 @@ LegacyBmDeleteAllInvalidBootOptions (
// Skip non legacy boot option // Skip non legacy boot option
// //
if ((DevicePathType (BootOption[Index].FilePath) != BBS_DEVICE_PATH) || if ((DevicePathType (BootOption[Index].FilePath) != BBS_DEVICE_PATH) ||
(DevicePathSubType (BootOption[Index].FilePath) != BBS_BBS_DP)) { (DevicePathSubType (BootOption[Index].FilePath) != BBS_BBS_DP))
{
continue; continue;
} }
BbsIndex = LegacyBmFuzzyMatch (&BootOption[Index], BbsTable, BbsCount, BbsIndexUsed); BbsIndex = LegacyBmFuzzyMatch (&BootOption[Index], BbsTable, BbsCount, BbsIndexUsed);
if (BbsIndex == BbsCount) { if (BbsIndex == BbsCount) {
DEBUG ((DEBUG_INFO, "[LegacyBds] Delete Boot Option Boot%04x: %s\n", (UINTN) BootOption[Index].OptionNumber, BootOption[Index].Description)); DEBUG ((DEBUG_INFO, "[LegacyBds] Delete Boot Option Boot%04x: %s\n", (UINTN)BootOption[Index].OptionNumber, BootOption[Index].Description));
// //
// Delete entry from LegacyDevOrder // Delete entry from LegacyDevOrder
// //
@ -448,14 +458,20 @@ LegacyBmDeleteAllInvalidBootOptions (
LegacyDevOrder, LegacyDevOrder,
&LegacyDevOrderSize, &LegacyDevOrderSize,
LegacyBmDeviceType (BootOption[Index].FilePath), LegacyBmDeviceType (BootOption[Index].FilePath),
((LEGACY_BM_BOOT_OPTION_BBS_DATA *) BootOption[Index].OptionalData)->BbsIndex, ((LEGACY_BM_BOOT_OPTION_BBS_DATA *)BootOption[Index].OptionalData)->BbsIndex,
(UINT16) -1 (UINT16)-1
); );
EfiBootManagerDeleteLoadOptionVariable (BootOption[Index].OptionNumber, BootOption[Index].OptionType); EfiBootManagerDeleteLoadOptionVariable (BootOption[Index].OptionNumber, BootOption[Index].OptionType);
} else { } else {
if (((LEGACY_BM_BOOT_OPTION_BBS_DATA *) BootOption[Index].OptionalData)->BbsIndex != BbsIndex) { if (((LEGACY_BM_BOOT_OPTION_BBS_DATA *)BootOption[Index].OptionalData)->BbsIndex != BbsIndex) {
DEBUG ((DEBUG_INFO, "[LegacyBds] Update Boot Option Boot%04x: %s Bbs0x%04x->Bbs0x%04x\n", (UINTN) BootOption[Index].OptionNumber, BootOption[Index].Description, DEBUG ((
(UINTN) ((LEGACY_BM_BOOT_OPTION_BBS_DATA *) BootOption[Index].OptionalData)->BbsIndex, (UINTN) BbsIndex)); DEBUG_INFO,
"[LegacyBds] Update Boot Option Boot%04x: %s Bbs0x%04x->Bbs0x%04x\n",
(UINTN)BootOption[Index].OptionNumber,
BootOption[Index].Description,
(UINTN)((LEGACY_BM_BOOT_OPTION_BBS_DATA *)BootOption[Index].OptionalData)->BbsIndex,
(UINTN)BbsIndex
));
// //
// Update the BBS index in LegacyDevOrder // Update the BBS index in LegacyDevOrder
// //
@ -463,18 +479,19 @@ LegacyBmDeleteAllInvalidBootOptions (
LegacyDevOrder, LegacyDevOrder,
&LegacyDevOrderSize, &LegacyDevOrderSize,
LegacyBmDeviceType (BootOption[Index].FilePath), LegacyBmDeviceType (BootOption[Index].FilePath),
((LEGACY_BM_BOOT_OPTION_BBS_DATA *) BootOption[Index].OptionalData)->BbsIndex, ((LEGACY_BM_BOOT_OPTION_BBS_DATA *)BootOption[Index].OptionalData)->BbsIndex,
BbsIndex BbsIndex
); );
// //
// Update the OptionalData in the Boot#### variable // Update the OptionalData in the Boot#### variable
// //
((LEGACY_BM_BOOT_OPTION_BBS_DATA *) BootOption[Index].OptionalData)->BbsIndex = BbsIndex; ((LEGACY_BM_BOOT_OPTION_BBS_DATA *)BootOption[Index].OptionalData)->BbsIndex = BbsIndex;
EfiBootManagerLoadOptionToVariable (&BootOption[Index]); EfiBootManagerLoadOptionToVariable (&BootOption[Index]);
} }
} }
} }
EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount); EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount);
if (LegacyDevOrder != NULL) { if (LegacyDevOrder != NULL) {
@ -492,7 +509,8 @@ LegacyBmDeleteAllInvalidBootOptions (
FreePool (LegacyDevOrder); FreePool (LegacyDevOrder);
} }
FreePool(BbsIndexUsed);
FreePool (BbsIndexUsed);
return Status; return Status;
} }
@ -536,7 +554,7 @@ LegacyBmCreateLegacyBootOption (
DevicePath = AllocatePool (sizeof (BBS_BBS_DEVICE_PATH) + StringLen + END_DEVICE_PATH_LENGTH); DevicePath = AllocatePool (sizeof (BBS_BBS_DEVICE_PATH) + StringLen + END_DEVICE_PATH_LENGTH);
ASSERT (DevicePath != NULL); ASSERT (DevicePath != NULL);
BbsNode = (BBS_BBS_DEVICE_PATH *) DevicePath; BbsNode = (BBS_BBS_DEVICE_PATH *)DevicePath;
SetDevicePathNodeLength (BbsNode, sizeof (BBS_BBS_DEVICE_PATH) + StringLen); SetDevicePathNodeLength (BbsNode, sizeof (BBS_BBS_DEVICE_PATH) + StringLen);
BbsNode->Header.Type = BBS_DEVICE_PATH; BbsNode->Header.Type = BBS_DEVICE_PATH;
BbsNode->Header.SubType = BBS_BBS_DP; BbsNode->Header.SubType = BBS_BBS_DP;
@ -563,7 +581,7 @@ LegacyBmCreateLegacyBootOption (
LOAD_OPTION_ACTIVE, LOAD_OPTION_ACTIVE,
Description, Description,
DevicePath, DevicePath,
(UINT8 *) OptionalData, (UINT8 *)OptionalData,
sizeof (LEGACY_BM_BOOT_OPTION_BBS_DATA) sizeof (LEGACY_BM_BOOT_OPTION_BBS_DATA)
); );
FreePool (DevicePath); FreePool (DevicePath);
@ -602,7 +620,7 @@ LegacyBmFillDevOrderBuf (
continue; continue;
} }
*Buf = (UINT16) (Index & 0xFF); *Buf = (UINT16)(Index & 0xFF);
Buf++; Buf++;
} }
@ -697,29 +715,30 @@ LegacyBmCreateDevOrder (
if (NULL == DevOrder) { if (NULL == DevOrder) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
DevOrderPtr = DevOrder; DevOrderPtr = DevOrder;
DevOrderPtr->BbsType = BBS_FLOPPY; DevOrderPtr->BbsType = BBS_FLOPPY;
DevOrderPtr->Length = (UINT16) (sizeof (DevOrderPtr->Length) + FDCount * sizeof (UINT16)); DevOrderPtr->Length = (UINT16)(sizeof (DevOrderPtr->Length) + FDCount * sizeof (UINT16));
DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *) LegacyBmFillDevOrderBuf (BbsTable, BBS_FLOPPY, BbsCount, DevOrderPtr->Data); DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *)LegacyBmFillDevOrderBuf (BbsTable, BBS_FLOPPY, BbsCount, DevOrderPtr->Data);
DevOrderPtr->BbsType = BBS_HARDDISK; DevOrderPtr->BbsType = BBS_HARDDISK;
DevOrderPtr->Length = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16)); DevOrderPtr->Length = (UINT16)(sizeof (UINT16) + HDCount * sizeof (UINT16));
DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *) LegacyBmFillDevOrderBuf (BbsTable, BBS_HARDDISK, BbsCount, DevOrderPtr->Data); DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *)LegacyBmFillDevOrderBuf (BbsTable, BBS_HARDDISK, BbsCount, DevOrderPtr->Data);
DevOrderPtr->BbsType = BBS_CDROM; DevOrderPtr->BbsType = BBS_CDROM;
DevOrderPtr->Length = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16)); DevOrderPtr->Length = (UINT16)(sizeof (UINT16) + CDCount * sizeof (UINT16));
DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *) LegacyBmFillDevOrderBuf (BbsTable, BBS_CDROM, BbsCount, DevOrderPtr->Data); DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *)LegacyBmFillDevOrderBuf (BbsTable, BBS_CDROM, BbsCount, DevOrderPtr->Data);
DevOrderPtr->BbsType = BBS_EMBED_NETWORK; DevOrderPtr->BbsType = BBS_EMBED_NETWORK;
DevOrderPtr->Length = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16)); DevOrderPtr->Length = (UINT16)(sizeof (UINT16) + NETCount * sizeof (UINT16));
DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *) LegacyBmFillDevOrderBuf (BbsTable, BBS_EMBED_NETWORK, BbsCount, DevOrderPtr->Data); DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *)LegacyBmFillDevOrderBuf (BbsTable, BBS_EMBED_NETWORK, BbsCount, DevOrderPtr->Data);
DevOrderPtr->BbsType = BBS_BEV_DEVICE; DevOrderPtr->BbsType = BBS_BEV_DEVICE;
DevOrderPtr->Length = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16)); DevOrderPtr->Length = (UINT16)(sizeof (UINT16) + BEVCount * sizeof (UINT16));
DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *) LegacyBmFillDevOrderBuf (BbsTable, BBS_BEV_DEVICE, BbsCount, DevOrderPtr->Data); DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *)LegacyBmFillDevOrderBuf (BbsTable, BBS_BEV_DEVICE, BbsCount, DevOrderPtr->Data);
ASSERT (TotalSize == ((UINTN) DevOrderPtr - (UINTN) DevOrder)); ASSERT (TotalSize == ((UINTN)DevOrderPtr - (UINTN)DevOrder));
// //
// Save device order for legacy boot device to variable. // Save device order for legacy boot device to variable.
@ -798,7 +817,7 @@ LegacyBmUpdateDevOrder (
BEVIndex = 0; BEVIndex = 0;
NewDevPtr = NULL; NewDevPtr = NULL;
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios); Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **)&LegacyBios);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -814,10 +833,11 @@ LegacyBmUpdateDevOrder (
return Status; return Status;
} }
GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **) &DevOrder, NULL); GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **)&DevOrder, NULL);
if (NULL == DevOrder) { if (NULL == DevOrder) {
return LegacyBmCreateDevOrder (LocalBbsTable, BbsCount); return LegacyBmCreateDevOrder (LocalBbsTable, BbsCount);
} }
// //
// First we figure out how many boot devices with same device type respectively // First we figure out how many boot devices with same device type respectively
// //
@ -869,93 +889,103 @@ LegacyBmUpdateDevOrder (
Ptr = DevOrder; Ptr = DevOrder;
NewPtr = NewDevOrder; NewPtr = NewDevOrder;
NewPtr->BbsType = Ptr->BbsType; NewPtr->BbsType = Ptr->BbsType;
NewPtr->Length = (UINT16) (sizeof (UINT16) + FDCount * sizeof (UINT16)); NewPtr->Length = (UINT16)(sizeof (UINT16) + FDCount * sizeof (UINT16));
for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) || if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) ||
LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_FLOPPY (LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_FLOPPY)
) { )
{
continue; continue;
} }
NewPtr->Data[FDIndex] = Ptr->Data[Index]; NewPtr->Data[FDIndex] = Ptr->Data[Index];
FDIndex++; FDIndex++;
} }
NewFDPtr = NewPtr->Data; NewFDPtr = NewPtr->Data;
// //
// copy HD // copy HD
// //
Ptr = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]); Ptr = (LEGACY_DEV_ORDER_ENTRY *)(&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]); NewPtr = (LEGACY_DEV_ORDER_ENTRY *)(&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
NewPtr->BbsType = Ptr->BbsType; NewPtr->BbsType = Ptr->BbsType;
NewPtr->Length = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16)); NewPtr->Length = (UINT16)(sizeof (UINT16) + HDCount * sizeof (UINT16));
for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) || if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) ||
LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_HARDDISK (LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_HARDDISK)
) { )
{
continue; continue;
} }
NewPtr->Data[HDIndex] = Ptr->Data[Index]; NewPtr->Data[HDIndex] = Ptr->Data[Index];
HDIndex++; HDIndex++;
} }
NewHDPtr = NewPtr->Data; NewHDPtr = NewPtr->Data;
// //
// copy CD // copy CD
// //
Ptr = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]); Ptr = (LEGACY_DEV_ORDER_ENTRY *)(&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]); NewPtr = (LEGACY_DEV_ORDER_ENTRY *)(&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
NewPtr->BbsType = Ptr->BbsType; NewPtr->BbsType = Ptr->BbsType;
NewPtr->Length = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16)); NewPtr->Length = (UINT16)(sizeof (UINT16) + CDCount * sizeof (UINT16));
for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) || if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) ||
LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_CDROM (LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_CDROM)
) { )
{
continue; continue;
} }
NewPtr->Data[CDIndex] = Ptr->Data[Index]; NewPtr->Data[CDIndex] = Ptr->Data[Index];
CDIndex++; CDIndex++;
} }
NewCDPtr = NewPtr->Data; NewCDPtr = NewPtr->Data;
// //
// copy NET // copy NET
// //
Ptr = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]); Ptr = (LEGACY_DEV_ORDER_ENTRY *)(&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]); NewPtr = (LEGACY_DEV_ORDER_ENTRY *)(&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
NewPtr->BbsType = Ptr->BbsType; NewPtr->BbsType = Ptr->BbsType;
NewPtr->Length = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16)); NewPtr->Length = (UINT16)(sizeof (UINT16) + NETCount * sizeof (UINT16));
for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) || if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) ||
LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_EMBED_NETWORK (LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_EMBED_NETWORK)
) { )
{
continue; continue;
} }
NewPtr->Data[NETIndex] = Ptr->Data[Index]; NewPtr->Data[NETIndex] = Ptr->Data[Index];
NETIndex++; NETIndex++;
} }
NewNETPtr = NewPtr->Data; NewNETPtr = NewPtr->Data;
// //
// copy BEV // copy BEV
// //
Ptr = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]); Ptr = (LEGACY_DEV_ORDER_ENTRY *)(&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]); NewPtr = (LEGACY_DEV_ORDER_ENTRY *)(&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
NewPtr->BbsType = Ptr->BbsType; NewPtr->BbsType = Ptr->BbsType;
NewPtr->Length = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16)); NewPtr->Length = (UINT16)(sizeof (UINT16) + BEVCount * sizeof (UINT16));
for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) || if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) ||
LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_BEV_DEVICE (LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_BEV_DEVICE)
) { )
{
continue; continue;
} }
NewPtr->Data[BEVIndex] = Ptr->Data[Index]; NewPtr->Data[BEVIndex] = Ptr->Data[Index];
BEVIndex++; BEVIndex++;
} }
NewBEVPtr = NewPtr->Data; NewBEVPtr = NewPtr->Data;
for (Index = 0; Index < BbsCount; Index++) { for (Index = 0; Index < BbsCount; Index++) {
@ -993,13 +1023,14 @@ LegacyBmUpdateDevOrder (
Idx = NULL; Idx = NULL;
break; break;
} }
// //
// at this point we have copied those valid indexes to new buffer // at this point we have copied those valid indexes to new buffer
// and we should check if there is any new appeared boot device // and we should check if there is any new appeared boot device
// //
if (Idx != NULL) { if (Idx != NULL) {
for (Index2 = 0; Index2 < *Idx; Index2++) { for (Index2 = 0; Index2 < *Idx; Index2++) {
if ((NewDevPtr[Index2] & 0xFF) == (UINT16) Index) { if ((NewDevPtr[Index2] & 0xFF) == (UINT16)Index) {
break; break;
} }
} }
@ -1015,8 +1046,9 @@ LegacyBmUpdateDevOrder (
break; break;
} }
} }
CopyMem (&NewDevPtr[Index2 + 1], &NewDevPtr[Index2], (*Idx - Index2) * sizeof (UINT16)); CopyMem (&NewDevPtr[Index2 + 1], &NewDevPtr[Index2], (*Idx - Index2) * sizeof (UINT16));
NewDevPtr[Index2] = (UINT16) (Index & 0xFF); NewDevPtr[Index2] = (UINT16)(Index & 0xFF);
(*Idx)++; (*Idx)++;
} }
} }
@ -1062,26 +1094,26 @@ LegacyBmSetPriorityForSameTypeDev (
UINTN DevOrderSize; UINTN DevOrderSize;
UINTN Index; UINTN Index;
GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **) &DevOrder, &DevOrderSize); GetVariable2 (VAR_LEGACY_DEV_ORDER, &gEfiLegacyDevOrderVariableGuid, (VOID **)&DevOrder, &DevOrderSize);
if (NULL == DevOrder) { if (NULL == DevOrder) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
DevOrderPtr = DevOrder; DevOrderPtr = DevOrder;
while ((UINT8 *) DevOrderPtr < (UINT8 *) DevOrder + DevOrderSize) { while ((UINT8 *)DevOrderPtr < (UINT8 *)DevOrder + DevOrderSize) {
if (DevOrderPtr->BbsType == DeviceType) { if (DevOrderPtr->BbsType == DeviceType) {
break; break;
} }
DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *) ((UINTN) DevOrderPtr + sizeof (BBS_TYPE) + DevOrderPtr->Length); DevOrderPtr = (LEGACY_DEV_ORDER_ENTRY *)((UINTN)DevOrderPtr + sizeof (BBS_TYPE) + DevOrderPtr->Length);
} }
if ((UINT8 *) DevOrderPtr >= (UINT8 *) DevOrder + DevOrderSize) { if ((UINT8 *)DevOrderPtr >= (UINT8 *)DevOrder + DevOrderSize) {
FreePool (DevOrder); FreePool (DevOrder);
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
if (BbsIndex != (UINTN) -1) { if (BbsIndex != (UINTN)-1) {
// //
// In case the BBS entry isn't valid because devices were plugged or removed. // In case the BBS entry isn't valid because devices were plugged or removed.
// //
@ -1089,9 +1121,11 @@ LegacyBmSetPriorityForSameTypeDev (
FreePool (DevOrder); FreePool (DevOrder);
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
LocalBbsTable[BbsIndex].BootPriority = *Priority; LocalBbsTable[BbsIndex].BootPriority = *Priority;
(*Priority)++; (*Priority)++;
} }
// //
// If the high byte of the DevIndex is 0xFF, it indicates that this device has been disabled. // If the high byte of the DevIndex is 0xFF, it indicates that this device has been disabled.
// //
@ -1135,19 +1169,19 @@ LegacyBmPrintBbsTable (
DEBUG ( DEBUG (
(DEBUG_INFO, (DEBUG_INFO,
" %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x %04x:%04x\n", " %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x %04x:%04x\n",
(UINTN) Index, (UINTN)Index,
(UINTN) LocalBbsTable[Index].BootPriority, (UINTN)LocalBbsTable[Index].BootPriority,
(UINTN) LocalBbsTable[Index].Bus, (UINTN)LocalBbsTable[Index].Bus,
(UINTN) LocalBbsTable[Index].Device, (UINTN)LocalBbsTable[Index].Device,
(UINTN) LocalBbsTable[Index].Function, (UINTN)LocalBbsTable[Index].Function,
(UINTN) LocalBbsTable[Index].Class, (UINTN)LocalBbsTable[Index].Class,
(UINTN) LocalBbsTable[Index].SubClass, (UINTN)LocalBbsTable[Index].SubClass,
(UINTN) LocalBbsTable[Index].DeviceType, (UINTN)LocalBbsTable[Index].DeviceType,
(UINTN) * (UINT16 *) &LocalBbsTable[Index].StatusFlags, (UINTN)*(UINT16 *)&LocalBbsTable[Index].StatusFlags,
(UINTN) LocalBbsTable[Index].BootHandlerSegment, (UINTN)LocalBbsTable[Index].BootHandlerSegment,
(UINTN) LocalBbsTable[Index].BootHandlerOffset, (UINTN)LocalBbsTable[Index].BootHandlerOffset,
(UINTN) ((LocalBbsTable[Index].MfgStringSegment << 4) + LocalBbsTable[Index].MfgStringOffset), (UINTN)((LocalBbsTable[Index].MfgStringSegment << 4) + LocalBbsTable[Index].MfgStringOffset),
(UINTN) ((LocalBbsTable[Index].DescStringSegment << 4) + LocalBbsTable[Index].DescStringOffset)) (UINTN)((LocalBbsTable[Index].DescStringSegment << 4) + LocalBbsTable[Index].DescStringOffset))
); );
} }
@ -1190,7 +1224,7 @@ LegacyBmRefreshBbsTableForBoot (
LocalBbsTable = NULL; LocalBbsTable = NULL;
DevType = BBS_UNKNOWN; DevType = BBS_UNKNOWN;
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios); Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **)&LegacyBios);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -1215,17 +1249,19 @@ LegacyBmRefreshBbsTableForBoot (
LocalBbsTable[Index].BootPriority = BBS_UNPRIORITIZED_ENTRY; LocalBbsTable[Index].BootPriority = BBS_UNPRIORITIZED_ENTRY;
} }
} }
// //
// boot priority always starts at 0 // boot priority always starts at 0
// //
Priority = 0; Priority = 0;
if ((DevicePathType (BootOption->FilePath) == BBS_DEVICE_PATH) && if ((DevicePathType (BootOption->FilePath) == BBS_DEVICE_PATH) &&
(DevicePathSubType (BootOption->FilePath) == BBS_BBS_DP)) { (DevicePathSubType (BootOption->FilePath) == BBS_BBS_DP))
{
// //
// If BootOption stands for a legacy boot option, we prioritize the devices with the same type first. // If BootOption stands for a legacy boot option, we prioritize the devices with the same type first.
// //
DevType = LegacyBmDeviceType (BootOption->FilePath); DevType = LegacyBmDeviceType (BootOption->FilePath);
BbsIndex = ((LEGACY_BM_BOOT_OPTION_BBS_DATA *) BootOption->OptionalData)->BbsIndex; BbsIndex = ((LEGACY_BM_BOOT_OPTION_BBS_DATA *)BootOption->OptionalData)->BbsIndex;
Status = LegacyBmSetPriorityForSameTypeDev ( Status = LegacyBmSetPriorityForSameTypeDev (
DevType, DevType,
BbsIndex, BbsIndex,
@ -1236,6 +1272,7 @@ LegacyBmRefreshBbsTableForBoot (
return Status; return Status;
} }
} }
// //
// we have to set the boot priority for other BBS entries with different device types // we have to set the boot priority for other BBS entries with different device types
// //
@ -1246,7 +1283,8 @@ LegacyBmRefreshBbsTableForBoot (
DeviceTypeCount = 1; DeviceTypeCount = 1;
for (Index = 0; Index < OptionCount; Index++) { for (Index = 0; Index < OptionCount; Index++) {
if ((DevicePathType (Option[Index].FilePath) != BBS_DEVICE_PATH) || if ((DevicePathType (Option[Index].FilePath) != BBS_DEVICE_PATH) ||
(DevicePathSubType (Option[Index].FilePath) != BBS_BBS_DP)) { (DevicePathSubType (Option[Index].FilePath) != BBS_BBS_DP))
{
continue; continue;
} }
@ -1256,6 +1294,7 @@ LegacyBmRefreshBbsTableForBoot (
break; break;
} }
} }
if (DeviceTypeIndex < DeviceTypeCount) { if (DeviceTypeIndex < DeviceTypeCount) {
// //
// We don't want to process twice for a device type // We don't want to process twice for a device type
@ -1268,21 +1307,21 @@ LegacyBmRefreshBbsTableForBoot (
Status = LegacyBmSetPriorityForSameTypeDev ( Status = LegacyBmSetPriorityForSameTypeDev (
DevType, DevType,
(UINTN) -1, (UINTN)-1,
LocalBbsTable, LocalBbsTable,
&Priority &Priority
); );
} }
EfiBootManagerFreeLoadOptions (Option, OptionCount); EfiBootManagerFreeLoadOptions (Option, OptionCount);
DEBUG_CODE_BEGIN(); DEBUG_CODE_BEGIN ();
LegacyBmPrintBbsTable (LocalBbsTable, BbsCount); LegacyBmPrintBbsTable (LocalBbsTable, BbsCount);
DEBUG_CODE_END(); DEBUG_CODE_END ();
return Status; return Status;
} }
/** /**
Boot the legacy system with the boot option. Boot the legacy system with the boot option.
@ -1301,7 +1340,7 @@ LegacyBmBoot (
EFI_STATUS Status; EFI_STATUS Status;
EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios); Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **)&LegacyBios);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //
// If no LegacyBios protocol we do not support legacy boot // If no LegacyBios protocol we do not support legacy boot
@ -1309,6 +1348,7 @@ LegacyBmBoot (
BootOption->Status = EFI_UNSUPPORTED; BootOption->Status = EFI_UNSUPPORTED;
return; return;
} }
// //
// Notes: if we separate the int 19, then we don't need to refresh BBS // Notes: if we separate the int 19, then we don't need to refresh BBS
// //
@ -1320,7 +1360,7 @@ LegacyBmBoot (
BootOption->Status = LegacyBios->LegacyBoot ( BootOption->Status = LegacyBios->LegacyBoot (
LegacyBios, LegacyBios,
(BBS_BBS_DEVICE_PATH *) BootOption->FilePath, (BBS_BBS_DEVICE_PATH *)BootOption->FilePath,
BootOption->OptionalDataSize, BootOption->OptionalDataSize,
BootOption->OptionalData BootOption->OptionalData
); );
@ -1353,7 +1393,7 @@ LegacyBmEnumerateAllBootOptions (
*BootOptionCount = 0; *BootOptionCount = 0;
BbsCount = 0; BbsCount = 0;
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios); Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **)&LegacyBios);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return NULL; return NULL;
} }
@ -1413,8 +1453,9 @@ LegacyBmFindBootOption (
if ((StrCmp (Key->Description, Array[Index].Description) == 0) && if ((StrCmp (Key->Description, Array[Index].Description) == 0) &&
(CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSize (Key->FilePath)) == 0) && (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSize (Key->FilePath)) == 0) &&
(Key->OptionalDataSize == Array[Index].OptionalDataSize) && (Key->OptionalDataSize == Array[Index].OptionalDataSize) &&
(CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->OptionalDataSize) == 0)) { (CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->OptionalDataSize) == 0))
return (INTN) Index; {
return (INTN)Index;
} }
} }
@ -1445,11 +1486,12 @@ LegacyBmRefreshAllBootOption (
EFI_BOOT_MANAGER_LOAD_OPTION *ExistingBootOptions; EFI_BOOT_MANAGER_LOAD_OPTION *ExistingBootOptions;
UINTN ExistingBootOptionCount; UINTN ExistingBootOptionCount;
Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios); Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **)&LegacyBios);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
LegacyBmDeleteAllBootOptions (); LegacyBmDeleteAllBootOptions ();
return; return;
} }
PERF_START (NULL, "LegacyBootOptionEnum", "BDS", 0); PERF_START (NULL, "LegacyBootOptionEnum", "BDS", 0);
// //
@ -1504,11 +1546,12 @@ LegacyBmRefreshAllBootOption (
for (Index = 0; Index < BootOptionCount; Index++) { for (Index = 0; Index < BootOptionCount; Index++) {
if (LegacyBmFindBootOption (&BootOptions[Index], ExistingBootOptions, ExistingBootOptionCount) == -1) { if (LegacyBmFindBootOption (&BootOptions[Index], ExistingBootOptions, ExistingBootOptionCount) == -1) {
Status = EfiBootManagerAddLoadOptionVariable (&BootOptions[Index], (UINTN) -1); Status = EfiBootManagerAddLoadOptionVariable (&BootOptions[Index], (UINTN)-1);
DEBUG (( DEBUG ((
DEBUG_INFO, "[LegacyBds] New Boot Option: Boot%04x Bbs0x%04x %s %r\n", DEBUG_INFO,
(UINTN) BootOptions[Index].OptionNumber, "[LegacyBds] New Boot Option: Boot%04x Bbs0x%04x %s %r\n",
(UINTN) ((LEGACY_BM_BOOT_OPTION_BBS_DATA *) BootOptions[Index].OptionalData)->BbsIndex, (UINTN)BootOptions[Index].OptionNumber,
(UINTN)((LEGACY_BM_BOOT_OPTION_BBS_DATA *)BootOptions[Index].OptionalData)->BbsIndex,
BootOptions[Index].Description, BootOptions[Index].Description,
Status Status
)); ));

View File

@ -82,7 +82,6 @@ EFI_FW_VOL_BLOCK_DEVICE mEmuVarsFvb = {
}, },
}; };
/** /**
Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE.
@ -103,7 +102,6 @@ FvbVirtualAddressChangeEvent (
EfiConvertPointer (0x0, &mEmuVarsFvb.BufferPtr); EfiConvertPointer (0x0, &mEmuVarsFvb.BufferPtr);
} }
// //
// FVB protocol APIs // FVB protocol APIs
// //
@ -136,12 +134,11 @@ FvbProtocolGetPhysicalAddress (
FvbDevice = FVB_DEVICE_FROM_THIS (This); FvbDevice = FVB_DEVICE_FROM_THIS (This);
*Address = (EFI_PHYSICAL_ADDRESS)(UINTN) FvbDevice->BufferPtr; *Address = (EFI_PHYSICAL_ADDRESS)(UINTN)FvbDevice->BufferPtr;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
The GetBlockSize() function retrieves the size of the requested The GetBlockSize() function retrieves the size of the requested
block. It also returns the number of additional blocks with block. It also returns the number of additional blocks with
@ -191,7 +188,6 @@ FvbProtocolGetBlockSize (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
The GetAttributes() function retrieves the attributes and The GetAttributes() function retrieves the attributes and
current settings of the block. Status Codes Returned current settings of the block. Status Codes Returned
@ -215,7 +211,7 @@ FvbProtocolGetAttributes (
) )
{ {
*Attributes = *Attributes =
(EFI_FVB_ATTRIBUTES_2) ( (EFI_FVB_ATTRIBUTES_2)(
EFI_FVB2_READ_ENABLED_CAP | EFI_FVB2_READ_ENABLED_CAP |
EFI_FVB2_READ_STATUS | EFI_FVB2_READ_STATUS |
EFI_FVB2_WRITE_ENABLED_CAP | EFI_FVB2_WRITE_ENABLED_CAP |
@ -226,7 +222,6 @@ FvbProtocolGetAttributes (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
The SetAttributes() function sets configurable firmware volume The SetAttributes() function sets configurable firmware volume
attributes and returns the new settings of the firmware volume. attributes and returns the new settings of the firmware volume.
@ -259,7 +254,6 @@ FvbProtocolSetAttributes (
return EFI_ACCESS_DENIED; return EFI_ACCESS_DENIED;
} }
/** /**
Erases and initializes a firmware volume block. Erases and initializes a firmware volume block.
@ -333,14 +327,17 @@ FvbProtocolEraseBlocks (
if (StartingLba == EFI_LBA_LIST_TERMINATOR) { if (StartingLba == EFI_LBA_LIST_TERMINATOR) {
break; break;
} }
NumOfLba = VA_ARG (Args, UINTN); NumOfLba = VA_ARG (Args, UINTN);
if (StartingLba > EMU_FVB_NUM_TOTAL_BLOCKS || if ((StartingLba > EMU_FVB_NUM_TOTAL_BLOCKS) ||
NumOfLba > EMU_FVB_NUM_TOTAL_BLOCKS - StartingLba) { (NumOfLba > EMU_FVB_NUM_TOTAL_BLOCKS - StartingLba))
{
VA_END (Args); VA_END (Args);
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
} while (1); } while (1);
VA_END (Args); VA_END (Args);
// //
@ -352,6 +349,7 @@ FvbProtocolEraseBlocks (
if (StartingLba == EFI_LBA_LIST_TERMINATOR) { if (StartingLba == EFI_LBA_LIST_TERMINATOR) {
break; break;
} }
NumOfLba = VA_ARG (Args, UINTN); NumOfLba = VA_ARG (Args, UINTN);
ErasePtr = FvbDevice->BufferPtr; ErasePtr = FvbDevice->BufferPtr;
@ -360,6 +358,7 @@ FvbProtocolEraseBlocks (
SetMem (ErasePtr, EraseSize, ERASED_UINT8); SetMem (ErasePtr, EraseSize, ERASED_UINT8);
} while (1); } while (1);
VA_END (Args); VA_END (Args);
// //
@ -372,7 +371,6 @@ FvbProtocolEraseBlocks (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Writes the specified number of bytes from the input buffer to the block. Writes the specified number of bytes from the input buffer to the block.
@ -448,8 +446,9 @@ FvbProtocolWrite (
FvbDevice = FVB_DEVICE_FROM_THIS (This); FvbDevice = FVB_DEVICE_FROM_THIS (This);
if (Lba >= EMU_FVB_NUM_TOTAL_BLOCKS || if ((Lba >= EMU_FVB_NUM_TOTAL_BLOCKS) ||
Offset > FvbDevice->BlockSize) { (Offset > FvbDevice->BlockSize))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -468,7 +467,6 @@ FvbProtocolWrite (
return Status; return Status;
} }
/** /**
Reads the specified number of bytes into a buffer from the specified block. Reads the specified number of bytes into a buffer from the specified block.
@ -532,8 +530,9 @@ FvbProtocolRead (
FvbDevice = FVB_DEVICE_FROM_THIS (This); FvbDevice = FVB_DEVICE_FROM_THIS (This);
if (Lba >= EMU_FVB_NUM_TOTAL_BLOCKS || if ((Lba >= EMU_FVB_NUM_TOTAL_BLOCKS) ||
Offset > FvbDevice->BlockSize) { (Offset > FvbDevice->BlockSize))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -552,7 +551,6 @@ FvbProtocolRead (
return Status; return Status;
} }
/** /**
Check the integrity of firmware volume header. Check the integrity of firmware volume header.
@ -578,14 +576,16 @@ ValidateFvHeader (
(FwVolHeader->Signature != EFI_FVH_SIGNATURE) || (FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||
(FwVolHeader->FvLength != EMU_FVB_SIZE) || (FwVolHeader->FvLength != EMU_FVB_SIZE) ||
(FwVolHeader->HeaderLength != EMU_FV_HEADER_LENGTH) (FwVolHeader->HeaderLength != EMU_FV_HEADER_LENGTH)
) { )
{
DEBUG ((DEBUG_INFO, "EMU Variable FVB: Basic FV headers were invalid\n")); DEBUG ((DEBUG_INFO, "EMU Variable FVB: Basic FV headers were invalid\n"));
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
// //
// Verify the header checksum // Verify the header checksum
// //
Checksum = CalculateSum16((VOID*) FwVolHeader, FwVolHeader->HeaderLength); Checksum = CalculateSum16 ((VOID *)FwVolHeader, FwVolHeader->HeaderLength);
if (Checksum != 0) { if (Checksum != 0) {
DEBUG ((DEBUG_INFO, "EMU Variable FVB: FV checksum was invalid\n")); DEBUG ((DEBUG_INFO, "EMU Variable FVB: FV checksum was invalid\n"));
@ -595,7 +595,6 @@ ValidateFvHeader (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Initializes the FV Header and Variable Store Header Initializes the FV Header and Variable Store Header
to support variable operations. to support variable operations.
@ -638,7 +637,7 @@ InitializeFvAndVariableStoreHeaders (
0, 0,
// UINT8 Reserved[1]; // UINT8 Reserved[1];
{0}, { 0 },
// UINT8 Revision; // UINT8 Revision;
EFI_FVH_REVISION, EFI_FVH_REVISION,
@ -691,7 +690,7 @@ InitializeFvAndVariableStoreHeaders (
// //
// Update the checksum for the FV header // Update the checksum for the FV header
// //
Fv = (EFI_FIRMWARE_VOLUME_HEADER*) Ptr; Fv = (EFI_FIRMWARE_VOLUME_HEADER *)Ptr;
Fv->Checksum = CalculateCheckSum16 (Ptr, Fv->HeaderLength); Fv->Checksum = CalculateCheckSum16 (Ptr, Fv->HeaderLength);
} }
@ -724,21 +723,27 @@ FvbInitialize (
// //
// Verify that the PCD's are set correctly. // Verify that the PCD's are set correctly.
// //
ASSERT (FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) % ASSERT (
EMU_FVB_BLOCK_SIZE == 0); FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) %
EMU_FVB_BLOCK_SIZE == 0
);
if ( if (
(PcdGet32 (PcdFlashNvStorageVariableSize) + (PcdGet32 (PcdFlashNvStorageVariableSize) +
PcdGet32 (PcdFlashNvStorageFtwWorkingSize) PcdGet32 (PcdFlashNvStorageFtwWorkingSize)
) > ) >
EMU_FVB_NUM_SPARE_BLOCKS * EMU_FVB_BLOCK_SIZE EMU_FVB_NUM_SPARE_BLOCKS * EMU_FVB_BLOCK_SIZE
) { )
{
DEBUG ((DEBUG_ERROR, "EMU Variable invalid PCD sizes\n")); DEBUG ((DEBUG_ERROR, "EMU Variable invalid PCD sizes\n"));
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (PcdGet64 (PcdFlashNvStorageVariableBase64) != 0) { if (PcdGet64 (PcdFlashNvStorageVariableBase64) != 0) {
DEBUG ((DEBUG_INFO, "Disabling EMU Variable FVB since " DEBUG ((
"flash variables appear to be supported.\n")); DEBUG_INFO,
"Disabling EMU Variable FVB since "
"flash variables appear to be supported.\n"
));
return EFI_ABORTED; return EFI_ABORTED;
} }
@ -752,7 +757,7 @@ FvbInitialize (
// //
Initialize = TRUE; Initialize = TRUE;
if (PcdGet64 (PcdEmuVariableNvStoreReserved) != 0) { if (PcdGet64 (PcdEmuVariableNvStoreReserved) != 0) {
Ptr = (VOID*)(UINTN) PcdGet64 (PcdEmuVariableNvStoreReserved); Ptr = (VOID *)(UINTN)PcdGet64 (PcdEmuVariableNvStoreReserved);
DEBUG (( DEBUG ((
DEBUG_INFO, DEBUG_INFO,
"EMU Variable FVB: Using pre-reserved block at %p\n", "EMU Variable FVB: Using pre-reserved block at %p\n",
@ -776,30 +781,35 @@ FvbInitialize (
SetMem (Ptr, EMU_FVB_SIZE, ERASED_UINT8); SetMem (Ptr, EMU_FVB_SIZE, ERASED_UINT8);
InitializeFvAndVariableStoreHeaders (Ptr); InitializeFvAndVariableStoreHeaders (Ptr);
} }
PcdStatus = PcdSet64S (PcdFlashNvStorageVariableBase64, (UINT32)(UINTN) Ptr);
PcdStatus = PcdSet64S (PcdFlashNvStorageVariableBase64, (UINT32)(UINTN)Ptr);
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
// //
// Initialize the Fault Tolerant Write data area // Initialize the Fault Tolerant Write data area
// //
SubPtr = (VOID*) ((UINT8*) Ptr + PcdGet32 (PcdFlashNvStorageVariableSize)); SubPtr = (VOID *)((UINT8 *)Ptr + PcdGet32 (PcdFlashNvStorageVariableSize));
PcdStatus = PcdSet32S (PcdFlashNvStorageFtwWorkingBase, PcdStatus = PcdSet32S (
(UINT32)(UINTN) SubPtr); PcdFlashNvStorageFtwWorkingBase,
(UINT32)(UINTN)SubPtr
);
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
// //
// Initialize the Fault Tolerant Write spare block // Initialize the Fault Tolerant Write spare block
// //
SubPtr = (VOID*) ((UINT8*) Ptr + SubPtr = (VOID *)((UINT8 *)Ptr +
EMU_FVB_NUM_SPARE_BLOCKS * EMU_FVB_BLOCK_SIZE); EMU_FVB_NUM_SPARE_BLOCKS * EMU_FVB_BLOCK_SIZE);
PcdStatus = PcdSet32S (PcdFlashNvStorageFtwSpareBase, PcdStatus = PcdSet32S (
(UINT32)(UINTN) SubPtr); PcdFlashNvStorageFtwSpareBase,
(UINT32)(UINTN)SubPtr
);
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
// //
// Setup FVB device path // Setup FVB device path
// //
Address = (EFI_PHYSICAL_ADDRESS)(UINTN) Ptr; Address = (EFI_PHYSICAL_ADDRESS)(UINTN)Ptr;
mEmuVarsFvb.DevicePath.MemMapDevPath.StartingAddress = Address; mEmuVarsFvb.DevicePath.MemMapDevPath.StartingAddress = Address;
mEmuVarsFvb.DevicePath.MemMapDevPath.EndingAddress = Address + EMU_FVB_SIZE - 1; mEmuVarsFvb.DevicePath.MemMapDevPath.EndingAddress = Address + EMU_FVB_SIZE - 1;
@ -833,5 +843,3 @@ FvbInitialize (
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -25,11 +25,9 @@ Abstract:
#pragma pack (1) #pragma pack (1)
typedef struct { typedef struct {
EFI_FIRMWARE_VOLUME_HEADER FvHdr; EFI_FIRMWARE_VOLUME_HEADER FvHdr;
EFI_FV_BLOCK_MAP_ENTRY EndBlockMap; EFI_FV_BLOCK_MAP_ENTRY EndBlockMap;
VARIABLE_STORE_HEADER VarHdr; VARIABLE_STORE_HEADER VarHdr;
} FVB_FV_HDR_AND_VARS_TEMPLATE; } FVB_FV_HDR_AND_VARS_TEMPLATE;
typedef struct { typedef struct {
@ -48,7 +46,6 @@ typedef struct {
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance; EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
} EFI_FW_VOL_BLOCK_DEVICE; } EFI_FW_VOL_BLOCK_DEVICE;
// //
// Constants // Constants
// //

View File

@ -8,7 +8,6 @@
#include "EnrollDefaultKeys.h" #include "EnrollDefaultKeys.h"
// //
// Second KEK: "Microsoft Corporation KEK CA 2011". // Second KEK: "Microsoft Corporation KEK CA 2011".
// SHA1: 31:59:0b:fd:89:c9:d7:4e:d0:87:df:ac:66:33:4b:39:31:25:4b:30 // SHA1: 31:59:0b:fd:89:c9:d7:4e:d0:87:df:ac:66:33:4b:39:31:25:4b:30
@ -137,7 +136,6 @@ CONST UINT8 mMicrosoftKek[] = {
CONST UINTN mSizeOfMicrosoftKek = sizeof mMicrosoftKek; CONST UINTN mSizeOfMicrosoftKek = sizeof mMicrosoftKek;
// //
// First DB entry: "Microsoft Windows Production PCA 2011" // First DB entry: "Microsoft Windows Production PCA 2011"
// SHA1: 58:0a:6f:4c:c4:e4:b6:69:b9:eb:dc:1b:2b:3e:08:7b:80:d0:67:8d // SHA1: 58:0a:6f:4c:c4:e4:b6:69:b9:eb:dc:1b:2b:3e:08:7b:80:d0:67:8d
@ -266,7 +264,6 @@ CONST UINT8 mMicrosoftPca[] = {
CONST UINTN mSizeOfMicrosoftPca = sizeof mMicrosoftPca; CONST UINTN mSizeOfMicrosoftPca = sizeof mMicrosoftPca;
// //
// Second DB entry: "Microsoft Corporation UEFI CA 2011" // Second DB entry: "Microsoft Corporation UEFI CA 2011"
// SHA1: 46:de:f6:3b:5c:e6:1c:f8:ba:0d:e2:e6:63:9c:10:19:d0:ed:14:f3 // SHA1: 46:de:f6:3b:5c:e6:1c:f8:ba:0d:e2:e6:63:9c:10:19:d0:ed:14:f3
@ -398,7 +395,6 @@ CONST UINT8 mMicrosoftUefiCa[] = {
CONST UINTN mSizeOfMicrosoftUefiCa = sizeof mMicrosoftUefiCa; CONST UINTN mSizeOfMicrosoftUefiCa = sizeof mMicrosoftUefiCa;
// //
// The Microsoft.UefiSecureBootLogo.Tests.OutOfBoxConfirmDBXisPresent test case // The Microsoft.UefiSecureBootLogo.Tests.OutOfBoxConfirmDBXisPresent test case
// of the Secure Boot Logo Test in the Microsoft Hardware Certification Kit // of the Secure Boot Logo Test in the Microsoft Hardware Certification Kit

View File

@ -24,7 +24,6 @@
#include "EnrollDefaultKeys.h" #include "EnrollDefaultKeys.h"
/** /**
Fetch the X509 certificate (to be used as Platform Key and first Key Exchange Fetch the X509 certificate (to be used as Platform Key and first Key Exchange
Key) from SMBIOS. Key) from SMBIOS.
@ -75,14 +74,21 @@ GetPkKek1 (
// //
// Format the application prefix, for OEM String matching. // Format the application prefix, for OEM String matching.
// //
AsciiSPrint (OvmfPkKek1AppPrefix, sizeof OvmfPkKek1AppPrefix, "%g:", AsciiSPrint (
&gOvmfPkKek1AppPrefixGuid); OvmfPkKek1AppPrefix,
sizeof OvmfPkKek1AppPrefix,
"%g:",
&gOvmfPkKek1AppPrefixGuid
);
// //
// Scan all "OEM Strings" tables. // Scan all "OEM Strings" tables.
// //
Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, Status = gBS->LocateProtocol (
(VOID **)&Smbios); &gEfiSmbiosProtocolGuid,
NULL,
(VOID **)&Smbios
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
AsciiPrint ("error: failed to locate EFI_SMBIOS_PROTOCOL: %r\n", Status); AsciiPrint ("error: failed to locate EFI_SMBIOS_PROTOCOL: %r\n", Status);
return Status; return Status;
@ -92,7 +98,8 @@ GetPkKek1 (
Type = SMBIOS_TYPE_OEM_STRINGS; Type = SMBIOS_TYPE_OEM_STRINGS;
for (Status = Smbios->GetNext (Smbios, &Handle, &Type, &Header, NULL); for (Status = Smbios->GetNext (Smbios, &Handle, &Type, &Header, NULL);
!EFI_ERROR (Status); !EFI_ERROR (Status);
Status = Smbios->GetNext (Smbios, &Handle, &Type, &Header, NULL)) { Status = Smbios->GetNext (Smbios, &Handle, &Type, &Header, NULL))
{
CONST CHAR8 *OemString; CONST CHAR8 *OemString;
UINTN Idx; UINTN Idx;
@ -102,6 +109,7 @@ GetPkKek1 (
// //
continue; continue;
} }
OemStringsTable = (SMBIOS_TABLE_TYPE11 *)Header; OemStringsTable = (SMBIOS_TABLE_TYPE11 *)Header;
// //
@ -115,8 +123,12 @@ GetPkKek1 (
// //
// NUL-terminate the candidate prefix for case-insensitive comparison. // NUL-terminate the candidate prefix for case-insensitive comparison.
// //
AsciiStrnCpyS (CandidatePrefix, sizeof CandidatePrefix, OemString, AsciiStrnCpyS (
GUID_STRING_LENGTH + 1); CandidatePrefix,
sizeof CandidatePrefix,
OemString,
GUID_STRING_LENGTH + 1
);
if (AsciiStriCmp (OvmfPkKek1AppPrefix, CandidatePrefix) == 0) { if (AsciiStriCmp (OvmfPkKek1AppPrefix, CandidatePrefix) == 0) {
// //
// The current string matches the prefix. // The current string matches the prefix.
@ -124,6 +136,7 @@ GetPkKek1 (
Base64Cert = OemString + GUID_STRING_LENGTH + 1; Base64Cert = OemString + GUID_STRING_LENGTH + 1;
break; break;
} }
OemString += AsciiStrSize (OemString); OemString += AsciiStrSize (OemString);
} }
@ -139,8 +152,11 @@ GetPkKek1 (
// //
// No table with a matching string has been found. // No table with a matching string has been found.
// //
AsciiPrint ("error: OEM String with app prefix %g not found: %r\n", AsciiPrint (
&gOvmfPkKek1AppPrefixGuid, Status); "error: OEM String with app prefix %g not found: %r\n",
&gOvmfPkKek1AppPrefixGuid,
Status
);
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -157,12 +173,16 @@ GetPkKek1 (
ASSERT (DecodedCertSize > 0); ASSERT (DecodedCertSize > 0);
break; break;
case EFI_SUCCESS: case EFI_SUCCESS:
AsciiPrint ("error: empty certificate after app prefix %g\n", AsciiPrint (
&gOvmfPkKek1AppPrefixGuid); "error: empty certificate after app prefix %g\n",
&gOvmfPkKek1AppPrefixGuid
);
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
default: default:
AsciiPrint ("error: invalid base64 string after app prefix %g\n", AsciiPrint (
&gOvmfPkKek1AppPrefixGuid); "error: invalid base64 string after app prefix %g\n",
&gOvmfPkKek1AppPrefixGuid
);
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -178,8 +198,12 @@ GetPkKek1 (
// //
// Decoding will succeed at this point. // Decoding will succeed at this point.
// //
Status = Base64Decode (Base64Cert, Base64CertLen, DecodedCert, Status = Base64Decode (
&DecodedCertSize); Base64Cert,
Base64CertLen,
DecodedCert,
&DecodedCertSize
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
*PkKek1 = DecodedCert; *PkKek1 = DecodedCert;
@ -187,7 +211,6 @@ GetPkKek1 (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Enroll a set of certificates in a global variable, overwriting it. Enroll a set of certificates in a global variable, overwriting it.
@ -259,25 +282,30 @@ EnrollListOfCerts (
VA_START (Marker, CertType); VA_START (Marker, CertType);
for (Cert = VA_ARG (Marker, CONST UINT8 *); for (Cert = VA_ARG (Marker, CONST UINT8 *);
Cert != NULL; Cert != NULL;
Cert = VA_ARG (Marker, CONST UINT8 *)) { Cert = VA_ARG (Marker, CONST UINT8 *))
{
UINTN CertSize; UINTN CertSize;
CertSize = VA_ARG (Marker, UINTN); CertSize = VA_ARG (Marker, UINTN);
(VOID)VA_ARG (Marker, CONST EFI_GUID *); (VOID)VA_ARG (Marker, CONST EFI_GUID *);
if (CertSize == 0 || if ((CertSize == 0) ||
CertSize > MAX_UINT32 - sizeof *RepeatingHeader || (CertSize > MAX_UINT32 - sizeof *RepeatingHeader) ||
DataSize > MAX_UINT32 - sizeof *RepeatingHeader - CertSize) { (DataSize > MAX_UINT32 - sizeof *RepeatingHeader - CertSize))
{
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
break; break;
} }
DataSize += sizeof *RepeatingHeader + CertSize; DataSize += sizeof *RepeatingHeader + CertSize;
} }
VA_END (Marker); VA_END (Marker);
if (DataSize == sizeof *SingleHeader) { if (DataSize == sizeof *SingleHeader) {
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Out; goto Out;
} }
@ -295,14 +323,15 @@ EnrollListOfCerts (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreeData; goto FreeData;
} }
SingleHeader->TimeStamp.Pad1 = 0; SingleHeader->TimeStamp.Pad1 = 0;
SingleHeader->TimeStamp.Nanosecond = 0; SingleHeader->TimeStamp.Nanosecond = 0;
SingleHeader->TimeStamp.TimeZone = 0; SingleHeader->TimeStamp.TimeZone = 0;
SingleHeader->TimeStamp.Daylight = 0; SingleHeader->TimeStamp.Daylight = 0;
SingleHeader->TimeStamp.Pad2 = 0; SingleHeader->TimeStamp.Pad2 = 0;
#if 0 #if 0
SingleHeader->dwLength = DataSize - sizeof SingleHeader->TimeStamp; SingleHeader->dwLength = DataSize - sizeof SingleHeader->TimeStamp;
#else #else
// //
// This looks like a bug in edk2. According to the UEFI specification, // This looks like a bug in edk2. According to the UEFI specification,
// dwLength is "The length of the entire certificate, including the length of // dwLength is "The length of the entire certificate, including the length of
@ -311,7 +340,7 @@ EnrollListOfCerts (
// //
SingleHeader->dwLength = sizeof *SingleHeader SingleHeader->dwLength = sizeof *SingleHeader
- sizeof SingleHeader->TimeStamp; - sizeof SingleHeader->TimeStamp;
#endif #endif
SingleHeader->wRevision = 0x0200; SingleHeader->wRevision = 0x0200;
SingleHeader->wCertificateType = WIN_CERT_TYPE_EFI_GUID; SingleHeader->wCertificateType = WIN_CERT_TYPE_EFI_GUID;
CopyGuid (&SingleHeader->CertType, &gEfiCertPkcs7Guid); CopyGuid (&SingleHeader->CertType, &gEfiCertPkcs7Guid);
@ -320,7 +349,8 @@ EnrollListOfCerts (
VA_START (Marker, CertType); VA_START (Marker, CertType);
for (Cert = VA_ARG (Marker, CONST UINT8 *); for (Cert = VA_ARG (Marker, CONST UINT8 *);
Cert != NULL; Cert != NULL;
Cert = VA_ARG (Marker, CONST UINT8 *)) { Cert = VA_ARG (Marker, CONST UINT8 *))
{
UINTN CertSize; UINTN CertSize;
CONST EFI_GUID *OwnerGuid; CONST EFI_GUID *OwnerGuid;
@ -340,29 +370,39 @@ EnrollListOfCerts (
CopyMem (Position, Cert, CertSize); CopyMem (Position, Cert, CertSize);
Position += CertSize; Position += CertSize;
} }
VA_END (Marker); VA_END (Marker);
ASSERT (Data + DataSize == Position); ASSERT (Data + DataSize == Position);
Status = gRT->SetVariable (VariableName, VendorGuid, Status = gRT->SetVariable (
VariableName,
VendorGuid,
(EFI_VARIABLE_NON_VOLATILE | (EFI_VARIABLE_NON_VOLATILE |
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS |
EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS), EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS),
DataSize, Data); DataSize,
Data
);
FreeData: FreeData:
FreePool (Data); FreePool (Data);
Out: Out:
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
AsciiPrint ("error: %a(\"%s\", %g): %r\n", __FUNCTION__, VariableName, AsciiPrint (
VendorGuid, Status); "error: %a(\"%s\", %g): %r\n",
__FUNCTION__,
VariableName,
VendorGuid,
Status
);
} }
return Status; return Status;
} }
/** /**
Read a UEFI variable into a caller-allocated buffer, enforcing an exact size. Read a UEFI variable into a caller-allocated buffer, enforcing an exact size.
@ -417,26 +457,35 @@ GetExact (
Size = DataSize; Size = DataSize;
Status = gRT->GetVariable (VariableName, VendorGuid, NULL, &Size, Data); Status = gRT->GetVariable (VariableName, VendorGuid, NULL, &Size, Data);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
if (Status == EFI_NOT_FOUND && AllowMissing) { if ((Status == EFI_NOT_FOUND) && AllowMissing) {
ZeroMem (Data, DataSize); ZeroMem (Data, DataSize);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
AsciiPrint ("error: GetVariable(\"%s\", %g): %r\n", VariableName, AsciiPrint (
VendorGuid, Status); "error: GetVariable(\"%s\", %g): %r\n",
VariableName,
VendorGuid,
Status
);
return Status; return Status;
} }
if (Size != DataSize) { if (Size != DataSize) {
AsciiPrint ("error: GetVariable(\"%s\", %g): expected size 0x%Lx, " AsciiPrint (
"got 0x%Lx\n", VariableName, VendorGuid, (UINT64)DataSize, (UINT64)Size); "error: GetVariable(\"%s\", %g): expected size 0x%Lx, "
"got 0x%Lx\n",
VariableName,
VendorGuid,
(UINT64)DataSize,
(UINT64)Size
);
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Populate a SETTINGS structure from the underlying UEFI variables. Populate a SETTINGS structure from the underlying UEFI variables.
@ -469,37 +518,60 @@ GetSettings (
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = GetExact (EFI_SETUP_MODE_NAME, &gEfiGlobalVariableGuid, Status = GetExact (
&Settings->SetupMode, sizeof Settings->SetupMode, FALSE); EFI_SETUP_MODE_NAME,
&gEfiGlobalVariableGuid,
&Settings->SetupMode,
sizeof Settings->SetupMode,
FALSE
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = GetExact (EFI_SECURE_BOOT_MODE_NAME, &gEfiGlobalVariableGuid, Status = GetExact (
&Settings->SecureBoot, sizeof Settings->SecureBoot, FALSE); EFI_SECURE_BOOT_MODE_NAME,
&gEfiGlobalVariableGuid,
&Settings->SecureBoot,
sizeof Settings->SecureBoot,
FALSE
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = GetExact (EFI_SECURE_BOOT_ENABLE_NAME, Status = GetExact (
&gEfiSecureBootEnableDisableGuid, &Settings->SecureBootEnable, EFI_SECURE_BOOT_ENABLE_NAME,
sizeof Settings->SecureBootEnable, TRUE); &gEfiSecureBootEnableDisableGuid,
&Settings->SecureBootEnable,
sizeof Settings->SecureBootEnable,
TRUE
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = GetExact (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, Status = GetExact (
&Settings->CustomMode, sizeof Settings->CustomMode, FALSE); EFI_CUSTOM_MODE_NAME,
&gEfiCustomModeEnableGuid,
&Settings->CustomMode,
sizeof Settings->CustomMode,
FALSE
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = GetExact (EFI_VENDOR_KEYS_VARIABLE_NAME, &gEfiGlobalVariableGuid, Status = GetExact (
&Settings->VendorKeys, sizeof Settings->VendorKeys, FALSE); EFI_VENDOR_KEYS_VARIABLE_NAME,
&gEfiGlobalVariableGuid,
&Settings->VendorKeys,
sizeof Settings->VendorKeys,
FALSE
);
return Status; return Status;
} }
/** /**
Print the contents of a SETTINGS structure to the UEFI console. Print the contents of a SETTINGS structure to the UEFI console.
@ -511,12 +583,17 @@ PrintSettings (
IN CONST SETTINGS *Settings IN CONST SETTINGS *Settings
) )
{ {
AsciiPrint ("info: SetupMode=%d SecureBoot=%d SecureBootEnable=%d " AsciiPrint (
"CustomMode=%d VendorKeys=%d\n", Settings->SetupMode, Settings->SecureBoot, "info: SetupMode=%d SecureBoot=%d SecureBootEnable=%d "
Settings->SecureBootEnable, Settings->CustomMode, Settings->VendorKeys); "CustomMode=%d VendorKeys=%d\n",
Settings->SetupMode,
Settings->SecureBoot,
Settings->SecureBootEnable,
Settings->CustomMode,
Settings->VendorKeys
);
} }
/** /**
Entry point function of this shell application. Entry point function of this shell application.
**/ **/
@ -534,7 +611,7 @@ ShellAppMain (
UINTN SizeOfPkKek1; UINTN SizeOfPkKek1;
BOOLEAN NoDefault; BOOLEAN NoDefault;
if (Argc == 2 && StrCmp (Argv[1], L"--no-default") == 0) { if ((Argc == 2) && (StrCmp (Argv[1], L"--no-default") == 0)) {
NoDefault = TRUE; NoDefault = TRUE;
} else { } else {
NoDefault = FALSE; NoDefault = FALSE;
@ -552,6 +629,7 @@ ShellAppMain (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return RetVal; return RetVal;
} }
PrintSettings (&Settings); PrintSettings (&Settings);
if (Settings.SetupMode != 1) { if (Settings.SetupMode != 1) {
@ -581,13 +659,21 @@ ShellAppMain (
// //
if (Settings.CustomMode != CUSTOM_SECURE_BOOT_MODE) { if (Settings.CustomMode != CUSTOM_SECURE_BOOT_MODE) {
Settings.CustomMode = CUSTOM_SECURE_BOOT_MODE; Settings.CustomMode = CUSTOM_SECURE_BOOT_MODE;
Status = gRT->SetVariable (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, Status = gRT->SetVariable (
EFI_CUSTOM_MODE_NAME,
&gEfiCustomModeEnableGuid,
(EFI_VARIABLE_NON_VOLATILE | (EFI_VARIABLE_NON_VOLATILE |
EFI_VARIABLE_BOOTSERVICE_ACCESS), EFI_VARIABLE_BOOTSERVICE_ACCESS),
sizeof Settings.CustomMode, &Settings.CustomMode); sizeof Settings.CustomMode,
&Settings.CustomMode
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
AsciiPrint ("error: SetVariable(\"%s\", %g): %r\n", EFI_CUSTOM_MODE_NAME, AsciiPrint (
&gEfiCustomModeEnableGuid, Status); "error: SetVariable(\"%s\", %g): %r\n",
EFI_CUSTOM_MODE_NAME,
&gEfiCustomModeEnableGuid,
Status
);
goto FreePkKek1; goto FreePkKek1;
} }
} }
@ -600,17 +686,26 @@ ShellAppMain (
EFI_IMAGE_SECURITY_DATABASE, EFI_IMAGE_SECURITY_DATABASE,
&gEfiImageSecurityDatabaseGuid, &gEfiImageSecurityDatabaseGuid,
&gEfiCertX509Guid, &gEfiCertX509Guid,
PkKek1, SizeOfPkKek1, &gEfiCallerIdGuid, PkKek1,
NULL); SizeOfPkKek1,
&gEfiCallerIdGuid,
NULL
);
} else { } else {
Status = EnrollListOfCerts ( Status = EnrollListOfCerts (
EFI_IMAGE_SECURITY_DATABASE, EFI_IMAGE_SECURITY_DATABASE,
&gEfiImageSecurityDatabaseGuid, &gEfiImageSecurityDatabaseGuid,
&gEfiCertX509Guid, &gEfiCertX509Guid,
mMicrosoftPca, mSizeOfMicrosoftPca, &gMicrosoftVendorGuid, mMicrosoftPca,
mMicrosoftUefiCa, mSizeOfMicrosoftUefiCa, &gMicrosoftVendorGuid, mSizeOfMicrosoftPca,
NULL); &gMicrosoftVendorGuid,
mMicrosoftUefiCa,
mSizeOfMicrosoftUefiCa,
&gMicrosoftVendorGuid,
NULL
);
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreePkKek1; goto FreePkKek1;
} }
@ -622,8 +717,11 @@ ShellAppMain (
EFI_IMAGE_SECURITY_DATABASE1, EFI_IMAGE_SECURITY_DATABASE1,
&gEfiImageSecurityDatabaseGuid, &gEfiImageSecurityDatabaseGuid,
&gEfiCertSha256Guid, &gEfiCertSha256Guid,
mSha256OfDevNull, mSizeOfSha256OfDevNull, &gEfiCallerIdGuid, mSha256OfDevNull,
NULL); mSizeOfSha256OfDevNull,
&gEfiCallerIdGuid,
NULL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreePkKek1; goto FreePkKek1;
} }
@ -636,17 +734,26 @@ ShellAppMain (
EFI_KEY_EXCHANGE_KEY_NAME, EFI_KEY_EXCHANGE_KEY_NAME,
&gEfiGlobalVariableGuid, &gEfiGlobalVariableGuid,
&gEfiCertX509Guid, &gEfiCertX509Guid,
PkKek1, SizeOfPkKek1, &gEfiCallerIdGuid, PkKek1,
NULL); SizeOfPkKek1,
&gEfiCallerIdGuid,
NULL
);
} else { } else {
Status = EnrollListOfCerts ( Status = EnrollListOfCerts (
EFI_KEY_EXCHANGE_KEY_NAME, EFI_KEY_EXCHANGE_KEY_NAME,
&gEfiGlobalVariableGuid, &gEfiGlobalVariableGuid,
&gEfiCertX509Guid, &gEfiCertX509Guid,
PkKek1, SizeOfPkKek1, &gEfiCallerIdGuid, PkKek1,
mMicrosoftKek, mSizeOfMicrosoftKek, &gMicrosoftVendorGuid, SizeOfPkKek1,
NULL); &gEfiCallerIdGuid,
mMicrosoftKek,
mSizeOfMicrosoftKek,
&gMicrosoftVendorGuid,
NULL
);
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreePkKek1; goto FreePkKek1;
} }
@ -658,8 +765,11 @@ ShellAppMain (
EFI_PLATFORM_KEY_NAME, EFI_PLATFORM_KEY_NAME,
&gEfiGlobalVariableGuid, &gEfiGlobalVariableGuid,
&gEfiCertX509Guid, &gEfiCertX509Guid,
PkKek1, SizeOfPkKek1, &gEfiGlobalVariableGuid, PkKek1,
NULL); SizeOfPkKek1,
&gEfiGlobalVariableGuid,
NULL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreePkKek1; goto FreePkKek1;
} }
@ -669,12 +779,20 @@ ShellAppMain (
// signatures. // signatures.
// //
Settings.CustomMode = STANDARD_SECURE_BOOT_MODE; Settings.CustomMode = STANDARD_SECURE_BOOT_MODE;
Status = gRT->SetVariable (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, Status = gRT->SetVariable (
EFI_CUSTOM_MODE_NAME,
&gEfiCustomModeEnableGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
sizeof Settings.CustomMode, &Settings.CustomMode); sizeof Settings.CustomMode,
&Settings.CustomMode
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
AsciiPrint ("error: SetVariable(\"%s\", %g): %r\n", EFI_CUSTOM_MODE_NAME, AsciiPrint (
&gEfiCustomModeEnableGuid, Status); "error: SetVariable(\"%s\", %g): %r\n",
EFI_CUSTOM_MODE_NAME,
&gEfiCustomModeEnableGuid,
Status
);
goto FreePkKek1; goto FreePkKek1;
} }
@ -713,11 +831,13 @@ ShellAppMain (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreePkKek1; goto FreePkKek1;
} }
PrintSettings (&Settings); PrintSettings (&Settings);
if (Settings.SetupMode != 0 || Settings.SecureBoot != 1 || if ((Settings.SetupMode != 0) || (Settings.SecureBoot != 1) ||
Settings.SecureBootEnable != 1 || Settings.CustomMode != 0 || (Settings.SecureBootEnable != 1) || (Settings.CustomMode != 0) ||
Settings.VendorKeys != 0) { (Settings.VendorKeys != 0))
{
AsciiPrint ("error: unexpected\n"); AsciiPrint ("error: unexpected\n");
goto FreePkKek1; goto FreePkKek1;
} }

View File

@ -106,7 +106,6 @@ typedef struct {
} REPEATING_HEADER; } REPEATING_HEADER;
#pragma pack () #pragma pack ()
// //
// A structure that collects the values of UEFI variables related to Secure // A structure that collects the values of UEFI variables related to Secure
// Boot. // Boot.
@ -119,7 +118,6 @@ typedef struct {
UINT8 VendorKeys; UINT8 VendorKeys;
} SETTINGS; } SETTINGS;
// //
// Refer to "AuthData.c" for details on the following objects. // Refer to "AuthData.c" for details on the following objects.
// //

View File

@ -51,21 +51,34 @@ MapGcdMmioSpace (
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = gDS->AddMemorySpace (EfiGcdMemoryTypeMemoryMappedIo, Base, Size, Status = gDS->AddMemorySpace (
EFI_MEMORY_UC); EfiGcdMemoryTypeMemoryMappedIo,
Base,
Size,
EFI_MEMORY_UC
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"%a: failed to add GCD memory space for region [0x%Lx+0x%Lx)\n", "%a: failed to add GCD memory space for region [0x%Lx+0x%Lx)\n",
__FUNCTION__, Base, Size)); __FUNCTION__,
Base,
Size
));
return Status; return Status;
} }
Status = gDS->SetMemorySpaceAttributes (Base, Size, EFI_MEMORY_UC); Status = gDS->SetMemorySpaceAttributes (Base, Size, EFI_MEMORY_UC);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"%a: failed to set memory space attributes for region [0x%Lx+0x%Lx)\n", "%a: failed to set memory space attributes for region [0x%Lx+0x%Lx)\n",
__FUNCTION__, Base, Size)); __FUNCTION__,
Base,
Size
));
} }
return Status; return Status;
} }
@ -114,16 +127,24 @@ ProcessPciHost (
*Mmio64Size = 0; *Mmio64Size = 0;
IoTranslation = 0; IoTranslation = 0;
Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL, Status = gBS->LocateProtocol (
(VOID **)&FdtClient); &gFdtClientProtocolGuid,
NULL,
(VOID **)&FdtClient
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = FdtClient->FindCompatibleNode (FdtClient, "pci-host-ecam-generic", Status = FdtClient->FindCompatibleNode (
&Node); FdtClient,
"pci-host-ecam-generic",
&Node
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, DEBUG ((
DEBUG_INFO,
"%a: No 'pci-host-ecam-generic' compatible DT node found\n", "%a: No 'pci-host-ecam-generic' compatible DT node found\n",
__FUNCTION__)); __FUNCTION__
));
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -134,15 +155,22 @@ ProcessPciHost (
// A DT can legally describe multiple PCI host bridges, but we are not // A DT can legally describe multiple PCI host bridges, but we are not
// equipped to deal with that. So assert that there is only one. // equipped to deal with that. So assert that there is only one.
// //
Status = FdtClient->FindNextCompatibleNode (FdtClient, Status = FdtClient->FindNextCompatibleNode (
"pci-host-ecam-generic", Node, &Tmp); FdtClient,
"pci-host-ecam-generic",
Node,
&Tmp
);
ASSERT (Status == EFI_NOT_FOUND); ASSERT (Status == EFI_NOT_FOUND);
); );
Status = FdtClient->GetNodeProperty (FdtClient, Node, "reg", &Prop, &Len); Status = FdtClient->GetNodeProperty (FdtClient, Node, "reg", &Prop, &Len);
if (EFI_ERROR (Status) || Len != 2 * sizeof (UINT64)) { if (EFI_ERROR (Status) || (Len != 2 * sizeof (UINT64))) {
DEBUG ((DEBUG_ERROR, "%a: 'reg' property not found or invalid\n", DEBUG ((
__FUNCTION__)); DEBUG_ERROR,
"%a: 'reg' property not found or invalid\n",
__FUNCTION__
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -155,13 +183,22 @@ ProcessPciHost (
// //
// Fetch the bus range (note: inclusive). // Fetch the bus range (note: inclusive).
// //
Status = FdtClient->GetNodeProperty (FdtClient, Node, "bus-range", &Prop, Status = FdtClient->GetNodeProperty (
&Len); FdtClient,
if (EFI_ERROR (Status) || Len != 2 * sizeof (UINT32)) { Node,
DEBUG ((DEBUG_ERROR, "%a: 'bus-range' not found or invalid\n", "bus-range",
__FUNCTION__)); &Prop,
&Len
);
if (EFI_ERROR (Status) || (Len != 2 * sizeof (UINT32))) {
DEBUG ((
DEBUG_ERROR,
"%a: 'bus-range' not found or invalid\n",
__FUNCTION__
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
*BusMin = SwapBytes32 (((CONST UINT32 *)Prop)[0]); *BusMin = SwapBytes32 (((CONST UINT32 *)Prop)[0]);
*BusMax = SwapBytes32 (((CONST UINT32 *)Prop)[1]); *BusMax = SwapBytes32 (((CONST UINT32 *)Prop)[1]);
@ -169,10 +206,14 @@ ProcessPciHost (
// Sanity check: the config space must accommodate all 4K register bytes of // Sanity check: the config space must accommodate all 4K register bytes of
// all 8 functions of all 32 devices of all buses. // all 8 functions of all 32 devices of all buses.
// //
if (*BusMax < *BusMin || *BusMax - *BusMin == MAX_UINT32 || if ((*BusMax < *BusMin) || (*BusMax - *BusMin == MAX_UINT32) ||
DivU64x32 (ConfigSize, SIZE_4KB * 8 * 32) < *BusMax - *BusMin + 1) { (DivU64x32 (ConfigSize, SIZE_4KB * 8 * 32) < *BusMax - *BusMin + 1))
DEBUG ((DEBUG_ERROR, "%a: invalid 'bus-range' and/or 'reg'\n", {
__FUNCTION__)); DEBUG ((
DEBUG_ERROR,
"%a: invalid 'bus-range' and/or 'reg'\n",
__FUNCTION__
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -180,14 +221,16 @@ ProcessPciHost (
// Iterate over "ranges". // Iterate over "ranges".
// //
Status = FdtClient->GetNodeProperty (FdtClient, Node, "ranges", &Prop, &Len); Status = FdtClient->GetNodeProperty (FdtClient, Node, "ranges", &Prop, &Len);
if (EFI_ERROR (Status) || Len == 0 || if (EFI_ERROR (Status) || (Len == 0) ||
Len % sizeof (DTB_PCI_HOST_RANGE_RECORD) != 0) { (Len % sizeof (DTB_PCI_HOST_RANGE_RECORD) != 0))
{
DEBUG ((DEBUG_ERROR, "%a: 'ranges' not found or invalid\n", __FUNCTION__)); DEBUG ((DEBUG_ERROR, "%a: 'ranges' not found or invalid\n", __FUNCTION__));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
for (RecordIdx = 0; RecordIdx < Len / sizeof (DTB_PCI_HOST_RANGE_RECORD); for (RecordIdx = 0; RecordIdx < Len / sizeof (DTB_PCI_HOST_RANGE_RECORD);
++RecordIdx) { ++RecordIdx)
{
CONST DTB_PCI_HOST_RANGE_RECORD *Record; CONST DTB_PCI_HOST_RANGE_RECORD *Record;
Record = (CONST DTB_PCI_HOST_RANGE_RECORD *)Prop + RecordIdx; Record = (CONST DTB_PCI_HOST_RANGE_RECORD *)Prop + RecordIdx;
@ -205,8 +248,9 @@ ProcessPciHost (
*Mmio32Size = SwapBytes64 (Record->Size); *Mmio32Size = SwapBytes64 (Record->Size);
Mmio32Translation = SwapBytes64 (Record->CpuBase) - *Mmio32Base; Mmio32Translation = SwapBytes64 (Record->CpuBase) - *Mmio32Base;
if (*Mmio32Base > MAX_UINT32 || *Mmio32Size > MAX_UINT32 || if ((*Mmio32Base > MAX_UINT32) || (*Mmio32Size > MAX_UINT32) ||
*Mmio32Base + *Mmio32Size > SIZE_4GB) { (*Mmio32Base + *Mmio32Size > SIZE_4GB))
{
DEBUG ((DEBUG_ERROR, "%a: MMIO32 space invalid\n", __FUNCTION__)); DEBUG ((DEBUG_ERROR, "%a: MMIO32 space invalid\n", __FUNCTION__));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -214,8 +258,13 @@ ProcessPciHost (
ASSERT (PcdGet64 (PcdPciMmio32Translation) == Mmio32Translation); ASSERT (PcdGet64 (PcdPciMmio32Translation) == Mmio32Translation);
if (Mmio32Translation != 0) { if (Mmio32Translation != 0) {
DEBUG ((DEBUG_ERROR, "%a: unsupported nonzero MMIO32 translation " DEBUG ((
"0x%Lx\n", __FUNCTION__, Mmio32Translation)); DEBUG_ERROR,
"%a: unsupported nonzero MMIO32 translation "
"0x%Lx\n",
__FUNCTION__,
Mmio32Translation
));
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -229,17 +278,27 @@ ProcessPciHost (
ASSERT (PcdGet64 (PcdPciMmio64Translation) == Mmio64Translation); ASSERT (PcdGet64 (PcdPciMmio64Translation) == Mmio64Translation);
if (Mmio64Translation != 0) { if (Mmio64Translation != 0) {
DEBUG ((DEBUG_ERROR, "%a: unsupported nonzero MMIO64 translation " DEBUG ((
"0x%Lx\n", __FUNCTION__, Mmio64Translation)); DEBUG_ERROR,
"%a: unsupported nonzero MMIO64 translation "
"0x%Lx\n",
__FUNCTION__,
Mmio64Translation
));
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
break; break;
} }
} }
if (*IoSize == 0 || *Mmio32Size == 0) {
DEBUG ((DEBUG_ERROR, "%a: %a space empty\n", __FUNCTION__, if ((*IoSize == 0) || (*Mmio32Size == 0)) {
(*IoSize == 0) ? "IO" : "MMIO32")); DEBUG ((
DEBUG_ERROR,
"%a: %a space empty\n",
__FUNCTION__,
(*IoSize == 0) ? "IO" : "MMIO32"
));
return EFI_PROTOCOL_ERROR; return EFI_PROTOCOL_ERROR;
} }
@ -249,10 +308,23 @@ ProcessPciHost (
// //
ASSERT (PcdGet64 (PcdPciExpressBaseAddress) == ConfigBase); ASSERT (PcdGet64 (PcdPciExpressBaseAddress) == ConfigBase);
DEBUG ((DEBUG_INFO, "%a: Config[0x%Lx+0x%Lx) Bus[0x%x..0x%x] " DEBUG ((
DEBUG_INFO,
"%a: Config[0x%Lx+0x%Lx) Bus[0x%x..0x%x] "
"Io[0x%Lx+0x%Lx)@0x%Lx Mem32[0x%Lx+0x%Lx)@0x0 Mem64[0x%Lx+0x%Lx)@0x0\n", "Io[0x%Lx+0x%Lx)@0x%Lx Mem32[0x%Lx+0x%Lx)@0x0 Mem64[0x%Lx+0x%Lx)@0x0\n",
__FUNCTION__, ConfigBase, ConfigSize, *BusMin, *BusMax, *IoBase, *IoSize, __FUNCTION__,
IoTranslation, *Mmio32Base, *Mmio32Size, *Mmio64Base, *Mmio64Size)); ConfigBase,
ConfigSize,
*BusMin,
*BusMax,
*IoBase,
*IoSize,
IoTranslation,
*Mmio32Base,
*Mmio32Size,
*Mmio64Base,
*Mmio64Size
));
// Map the ECAM space in the GCD memory map // Map the ECAM space in the GCD memory map
Status = MapGcdMmioSpace (ConfigBase, ConfigSize); Status = MapGcdMmioSpace (ConfigBase, ConfigSize);
@ -307,11 +379,23 @@ PciHostBridgeGetRootBridges (
return NULL; return NULL;
} }
Status = ProcessPciHost (&IoBase, &IoSize, &Mmio32Base, &Mmio32Size, Status = ProcessPciHost (
&Mmio64Base, &Mmio64Size, &BusMin, &BusMax); &IoBase,
&IoSize,
&Mmio32Base,
&Mmio32Size,
&Mmio64Base,
&Mmio64Size,
&BusMin,
&BusMax
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: failed to discover PCI host bridge: %r\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_ERROR,
"%a: failed to discover PCI host bridge: %r\n",
__FUNCTION__,
Status
));
*Count = 0; *Count = 0;
return NULL; return NULL;
} }

View File

@ -55,14 +55,16 @@ GetPciIoTranslation (
// Iterate over "ranges". // Iterate over "ranges".
// //
Status = FdtClient->GetNodeProperty (FdtClient, Node, "ranges", &Prop, &Len); Status = FdtClient->GetNodeProperty (FdtClient, Node, "ranges", &Prop, &Len);
if (EFI_ERROR (Status) || Len == 0 || if (EFI_ERROR (Status) || (Len == 0) ||
Len % sizeof (DTB_PCI_HOST_RANGE_RECORD) != 0) { (Len % sizeof (DTB_PCI_HOST_RANGE_RECORD) != 0))
{
DEBUG ((DEBUG_ERROR, "%a: 'ranges' not found or invalid\n", __FUNCTION__)); DEBUG ((DEBUG_ERROR, "%a: 'ranges' not found or invalid\n", __FUNCTION__));
return RETURN_PROTOCOL_ERROR; return RETURN_PROTOCOL_ERROR;
} }
for (RecordIdx = 0; RecordIdx < Len / sizeof (DTB_PCI_HOST_RANGE_RECORD); for (RecordIdx = 0; RecordIdx < Len / sizeof (DTB_PCI_HOST_RANGE_RECORD);
++RecordIdx) { ++RecordIdx)
{
CONST DTB_PCI_HOST_RANGE_RECORD *Record; CONST DTB_PCI_HOST_RANGE_RECORD *Record;
UINT32 Type; UINT32 Type;
@ -75,6 +77,7 @@ GetPciIoTranslation (
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
} }
return RETURN_NOT_FOUND; return RETURN_NOT_FOUND;
} }
@ -106,19 +109,30 @@ FdtPciPcdProducerLibConstructor (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL, Status = gBS->LocateProtocol (
(VOID **)&FdtClient); &gFdtClientProtocolGuid,
NULL,
(VOID **)&FdtClient
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
PciExpressBaseAddress = 0; PciExpressBaseAddress = 0;
Status = FdtClient->FindCompatibleNode (FdtClient, "pci-host-ecam-generic", Status = FdtClient->FindCompatibleNode (
&Node); FdtClient,
"pci-host-ecam-generic",
&Node
);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
Status = FdtClient->GetNodeProperty (FdtClient, Node, "reg", Status = FdtClient->GetNodeProperty (
(CONST VOID **)&Reg, &RegSize); FdtClient,
Node,
"reg",
(CONST VOID **)&Reg,
&RegSize
);
if (!EFI_ERROR (Status) && RegSize == 2 * sizeof (UINT64)) { if (!EFI_ERROR (Status) && (RegSize == 2 * sizeof (UINT64))) {
PciExpressBaseAddress = SwapBytes64 (*Reg); PciExpressBaseAddress = SwapBytes64 (*Reg);
PcdStatus = PcdSetBoolS (PcdPciDisableBusEnumeration, FALSE); PcdStatus = PcdSetBoolS (PcdPciDisableBusEnumeration, FALSE);
@ -135,9 +149,11 @@ FdtPciPcdProducerLibConstructor (
// to abort in the general case. So leave it up to the actual driver to // to abort in the general case. So leave it up to the actual driver to
// complain about this if it wants to, and just issue a warning here. // complain about this if it wants to, and just issue a warning here.
// //
DEBUG ((DEBUG_WARN, DEBUG ((
DEBUG_WARN,
"%a: 'pci-host-ecam-generic' device encountered with no I/O range\n", "%a: 'pci-host-ecam-generic' device encountered with no I/O range\n",
__FUNCTION__)); __FUNCTION__
));
} }
} }
} }

View File

@ -36,24 +36,42 @@ InitializeHighMemDxe (
UINT64 Attributes; UINT64 Attributes;
EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor; EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;
Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL, Status = gBS->LocateProtocol (
(VOID **)&FdtClient); &gFdtClientProtocolGuid,
NULL,
(VOID **)&FdtClient
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, Status = gBS->LocateProtocol (
(VOID **)&Cpu); &gEfiCpuArchProtocolGuid,
NULL,
(VOID **)&Cpu
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
// Check for memory node and add the memory spaces except the lowest one // Check for memory node and add the memory spaces except the lowest one
// //
for (FindNodeStatus = FdtClient->FindMemoryNodeReg (FdtClient, &Node, for (FindNodeStatus = FdtClient->FindMemoryNodeReg (
(CONST VOID **) &Reg, &AddressCells, FdtClient,
&SizeCells, &RegSize); &Node,
(CONST VOID **)&Reg,
&AddressCells,
&SizeCells,
&RegSize
);
!EFI_ERROR (FindNodeStatus); !EFI_ERROR (FindNodeStatus);
FindNodeStatus = FdtClient->FindNextMemoryNodeReg (FdtClient, Node, FindNodeStatus = FdtClient->FindNextMemoryNodeReg (
&Node, (CONST VOID **) &Reg, &AddressCells, FdtClient,
&SizeCells, &RegSize)) { Node,
&Node,
(CONST VOID **)&Reg,
&AddressCells,
&SizeCells,
&RegSize
))
{
ASSERT (AddressCells <= 2); ASSERT (AddressCells <= 2);
ASSERT (SizeCells <= 2); ASSERT (SizeCells <= 2);
@ -62,36 +80,60 @@ InitializeHighMemDxe (
if (AddressCells > 1) { if (AddressCells > 1) {
CurBase = (CurBase << 32) | SwapBytes32 (*Reg++); CurBase = (CurBase << 32) | SwapBytes32 (*Reg++);
} }
CurSize = SwapBytes32 (*Reg++); CurSize = SwapBytes32 (*Reg++);
if (SizeCells > 1) { if (SizeCells > 1) {
CurSize = (CurSize << 32) | SwapBytes32 (*Reg++); CurSize = (CurSize << 32) | SwapBytes32 (*Reg++);
} }
RegSize -= (AddressCells + SizeCells) * sizeof (UINT32); RegSize -= (AddressCells + SizeCells) * sizeof (UINT32);
Status = gDS->GetMemorySpaceDescriptor (CurBase, &GcdDescriptor); Status = gDS->GetMemorySpaceDescriptor (CurBase, &GcdDescriptor);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, DEBUG ((
DEBUG_WARN,
"%a: Region 0x%lx - 0x%lx not found in the GCD memory space map\n", "%a: Region 0x%lx - 0x%lx not found in the GCD memory space map\n",
__FUNCTION__, CurBase, CurBase + CurSize - 1)); __FUNCTION__,
CurBase,
CurBase + CurSize - 1
));
continue; continue;
} }
if (GcdDescriptor.GcdMemoryType == EfiGcdMemoryTypeNonExistent) { if (GcdDescriptor.GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
Status = gDS->AddMemorySpace (EfiGcdMemoryTypeSystemMemory, CurBase, Status = gDS->AddMemorySpace (
CurSize, EFI_MEMORY_WB); EfiGcdMemoryTypeSystemMemory,
CurBase,
CurSize,
EFI_MEMORY_WB
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"%a: Failed to add System RAM @ 0x%lx - 0x%lx (%r)\n", "%a: Failed to add System RAM @ 0x%lx - 0x%lx (%r)\n",
__FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); __FUNCTION__,
CurBase,
CurBase + CurSize - 1,
Status
));
continue; continue;
} }
Status = gDS->SetMemorySpaceAttributes (CurBase, CurSize, Status = gDS->SetMemorySpaceAttributes (
EFI_MEMORY_WB); CurBase,
CurSize,
EFI_MEMORY_WB
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, DEBUG ((
DEBUG_WARN,
"%a: gDS->SetMemorySpaceAttributes() failed on region 0x%lx - 0x%lx (%r)\n", "%a: gDS->SetMemorySpaceAttributes() failed on region 0x%lx - 0x%lx (%r)\n",
__FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); __FUNCTION__,
CurBase,
CurBase + CurSize - 1,
Status
));
} }
// //
@ -107,19 +149,30 @@ InitializeHighMemDxe (
// //
Attributes = EFI_MEMORY_WB; Attributes = EFI_MEMORY_WB;
if ((PcdGet64 (PcdDxeNxMemoryProtectionPolicy) & if ((PcdGet64 (PcdDxeNxMemoryProtectionPolicy) &
(1U << (UINT32)EfiConventionalMemory)) != 0) { (1U << (UINT32)EfiConventionalMemory)) != 0)
{
Attributes |= EFI_MEMORY_XP; Attributes |= EFI_MEMORY_XP;
} }
Status = Cpu->SetMemoryAttributes (Cpu, CurBase, CurSize, Attributes); Status = Cpu->SetMemoryAttributes (Cpu, CurBase, CurSize, Attributes);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, DEBUG ((
DEBUG_ERROR,
"%a: Failed to set System RAM @ 0x%lx - 0x%lx attribute (%r)\n", "%a: Failed to set System RAM @ 0x%lx - 0x%lx attribute (%r)\n",
__FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); __FUNCTION__,
CurBase,
CurBase + CurSize - 1,
Status
));
} else { } else {
DEBUG ((DEBUG_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n", DEBUG ((
__FUNCTION__, CurBase, CurBase + CurSize - 1)); DEBUG_INFO,
"%a: Add System RAM @ 0x%lx - 0x%lx\n",
__FUNCTION__,
CurBase,
CurBase + CurSize - 1
));
} }
} }
} }

View File

@ -44,21 +44,40 @@ InitializeVirtioFdtDxe (
EFI_HANDLE Handle; EFI_HANDLE Handle;
UINT64 RegBase; UINT64 RegBase;
Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL, Status = gBS->LocateProtocol (
(VOID **)&FdtClient); &gFdtClientProtocolGuid,
NULL,
(VOID **)&FdtClient
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
for (FindNodeStatus = FdtClient->FindCompatibleNode (FdtClient, for (FindNodeStatus = FdtClient->FindCompatibleNode (
"virtio,mmio", &Node); FdtClient,
"virtio,mmio",
&Node
);
!EFI_ERROR (FindNodeStatus); !EFI_ERROR (FindNodeStatus);
FindNodeStatus = FdtClient->FindNextCompatibleNode (FdtClient, FindNodeStatus = FdtClient->FindNextCompatibleNode (
"virtio,mmio", Node, &Node)) { FdtClient,
"virtio,mmio",
Status = FdtClient->GetNodeProperty (FdtClient, Node, "reg", Node,
(CONST VOID **)&Reg, &RegSize); &Node
))
{
Status = FdtClient->GetNodeProperty (
FdtClient,
Node,
"reg",
(CONST VOID **)&Reg,
&RegSize
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: GetNodeProperty () failed (Status == %r)\n", DEBUG ((
__FUNCTION__, Status)); DEBUG_ERROR,
"%a: GetNodeProperty () failed (Status == %r)\n",
__FUNCTION__,
Status
));
continue; continue;
} }
@ -71,7 +90,8 @@ InitializeVirtioFdtDxe (
DevicePath = (VIRTIO_TRANSPORT_DEVICE_PATH *)CreateDeviceNode ( DevicePath = (VIRTIO_TRANSPORT_DEVICE_PATH *)CreateDeviceNode (
HARDWARE_DEVICE_PATH, HARDWARE_DEVICE_PATH,
HW_VENDOR_DP, HW_VENDOR_DP,
sizeof (VIRTIO_TRANSPORT_DEVICE_PATH)); sizeof (VIRTIO_TRANSPORT_DEVICE_PATH)
);
if (DevicePath == NULL) { if (DevicePath == NULL) {
DEBUG ((DEBUG_ERROR, "%a: Out of memory\n", __FUNCTION__)); DEBUG ((DEBUG_ERROR, "%a: Out of memory\n", __FUNCTION__));
continue; continue;
@ -79,39 +99,62 @@ InitializeVirtioFdtDxe (
CopyGuid (&DevicePath->Vendor.Guid, &gVirtioMmioTransportGuid); CopyGuid (&DevicePath->Vendor.Guid, &gVirtioMmioTransportGuid);
DevicePath->PhysBase = RegBase; DevicePath->PhysBase = RegBase;
SetDevicePathNodeLength (&DevicePath->Vendor, SetDevicePathNodeLength (
sizeof (*DevicePath) - sizeof (DevicePath->End)); &DevicePath->Vendor,
sizeof (*DevicePath) - sizeof (DevicePath->End)
);
SetDevicePathEndNode (&DevicePath->End); SetDevicePathEndNode (&DevicePath->End);
Handle = NULL; Handle = NULL;
Status = gBS->InstallProtocolInterface (&Handle, Status = gBS->InstallProtocolInterface (
&gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE, &Handle,
DevicePath); &gEfiDevicePathProtocolGuid,
EFI_NATIVE_INTERFACE,
DevicePath
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: Failed to install the EFI_DEVICE_PATH " DEBUG ((
DEBUG_ERROR,
"%a: Failed to install the EFI_DEVICE_PATH "
"protocol on a new handle (Status == %r)\n", "protocol on a new handle (Status == %r)\n",
__FUNCTION__, Status)); __FUNCTION__,
Status
));
FreePool (DevicePath); FreePool (DevicePath);
continue; continue;
} }
Status = VirtioMmioInstallDevice (RegBase, Handle); Status = VirtioMmioInstallDevice (RegBase, Handle);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: Failed to install VirtIO transport @ 0x%Lx " DEBUG ((
"on handle %p (Status == %r)\n", __FUNCTION__, RegBase, DEBUG_ERROR,
Handle, Status)); "%a: Failed to install VirtIO transport @ 0x%Lx "
"on handle %p (Status == %r)\n",
__FUNCTION__,
RegBase,
Handle,
Status
));
Status = gBS->UninstallProtocolInterface (Handle, Status = gBS->UninstallProtocolInterface (
&gEfiDevicePathProtocolGuid, DevicePath); Handle,
&gEfiDevicePathProtocolGuid,
DevicePath
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
FreePool (DevicePath); FreePool (DevicePath);
continue; continue;
} }
} }
if (EFI_ERROR (FindNodeStatus) && FindNodeStatus != EFI_NOT_FOUND) { if (EFI_ERROR (FindNodeStatus) && (FindNodeStatus != EFI_NOT_FOUND)) {
DEBUG ((DEBUG_ERROR, "%a: Error occurred while iterating DT nodes " DEBUG ((
"(FindNodeStatus == %r)\n", __FUNCTION__, FindNodeStatus)); DEBUG_ERROR,
"%a: Error occurred while iterating DT nodes "
"(FindNodeStatus == %r)\n",
__FUNCTION__,
FindNodeStatus
));
} }
return EFI_SUCCESS; return EFI_SUCCESS;

View File

@ -1,4 +1,4 @@
/** @file /** @file
UEFI Configuration Table for exposing the SEV Launch Secret location to UEFI UEFI Configuration Table for exposing the SEV Launch Secret location to UEFI
applications (boot loaders). applications (boot loaders).

View File

@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef __E820_H__ #ifndef __E820_H__
#define __E820_H__ #define __E820_H__

View File

@ -107,18 +107,18 @@ typedef struct {
} MPT_SCSI_IO_REQUEST; } MPT_SCSI_IO_REQUEST;
typedef struct { typedef struct {
UINT32 Length: 24; UINT32 Length : 24;
UINT32 EndOfList: 1; UINT32 EndOfList : 1;
UINT32 Is64BitAddress: 1; UINT32 Is64BitAddress : 1;
// //
// True when the buffer contains data to be transfered. Otherwise it's the // True when the buffer contains data to be transfered. Otherwise it's the
// destination buffer // destination buffer
// //
UINT32 BufferContainsData: 1; UINT32 BufferContainsData : 1;
UINT32 LocalAddress: 1; UINT32 LocalAddress : 1;
UINT32 ElementType: 2; UINT32 ElementType : 2;
UINT32 EndOfBuffer: 1; UINT32 EndOfBuffer : 1;
UINT32 LastElement: 1; UINT32 LastElement : 1;
UINT64 DataBufferAddress; UINT64 DataBufferAddress;
} MPT_SG_ENTRY_SIMPLE; } MPT_SG_ENTRY_SIMPLE;

View File

@ -17,11 +17,11 @@
// //
typedef union { typedef union {
struct { struct {
UINT8 BitB:1; UINT8 BitB : 1;
UINT8 BitX:1; UINT8 BitX : 1;
UINT8 BitR:1; UINT8 BitR : 1;
UINT8 BitW:1; UINT8 BitW : 1;
UINT8 Rex:4; UINT8 Rex : 4;
} Bits; } Bits;
UINT8 Uint8; UINT8 Uint8;
@ -32,9 +32,9 @@ typedef union {
// //
typedef union { typedef union {
struct { struct {
UINT8 Rm:3; UINT8 Rm : 3;
UINT8 Reg:3; UINT8 Reg : 3;
UINT8 Mod:2; UINT8 Mod : 2;
} Bits; } Bits;
UINT8 Uint8; UINT8 Uint8;
@ -45,9 +45,9 @@ typedef union {
// //
typedef union { typedef union {
struct { struct {
UINT8 Base:3; UINT8 Base : 3;
UINT8 Index:3; UINT8 Index : 3;
UINT8 Scale:2; UINT8 Scale : 2;
} Bits; } Bits;
UINT8 Uint8; UINT8 Uint8;

View File

@ -87,11 +87,11 @@ struct screen_info {
UINT8 orig_video_cols; /* 0x07 */ UINT8 orig_video_cols; /* 0x07 */
UINT8 flags; /* 0x08 */ UINT8 flags; /* 0x08 */
UINT8 unused2; /* 0x09 */ UINT8 unused2; /* 0x09 */
UINT16 orig_video_ega_bx;/* 0x0a */ UINT16 orig_video_ega_bx; /* 0x0a */
UINT16 unused3; /* 0x0c */ UINT16 unused3; /* 0x0c */
UINT8 orig_video_lines; /* 0x0e */ UINT8 orig_video_lines; /* 0x0e */
UINT8 orig_video_isVGA; /* 0x0f */ UINT8 orig_video_isVGA; /* 0x0f */
UINT16 orig_video_points;/* 0x10 */ UINT16 orig_video_points; /* 0x10 */
/* VESA graphic mode -- linear frame buffer */ /* VESA graphic mode -- linear frame buffer */
UINT16 lfb_width; /* 0x12 */ UINT16 lfb_width; /* 0x12 */
@ -138,7 +138,7 @@ struct boot_params {
UINT8 edd_mbr_sig_buf_entries; UINT8 edd_mbr_sig_buf_entries;
UINT8 _pad6[6]; UINT8 _pad6[6];
struct setup_header hdr; struct setup_header hdr;
UINT8 _pad7[0x290-0x1f1-sizeof(struct setup_header)]; UINT8 _pad7[0x290-0x1f1-sizeof (struct setup_header)];
UINT32 edd_mbr_sig_buffer[16]; UINT32 edd_mbr_sig_buffer[16];
struct e820_entry e820_map[128]; struct e820_entry e820_map[128];
UINT8 _pad8[48]; UINT8 _pad8[48];
@ -153,6 +153,9 @@ typedef struct {
#pragma pack() #pragma pack()
extern EFI_STATUS setup_graphics(struct boot_params *buf); extern EFI_STATUS
setup_graphics (
struct boot_params *buf
);
#endif /* __LINUX_BZIMAGE_H__ */ #endif /* __LINUX_BZIMAGE_H__ */

View File

@ -4,6 +4,7 @@
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef __MICROVM_H__ #ifndef __MICROVM_H__
#define __MICROVM_H__ #define __MICROVM_H__

View File

@ -25,21 +25,21 @@
typedef union { typedef union {
struct { struct {
UINT64 Present:1; // 0 = Not present in memory, UINT64 Present : 1; // 0 = Not present in memory,
// 1 = Present in memory // 1 = Present in memory
UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write UINT64 ReadWrite : 1; // 0 = Read-Only, 1= Read/Write
UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User UINT64 UserSupervisor : 1; // 0 = Supervisor, 1=User
UINT64 WriteThrough:1; // 0 = Write-Back caching, UINT64 WriteThrough : 1; // 0 = Write-Back caching,
// 1 = Write-Through caching // 1 = Write-Through caching
UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached UINT64 CacheDisabled : 1; // 0 = Cached, 1=Non-Cached
UINT64 Accessed:1; // 0 = Not accessed, UINT64 Accessed : 1; // 0 = Not accessed,
// 1 = Accessed (set by CPU) // 1 = Accessed (set by CPU)
UINT64 Reserved:1; // Reserved UINT64 Reserved : 1; // Reserved
UINT64 MustBeZero:2; // Must Be Zero UINT64 MustBeZero : 2; // Must Be Zero
UINT64 Available:3; // Available for use by system software UINT64 Available : 3; // Available for use by system software
UINT64 PageTableBaseAddress:40; // Page Table Base Address UINT64 PageTableBaseAddress : 40; // Page Table Base Address
UINT64 AvabilableHigh:11; // Available for use by system software UINT64 AvabilableHigh : 11; // Available for use by system software
UINT64 Nx:1; // No Execute bit UINT64 Nx : 1; // No Execute bit
} Bits; } Bits;
UINT64 Uint64; UINT64 Uint64;
} PAGE_MAP_AND_DIRECTORY_POINTER; } PAGE_MAP_AND_DIRECTORY_POINTER;
@ -49,24 +49,24 @@ typedef union {
// //
typedef union { typedef union {
struct { struct {
UINT64 Present:1; // 0 = Not present in memory, UINT64 Present : 1; // 0 = Not present in memory,
// 1 = Present in memory // 1 = Present in memory
UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write UINT64 ReadWrite : 1; // 0 = Read-Only, 1= Read/Write
UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User UINT64 UserSupervisor : 1; // 0 = Supervisor, 1=User
UINT64 WriteThrough:1; // 0 = Write-Back caching, UINT64 WriteThrough : 1; // 0 = Write-Back caching,
// 1 = Write-Through caching // 1 = Write-Through caching
UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached UINT64 CacheDisabled : 1; // 0 = Cached, 1=Non-Cached
UINT64 Accessed:1; // 0 = Not accessed, UINT64 Accessed : 1; // 0 = Not accessed,
// 1 = Accessed (set by CPU) // 1 = Accessed (set by CPU)
UINT64 Dirty:1; // 0 = Not Dirty, 1 = written by UINT64 Dirty : 1; // 0 = Not Dirty, 1 = written by
// processor on access to page // processor on access to page
UINT64 PAT:1; // UINT64 PAT : 1; //
UINT64 Global:1; // 0 = Not global page, 1 = global page UINT64 Global : 1; // 0 = Not global page, 1 = global page
// TLB not cleared on CR3 write // TLB not cleared on CR3 write
UINT64 Available:3; // Available for use by system software UINT64 Available : 3; // Available for use by system software
UINT64 PageTableBaseAddress:40; // Page Table Base Address UINT64 PageTableBaseAddress : 40; // Page Table Base Address
UINT64 AvabilableHigh:11; // Available for use by system software UINT64 AvabilableHigh : 11; // Available for use by system software
UINT64 Nx:1; // 0 = Execute Code, UINT64 Nx : 1; // 0 = Execute Code,
// 1 = No Code Execution // 1 = No Code Execution
} Bits; } Bits;
UINT64 Uint64; UINT64 Uint64;
@ -77,26 +77,26 @@ typedef union {
// //
typedef union { typedef union {
struct { struct {
UINT64 Present:1; // 0 = Not present in memory, UINT64 Present : 1; // 0 = Not present in memory,
// 1 = Present in memory // 1 = Present in memory
UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write UINT64 ReadWrite : 1; // 0 = Read-Only, 1= Read/Write
UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User UINT64 UserSupervisor : 1; // 0 = Supervisor, 1=User
UINT64 WriteThrough:1; // 0 = Write-Back caching, UINT64 WriteThrough : 1; // 0 = Write-Back caching,
// 1=Write-Through caching // 1=Write-Through caching
UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached UINT64 CacheDisabled : 1; // 0 = Cached, 1=Non-Cached
UINT64 Accessed:1; // 0 = Not accessed, UINT64 Accessed : 1; // 0 = Not accessed,
// 1 = Accessed (set by CPU) // 1 = Accessed (set by CPU)
UINT64 Dirty:1; // 0 = Not Dirty, 1 = written by UINT64 Dirty : 1; // 0 = Not Dirty, 1 = written by
// processor on access to page // processor on access to page
UINT64 MustBe1:1; // Must be 1 UINT64 MustBe1 : 1; // Must be 1
UINT64 Global:1; // 0 = Not global page, 1 = global page UINT64 Global : 1; // 0 = Not global page, 1 = global page
// TLB not cleared on CR3 write // TLB not cleared on CR3 write
UINT64 Available:3; // Available for use by system software UINT64 Available : 3; // Available for use by system software
UINT64 PAT:1; // UINT64 PAT : 1; //
UINT64 MustBeZero:8; // Must be zero; UINT64 MustBeZero : 8; // Must be zero;
UINT64 PageTableBaseAddress:31; // Page Table Base Address UINT64 PageTableBaseAddress : 31; // Page Table Base Address
UINT64 AvabilableHigh:11; // Available for use by system software UINT64 AvabilableHigh : 11; // Available for use by system software
UINT64 Nx:1; // 0 = Execute Code, UINT64 Nx : 1; // 0 = Execute Code,
// 1 = No Code Execution // 1 = No Code Execution
} Bits; } Bits;
UINT64 Uint64; UINT64 Uint64;
@ -107,26 +107,26 @@ typedef union {
// //
typedef union { typedef union {
struct { struct {
UINT64 Present:1; // 0 = Not present in memory, UINT64 Present : 1; // 0 = Not present in memory,
// 1 = Present in memory // 1 = Present in memory
UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write UINT64 ReadWrite : 1; // 0 = Read-Only, 1= Read/Write
UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User UINT64 UserSupervisor : 1; // 0 = Supervisor, 1=User
UINT64 WriteThrough:1; // 0 = Write-Back caching, UINT64 WriteThrough : 1; // 0 = Write-Back caching,
// 1 = Write-Through caching // 1 = Write-Through caching
UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached UINT64 CacheDisabled : 1; // 0 = Cached, 1=Non-Cached
UINT64 Accessed:1; // 0 = Not accessed, UINT64 Accessed : 1; // 0 = Not accessed,
// 1 = Accessed (set by CPU) // 1 = Accessed (set by CPU)
UINT64 Dirty:1; // 0 = Not Dirty, 1 = written by UINT64 Dirty : 1; // 0 = Not Dirty, 1 = written by
// processor on access to page // processor on access to page
UINT64 MustBe1:1; // Must be 1 UINT64 MustBe1 : 1; // Must be 1
UINT64 Global:1; // 0 = Not global page, 1 = global page UINT64 Global : 1; // 0 = Not global page, 1 = global page
// TLB not cleared on CR3 write // TLB not cleared on CR3 write
UINT64 Available:3; // Available for use by system software UINT64 Available : 3; // Available for use by system software
UINT64 PAT:1; // UINT64 PAT : 1; //
UINT64 MustBeZero:17; // Must be zero; UINT64 MustBeZero : 17; // Must be zero;
UINT64 PageTableBaseAddress:22; // Page Table Base Address UINT64 PageTableBaseAddress : 22; // Page Table Base Address
UINT64 AvabilableHigh:11; // Available for use by system software UINT64 AvabilableHigh : 11; // Available for use by system software
UINT64 Nx:1; // 0 = Execute Code, UINT64 Nx : 1; // 0 = Execute Code,
// 1 = No Code Execution // 1 = No Code Execution
} Bits; } Bits;
UINT64 Uint64; UINT64 Uint64;

View File

@ -80,7 +80,6 @@ typedef enum {
QemuFwCfgItemX86Irq0Override = 0x8002, QemuFwCfgItemX86Irq0Override = 0x8002,
QemuFwCfgItemX86E820Table = 0x8003, QemuFwCfgItemX86E820Table = 0x8003,
QemuFwCfgItemX86HpetData = 0x8004, QemuFwCfgItemX86HpetData = 0x8004,
} FIRMWARE_CONFIG_ITEM; } FIRMWARE_CONFIG_ITEM;
// //

View File

@ -35,7 +35,6 @@
#define VIRTIO_VENDOR_ID 0x1AF4 #define VIRTIO_VENDOR_ID 0x1AF4
#define VIRTIO_MMIO_MAGIC 0x74726976 // "virt" #define VIRTIO_MMIO_MAGIC 0x74726976 // "virt"
// //
// VirtIo Device Specific Configuration Offsets // VirtIo Device Specific Configuration Offsets
// //
@ -104,7 +103,6 @@ typedef struct {
volatile UINT16 *UsedEvent; // unused as per negotiation volatile UINT16 *UsedEvent; // unused as per negotiation
} VRING_AVAIL; } VRING_AVAIL;
// //
// virtio-0.9.5, 2.3.5 Used Ring // virtio-0.9.5, 2.3.5 Used Ring
// //
@ -124,7 +122,6 @@ typedef struct {
volatile UINT16 *AvailEvent; // unused as per negotiation volatile UINT16 *AvailEvent; // unused as per negotiation
} VRING_USED; } VRING_USED;
// //
// virtio-0.9.5, 2.3.2 Descriptor Table // virtio-0.9.5, 2.3.2 Descriptor Table
// //
@ -165,5 +162,4 @@ typedef struct {
#define VIRTIO_F_RING_INDIRECT_DESC BIT28 #define VIRTIO_F_RING_INDIRECT_DESC BIT28
#define VIRTIO_F_RING_EVENT_IDX BIT29 #define VIRTIO_F_RING_EVENT_IDX BIT29
#endif // _VIRTIO_0_9_5_H_ #endif // _VIRTIO_0_9_5_H_

View File

@ -14,7 +14,6 @@
#include <IndustryStandard/Virtio.h> #include <IndustryStandard/Virtio.h>
// //
// virtio-0.9.5, Appendix D: Block Device // virtio-0.9.5, Appendix D: Block Device
// //

View File

@ -14,7 +14,6 @@
#include <IndustryStandard/Virtio.h> #include <IndustryStandard/Virtio.h>
// //
// virtio-0.9.5, Appendix I: SCSI Host Device // virtio-0.9.5, Appendix I: SCSI Host Device
// //

View File

@ -184,67 +184,66 @@
_sxghr_tmp->q = 0; \ _sxghr_tmp->q = 0; \
_sxghr_tmp->p = val; \ _sxghr_tmp->p = val; \
} while ( 0 ) } while ( 0 )
#ifdef __XEN_TOOLS__ #ifdef __XEN_TOOLS__
#define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0) #define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0)
#endif #endif
#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) #define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) #if defined (__GNUC__) && !defined (__STRICT_ANSI__)
/* Anonymous union includes both 32- and 64-bit names (e.g., r0/x0). */ /* Anonymous union includes both 32- and 64-bit names (e.g., r0/x0). */
# define __DECL_REG(n64, n32) union { \ #define __DECL_REG(n64, n32) union { \
UINT64 n64; \ UINT64 n64; \
UINT32 n32; \ UINT32 n32; \
} }
#else #else
/* Non-gcc sources must always use the proper 64-bit name (e.g., x0). */ /* Non-gcc sources must always use the proper 64-bit name (e.g., x0). */
#define __DECL_REG(n64, n32) UINT64 n64 #define __DECL_REG(n64, n32) UINT64 n64
#endif #endif
struct vcpu_guest_core_regs struct vcpu_guest_core_regs {
{
/* Aarch64 Aarch32 */ /* Aarch64 Aarch32 */
__DECL_REG(x0, r0_usr); __DECL_REG (x0, r0_usr);
__DECL_REG(x1, r1_usr); __DECL_REG (x1, r1_usr);
__DECL_REG(x2, r2_usr); __DECL_REG (x2, r2_usr);
__DECL_REG(x3, r3_usr); __DECL_REG (x3, r3_usr);
__DECL_REG(x4, r4_usr); __DECL_REG (x4, r4_usr);
__DECL_REG(x5, r5_usr); __DECL_REG (x5, r5_usr);
__DECL_REG(x6, r6_usr); __DECL_REG (x6, r6_usr);
__DECL_REG(x7, r7_usr); __DECL_REG (x7, r7_usr);
__DECL_REG(x8, r8_usr); __DECL_REG (x8, r8_usr);
__DECL_REG(x9, r9_usr); __DECL_REG (x9, r9_usr);
__DECL_REG(x10, r10_usr); __DECL_REG (x10, r10_usr);
__DECL_REG(x11, r11_usr); __DECL_REG (x11, r11_usr);
__DECL_REG(x12, r12_usr); __DECL_REG (x12, r12_usr);
__DECL_REG(x13, sp_usr); __DECL_REG (x13, sp_usr);
__DECL_REG(x14, lr_usr); __DECL_REG (x14, lr_usr);
__DECL_REG(x15, __unused_sp_hyp); __DECL_REG (x15, __unused_sp_hyp);
__DECL_REG(x16, lr_irq); __DECL_REG (x16, lr_irq);
__DECL_REG(x17, sp_irq); __DECL_REG (x17, sp_irq);
__DECL_REG(x18, lr_svc); __DECL_REG (x18, lr_svc);
__DECL_REG(x19, sp_svc); __DECL_REG (x19, sp_svc);
__DECL_REG(x20, lr_abt); __DECL_REG (x20, lr_abt);
__DECL_REG(x21, sp_abt); __DECL_REG (x21, sp_abt);
__DECL_REG(x22, lr_und); __DECL_REG (x22, lr_und);
__DECL_REG(x23, sp_und); __DECL_REG (x23, sp_und);
__DECL_REG(x24, r8_fiq); __DECL_REG (x24, r8_fiq);
__DECL_REG(x25, r9_fiq); __DECL_REG (x25, r9_fiq);
__DECL_REG(x26, r10_fiq); __DECL_REG (x26, r10_fiq);
__DECL_REG(x27, r11_fiq); __DECL_REG (x27, r11_fiq);
__DECL_REG(x28, r12_fiq); __DECL_REG (x28, r12_fiq);
__DECL_REG(x29, sp_fiq); __DECL_REG (x29, sp_fiq);
__DECL_REG(x30, lr_fiq); __DECL_REG (x30, lr_fiq);
/* Return address and mode */ /* Return address and mode */
__DECL_REG(pc64, pc32); /* ELR_EL2 */ __DECL_REG (pc64, pc32); /* ELR_EL2 */
UINT32 cpsr; /* SPSR_EL2 */ UINT32 cpsr; /* SPSR_EL2 */
union { union {
@ -259,10 +258,11 @@ struct vcpu_guest_core_regs
UINT64 sp_el0; UINT64 sp_el0;
UINT64 sp_el1, elr_el1; UINT64 sp_el1, elr_el1;
}; };
typedef struct vcpu_guest_core_regs vcpu_guest_core_regs_t;
DEFINE_XEN_GUEST_HANDLE(vcpu_guest_core_regs_t);
#undef __DECL_REG typedef struct vcpu_guest_core_regs vcpu_guest_core_regs_t;
DEFINE_XEN_GUEST_HANDLE (vcpu_guest_core_regs_t);
#undef __DECL_REG
typedef UINT64 xen_pfn_t; typedef UINT64 xen_pfn_t;
#define PRI_xen_pfn PRIx64 #define PRI_xen_pfn PRIx64
@ -274,10 +274,10 @@ typedef UINT64 xen_pfn_t;
typedef UINT64 xen_ulong_t; typedef UINT64 xen_ulong_t;
#define PRI_xen_ulong PRIx64 #define PRI_xen_ulong PRIx64
#if defined(__XEN__) || defined(__XEN_TOOLS__) #if defined (__XEN__) || defined (__XEN_TOOLS__)
struct vcpu_guest_context { struct vcpu_guest_context {
#define _VGCF_online 0 #define _VGCF_online 0
#define VGCF_online (1<<_VGCF_online) #define VGCF_online (1<<_VGCF_online)
UINT32 flags; /* VGCF_* */ UINT32 flags; /* VGCF_* */
struct vcpu_guest_core_regs user_regs; /* Core CPU registers */ struct vcpu_guest_core_regs user_regs; /* Core CPU registers */
@ -285,22 +285,25 @@ struct vcpu_guest_context {
UINT32 sctlr; UINT32 sctlr;
UINT64 ttbcr, ttbr0, ttbr1; UINT64 ttbcr, ttbr0, ttbr1;
}; };
typedef struct vcpu_guest_context vcpu_guest_context_t; typedef struct vcpu_guest_context vcpu_guest_context_t;
DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t); DEFINE_XEN_GUEST_HANDLE (vcpu_guest_context_t);
#endif #endif
struct arch_vcpu_info { struct arch_vcpu_info {
}; };
typedef struct arch_vcpu_info arch_vcpu_info_t; typedef struct arch_vcpu_info arch_vcpu_info_t;
struct arch_shared_info { struct arch_shared_info {
}; };
typedef struct arch_shared_info arch_shared_info_t; typedef struct arch_shared_info arch_shared_info_t;
typedef UINT64 xen_callback_t; typedef UINT64 xen_callback_t;
#endif #endif
#if defined(__XEN__) || defined(__XEN_TOOLS__) #if defined (__XEN__) || defined (__XEN_TOOLS__)
/* PSR bits (CPSR, SPSR)*/ /* PSR bits (CPSR, SPSR)*/
@ -325,7 +328,7 @@ typedef UINT64 xen_callback_t;
#define PSR_MODE_SYS 0x1f #define PSR_MODE_SYS 0x1f
/* 64 bit modes */ /* 64 bit modes */
#define PSR_MODE_BIT 0x10 /* Set iff AArch32 */ #define PSR_MODE_BIT 0x10/* Set iff AArch32 */
#define PSR_MODE_EL3h 0x0d #define PSR_MODE_EL3h 0x0d
#define PSR_MODE_EL3t 0x0c #define PSR_MODE_EL3t 0x0c
#define PSR_MODE_EL2h 0x09 #define PSR_MODE_EL2h 0x09

View File

@ -26,6 +26,7 @@ struct arch_vcpu_info {
UINTN cr2; UINTN cr2;
UINTN pad[5]; /* sizeof(vcpu_info_t) == 64 */ UINTN pad[5]; /* sizeof(vcpu_info_t) == 64 */
}; };
typedef struct arch_vcpu_info arch_vcpu_info_t; typedef struct arch_vcpu_info arch_vcpu_info_t;
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */

View File

@ -26,6 +26,7 @@ struct arch_vcpu_info {
UINTN cr2; UINTN cr2;
UINTN pad; /* sizeof(vcpu_info_t) == 64 */ UINTN pad; /* sizeof(vcpu_info_t) == 64 */
}; };
typedef struct arch_vcpu_info arch_vcpu_info_t; typedef struct arch_vcpu_info arch_vcpu_info_t;
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */

View File

@ -14,13 +14,13 @@
#define __XEN_PUBLIC_ARCH_X86_XEN_H__ #define __XEN_PUBLIC_ARCH_X86_XEN_H__
/* Structural guest handles introduced in 0x00030201. */ /* Structural guest handles introduced in 0x00030201. */
#if __XEN_INTERFACE_VERSION__ >= 0x00030201 #if __XEN_INTERFACE_VERSION__ >= 0x00030201
#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ #define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
typedef struct { type *p; } __guest_handle_ ## name typedef struct { type *p; } __guest_handle_ ## name
#else #else
#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ #define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
typedef type * __guest_handle_ ## name typedef type * __guest_handle_ ## name
#endif #endif
/* /*
* XEN_GUEST_HANDLE represents a guest pointer, when passed as a field * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field
@ -38,37 +38,37 @@
#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) #define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name)
#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) #define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name)
#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0) #define set_xen_guest_handle_raw(hnd, val) do { (hnd).p = val; } while (0)
#ifdef __XEN_TOOLS__ #ifdef __XEN_TOOLS__
#define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0) #define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0)
#endif #endif
#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) #define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)
#if defined(MDE_CPU_IA32) #if defined (MDE_CPU_IA32)
#include "xen-x86_32.h" #include "xen-x86_32.h"
#elif defined(MDE_CPU_X64) #elif defined (MDE_CPU_X64)
#include "xen-x86_64.h" #include "xen-x86_64.h"
#endif #endif
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
typedef UINTN xen_pfn_t; typedef UINTN xen_pfn_t;
#define PRI_xen_pfn "lx" #define PRI_xen_pfn "lx"
#endif #endif
#define XEN_HAVE_PV_UPCALL_MASK 1 #define XEN_HAVE_PV_UPCALL_MASK 1
/* Maximum number of virtual CPUs in legacy multi-processor guests. */ /* Maximum number of virtual CPUs in legacy multi-processor guests. */
#define XEN_LEGACY_MAX_VCPUS 32 #define XEN_LEGACY_MAX_VCPUS 32
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
typedef UINTN xen_ulong_t; typedef UINTN xen_ulong_t;
#define PRI_xen_ulong "lx" #define PRI_xen_ulong "lx"
typedef UINT64 tsc_timestamp_t; /* RDTSC timestamp */ typedef UINT64 tsc_timestamp_t; /* RDTSC timestamp */
#ifdef MDE_CPU_IA32 #ifdef MDE_CPU_IA32
#pragma pack(4) #pragma pack(4)
#endif #endif
struct arch_shared_info { struct arch_shared_info {
UINTN max_pfn; /* max pfn that appears in table */ UINTN max_pfn; /* max pfn that appears in table */
/* Frame containing list of mfns containing list of mfns containing p2m. */ /* Frame containing list of mfns containing list of mfns containing p2m. */
@ -76,12 +76,13 @@ struct arch_shared_info {
UINTN nmi_reason; UINTN nmi_reason;
UINT64 pad[32]; UINT64 pad[32];
}; };
typedef struct arch_shared_info arch_shared_info_t;
#ifdef MDE_CPU_IA32
#pragma pack()
#endif
#endif /* !__ASSEMBLY__ */ typedef struct arch_shared_info arch_shared_info_t;
#ifdef MDE_CPU_IA32
#pragma pack()
#endif
#endif /* !__ASSEMBLY__ */
#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */ #endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */

View File

@ -50,7 +50,7 @@
/* ` } */ /* ` } */
typedef UINT32 evtchn_port_t; typedef UINT32 evtchn_port_t;
DEFINE_XEN_GUEST_HANDLE(evtchn_port_t); DEFINE_XEN_GUEST_HANDLE (evtchn_port_t);
/* /*
* EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as * EVTCHNOP_alloc_unbound: Allocate a port in domain <dom> and mark as
@ -66,6 +66,7 @@ struct evtchn_alloc_unbound {
/* OUT parameters */ /* OUT parameters */
evtchn_port_t port; evtchn_port_t port;
}; };
typedef struct evtchn_alloc_unbound evtchn_alloc_unbound_t; typedef struct evtchn_alloc_unbound evtchn_alloc_unbound_t;
/* /*
@ -77,6 +78,7 @@ struct evtchn_close {
/* IN parameters. */ /* IN parameters. */
evtchn_port_t port; evtchn_port_t port;
}; };
typedef struct evtchn_close evtchn_close_t; typedef struct evtchn_close evtchn_close_t;
/* /*
@ -87,6 +89,7 @@ struct evtchn_send {
/* IN parameters. */ /* IN parameters. */
evtchn_port_t port; evtchn_port_t port;
}; };
typedef struct evtchn_send evtchn_send_t; typedef struct evtchn_send evtchn_send_t;
#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */ #endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */

View File

@ -117,12 +117,14 @@ struct grant_entry_v1 {
UINT16 flags; UINT16 flags;
/* The domain being granted foreign privileges. [GST] */ /* The domain being granted foreign privileges. [GST] */
domid_t domid; domid_t domid;
/* /*
* GTF_permit_access: Frame that @domid is allowed to map and access. [GST] * GTF_permit_access: Frame that @domid is allowed to map and access. [GST]
* GTF_accept_transfer: Frame whose ownership transferred by @domid. [XEN] * GTF_accept_transfer: Frame whose ownership transferred by @domid. [XEN]
*/ */
UINT32 frame; UINT32 frame;
}; };
typedef struct grant_entry_v1 grant_entry_v1_t; typedef struct grant_entry_v1 grant_entry_v1_t;
/* The first few grant table entries will be preserved across grant table /* The first few grant table entries will be preserved across grant table
@ -197,6 +199,7 @@ typedef struct grant_entry_v1 grant_entry_v1_t;
* on the grant table version in use by the other domain. * on the grant table version in use by the other domain.
*/ */
#if __XEN_INTERFACE_VERSION__ >= 0x0003020a #if __XEN_INTERFACE_VERSION__ >= 0x0003020a
/* /*
* Version 1 and version 2 grant entries share a common prefix. The * Version 1 and version 2 grant entries share a common prefix. The
* fields of the prefix are documented as part of struct * fields of the prefix are documented as part of struct
@ -206,6 +209,7 @@ struct grant_entry_header {
UINT16 flags; UINT16 flags;
domid_t domid; domid_t domid;
}; };
typedef struct grant_entry_header grant_entry_header_t; typedef struct grant_entry_header grant_entry_header_t;
/* /*
@ -259,6 +263,7 @@ union grant_entry_v2 {
UINT32 __spacer[4]; /* Pad to a power of two */ UINT32 __spacer[4]; /* Pad to a power of two */
}; };
typedef union grant_entry_v2 grant_entry_v2_t; typedef union grant_entry_v2 grant_entry_v2_t;
typedef UINT16 grant_status_t; typedef UINT16 grant_status_t;
@ -317,8 +322,9 @@ struct gnttab_map_grant_ref {
grant_handle_t handle; grant_handle_t handle;
UINT64 dev_bus_addr; UINT64 dev_bus_addr;
}; };
typedef struct gnttab_map_grant_ref gnttab_map_grant_ref_t; typedef struct gnttab_map_grant_ref gnttab_map_grant_ref_t;
DEFINE_XEN_GUEST_HANDLE(gnttab_map_grant_ref_t); DEFINE_XEN_GUEST_HANDLE (gnttab_map_grant_ref_t);
/* /*
* GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings * GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings
@ -339,22 +345,24 @@ struct gnttab_unmap_grant_ref {
/* OUT parameters. */ /* OUT parameters. */
INT16 status; /* => enum grant_status */ INT16 status; /* => enum grant_status */
}; };
typedef struct gnttab_unmap_grant_ref gnttab_unmap_grant_ref_t; typedef struct gnttab_unmap_grant_ref gnttab_unmap_grant_ref_t;
DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t); DEFINE_XEN_GUEST_HANDLE (gnttab_unmap_grant_ref_t);
/* /*
* Bitfield values for gnttab_map_grant_ref.flags. * Bitfield values for gnttab_map_grant_ref.flags.
*/ */
/* Map the grant entry for access by I/O devices. */ /* Map the grant entry for access by I/O devices. */
#define _GNTMAP_device_map (0) #define _GNTMAP_device_map (0)
#define GNTMAP_device_map (1<<_GNTMAP_device_map) #define GNTMAP_device_map (1<<_GNTMAP_device_map)
/* Map the grant entry for access by host CPUs. */ /* Map the grant entry for access by host CPUs. */
#define _GNTMAP_host_map (1) #define _GNTMAP_host_map (1)
#define GNTMAP_host_map (1<<_GNTMAP_host_map) #define GNTMAP_host_map (1<<_GNTMAP_host_map)
/* Accesses to the granted frame will be restricted to read-only access. */ /* Accesses to the granted frame will be restricted to read-only access. */
#define _GNTMAP_readonly (2) #define _GNTMAP_readonly (2)
#define GNTMAP_readonly (1<<_GNTMAP_readonly) #define GNTMAP_readonly (1<<_GNTMAP_readonly)
/*
/*
* GNTMAP_host_map subflag: * GNTMAP_host_map subflag:
* 0 => The host mapping is usable only by the guest OS. * 0 => The host mapping is usable only by the guest OS.
* 1 => The host mapping is usable by guest OS + current application. * 1 => The host mapping is usable by guest OS + current application.
@ -362,7 +370,7 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t);
#define _GNTMAP_application_map (3) #define _GNTMAP_application_map (3)
#define GNTMAP_application_map (1<<_GNTMAP_application_map) #define GNTMAP_application_map (1<<_GNTMAP_application_map)
/* /*
* GNTMAP_contains_pte subflag: * GNTMAP_contains_pte subflag:
* 0 => This map request contains a host virtual address. * 0 => This map request contains a host virtual address.
* 1 => This map request contains the machine address of the PTE to update. * 1 => This map request contains the machine address of the PTE to update.

View File

@ -15,7 +15,8 @@ struct xen_hvm_param {
UINT32 index; /* IN */ UINT32 index; /* IN */
UINT64 value; /* IN/OUT */ UINT64 value; /* IN/OUT */
}; };
typedef struct xen_hvm_param xen_hvm_param_t; typedef struct xen_hvm_param xen_hvm_param_t;
DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t); DEFINE_XEN_GUEST_HANDLE (xen_hvm_param_t);
#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */ #endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */

View File

@ -38,7 +38,7 @@
#define HVM_PARAM_BUFIOREQ_PFN 6 #define HVM_PARAM_BUFIOREQ_PFN 6
#define HVM_PARAM_BUFIOREQ_EVTCHN 26 #define HVM_PARAM_BUFIOREQ_EVTCHN 26
#if defined(MDE_CPU_IA32) || defined(MDE_CPU_X64) #if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
/* Expose Viridian interfaces to this HVM guest? */ /* Expose Viridian interfaces to this HVM guest? */
#define HVM_PARAM_VIRIDIAN 9 #define HVM_PARAM_VIRIDIAN 9

View File

@ -417,6 +417,7 @@
*/ */
#define BLKIF_OP_READ 0 #define BLKIF_OP_READ 0
#define BLKIF_OP_WRITE 1 #define BLKIF_OP_WRITE 1
/* /*
* All writes issued prior to a request with the BLKIF_OP_WRITE_BARRIER * All writes issued prior to a request with the BLKIF_OP_WRITE_BARRIER
* operation code ("barrier request") must be completed prior to the * operation code ("barrier request") must be completed prior to the
@ -426,6 +427,7 @@
* Optional. See "feature-barrier" XenBus node documentation above. * Optional. See "feature-barrier" XenBus node documentation above.
*/ */
#define BLKIF_OP_WRITE_BARRIER 2 #define BLKIF_OP_WRITE_BARRIER 2
/* /*
* Commit any uncommitted contents of the backing device's volatile cache * Commit any uncommitted contents of the backing device's volatile cache
* to stable storage. * to stable storage.
@ -433,11 +435,13 @@
* Optional. See "feature-flush-cache" XenBus node documentation above. * Optional. See "feature-flush-cache" XenBus node documentation above.
*/ */
#define BLKIF_OP_FLUSH_DISKCACHE 3 #define BLKIF_OP_FLUSH_DISKCACHE 3
/* /*
* Used in SLES sources for device specific command packet * Used in SLES sources for device specific command packet
* contained within the request. Reserved for that purpose. * contained within the request. Reserved for that purpose.
*/ */
#define BLKIF_OP_RESERVED_1 4 #define BLKIF_OP_RESERVED_1 4
/* /*
* Indicate to the backend device that a region of storage is no longer in * Indicate to the backend device that a region of storage is no longer in
* use, and may be discarded at any time without impact to the client. If * use, and may be discarded at any time without impact to the client. If
@ -514,22 +518,23 @@ struct blkif_request_segment {
/* /*
* Starting ring element for any I/O request. * Starting ring element for any I/O request.
*/ */
#if defined(MDE_CPU_IA32) #if defined (MDE_CPU_IA32)
// //
// pack(4) is necessary when these structs are compiled for Ia32. // pack(4) is necessary when these structs are compiled for Ia32.
// Without it, the struct will have a different alignment than the one // Without it, the struct will have a different alignment than the one
// a backend expect for a 32bit guest. // a backend expect for a 32bit guest.
// //
#pragma pack(4) #pragma pack(4)
#endif #endif
struct blkif_request { struct blkif_request {
UINT8 operation; /* BLKIF_OP_??? */ UINT8 operation; /* BLKIF_OP_??? */
UINT8 nr_segments; /* number of segments */ UINT8 nr_segments; /* number of segments */
blkif_vdev_t handle; /* only for read/write requests */ blkif_vdev_t handle; /* only for read/write requests */
UINT64 id; /* private guest value, echoed in resp */ UINT64 id; /* private guest value, echoed in resp */
blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ blkif_sector_t sector_number; /* start sector idx on disk (r/w only) */
struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
}; };
typedef struct blkif_request blkif_request_t; typedef struct blkif_request blkif_request_t;
/* /*
@ -539,12 +544,13 @@ typedef struct blkif_request blkif_request_t;
struct blkif_request_discard { struct blkif_request_discard {
UINT8 operation; /* BLKIF_OP_DISCARD */ UINT8 operation; /* BLKIF_OP_DISCARD */
UINT8 flag; /* BLKIF_DISCARD_SECURE or zero */ UINT8 flag; /* BLKIF_DISCARD_SECURE or zero */
#define BLKIF_DISCARD_SECURE (1<<0) /* ignored if discard-secure=0 */ #define BLKIF_DISCARD_SECURE (1<<0) /* ignored if discard-secure=0 */
blkif_vdev_t handle; /* same as for read/write requests */ blkif_vdev_t handle; /* same as for read/write requests */
UINT64 id; /* private guest value, echoed in resp */ UINT64 id; /* private guest value, echoed in resp */
blkif_sector_t sector_number;/* start sector idx on disk */ blkif_sector_t sector_number; /* start sector idx on disk */
UINT64 nr_sectors; /* number of contiguous sectors to discard*/ UINT64 nr_sectors; /* number of contiguous sectors to discard*/
}; };
typedef struct blkif_request_discard blkif_request_discard_t; typedef struct blkif_request_discard blkif_request_discard_t;
struct blkif_request_indirect { struct blkif_request_indirect {
@ -552,13 +558,14 @@ struct blkif_request_indirect {
UINT8 indirect_op; /* BLKIF_OP_{READ/WRITE} */ UINT8 indirect_op; /* BLKIF_OP_{READ/WRITE} */
UINT16 nr_segments; /* number of segments */ UINT16 nr_segments; /* number of segments */
UINT64 id; /* private guest value, echoed in resp */ UINT64 id; /* private guest value, echoed in resp */
blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ blkif_sector_t sector_number; /* start sector idx on disk (r/w only) */
blkif_vdev_t handle; /* same as for read/write requests */ blkif_vdev_t handle; /* same as for read/write requests */
grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
#ifdef MDE_CPU_IA32 #ifdef MDE_CPU_IA32
UINT64 pad; /* Make it 64 byte aligned on i386 */ UINT64 pad; /* Make it 64 byte aligned on i386 */
#endif #endif
}; };
typedef struct blkif_request_indirect blkif_request_indirect_t; typedef struct blkif_request_indirect blkif_request_indirect_t;
struct blkif_response { struct blkif_response {
@ -566,25 +573,26 @@ struct blkif_response {
UINT8 operation; /* copied from request */ UINT8 operation; /* copied from request */
INT16 status; /* BLKIF_RSP_??? */ INT16 status; /* BLKIF_RSP_??? */
}; };
typedef struct blkif_response blkif_response_t; typedef struct blkif_response blkif_response_t;
#if defined(MDE_CPU_IA32) #if defined (MDE_CPU_IA32)
#pragma pack() #pragma pack()
#endif #endif
/* /*
* STATUS RETURN CODES. * STATUS RETURN CODES.
*/ */
/* Operation not supported (only happens on barrier writes). */ /* Operation not supported (only happens on barrier writes). */
#define BLKIF_RSP_EOPNOTSUPP -2 #define BLKIF_RSP_EOPNOTSUPP -2
/* Operation failed for some unspecified reason (-EIO). */ /* Operation failed for some unspecified reason (-EIO). */
#define BLKIF_RSP_ERROR -1 #define BLKIF_RSP_ERROR -1
/* Operation completed successfully. */ /* Operation completed successfully. */
#define BLKIF_RSP_OKAY 0 #define BLKIF_RSP_OKAY 0
/* /*
* Generate blkif ring structures and types. * Generate blkif ring structures and types.
*/ */
DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response); DEFINE_RING_TYPES (blkif, struct blkif_request, struct blkif_response);
#define VDISK_CDROM 0x1 #define VDISK_CDROM 0x1
#define VDISK_REMOVABLE 0x2 #define VDISK_REMOVABLE 0x2

View File

@ -11,14 +11,14 @@
#define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi" #define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi"
#define XEN_IO_PROTO_ABI_ARM "arm-abi" #define XEN_IO_PROTO_ABI_ARM "arm-abi"
#if defined(MDE_CPU_IA32) #if defined (MDE_CPU_IA32)
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32 #define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32
#elif defined(MDE_CPU_X64) #elif defined (MDE_CPU_X64)
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_64 #define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_64
#elif defined(__arm__) || defined(__aarch64__) #elif defined (__arm__) || defined (__aarch64__)
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM #define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM
#else #else
# error arch fixup needed here #error arch fixup needed here
#endif #endif
#endif #endif

Some files were not shown because too many files have changed in this diff Show More