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

@@ -30,20 +30,20 @@
**/
VOID
InternalAcpiDelay (
IN UINT32 Delay
IN UINT32 Delay
)
{
UINT32 Ticks;
UINT32 Times;
UINT32 Ticks;
UINT32 Times;
Times = Delay >> 22;
Delay &= BIT22 - 1;
Times = Delay >> 22;
Delay &= BIT22 - 1;
do {
//
// The target timer count is calculated here
//
Ticks = InternalAcpiGetTimerTick () + Delay;
Delay = BIT22;
Ticks = InternalAcpiGetTimerTick () + Delay;
Delay = BIT22;
//
// Wait until time out
// Delay >= 2^23 could not be handled by this function
@@ -68,7 +68,7 @@ InternalAcpiDelay (
UINTN
EFIAPI
MicroSecondDelay (
IN UINTN MicroSeconds
IN UINTN MicroSeconds
)
{
InternalAcpiDelay (
@@ -96,7 +96,7 @@ MicroSecondDelay (
UINTN
EFIAPI
NanoSecondDelay (
IN UINTN NanoSeconds
IN UINTN NanoSeconds
)
{
InternalAcpiDelay (
@@ -158,8 +158,8 @@ GetPerformanceCounter (
UINT64
EFIAPI
GetPerformanceCounterProperties (
OUT UINT64 *StartValue OPTIONAL,
OUT UINT64 *EndValue OPTIONAL
OUT UINT64 *StartValue OPTIONAL,
OUT UINT64 *EndValue OPTIONAL
)
{
if (StartValue != NULL) {
@@ -187,7 +187,7 @@ GetPerformanceCounterProperties (
UINT64
EFIAPI
GetTimeInNanoSecond (
IN UINT64 Ticks
IN UINT64 Ticks
)
{
UINT64 NanoSeconds;
@@ -204,7 +204,7 @@ GetTimeInNanoSecond (
// Frequency < 0x100000000, so Remainder < 0x100000000, then (Remainder * 1,000,000,000)
// will not overflow 64-bit.
//
NanoSeconds += DivU64x32 (MultU64x32 ((UINT64) Remainder, 1000000000u), ACPI_TIMER_FREQUENCY);
NanoSeconds += DivU64x32 (MultU64x32 ((UINT64)Remainder, 1000000000u), ACPI_TIMER_FREQUENCY);
return NanoSeconds;
}

View File

@@ -14,7 +14,7 @@
//
// Cached ACPI Timer IO Address
//
STATIC UINT32 mAcpiTimerIoAddr;
STATIC UINT32 mAcpiTimerIoAddr;
/**
The constructor function caches the ACPI tick counter address, and,
@@ -29,12 +29,12 @@ AcpiTimerLibConstructor (
VOID
)
{
UINT16 HostBridgeDevId;
UINTN Pmba;
UINT32 PmbaAndVal;
UINT32 PmbaOrVal;
UINTN AcpiCtlReg;
UINT8 AcpiEnBit;
UINT16 HostBridgeDevId;
UINTN Pmba;
UINT32 PmbaAndVal;
UINT32 PmbaOrVal;
UINTN AcpiCtlReg;
UINT8 AcpiEnBit;
//
// Query Host Bridge DID to determine platform type
@@ -56,8 +56,12 @@ AcpiTimerLibConstructor (
AcpiEnBit = ICH9_ACPI_CNTL_ACPI_EN;
break;
default:
DEBUG ((DEBUG_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__, HostBridgeDevId));
DEBUG ((
DEBUG_ERROR,
"%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__,
HostBridgeDevId
));
ASSERT (FALSE);
return RETURN_UNSUPPORTED;
}

View File

@@ -27,12 +27,12 @@ AcpiTimerLibConstructor (
VOID
)
{
UINT16 HostBridgeDevId;
UINTN Pmba;
UINT32 PmbaAndVal;
UINT32 PmbaOrVal;
UINTN AcpiCtlReg;
UINT8 AcpiEnBit;
UINT16 HostBridgeDevId;
UINTN Pmba;
UINT32 PmbaAndVal;
UINT32 PmbaOrVal;
UINTN AcpiCtlReg;
UINT8 AcpiEnBit;
//
// Query Host Bridge DID to determine platform type
@@ -54,8 +54,12 @@ AcpiTimerLibConstructor (
AcpiEnBit = ICH9_ACPI_CNTL_ACPI_EN;
break;
default:
DEBUG ((DEBUG_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__, HostBridgeDevId));
DEBUG ((
DEBUG_ERROR,
"%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__,
HostBridgeDevId
));
ASSERT (FALSE);
return RETURN_UNSUPPORTED;
}
@@ -93,8 +97,8 @@ InternalAcpiGetTimerTick (
VOID
)
{
UINT16 HostBridgeDevId;
UINTN Pmba;
UINT16 HostBridgeDevId;
UINTN Pmba;
//
// Query Host Bridge DID to determine platform type
@@ -108,8 +112,12 @@ InternalAcpiGetTimerTick (
Pmba = POWER_MGMT_REGISTER_Q35 (ICH9_PMBASE);
break;
default:
DEBUG ((DEBUG_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__, HostBridgeDevId));
DEBUG ((
DEBUG_ERROR,
"%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__,
HostBridgeDevId
));
ASSERT (FALSE);
return 0;
}

View File

@@ -15,7 +15,7 @@
//
// Cached ACPI Timer IO Address
//
STATIC UINT32 mAcpiTimerIoAddr;
STATIC UINT32 mAcpiTimerIoAddr;
/**
The constructor function caches the ACPI tick counter address
@@ -36,8 +36,8 @@ AcpiTimerLibConstructor (
VOID
)
{
UINT16 HostBridgeDevId;
UINTN Pmba;
UINT16 HostBridgeDevId;
UINTN Pmba;
//
// Query Host Bridge DID to determine platform type
@@ -51,8 +51,12 @@ AcpiTimerLibConstructor (
Pmba = POWER_MGMT_REGISTER_Q35 (ICH9_PMBASE);
break;
default:
DEBUG ((DEBUG_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__, HostBridgeDevId));
DEBUG ((
DEBUG_ERROR,
"%a: Unknown Host Bridge Device ID: 0x%04x\n",
__FUNCTION__,
HostBridgeDevId
));
ASSERT (FALSE);
return RETURN_UNSUPPORTED;
}

View File

@@ -17,12 +17,12 @@
#include <Register/Cpuid.h>
#include <Uefi/UefiBaseType.h>
STATIC BOOLEAN mSevStatus = FALSE;
STATIC BOOLEAN mSevEsStatus = FALSE;
STATIC BOOLEAN mSevStatusChecked = FALSE;
STATIC BOOLEAN mSevStatus = FALSE;
STATIC BOOLEAN mSevEsStatus = FALSE;
STATIC BOOLEAN mSevStatusChecked = FALSE;
STATIC UINT64 mSevEncryptionMask = 0;
STATIC BOOLEAN mSevEncryptionMaskSaved = FALSE;
STATIC UINT64 mSevEncryptionMask = 0;
STATIC BOOLEAN mSevEncryptionMaskSaved = FALSE;
/**
Reads and sets the status of SEV features.
@@ -137,7 +137,7 @@ MemEncryptSevGetEncryptionMask (
)
{
if (!mSevEncryptionMaskSaved) {
mSevEncryptionMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
mSevEncryptionMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
mSevEncryptionMaskSaved = TRUE;
}

View File

@@ -35,9 +35,9 @@
RETURN_STATUS
EFIAPI
MemEncryptSevClearPageEncMask (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
)
{
//
@@ -66,9 +66,9 @@ MemEncryptSevClearPageEncMask (
RETURN_STATUS
EFIAPI
MemEncryptSevSetPageEncMask (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
)
{
//
@@ -95,9 +95,9 @@ MemEncryptSevSetPageEncMask (
MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE
EFIAPI
MemEncryptSevGetAddressRangeState (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN Length
)
{
//
@@ -126,9 +126,9 @@ MemEncryptSevGetAddressRangeState (
RETURN_STATUS
EFIAPI
MemEncryptSevClearMmioPageEncMask (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
)
{
//

View File

@@ -34,15 +34,15 @@
RETURN_STATUS
EFIAPI
MemEncryptSevLocateInitialSmramSaveStateMapPages (
OUT UINTN *BaseAddress,
OUT UINTN *NumberOfPages
OUT UINTN *BaseAddress,
OUT UINTN *NumberOfPages
)
{
UINTN MapStart;
UINTN MapEnd;
UINTN MapPagesStart; // MapStart rounded down to page boundary
UINTN MapPagesEnd; // MapEnd rounded up to page boundary
UINTN MapPagesSize; // difference between MapPagesStart and MapPagesEnd
UINTN MapStart;
UINTN MapEnd;
UINTN MapPagesStart; // MapStart rounded down to page boundary
UINTN MapPagesEnd; // MapEnd rounded up to page boundary
UINTN MapPagesSize; // difference between MapPagesStart and MapPagesEnd
if (!FeaturePcdGet (PcdSmmSmramRequire)) {
return RETURN_UNSUPPORTED;

View File

@@ -17,12 +17,12 @@
#include <Register/Cpuid.h>
#include <Uefi/UefiBaseType.h>
STATIC BOOLEAN mSevStatus = FALSE;
STATIC BOOLEAN mSevEsStatus = FALSE;
STATIC BOOLEAN mSevStatusChecked = FALSE;
STATIC BOOLEAN mSevStatus = FALSE;
STATIC BOOLEAN mSevEsStatus = FALSE;
STATIC BOOLEAN mSevStatusChecked = FALSE;
STATIC UINT64 mSevEncryptionMask = 0;
STATIC BOOLEAN mSevEncryptionMaskSaved = FALSE;
STATIC UINT64 mSevEncryptionMask = 0;
STATIC BOOLEAN mSevEncryptionMaskSaved = FALSE;
/**
Reads and sets the status of SEV features.
@@ -43,8 +43,8 @@ InternalMemEncryptSevStatus (
ReadSevMsr = FALSE;
SevEsWorkArea = (SEC_SEV_ES_WORK_AREA *) FixedPcdGet32 (PcdSevEsWorkAreaBase);
if (SevEsWorkArea != NULL && SevEsWorkArea->EncryptionMask != 0) {
SevEsWorkArea = (SEC_SEV_ES_WORK_AREA *)FixedPcdGet32 (PcdSevEsWorkAreaBase);
if ((SevEsWorkArea != NULL) && (SevEsWorkArea->EncryptionMask != 0)) {
//
// The MSR has been read before, so it is safe to read it again and avoid
// having to validate the CPUID information.
@@ -139,7 +139,7 @@ MemEncryptSevGetEncryptionMask (
if (!mSevEncryptionMaskSaved) {
SEC_SEV_ES_WORK_AREA *SevEsWorkArea;
SevEsWorkArea = (SEC_SEV_ES_WORK_AREA *) FixedPcdGet32 (PcdSevEsWorkAreaBase);
SevEsWorkArea = (SEC_SEV_ES_WORK_AREA *)FixedPcdGet32 (PcdSevEsWorkAreaBase);
if (SevEsWorkArea != NULL) {
mSevEncryptionMask = SevEsWorkArea->EncryptionMask;
} else {

View File

@@ -35,8 +35,8 @@ InternalMemEncryptSevStatus (
ReadSevMsr = FALSE;
SevEsWorkArea = (SEC_SEV_ES_WORK_AREA *) FixedPcdGet32 (PcdSevEsWorkAreaBase);
if (SevEsWorkArea != NULL && SevEsWorkArea->EncryptionMask != 0) {
SevEsWorkArea = (SEC_SEV_ES_WORK_AREA *)FixedPcdGet32 (PcdSevEsWorkAreaBase);
if ((SevEsWorkArea != NULL) && (SevEsWorkArea->EncryptionMask != 0)) {
//
// The MSR has been read before, so it is safe to read it again and avoid
// having to validate the CPUID information.
@@ -74,7 +74,7 @@ MemEncryptSevEsIsEnabled (
VOID
)
{
MSR_SEV_STATUS_REGISTER Msr;
MSR_SEV_STATUS_REGISTER Msr;
Msr.Uint32 = InternalMemEncryptSevStatus ();
@@ -93,7 +93,7 @@ MemEncryptSevIsEnabled (
VOID
)
{
MSR_SEV_STATUS_REGISTER Msr;
MSR_SEV_STATUS_REGISTER Msr;
Msr.Uint32 = InternalMemEncryptSevStatus ();
@@ -115,7 +115,7 @@ MemEncryptSevGetEncryptionMask (
SEC_SEV_ES_WORK_AREA *SevEsWorkArea;
UINT64 EncryptionMask;
SevEsWorkArea = (SEC_SEV_ES_WORK_AREA *) FixedPcdGet32 (PcdSevEsWorkAreaBase);
SevEsWorkArea = (SEC_SEV_ES_WORK_AREA *)FixedPcdGet32 (PcdSevEsWorkAreaBase);
if (SevEsWorkArea != NULL) {
EncryptionMask = SevEsWorkArea->EncryptionMask;
} else {
@@ -147,8 +147,8 @@ MemEncryptSevGetEncryptionMask (
RETURN_STATUS
EFIAPI
MemEncryptSevLocateInitialSmramSaveStateMapPages (
OUT UINTN *BaseAddress,
OUT UINTN *NumberOfPages
OUT UINTN *BaseAddress,
OUT UINTN *NumberOfPages
)
{
return RETURN_UNSUPPORTED;

View File

@@ -37,9 +37,9 @@
RETURN_STATUS
EFIAPI
MemEncryptSevClearPageEncMask (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
)
{
return InternalMemEncryptSevSetMemoryDecrypted (
@@ -69,9 +69,9 @@ MemEncryptSevClearPageEncMask (
RETURN_STATUS
EFIAPI
MemEncryptSevSetPageEncMask (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
)
{
return InternalMemEncryptSevSetMemoryEncrypted (
@@ -99,9 +99,9 @@ MemEncryptSevSetPageEncMask (
MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE
EFIAPI
MemEncryptSevGetAddressRangeState (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN Length
)
{
return InternalMemEncryptSevGetAddressRangeState (
@@ -131,9 +131,9 @@ MemEncryptSevGetAddressRangeState (
RETURN_STATUS
EFIAPI
MemEncryptSevClearMmioPageEncMask (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN NumPages
)
{
return InternalMemEncryptSevClearMmioPageEncMask (
@@ -141,5 +141,4 @@ MemEncryptSevClearMmioPageEncMask (
BaseAddress,
EFI_PAGES_TO_SIZE (NumPages)
);
}

View File

@@ -18,13 +18,13 @@
#include "VirtualMemory.h"
STATIC BOOLEAN mAddressEncMaskChecked = FALSE;
STATIC UINT64 mAddressEncMask;
STATIC PAGE_TABLE_POOL *mPageTablePool = NULL;
STATIC BOOLEAN mAddressEncMaskChecked = FALSE;
STATIC UINT64 mAddressEncMask;
STATIC PAGE_TABLE_POOL *mPageTablePool = NULL;
typedef enum {
SetCBit,
ClearCBit
SetCBit,
ClearCBit
} MAP_RANGE_MODE;
/**
@@ -39,7 +39,7 @@ InternalGetMemEncryptionAddressMask (
VOID
)
{
UINT64 EncryptionMask;
UINT64 EncryptionMask;
if (mAddressEncMaskChecked) {
return mAddressEncMask;
@@ -47,7 +47,7 @@ InternalGetMemEncryptionAddressMask (
EncryptionMask = MemEncryptSevGetEncryptionMask ();
mAddressEncMask = EncryptionMask & PAGING_1G_ADDRESS_MASK_64;
mAddressEncMask = EncryptionMask & PAGING_1G_ADDRESS_MASK_64;
mAddressEncMaskChecked = TRUE;
return mAddressEncMask;
@@ -74,18 +74,18 @@ InternalGetMemEncryptionAddressMask (
STATIC
BOOLEAN
InitializePageTablePool (
IN UINTN PoolPages
IN UINTN PoolPages
)
{
VOID *Buffer;
VOID *Buffer;
//
// Always reserve at least PAGE_TABLE_POOL_UNIT_PAGES, including one page for
// header.
//
PoolPages += 1; // Add one page for header.
PoolPages = ((PoolPages - 1) / PAGE_TABLE_POOL_UNIT_PAGES + 1) *
PAGE_TABLE_POOL_UNIT_PAGES;
PoolPages = ((PoolPages - 1) / PAGE_TABLE_POOL_UNIT_PAGES + 1) *
PAGE_TABLE_POOL_UNIT_PAGES;
Buffer = AllocateAlignedPages (PoolPages, PAGE_TABLE_POOL_ALIGNMENT);
if (Buffer == NULL) {
DEBUG ((DEBUG_ERROR, "ERROR: Out of aligned pages\r\n"));
@@ -96,19 +96,19 @@ InitializePageTablePool (
// Link all pools into a list for easier track later.
//
if (mPageTablePool == NULL) {
mPageTablePool = Buffer;
mPageTablePool = Buffer;
mPageTablePool->NextPool = mPageTablePool;
} else {
((PAGE_TABLE_POOL *)Buffer)->NextPool = mPageTablePool->NextPool;
mPageTablePool->NextPool = Buffer;
mPageTablePool = Buffer;
mPageTablePool->NextPool = Buffer;
mPageTablePool = Buffer;
}
//
// Reserve one page for pool header.
//
mPageTablePool->FreePages = PoolPages - 1;
mPageTablePool->Offset = EFI_PAGES_TO_SIZE (1);
mPageTablePool->FreePages = PoolPages - 1;
mPageTablePool->Offset = EFI_PAGES_TO_SIZE (1);
return TRUE;
}
@@ -134,10 +134,10 @@ STATIC
VOID *
EFIAPI
AllocatePageTableMemory (
IN UINTN Pages
IN UINTN Pages
)
{
VOID *Buffer;
VOID *Buffer;
if (Pages == 0) {
return NULL;
@@ -146,8 +146,9 @@ AllocatePageTableMemory (
//
// Renew the pool if necessary.
//
if (mPageTablePool == NULL ||
Pages > mPageTablePool->FreePages) {
if ((mPageTablePool == NULL) ||
(Pages > mPageTablePool->FreePages))
{
if (!InitializePageTablePool (Pages)) {
return NULL;
}
@@ -155,8 +156,8 @@ AllocatePageTableMemory (
Buffer = (UINT8 *)mPageTablePool + mPageTablePool->Offset;
mPageTablePool->Offset += EFI_PAGES_TO_SIZE (Pages);
mPageTablePool->FreePages -= Pages;
mPageTablePool->Offset += EFI_PAGES_TO_SIZE (Pages);
mPageTablePool->FreePages -= Pages;
DEBUG ((
DEBUG_VERBOSE,
@@ -170,7 +171,6 @@ AllocatePageTableMemory (
return Buffer;
}
/**
Split 2M page to 4K.
@@ -184,19 +184,19 @@ AllocatePageTableMemory (
STATIC
VOID
Split2MPageTo4K (
IN PHYSICAL_ADDRESS PhysicalAddress,
IN OUT UINT64 *PageEntry2M,
IN PHYSICAL_ADDRESS StackBase,
IN UINTN StackSize
IN PHYSICAL_ADDRESS PhysicalAddress,
IN OUT UINT64 *PageEntry2M,
IN PHYSICAL_ADDRESS StackBase,
IN UINTN StackSize
)
{
PHYSICAL_ADDRESS PhysicalAddress4K;
UINTN IndexOfPageTableEntries;
PAGE_TABLE_4K_ENTRY *PageTableEntry;
PAGE_TABLE_4K_ENTRY *PageTableEntry1;
UINT64 AddressEncMask;
PHYSICAL_ADDRESS PhysicalAddress4K;
UINTN IndexOfPageTableEntries;
PAGE_TABLE_4K_ENTRY *PageTableEntry;
PAGE_TABLE_4K_ENTRY *PageTableEntry1;
UINT64 AddressEncMask;
PageTableEntry = AllocatePageTableMemory(1);
PageTableEntry = AllocatePageTableMemory (1);
PageTableEntry1 = PageTableEntry;
@@ -210,15 +210,17 @@ Split2MPageTo4K (
IndexOfPageTableEntries < 512;
(IndexOfPageTableEntries++,
PageTableEntry++,
PhysicalAddress4K += SIZE_4KB)) {
PhysicalAddress4K += SIZE_4KB))
{
//
// Fill in the Page Table entries
//
PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | AddressEncMask;
PageTableEntry->Uint64 = (UINT64)PhysicalAddress4K | AddressEncMask;
PageTableEntry->Bits.ReadWrite = 1;
PageTableEntry->Bits.Present = 1;
PageTableEntry->Bits.Present = 1;
if ((PhysicalAddress4K >= StackBase) &&
(PhysicalAddress4K < StackBase + StackSize)) {
(PhysicalAddress4K < StackBase + StackSize))
{
//
// Set Nx bit for stack.
//
@@ -244,9 +246,9 @@ Split2MPageTo4K (
STATIC
VOID
SetPageTablePoolReadOnly (
IN UINTN PageTableBase,
IN EFI_PHYSICAL_ADDRESS Address,
IN BOOLEAN Level4Paging
IN UINTN PageTableBase,
IN EFI_PHYSICAL_ADDRESS Address,
IN BOOLEAN Level4Paging
)
{
UINTN Index;
@@ -286,12 +288,12 @@ SetPageTablePoolReadOnly (
LevelSize[3] = SIZE_1GB;
LevelSize[4] = SIZE_512GB;
AddressEncMask = InternalGetMemEncryptionAddressMask();
PageTable = (UINT64 *)(UINTN)PageTableBase;
PoolUnitSize = PAGE_TABLE_POOL_UNIT_SIZE;
AddressEncMask = InternalGetMemEncryptionAddressMask ();
PageTable = (UINT64 *)(UINTN)PageTableBase;
PoolUnitSize = PAGE_TABLE_POOL_UNIT_SIZE;
for (Level = (Level4Paging) ? 4 : 3; Level > 0; --Level) {
Index = ((UINTN)RShiftU64 (Address, LevelShift[Level]));
Index = ((UINTN)RShiftU64 (Address, LevelShift[Level]));
Index &= PAGING_PAE_INDEX_MASK;
PageAttr = PageTable[Index];
@@ -319,14 +321,13 @@ SetPageTablePoolReadOnly (
ASSERT (Index < EFI_PAGE_SIZE/sizeof (UINT64));
PageTable[Index] &= ~(UINT64)IA32_PG_RW;
PoolUnitSize -= LevelSize[Level];
PoolUnitSize -= LevelSize[Level];
++Index;
}
}
break;
} else {
//
// The smaller granularity of page must be needed.
@@ -338,18 +339,20 @@ SetPageTablePoolReadOnly (
PhysicalAddress = PageAttr & LevelMask[Level];
for (EntryIndex = 0;
EntryIndex < EFI_PAGE_SIZE/sizeof (UINT64);
++EntryIndex) {
EntryIndex < EFI_PAGE_SIZE/sizeof (UINT64);
++EntryIndex)
{
NewPageTable[EntryIndex] = PhysicalAddress | AddressEncMask |
IA32_PG_P | IA32_PG_RW;
if (Level > 2) {
NewPageTable[EntryIndex] |= IA32_PG_PS;
}
PhysicalAddress += LevelSize[Level - 1];
}
PageTable[Index] = (UINT64)(UINTN)NewPageTable | AddressEncMask |
IA32_PG_P | IA32_PG_RW;
IA32_PG_P | IA32_PG_RW;
PageTable = NewPageTable;
}
}
@@ -365,14 +368,14 @@ SetPageTablePoolReadOnly (
STATIC
VOID
EnablePageTableProtection (
IN UINTN PageTableBase,
IN BOOLEAN Level4Paging
IN UINTN PageTableBase,
IN BOOLEAN Level4Paging
)
{
PAGE_TABLE_POOL *HeadPool;
PAGE_TABLE_POOL *Pool;
UINT64 PoolSize;
EFI_PHYSICAL_ADDRESS Address;
PAGE_TABLE_POOL *HeadPool;
PAGE_TABLE_POOL *Pool;
UINT64 PoolSize;
EFI_PHYSICAL_ADDRESS Address;
if (mPageTablePool == NULL) {
return;
@@ -383,7 +386,7 @@ EnablePageTableProtection (
// remember original one in advance.
//
HeadPool = mPageTablePool;
Pool = HeadPool;
Pool = HeadPool;
do {
Address = (EFI_PHYSICAL_ADDRESS)(UINTN)Pool;
PoolSize = Pool->Offset + EFI_PAGES_TO_SIZE (Pool->FreePages);
@@ -394,17 +397,15 @@ EnablePageTableProtection (
// the protection to them one by one.
//
while (PoolSize > 0) {
SetPageTablePoolReadOnly(PageTableBase, Address, Level4Paging);
Address += PAGE_TABLE_POOL_UNIT_SIZE;
PoolSize -= PAGE_TABLE_POOL_UNIT_SIZE;
SetPageTablePoolReadOnly (PageTableBase, Address, Level4Paging);
Address += PAGE_TABLE_POOL_UNIT_SIZE;
PoolSize -= PAGE_TABLE_POOL_UNIT_SIZE;
}
Pool = Pool->NextPool;
} while (Pool != HeadPool);
}
/**
Split 1G page to 2M.
@@ -418,18 +419,18 @@ EnablePageTableProtection (
STATIC
VOID
Split1GPageTo2M (
IN PHYSICAL_ADDRESS PhysicalAddress,
IN OUT UINT64 *PageEntry1G,
IN PHYSICAL_ADDRESS StackBase,
IN UINTN StackSize
IN PHYSICAL_ADDRESS PhysicalAddress,
IN OUT UINT64 *PageEntry1G,
IN PHYSICAL_ADDRESS StackBase,
IN UINTN StackSize
)
{
PHYSICAL_ADDRESS PhysicalAddress2M;
UINTN IndexOfPageDirectoryEntries;
PAGE_TABLE_ENTRY *PageDirectoryEntry;
UINT64 AddressEncMask;
PHYSICAL_ADDRESS PhysicalAddress2M;
UINTN IndexOfPageDirectoryEntries;
PAGE_TABLE_ENTRY *PageDirectoryEntry;
UINT64 AddressEncMask;
PageDirectoryEntry = AllocatePageTableMemory(1);
PageDirectoryEntry = AllocatePageTableMemory (1);
AddressEncMask = InternalGetMemEncryptionAddressMask ();
ASSERT (PageDirectoryEntry != NULL);
@@ -445,9 +446,11 @@ Split1GPageTo2M (
IndexOfPageDirectoryEntries < 512;
(IndexOfPageDirectoryEntries++,
PageDirectoryEntry++,
PhysicalAddress2M += SIZE_2MB)) {
PhysicalAddress2M += SIZE_2MB))
{
if ((PhysicalAddress2M < StackBase + StackSize) &&
((PhysicalAddress2M + SIZE_2MB) > StackBase)) {
((PhysicalAddress2M + SIZE_2MB) > StackBase))
{
//
// Need to split this 2M page that covers stack range.
//
@@ -461,15 +464,14 @@ Split1GPageTo2M (
//
// Fill in the Page Directory entries
//
PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M | AddressEncMask;
PageDirectoryEntry->Uint64 = (UINT64)PhysicalAddress2M | AddressEncMask;
PageDirectoryEntry->Bits.ReadWrite = 1;
PageDirectoryEntry->Bits.Present = 1;
PageDirectoryEntry->Bits.MustBe1 = 1;
PageDirectoryEntry->Bits.Present = 1;
PageDirectoryEntry->Bits.MustBe1 = 1;
}
}
}
/**
Set or Clear the memory encryption bit
@@ -478,12 +480,12 @@ Split1GPageTo2M (
**/
STATIC VOID
SetOrClearCBit(
IN OUT UINT64* PageTablePointer,
IN MAP_RANGE_MODE Mode
SetOrClearCBit (
IN OUT UINT64 *PageTablePointer,
IN MAP_RANGE_MODE Mode
)
{
UINT64 AddressEncMask;
UINT64 AddressEncMask;
AddressEncMask = InternalGetMemEncryptionAddressMask ();
@@ -492,7 +494,6 @@ SetOrClearCBit(
} else {
*PageTablePointer &= ~AddressEncMask;
}
}
/**
@@ -511,7 +512,6 @@ IsReadOnlyPageWriteProtected (
return ((AsmReadCr0 () & BIT16) != 0);
}
/**
Disable Write Protect on pages marked as read-only.
**/
@@ -521,7 +521,7 @@ DisableReadOnlyPageWriteProtect (
VOID
)
{
AsmWriteCr0 (AsmReadCr0() & ~BIT16);
AsmWriteCr0 (AsmReadCr0 () & ~BIT16);
}
/**
@@ -533,10 +533,9 @@ EnableReadOnlyPageWriteProtect (
VOID
)
{
AsmWriteCr0 (AsmReadCr0() | BIT16);
AsmWriteCr0 (AsmReadCr0 () | BIT16);
}
/**
This function either sets or clears memory encryption bit for the memory
region specified by PhysicalAddress and Length from the current page table
@@ -568,23 +567,23 @@ STATIC
RETURN_STATUS
EFIAPI
SetMemoryEncDec (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length,
IN MAP_RANGE_MODE Mode,
IN BOOLEAN CacheFlush
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length,
IN MAP_RANGE_MODE Mode,
IN BOOLEAN CacheFlush
)
{
PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel4Entry;
PAGE_MAP_AND_DIRECTORY_POINTER *PageUpperDirectoryPointerEntry;
PAGE_MAP_AND_DIRECTORY_POINTER *PageDirectoryPointerEntry;
PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry;
PAGE_TABLE_ENTRY *PageDirectory2MEntry;
PAGE_TABLE_4K_ENTRY *PageTableEntry;
UINT64 PgTableMask;
UINT64 AddressEncMask;
BOOLEAN IsWpEnabled;
RETURN_STATUS Status;
PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel4Entry;
PAGE_MAP_AND_DIRECTORY_POINTER *PageUpperDirectoryPointerEntry;
PAGE_MAP_AND_DIRECTORY_POINTER *PageDirectoryPointerEntry;
PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry;
PAGE_TABLE_ENTRY *PageDirectory2MEntry;
PAGE_TABLE_4K_ENTRY *PageTableEntry;
UINT64 PgTableMask;
UINT64 AddressEncMask;
BOOLEAN IsWpEnabled;
RETURN_STATUS Status;
//
// Set PageMapLevel4Entry to suppress incorrect compiler/analyzer warnings.
@@ -623,7 +622,7 @@ SetMemoryEncDec (
// with correct C-bit
//
if (CacheFlush) {
WriteBackInvalidateDataCacheRange((VOID*) (UINTN)PhysicalAddress, Length);
WriteBackInvalidateDataCacheRange ((VOID *)(UINTN)PhysicalAddress, Length);
}
//
@@ -636,17 +635,16 @@ SetMemoryEncDec (
Status = EFI_SUCCESS;
while (Length != 0)
{
while (Length != 0) {
//
// If Cr3BaseAddress is not specified then read the current CR3
//
if (Cr3BaseAddress == 0) {
Cr3BaseAddress = AsmReadCr3();
Cr3BaseAddress = AsmReadCr3 ();
}
PageMapLevel4Entry = (VOID*) (Cr3BaseAddress & ~PgTableMask);
PageMapLevel4Entry += PML4_OFFSET(PhysicalAddress);
PageMapLevel4Entry = (VOID *)(Cr3BaseAddress & ~PgTableMask);
PageMapLevel4Entry += PML4_OFFSET (PhysicalAddress);
if (!PageMapLevel4Entry->Bits.Present) {
DEBUG ((
DEBUG_ERROR,
@@ -660,10 +658,10 @@ SetMemoryEncDec (
}
PageDirectory1GEntry = (VOID *)(
(PageMapLevel4Entry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageDirectory1GEntry += PDP_OFFSET(PhysicalAddress);
(PageMapLevel4Entry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageDirectory1GEntry += PDP_OFFSET (PhysicalAddress);
if (!PageDirectory1GEntry->Bits.Present) {
DEBUG ((
DEBUG_ERROR,
@@ -684,8 +682,8 @@ SetMemoryEncDec (
// Valid 1GB page
// If we have at least 1GB to go, we can just update this entry
//
if ((PhysicalAddress & (BIT30 - 1)) == 0 && Length >= BIT30) {
SetOrClearCBit(&PageDirectory1GEntry->Uint64, Mode);
if (((PhysicalAddress & (BIT30 - 1)) == 0) && (Length >= BIT30)) {
SetOrClearCBit (&PageDirectory1GEntry->Uint64, Mode);
DEBUG ((
DEBUG_VERBOSE,
"%a:%a: updated 1GB entry for Physical=0x%Lx\n",
@@ -694,7 +692,7 @@ SetMemoryEncDec (
PhysicalAddress
));
PhysicalAddress += BIT30;
Length -= BIT30;
Length -= BIT30;
} else {
//
// We must split the page
@@ -722,10 +720,10 @@ SetMemoryEncDec (
(PAGE_MAP_AND_DIRECTORY_POINTER *)PageDirectory1GEntry;
PageDirectory2MEntry =
(VOID *)(
(PageUpperDirectoryPointerEntry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageDirectory2MEntry += PDE_OFFSET(PhysicalAddress);
(PageUpperDirectoryPointerEntry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageDirectory2MEntry += PDE_OFFSET (PhysicalAddress);
if (!PageDirectory2MEntry->Bits.Present) {
DEBUG ((
DEBUG_ERROR,
@@ -737,6 +735,7 @@ SetMemoryEncDec (
Status = RETURN_NO_MAPPING;
goto Done;
}
//
// If the MustBe1 bit is not a 1, it's not a 2MB entry
//
@@ -745,10 +744,10 @@ SetMemoryEncDec (
// Valid 2MB page
// If we have at least 2MB left to go, we can just update this entry
//
if ((PhysicalAddress & (BIT21-1)) == 0 && Length >= BIT21) {
if (((PhysicalAddress & (BIT21-1)) == 0) && (Length >= BIT21)) {
SetOrClearCBit (&PageDirectory2MEntry->Uint64, Mode);
PhysicalAddress += BIT21;
Length -= BIT21;
Length -= BIT21;
} else {
//
// We must split up this page into 4K pages
@@ -773,10 +772,10 @@ SetMemoryEncDec (
(PAGE_MAP_AND_DIRECTORY_POINTER *)PageDirectory2MEntry;
PageTableEntry =
(VOID *)(
(PageDirectoryPointerEntry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageTableEntry += PTE_OFFSET(PhysicalAddress);
(PageDirectoryPointerEntry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageTableEntry += PTE_OFFSET (PhysicalAddress);
if (!PageTableEntry->Bits.Present) {
DEBUG ((
DEBUG_ERROR,
@@ -788,9 +787,10 @@ SetMemoryEncDec (
Status = RETURN_NO_MAPPING;
goto Done;
}
SetOrClearCBit (&PageTableEntry->Uint64, Mode);
PhysicalAddress += EFI_PAGE_SIZE;
Length -= EFI_PAGE_SIZE;
Length -= EFI_PAGE_SIZE;
}
}
}
@@ -806,7 +806,7 @@ SetMemoryEncDec (
//
// Flush TLB
//
CpuFlushTlb();
CpuFlushTlb ();
Done:
//
@@ -838,12 +838,11 @@ Done:
RETURN_STATUS
EFIAPI
InternalMemEncryptSevSetMemoryDecrypted (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
)
{
return SetMemoryEncDec (
Cr3BaseAddress,
PhysicalAddress,
@@ -872,9 +871,9 @@ InternalMemEncryptSevSetMemoryDecrypted (
RETURN_STATUS
EFIAPI
InternalMemEncryptSevSetMemoryEncrypted (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
)
{
return SetMemoryEncDec (
@@ -905,9 +904,9 @@ InternalMemEncryptSevSetMemoryEncrypted (
RETURN_STATUS
EFIAPI
InternalMemEncryptSevClearMmioPageEncMask (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
)
{
return SetMemoryEncDec (

View File

@@ -25,9 +25,9 @@ InternalGetMemEncryptionAddressMask (
VOID
)
{
UINT64 EncryptionMask;
UINT64 EncryptionMask;
EncryptionMask = MemEncryptSevGetEncryptionMask ();
EncryptionMask = MemEncryptSevGetEncryptionMask ();
EncryptionMask &= PAGING_1G_ADDRESS_MASK_64;
return EncryptionMask;
@@ -52,9 +52,9 @@ InternalGetMemEncryptionAddressMask (
RETURN_STATUS
EFIAPI
InternalMemEncryptSevSetMemoryDecrypted (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
)
{
//
@@ -84,9 +84,9 @@ InternalMemEncryptSevSetMemoryDecrypted (
RETURN_STATUS
EFIAPI
InternalMemEncryptSevSetMemoryEncrypted (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
)
{
//
@@ -114,9 +114,9 @@ InternalMemEncryptSevSetMemoryEncrypted (
RETURN_STATUS
EFIAPI
InternalMemEncryptSevClearMmioPageEncMask (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
)
{
//

View File

@@ -96,10 +96,10 @@ InternalMemEncryptSevGetAddressRangeState (
// If Cr3BaseAddress is not specified then read the current CR3
//
if (Cr3BaseAddress == 0) {
Cr3BaseAddress = AsmReadCr3();
Cr3BaseAddress = AsmReadCr3 ();
}
AddressEncMask = MemEncryptSevGetEncryptionMask ();
AddressEncMask = MemEncryptSevGetEncryptionMask ();
AddressEncMask &= PAGING_1G_ADDRESS_MASK_64;
PgTableMask = AddressEncMask | EFI_PAGE_MASK;
@@ -110,21 +110,21 @@ InternalMemEncryptSevGetAddressRangeState (
// Encryption is on a page basis, so start at the beginning of the
// virtual address page boundary and walk page-by-page.
//
Address = (PHYSICAL_ADDRESS) (UINTN) BaseAddress & ~EFI_PAGE_MASK;
Address = (PHYSICAL_ADDRESS)(UINTN)BaseAddress & ~EFI_PAGE_MASK;
AddressEnd = (PHYSICAL_ADDRESS)
(UINTN) (BaseAddress + Length);
(UINTN)(BaseAddress + Length);
while (Address < AddressEnd) {
PageMapLevel4Entry = (VOID*) (Cr3BaseAddress & ~PgTableMask);
PageMapLevel4Entry = (VOID *)(Cr3BaseAddress & ~PgTableMask);
PageMapLevel4Entry += PML4_OFFSET (Address);
if (!PageMapLevel4Entry->Bits.Present) {
return MemEncryptSevAddressRangeError;
}
PageDirectory1GEntry = (VOID *) (
(PageMapLevel4Entry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageDirectory1GEntry = (VOID *)(
(PageMapLevel4Entry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageDirectory1GEntry += PDP_OFFSET (Address);
if (!PageDirectory1GEntry->Bits.Present) {
return MemEncryptSevAddressRangeError;
@@ -151,12 +151,12 @@ InternalMemEncryptSevGetAddressRangeState (
// Actually a PDP
//
PageUpperDirectoryPointerEntry =
(PAGE_MAP_AND_DIRECTORY_POINTER *) PageDirectory1GEntry;
(PAGE_MAP_AND_DIRECTORY_POINTER *)PageDirectory1GEntry;
PageDirectory2MEntry =
(VOID *) (
(PageUpperDirectoryPointerEntry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
(VOID *)(
(PageUpperDirectoryPointerEntry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageDirectory2MEntry += PDE_OFFSET (Address);
if (!PageDirectory2MEntry->Bits.Present) {
return MemEncryptSevAddressRangeError;
@@ -186,9 +186,9 @@ InternalMemEncryptSevGetAddressRangeState (
(PAGE_MAP_AND_DIRECTORY_POINTER *)PageDirectory2MEntry;
PageTableEntry =
(VOID *)(
(PageDirectoryPointerEntry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
(PageDirectoryPointerEntry->Bits.PageTableBaseAddress <<
12) & ~PgTableMask
);
PageTableEntry += PTE_OFFSET (Address);
if (!PageTableEntry->Bits.Present) {
return MemEncryptSevAddressRangeError;

View File

@@ -22,19 +22,19 @@
#include <Library/MemoryAllocationLib.h>
#include <Uefi.h>
#define SYS_CODE64_SEL 0x38
#define SYS_CODE64_SEL 0x38
#define PAGE_TABLE_POOL_ALIGNMENT BASE_2MB
#define PAGE_TABLE_POOL_UNIT_SIZE SIZE_2MB
#define PAGE_TABLE_POOL_ALIGNMENT BASE_2MB
#define PAGE_TABLE_POOL_UNIT_SIZE SIZE_2MB
#define PAGE_TABLE_POOL_UNIT_PAGES \
EFI_SIZE_TO_PAGES (PAGE_TABLE_POOL_UNIT_SIZE)
#define PAGE_TABLE_POOL_ALIGN_MASK \
(~(EFI_PHYSICAL_ADDRESS)(PAGE_TABLE_POOL_ALIGNMENT - 1))
typedef struct {
VOID *NextPool;
UINTN Offset;
UINTN FreePages;
VOID *NextPool;
UINTN Offset;
UINTN FreePages;
} PAGE_TABLE_POOL;
/**
@@ -68,9 +68,9 @@ InternalGetMemEncryptionAddressMask (
RETURN_STATUS
EFIAPI
InternalMemEncryptSevSetMemoryDecrypted (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
);
/**
@@ -92,9 +92,9 @@ InternalMemEncryptSevSetMemoryDecrypted (
RETURN_STATUS
EFIAPI
InternalMemEncryptSevSetMemoryEncrypted (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
);
/**
@@ -115,9 +115,9 @@ InternalMemEncryptSevSetMemoryEncrypted (
MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE
EFIAPI
InternalMemEncryptSevGetAddressRangeState (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS BaseAddress,
IN UINTN Length
);
/**
@@ -139,8 +139,9 @@ InternalMemEncryptSevGetAddressRangeState (
RETURN_STATUS
EFIAPI
InternalMemEncryptSevClearMmioPageEncMask (
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
IN PHYSICAL_ADDRESS Cr3BaseAddress,
IN PHYSICAL_ADDRESS PhysicalAddress,
IN UINTN Length
);
#endif

View File

@@ -17,7 +17,6 @@
#include "BasePciCapLib.h"
/**
Compare a standalone PCI_CAP_KEY against a PCI_CAP containing an embedded
PCI_CAP_KEY.
@@ -36,12 +35,12 @@ STATIC
INTN
EFIAPI
ComparePciCapKey (
IN CONST VOID *PciCapKey,
IN CONST VOID *PciCap
IN CONST VOID *PciCapKey,
IN CONST VOID *PciCap
)
{
CONST PCI_CAP_KEY *Key1;
CONST PCI_CAP_KEY *Key2;
CONST PCI_CAP_KEY *Key1;
CONST PCI_CAP_KEY *Key2;
Key1 = PciCapKey;
Key2 = &((CONST PCI_CAP *)PciCap)->Key;
@@ -49,25 +48,30 @@ ComparePciCapKey (
if (Key1->Domain < Key2->Domain) {
return -1;
}
if (Key1->Domain > Key2->Domain) {
return 1;
}
if (Key1->CapId < Key2->CapId) {
return -1;
}
if (Key1->CapId > Key2->CapId) {
return 1;
}
if (Key1->Instance < Key2->Instance) {
return -1;
}
if (Key1->Instance > Key2->Instance) {
return 1;
}
return 0;
}
/**
Compare two PCI_CAP objects based on PCI_CAP.Key.
@@ -85,17 +89,16 @@ STATIC
INTN
EFIAPI
ComparePciCap (
IN CONST VOID *PciCap1,
IN CONST VOID *PciCap2
IN CONST VOID *PciCap1,
IN CONST VOID *PciCap2
)
{
CONST PCI_CAP_KEY *PciCap1Key;
CONST PCI_CAP_KEY *PciCap1Key;
PciCap1Key = &((CONST PCI_CAP *)PciCap1)->Key;
return ComparePciCapKey (PciCap1Key, PciCap2);
}
/**
Compare the standalone UINT16 config space offset of a capability header
against a PCI_CAP containing an embedded Offset.
@@ -114,12 +117,12 @@ STATIC
INTN
EFIAPI
ComparePciCapOffsetKey (
IN CONST VOID *CapHdrOffset,
IN CONST VOID *PciCap
IN CONST VOID *CapHdrOffset,
IN CONST VOID *PciCap
)
{
UINT16 Offset1;
UINT16 Offset2;
UINT16 Offset1;
UINT16 Offset2;
Offset1 = *(CONST UINT16 *)CapHdrOffset;
Offset2 = ((CONST PCI_CAP *)PciCap)->Offset;
@@ -130,7 +133,6 @@ ComparePciCapOffsetKey (
return Offset1 - Offset2;
}
/**
Compare two PCI_CAP objects based on PCI_CAP.Offset.
@@ -148,12 +150,12 @@ STATIC
INTN
EFIAPI
ComparePciCapOffset (
IN CONST VOID *PciCap1,
IN CONST VOID *PciCap2
IN CONST VOID *PciCap1,
IN CONST VOID *PciCap2
)
{
UINT16 Offset1;
UINT16 Offset2;
UINT16 Offset1;
UINT16 Offset2;
Offset1 = ((CONST PCI_CAP *)PciCap1)->Offset;
Offset2 = ((CONST PCI_CAP *)PciCap2)->Offset;
@@ -164,7 +166,6 @@ ComparePciCapOffset (
return Offset1 - Offset2;
}
/**
Insert a new instance of the PCI capability given by (Domain, CapId) in
CapList.
@@ -205,22 +206,24 @@ ComparePciCapOffset (
STATIC
RETURN_STATUS
InsertPciCap (
IN OUT PCI_CAP_LIST *CapList,
IN OUT ORDERED_COLLECTION *CapHdrOffsets,
IN PCI_CAP_DOMAIN Domain,
IN UINT16 CapId,
IN UINT16 Offset,
IN UINT8 Version
IN OUT PCI_CAP_LIST *CapList,
IN OUT ORDERED_COLLECTION *CapHdrOffsets,
IN PCI_CAP_DOMAIN Domain,
IN UINT16 CapId,
IN UINT16 Offset,
IN UINT8 Version
)
{
PCI_CAP *PciCap;
RETURN_STATUS Status;
ORDERED_COLLECTION_ENTRY *PciCapEntry;
PCI_CAP *InstanceZero;
PCI_CAP *PciCap;
RETURN_STATUS Status;
ORDERED_COLLECTION_ENTRY *PciCapEntry;
PCI_CAP *InstanceZero;
ASSERT ((Offset & 0x3) == 0);
ASSERT (Offset < (Domain == PciCapNormal ?
PCI_MAX_CONFIG_OFFSET : PCI_EXP_MAX_CONFIG_OFFSET));
ASSERT (
Offset < (Domain == PciCapNormal ?
PCI_MAX_CONFIG_OFFSET : PCI_EXP_MAX_CONFIG_OFFSET)
);
ASSERT (Domain == PciCapExtended || Version == 0);
//
@@ -237,6 +240,7 @@ InsertPciCap (
if (PciCap == NULL) {
return RETURN_OUT_OF_RESOURCES;
}
PciCap->Key.Domain = Domain;
PciCap->Key.CapId = CapId;
PciCap->Key.Instance = 0;
@@ -248,12 +252,16 @@ InsertPciCap (
//
// Add PciCap to CapList.
//
Status = OrderedCollectionInsert (CapList->Capabilities, &PciCapEntry,
PciCap);
Status = OrderedCollectionInsert (
CapList->Capabilities,
&PciCapEntry,
PciCap
);
if (RETURN_ERROR (Status)) {
if (Status == RETURN_OUT_OF_RESOURCES) {
goto FreePciCap;
}
ASSERT (Status == RETURN_ALREADY_STARTED);
//
// PciCap is not the first instance of (Domain, CapId). Add it as a new
@@ -261,17 +269,21 @@ InsertPciCap (
// we don't bump the instance count maintained in Instance#0 just yet, to
// keep rollback on errors simple.
//
InstanceZero = OrderedCollectionUserStruct (PciCapEntry);
PciCap->Key.Instance = InstanceZero->NumInstancesUnion.NumInstances;
InstanceZero = OrderedCollectionUserStruct (PciCapEntry);
PciCap->Key.Instance = InstanceZero->NumInstancesUnion.NumInstances;
PciCap->NumInstancesUnion.InstanceZero = InstanceZero;
ASSERT (PciCap->Key.Instance > 0);
Status = OrderedCollectionInsert (CapList->Capabilities, &PciCapEntry,
PciCap);
Status = OrderedCollectionInsert (
CapList->Capabilities,
&PciCapEntry,
PciCap
);
if (Status == RETURN_OUT_OF_RESOURCES) {
goto FreePciCap;
}
}
//
// At this point, PciCap has been inserted in CapList->Capabilities, either
// with Instance==0 or with Instance>0. PciCapEntry is the iterator that
@@ -295,6 +307,7 @@ InsertPciCap (
//
Status = RETURN_DEVICE_ERROR;
}
goto DeletePciCapFromCapList;
}
@@ -312,6 +325,7 @@ InsertPciCap (
InstanceZero->NumInstancesUnion.NumInstances++;
}
return RETURN_SUCCESS;
DeletePciCapFromCapList:
@@ -323,7 +337,6 @@ FreePciCap:
return Status;
}
/**
Calculate the MaxSizeHint member for a PCI_CAP object.
@@ -347,11 +360,11 @@ FreePciCap:
STATIC
VOID
CalculatePciCapMaxSizeHint (
IN OUT PCI_CAP *PciCap,
IN PCI_CAP *NextPciCap OPTIONAL
IN OUT PCI_CAP *PciCap,
IN PCI_CAP *NextPciCap OPTIONAL
)
{
UINT16 ConfigSpaceSize;
UINT16 ConfigSpaceSize;
ConfigSpaceSize = (PciCap->Key.Domain == PciCapNormal ?
PCI_MAX_CONFIG_OFFSET : PCI_EXP_MAX_CONFIG_OFFSET);
@@ -372,14 +385,14 @@ CalculatePciCapMaxSizeHint (
// PciCap extends from PciCap->Offset to NextPciCap->Offset (if any), except
// it cannot cross config space boundary.
//
if (NextPciCap == NULL || NextPciCap->Offset >= ConfigSpaceSize) {
if ((NextPciCap == NULL) || (NextPciCap->Offset >= ConfigSpaceSize)) {
PciCap->MaxSizeHint = ConfigSpaceSize - PciCap->Offset;
return;
}
PciCap->MaxSizeHint = NextPciCap->Offset - PciCap->Offset;
}
/**
Debug dump a PCI_CAP_LIST object at the DEBUG_VERBOSE level.
@@ -389,18 +402,19 @@ STATIC
VOID
EFIAPI
DebugDumpPciCapList (
IN PCI_CAP_LIST *CapList
IN PCI_CAP_LIST *CapList
)
{
DEBUG_CODE_BEGIN ();
ORDERED_COLLECTION_ENTRY *PciCapEntry;
ORDERED_COLLECTION_ENTRY *PciCapEntry;
for (PciCapEntry = OrderedCollectionMin (CapList->Capabilities);
PciCapEntry != NULL;
PciCapEntry = OrderedCollectionNext (PciCapEntry)) {
PCI_CAP *PciCap;
RETURN_STATUS Status;
PCI_CAP_INFO Info;
PciCapEntry = OrderedCollectionNext (PciCapEntry))
{
PCI_CAP *PciCap;
RETURN_STATUS Status;
PCI_CAP_INFO Info;
PciCap = OrderedCollectionUserStruct (PciCapEntry);
Status = PciCapGetInfo (PciCap, &Info);
@@ -409,16 +423,24 @@ DebugDumpPciCapList (
//
ASSERT_RETURN_ERROR (Status);
DEBUG ((DEBUG_VERBOSE,
"%a:%a: %a 0x%04x %03u/%03u v0x%x @0x%03x+0x%03x\n", gEfiCallerBaseName,
__FUNCTION__, (Info.Domain == PciCapNormal ? "Norm" : "Extd"),
Info.CapId, Info.Instance, Info.NumInstances, Info.Version, Info.Offset,
Info.MaxSizeHint));
DEBUG ((
DEBUG_VERBOSE,
"%a:%a: %a 0x%04x %03u/%03u v0x%x @0x%03x+0x%03x\n",
gEfiCallerBaseName,
__FUNCTION__,
(Info.Domain == PciCapNormal ? "Norm" : "Extd"),
Info.CapId,
Info.Instance,
Info.NumInstances,
Info.Version,
Info.Offset,
Info.MaxSizeHint
));
}
DEBUG_CODE_END ();
}
/**
Empty a collection of PCI_CAP structures, optionally releasing the referenced
PCI_CAP structures themselves. Release the collection at last.
@@ -435,17 +457,18 @@ DebugDumpPciCapList (
STATIC
VOID
EmptyAndUninitPciCapCollection (
IN OUT ORDERED_COLLECTION *PciCapCollection,
IN BOOLEAN FreePciCap
IN OUT ORDERED_COLLECTION *PciCapCollection,
IN BOOLEAN FreePciCap
)
{
ORDERED_COLLECTION_ENTRY *PciCapEntry;
ORDERED_COLLECTION_ENTRY *NextEntry;
ORDERED_COLLECTION_ENTRY *PciCapEntry;
ORDERED_COLLECTION_ENTRY *NextEntry;
for (PciCapEntry = OrderedCollectionMin (PciCapCollection);
PciCapEntry != NULL;
PciCapEntry = NextEntry) {
PCI_CAP *PciCap;
PciCapEntry = NextEntry)
{
PCI_CAP *PciCap;
NextEntry = OrderedCollectionNext (PciCapEntry);
OrderedCollectionDelete (PciCapCollection, PciCapEntry, (VOID **)&PciCap);
@@ -453,10 +476,10 @@ EmptyAndUninitPciCapCollection (
FreePool (PciCap);
}
}
OrderedCollectionUninit (PciCapCollection);
}
/**
Parse the capabilities lists (both normal and extended, as applicable) of a
PCI device.
@@ -492,16 +515,16 @@ EmptyAndUninitPciCapCollection (
RETURN_STATUS
EFIAPI
PciCapListInit (
IN PCI_CAP_DEV *PciDevice,
OUT PCI_CAP_LIST **CapList
IN PCI_CAP_DEV *PciDevice,
OUT PCI_CAP_LIST **CapList
)
{
PCI_CAP_LIST *OutCapList;
RETURN_STATUS Status;
ORDERED_COLLECTION *CapHdrOffsets;
UINT16 PciStatusReg;
BOOLEAN DeviceIsExpress;
ORDERED_COLLECTION_ENTRY *OffsetEntry;
PCI_CAP_LIST *OutCapList;
RETURN_STATUS Status;
ORDERED_COLLECTION *CapHdrOffsets;
UINT16 PciStatusReg;
BOOLEAN DeviceIsExpress;
ORDERED_COLLECTION_ENTRY *OffsetEntry;
//
// Allocate the output structure.
@@ -510,12 +533,15 @@ PciCapListInit (
if (OutCapList == NULL) {
return RETURN_OUT_OF_RESOURCES;
}
//
// The OutCapList->Capabilities collection owns the PCI_CAP structures and
// orders them based on PCI_CAP.Key.
//
OutCapList->Capabilities = OrderedCollectionInit (ComparePciCap,
ComparePciCapKey);
OutCapList->Capabilities = OrderedCollectionInit (
ComparePciCap,
ComparePciCapKey
);
if (OutCapList->Capabilities == NULL) {
Status = RETURN_OUT_OF_RESOURCES;
goto FreeOutCapList;
@@ -525,8 +551,10 @@ PciCapListInit (
// The (temporary) CapHdrOffsets collection only references PCI_CAP
// structures, and orders them based on PCI_CAP.Offset.
//
CapHdrOffsets = OrderedCollectionInit (ComparePciCapOffset,
ComparePciCapOffsetKey);
CapHdrOffsets = OrderedCollectionInit (
ComparePciCapOffset,
ComparePciCapOffsetKey
);
if (CapHdrOffsets == NULL) {
Status = RETURN_OUT_OF_RESOURCES;
goto FreeCapabilities;
@@ -542,19 +570,28 @@ PciCapListInit (
// Check whether a normal capabilities list is present. If there's none,
// that's not an error; we'll just return OutCapList->Capabilities empty.
//
Status = PciDevice->ReadConfig (PciDevice, PCI_PRIMARY_STATUS_OFFSET,
&PciStatusReg, sizeof PciStatusReg);
Status = PciDevice->ReadConfig (
PciDevice,
PCI_PRIMARY_STATUS_OFFSET,
&PciStatusReg,
sizeof PciStatusReg
);
if (RETURN_ERROR (Status)) {
goto FreeCapHdrOffsets;
}
if ((PciStatusReg & EFI_PCI_STATUS_CAPABILITY) != 0) {
UINT8 NormalCapHdrOffset;
UINT8 NormalCapHdrOffset;
//
// Fetch the start offset of the normal capabilities list.
//
Status = PciDevice->ReadConfig (PciDevice, PCI_CAPBILITY_POINTER_OFFSET,
&NormalCapHdrOffset, sizeof NormalCapHdrOffset);
Status = PciDevice->ReadConfig (
PciDevice,
PCI_CAPBILITY_POINTER_OFFSET,
&NormalCapHdrOffset,
sizeof NormalCapHdrOffset
);
if (RETURN_ERROR (Status)) {
goto FreeCapHdrOffsets;
}
@@ -564,16 +601,26 @@ PciCapListInit (
//
NormalCapHdrOffset &= 0xFC;
while (NormalCapHdrOffset > 0) {
EFI_PCI_CAPABILITY_HDR NormalCapHdr;
EFI_PCI_CAPABILITY_HDR NormalCapHdr;
Status = PciDevice->ReadConfig (PciDevice, NormalCapHdrOffset,
&NormalCapHdr, sizeof NormalCapHdr);
Status = PciDevice->ReadConfig (
PciDevice,
NormalCapHdrOffset,
&NormalCapHdr,
sizeof NormalCapHdr
);
if (RETURN_ERROR (Status)) {
goto FreeCapHdrOffsets;
}
Status = InsertPciCap (OutCapList, CapHdrOffsets, PciCapNormal,
NormalCapHdr.CapabilityID, NormalCapHdrOffset, 0);
Status = InsertPciCap (
OutCapList,
CapHdrOffsets,
PciCapNormal,
NormalCapHdr.CapabilityID,
NormalCapHdrOffset,
0
);
if (RETURN_ERROR (Status)) {
goto FreeCapHdrOffsets;
}
@@ -581,6 +628,7 @@ PciCapListInit (
if (NormalCapHdr.CapabilityID == EFI_PCI_CAPABILITY_ID_PCIEXP) {
DeviceIsExpress = TRUE;
}
NormalCapHdrOffset = NormalCapHdr.NextItemPtr & 0xFC;
}
}
@@ -590,39 +638,51 @@ PciCapListInit (
// capabilities list. It starts right after the normal config space.
//
if (DeviceIsExpress) {
UINT16 ExtendedCapHdrOffset;
UINT16 ExtendedCapHdrOffset;
ExtendedCapHdrOffset = PCI_MAX_CONFIG_OFFSET;
while (ExtendedCapHdrOffset > 0) {
PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER ExtendedCapHdr;
PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER ExtendedCapHdr;
Status = PciDevice->ReadConfig (PciDevice, ExtendedCapHdrOffset,
&ExtendedCapHdr, sizeof ExtendedCapHdr);
Status = PciDevice->ReadConfig (
PciDevice,
ExtendedCapHdrOffset,
&ExtendedCapHdr,
sizeof ExtendedCapHdr
);
//
// If the first extended config space access fails, assume the device has
// no extended capabilities. If the first extended config space access
// succeeds but we read an "all bits zero" extended capability header,
// that means (by spec) the device has no extended capabilities.
//
if (ExtendedCapHdrOffset == PCI_MAX_CONFIG_OFFSET &&
if ((ExtendedCapHdrOffset == PCI_MAX_CONFIG_OFFSET) &&
(RETURN_ERROR (Status) ||
IsZeroBuffer (&ExtendedCapHdr, sizeof ExtendedCapHdr))) {
IsZeroBuffer (&ExtendedCapHdr, sizeof ExtendedCapHdr)))
{
break;
}
if (RETURN_ERROR (Status)) {
goto FreeCapHdrOffsets;
}
Status = InsertPciCap (OutCapList, CapHdrOffsets, PciCapExtended,
(UINT16)ExtendedCapHdr.CapabilityId, ExtendedCapHdrOffset,
(UINT8)ExtendedCapHdr.CapabilityVersion);
Status = InsertPciCap (
OutCapList,
CapHdrOffsets,
PciCapExtended,
(UINT16)ExtendedCapHdr.CapabilityId,
ExtendedCapHdrOffset,
(UINT8)ExtendedCapHdr.CapabilityVersion
);
if (RETURN_ERROR (Status)) {
goto FreeCapHdrOffsets;
}
ExtendedCapHdrOffset = ExtendedCapHdr.NextCapabilityOffset & 0xFFC;
if (ExtendedCapHdrOffset > 0 &&
ExtendedCapHdrOffset < PCI_MAX_CONFIG_OFFSET) {
if ((ExtendedCapHdrOffset > 0) &&
(ExtendedCapHdrOffset < PCI_MAX_CONFIG_OFFSET))
{
//
// Invalid capability pointer.
//
@@ -642,8 +702,8 @@ PciCapListInit (
//
OffsetEntry = OrderedCollectionMin (CapHdrOffsets);
if (OffsetEntry != NULL) {
ORDERED_COLLECTION_ENTRY *NextOffsetEntry;
PCI_CAP *PciCap;
ORDERED_COLLECTION_ENTRY *NextOffsetEntry;
PCI_CAP *PciCap;
//
// Initialize NextOffsetEntry to the iterator of the PCI_CAP object with
@@ -655,21 +715,23 @@ PciCapListInit (
// highest Offset.
//
while (NextOffsetEntry != NULL) {
PCI_CAP *NextPciCap;
PCI_CAP *NextPciCap;
OrderedCollectionDelete (CapHdrOffsets, OffsetEntry, (VOID **)&PciCap);
NextPciCap = OrderedCollectionUserStruct (NextOffsetEntry);
CalculatePciCapMaxSizeHint (PciCap, NextPciCap);
OffsetEntry = NextOffsetEntry;
OffsetEntry = NextOffsetEntry;
NextOffsetEntry = OrderedCollectionNext (OffsetEntry);
}
//
// Calculate MaxSizeHint for the PCI_CAP object with the highest Offset.
//
OrderedCollectionDelete (CapHdrOffsets, OffsetEntry, (VOID **)&PciCap);
CalculatePciCapMaxSizeHint (PciCap, NULL);
}
ASSERT (OrderedCollectionIsEmpty (CapHdrOffsets));
OrderedCollectionUninit (CapHdrOffsets);
@@ -687,12 +749,16 @@ FreeOutCapList:
FreePool (OutCapList);
ASSERT (RETURN_ERROR (Status));
DEBUG ((DEBUG_ERROR, "%a:%a: %r\n", gEfiCallerBaseName, __FUNCTION__,
Status));
DEBUG ((
DEBUG_ERROR,
"%a:%a: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return Status;
}
/**
Free the resources used by CapList.
@@ -702,14 +768,13 @@ FreeOutCapList:
VOID
EFIAPI
PciCapListUninit (
IN PCI_CAP_LIST *CapList
IN PCI_CAP_LIST *CapList
)
{
EmptyAndUninitPciCapCollection (CapList->Capabilities, TRUE);
FreePool (CapList);
}
/**
Locate a capability instance in the parsed capabilities lists.
@@ -746,15 +811,15 @@ PciCapListUninit (
RETURN_STATUS
EFIAPI
PciCapListFindCap (
IN PCI_CAP_LIST *CapList,
IN PCI_CAP_DOMAIN Domain,
IN UINT16 CapId,
IN UINT16 Instance,
OUT PCI_CAP **Cap OPTIONAL
IN PCI_CAP_LIST *CapList,
IN PCI_CAP_DOMAIN Domain,
IN UINT16 CapId,
IN UINT16 Instance,
OUT PCI_CAP **Cap OPTIONAL
)
{
PCI_CAP_KEY Key;
ORDERED_COLLECTION_ENTRY *PciCapEntry;
PCI_CAP_KEY Key;
ORDERED_COLLECTION_ENTRY *PciCapEntry;
Key.Domain = Domain;
Key.CapId = CapId;
@@ -764,13 +829,14 @@ PciCapListFindCap (
if (PciCapEntry == NULL) {
return RETURN_NOT_FOUND;
}
if (Cap != NULL) {
*Cap = OrderedCollectionUserStruct (PciCapEntry);
}
return RETURN_SUCCESS;
}
/**
Locate the first instance of the capability given by (Domain, CapId) such
that the instance's Version is greater than or equal to MinVersion.
@@ -807,15 +873,15 @@ PciCapListFindCap (
RETURN_STATUS
EFIAPI
PciCapListFindCapVersion (
IN PCI_CAP_LIST *CapList,
IN PCI_CAP_DOMAIN Domain,
IN UINT16 CapId,
IN UINT8 MinVersion,
OUT PCI_CAP **Cap OPTIONAL
IN PCI_CAP_LIST *CapList,
IN PCI_CAP_DOMAIN Domain,
IN UINT16 CapId,
IN UINT8 MinVersion,
OUT PCI_CAP **Cap OPTIONAL
)
{
PCI_CAP_KEY Key;
ORDERED_COLLECTION_ENTRY *PciCapEntry;
PCI_CAP_KEY Key;
ORDERED_COLLECTION_ENTRY *PciCapEntry;
//
// Start the version checks at Instance#0 of (Domain, CapId).
@@ -826,8 +892,9 @@ PciCapListFindCapVersion (
for (PciCapEntry = OrderedCollectionFind (CapList->Capabilities, &Key);
PciCapEntry != NULL;
PciCapEntry = OrderedCollectionNext (PciCapEntry)) {
PCI_CAP *PciCap;
PciCapEntry = OrderedCollectionNext (PciCapEntry))
{
PCI_CAP *PciCap;
PciCap = OrderedCollectionUserStruct (PciCapEntry);
//
@@ -835,9 +902,10 @@ PciCapListFindCapVersion (
// adjacent to each other, so stop searching if either Domain or CapId
// changes.
//
if (PciCap->Key.Domain != Domain || PciCap->Key.CapId != CapId) {
if ((PciCap->Key.Domain != Domain) || (PciCap->Key.CapId != CapId)) {
break;
}
if (PciCap->Version >= MinVersion) {
//
// Match found.
@@ -845,13 +913,14 @@ PciCapListFindCapVersion (
if (Cap != NULL) {
*Cap = PciCap;
}
return RETURN_SUCCESS;
}
}
return RETURN_NOT_FOUND;
}
/**
Get information about a PCI Capability instance.
@@ -869,11 +938,11 @@ PciCapListFindCapVersion (
RETURN_STATUS
EFIAPI
PciCapGetInfo (
IN PCI_CAP *Cap,
OUT PCI_CAP_INFO *Info
IN PCI_CAP *Cap,
OUT PCI_CAP_INFO *Info
)
{
PCI_CAP *InstanceZero;
PCI_CAP *InstanceZero;
ASSERT (Info != NULL);
@@ -891,7 +960,6 @@ PciCapGetInfo (
return RETURN_SUCCESS;
}
/**
Read a slice of a capability instance.
@@ -931,11 +999,11 @@ PciCapGetInfo (
RETURN_STATUS
EFIAPI
PciCapRead (
IN PCI_CAP_DEV *PciDevice,
IN PCI_CAP *Cap,
IN UINT16 SourceOffsetInCap,
OUT VOID *DestinationBuffer,
IN UINT16 Size
IN PCI_CAP_DEV *PciDevice,
IN PCI_CAP *Cap,
IN UINT16 SourceOffsetInCap,
OUT VOID *DestinationBuffer,
IN UINT16 Size
)
{
//
@@ -945,10 +1013,14 @@ PciCapRead (
if (SourceOffsetInCap + Size > Cap->MaxSizeHint) {
return RETURN_BAD_BUFFER_SIZE;
}
return PciDevice->ReadConfig (PciDevice, Cap->Offset + SourceOffsetInCap,
DestinationBuffer, Size);
}
return PciDevice->ReadConfig (
PciDevice,
Cap->Offset + SourceOffsetInCap,
DestinationBuffer,
Size
);
}
/**
Write a slice of a capability instance.
@@ -990,11 +1062,11 @@ PciCapRead (
RETURN_STATUS
EFIAPI
PciCapWrite (
IN PCI_CAP_DEV *PciDevice,
IN PCI_CAP *Cap,
IN UINT16 DestinationOffsetInCap,
IN VOID *SourceBuffer,
IN UINT16 Size
IN PCI_CAP_DEV *PciDevice,
IN PCI_CAP *Cap,
IN UINT16 DestinationOffsetInCap,
IN VOID *SourceBuffer,
IN UINT16 Size
)
{
//
@@ -1004,7 +1076,11 @@ PciCapWrite (
if (DestinationOffsetInCap + Size > Cap->MaxSizeHint) {
return RETURN_BAD_BUFFER_SIZE;
}
return PciDevice->WriteConfig (PciDevice,
Cap->Offset + DestinationOffsetInCap, SourceBuffer,
Size);
return PciDevice->WriteConfig (
PciDevice,
Cap->Offset + DestinationOffsetInCap,
SourceBuffer,
Size
);
}

View File

@@ -18,9 +18,9 @@
// for insertion and lookup.
//
typedef struct {
PCI_CAP_DOMAIN Domain;
UINT16 CapId;
UINT16 Instance;
PCI_CAP_DOMAIN Domain;
UINT16 CapId;
UINT16 Instance;
} PCI_CAP_KEY;
//
@@ -29,26 +29,26 @@ typedef struct {
// NumInstances needs maintenance in one object only, per (Domain, CapId) pair.
//
typedef union {
UINT16 NumInstances;
PCI_CAP *InstanceZero;
UINT16 NumInstances;
PCI_CAP *InstanceZero;
} PCI_CAP_NUM_INSTANCES;
//
// Complete the incomplete PCI_CAP structure here.
//
struct PCI_CAP {
PCI_CAP_KEY Key;
PCI_CAP_NUM_INSTANCES NumInstancesUnion;
UINT16 Offset;
UINT16 MaxSizeHint;
UINT8 Version;
PCI_CAP_KEY Key;
PCI_CAP_NUM_INSTANCES NumInstancesUnion;
UINT16 Offset;
UINT16 MaxSizeHint;
UINT8 Version;
};
//
// Complete the incomplete PCI_CAP_LIST structure here.
//
struct PCI_CAP_LIST {
ORDERED_COLLECTION *Capabilities;
ORDERED_COLLECTION *Capabilities;
};
#endif // __BASE_PCI_CAP_LIB_H__

View File

@@ -14,7 +14,6 @@
#include "BasePciCapPciSegmentLib.h"
/**
Read the config space of a given PCI device (both normal and extended).
@@ -44,17 +43,17 @@ STATIC
RETURN_STATUS
EFIAPI
SegmentDevReadConfig (
IN PCI_CAP_DEV *PciDevice,
IN UINT16 SourceOffset,
OUT VOID *DestinationBuffer,
IN UINT16 Size
IN PCI_CAP_DEV *PciDevice,
IN UINT16 SourceOffset,
OUT VOID *DestinationBuffer,
IN UINT16 Size
)
{
SEGMENT_DEV *SegmentDev;
UINT16 ConfigSpaceSize;
UINT64 SourceAddress;
SEGMENT_DEV *SegmentDev;
UINT16 ConfigSpaceSize;
UINT64 SourceAddress;
SegmentDev = SEGMENT_DEV_FROM_PCI_CAP_DEV (PciDevice);
SegmentDev = SEGMENT_DEV_FROM_PCI_CAP_DEV (PciDevice);
ConfigSpaceSize = (SegmentDev->MaxDomain == PciCapNormal ?
PCI_MAX_CONFIG_OFFSET : PCI_EXP_MAX_CONFIG_OFFSET);
//
@@ -64,14 +63,18 @@ SegmentDevReadConfig (
if (SourceOffset + Size > ConfigSpaceSize) {
return RETURN_UNSUPPORTED;
}
SourceAddress = PCI_SEGMENT_LIB_ADDRESS (SegmentDev->SegmentNr,
SegmentDev->BusNr, SegmentDev->DeviceNr,
SegmentDev->FunctionNr, SourceOffset);
SourceAddress = PCI_SEGMENT_LIB_ADDRESS (
SegmentDev->SegmentNr,
SegmentDev->BusNr,
SegmentDev->DeviceNr,
SegmentDev->FunctionNr,
SourceOffset
);
PciSegmentReadBuffer (SourceAddress, Size, DestinationBuffer);
return RETURN_SUCCESS;
}
/**
Write the config space of a given PCI device (both normal and extended).
@@ -101,17 +104,17 @@ STATIC
RETURN_STATUS
EFIAPI
SegmentDevWriteConfig (
IN PCI_CAP_DEV *PciDevice,
IN UINT16 DestinationOffset,
IN VOID *SourceBuffer,
IN UINT16 Size
IN PCI_CAP_DEV *PciDevice,
IN UINT16 DestinationOffset,
IN VOID *SourceBuffer,
IN UINT16 Size
)
{
SEGMENT_DEV *SegmentDev;
UINT16 ConfigSpaceSize;
UINT64 DestinationAddress;
SEGMENT_DEV *SegmentDev;
UINT16 ConfigSpaceSize;
UINT64 DestinationAddress;
SegmentDev = SEGMENT_DEV_FROM_PCI_CAP_DEV (PciDevice);
SegmentDev = SEGMENT_DEV_FROM_PCI_CAP_DEV (PciDevice);
ConfigSpaceSize = (SegmentDev->MaxDomain == PciCapNormal ?
PCI_MAX_CONFIG_OFFSET : PCI_EXP_MAX_CONFIG_OFFSET);
//
@@ -121,14 +124,18 @@ SegmentDevWriteConfig (
if (DestinationOffset + Size > ConfigSpaceSize) {
return RETURN_UNSUPPORTED;
}
DestinationAddress = PCI_SEGMENT_LIB_ADDRESS (SegmentDev->SegmentNr,
SegmentDev->BusNr, SegmentDev->DeviceNr,
SegmentDev->FunctionNr, DestinationOffset);
DestinationAddress = PCI_SEGMENT_LIB_ADDRESS (
SegmentDev->SegmentNr,
SegmentDev->BusNr,
SegmentDev->DeviceNr,
SegmentDev->FunctionNr,
DestinationOffset
);
PciSegmentWriteBuffer (DestinationAddress, Size, SourceBuffer);
return RETURN_SUCCESS;
}
/**
Create a PCI_CAP_DEV object from the PCI Segment:Bus:Device.Function
quadruplet. The config space accessors are based upon PciSegmentLib.
@@ -168,17 +175,17 @@ SegmentDevWriteConfig (
RETURN_STATUS
EFIAPI
PciCapPciSegmentDeviceInit (
IN PCI_CAP_DOMAIN MaxDomain,
IN UINT16 Segment,
IN UINT8 Bus,
IN UINT8 Device,
IN UINT8 Function,
OUT PCI_CAP_DEV **PciDevice
IN PCI_CAP_DOMAIN MaxDomain,
IN UINT16 Segment,
IN UINT8 Bus,
IN UINT8 Device,
IN UINT8 Function,
OUT PCI_CAP_DEV **PciDevice
)
{
SEGMENT_DEV *SegmentDev;
SEGMENT_DEV *SegmentDev;
if (Device > PCI_MAX_DEVICE || Function > PCI_MAX_FUNC) {
if ((Device > PCI_MAX_DEVICE) || (Function > PCI_MAX_FUNC)) {
return RETURN_INVALID_PARAMETER;
}
@@ -200,7 +207,6 @@ PciCapPciSegmentDeviceInit (
return RETURN_SUCCESS;
}
/**
Free the resources used by PciDevice.
@@ -210,10 +216,10 @@ PciCapPciSegmentDeviceInit (
VOID
EFIAPI
PciCapPciSegmentDeviceUninit (
IN PCI_CAP_DEV *PciDevice
IN PCI_CAP_DEV *PciDevice
)
{
SEGMENT_DEV *SegmentDev;
SEGMENT_DEV *SegmentDev;
SegmentDev = SEGMENT_DEV_FROM_PCI_CAP_DEV (PciDevice);
FreePool (SegmentDev);

View File

@@ -14,25 +14,25 @@
#include <Library/PciCapPciSegmentLib.h>
#define SEGMENT_DEV_SIG SIGNATURE_64 ('P', 'C', 'P', 'S', 'G', 'M', 'N', 'T')
#define SEGMENT_DEV_SIG SIGNATURE_64 ('P', 'C', 'P', 'S', 'G', 'M', 'N', 'T')
typedef struct {
//
// Signature identifying the derived class.
//
UINT64 Signature;
UINT64 Signature;
//
// Members added by the derived class, specific to the use of PciSegmentLib.
//
PCI_CAP_DOMAIN MaxDomain;
UINT16 SegmentNr;
UINT8 BusNr;
UINT8 DeviceNr;
UINT8 FunctionNr;
PCI_CAP_DOMAIN MaxDomain;
UINT16 SegmentNr;
UINT8 BusNr;
UINT8 DeviceNr;
UINT8 FunctionNr;
//
// Base class.
//
PCI_CAP_DEV BaseDevice;
PCI_CAP_DEV BaseDevice;
} SEGMENT_DEV;
#define SEGMENT_DEV_FROM_PCI_CAP_DEV(PciDevice) \

View File

@@ -18,15 +18,15 @@
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#define FW_PORT 0x510
#define FW_IPORT 0x511
#define FW_PORT 0x510
#define FW_IPORT 0x511
/* Transport protocol basic operations */
#define OP_NULL 1
#define OP_ECHO 2
#define OP_GET 3
#define OP_GET_LEN 4
#define OP_SET 5
#define OP_NULL 1
#define OP_ECHO 2
#define OP_GET 3
#define OP_GET_LEN 4
#define OP_SET 5
/* Transport protocol error returns */
#define T_ESUCCESS 0
@@ -34,17 +34,17 @@
#define T_E2BIG 7
#define T_EMSGSIZE 40
#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
STATIC CONST CHAR8 mBhyveSig[4] = { 'B', 'H', 'Y', 'V' };
STATIC CONST CHAR8 mBhyveSig[4] = { 'B', 'H', 'Y', 'V' };
STATIC BOOLEAN mBhyveFwCtlSupported = FALSE;
STATIC BOOLEAN mBhyveFwCtlSupported = FALSE;
STATIC INT32 mBhyveFwCtlTxid = 0xa5;
STATIC INT32 mBhyveFwCtlTxid = 0xa5;
/* XXX Maybe a better inbuilt version of this ? */
typedef struct {
VOID *Base;
VOID *Base;
UINT32 Len;
} BIO_VEC;
@@ -59,27 +59,27 @@ STATIC
RETURN_STATUS
EFIAPI
BhyveFwCtl_CvtErr (
IN UINT32 errno
IN UINT32 errno
)
{
RETURN_STATUS Status;
RETURN_STATUS Status;
switch (errno) {
case T_ESUCCESS:
Status = RETURN_SUCCESS;
break;
case T_ENOENT:
Status = RETURN_NOT_FOUND;
break;
case T_E2BIG:
Status = RETURN_INVALID_PARAMETER;
break;
case T_EMSGSIZE:
Status = RETURN_BUFFER_TOO_SMALL;
break;
default:
Status = RETURN_PROTOCOL_ERROR;
break;
case T_ESUCCESS:
Status = RETURN_SUCCESS;
break;
case T_ENOENT:
Status = RETURN_NOT_FOUND;
break;
case T_E2BIG:
Status = RETURN_INVALID_PARAMETER;
break;
case T_EMSGSIZE:
Status = RETURN_BUFFER_TOO_SMALL;
break;
default:
Status = RETURN_PROTOCOL_ERROR;
break;
}
return Status;
@@ -89,17 +89,18 @@ STATIC
UINT32
EFIAPI
BIov_WLen (
IN BIO_VEC b[]
IN BIO_VEC b[]
)
{
UINT32 i;
UINT32 tLen;
UINT32 i;
UINT32 tLen;
tLen = 0;
if (b != NULL) {
for (i = 0; b[i].Base != NULL; i++)
tLen += ROUNDUP (b[i].Len, sizeof(UINT32));
for (i = 0; b[i].Base != NULL; i++) {
tLen += ROUNDUP (b[i].Len, sizeof (UINT32));
}
}
return tLen;
@@ -113,21 +114,22 @@ STATIC
UINT32
BIov_Send_Rem (
IN UINT32 *Data,
IN UINT32 Len
IN UINT32 Len
)
{
union {
UINT8 c[4];
UINT8 c[4];
UINT32 w;
} u;
UINT8 *cdata;
UINT32 i;
UINT8 *cdata;
UINT32 i;
cdata = (UINT8 *)Data;
u.w = 0;
u.w = 0;
for (i = 0; i < Len; i++)
for (i = 0; i < Len; i++) {
u.c[i] = *cdata++;
}
return u.w;
}
@@ -140,16 +142,16 @@ STATIC
VOID
BIov_Send (
IN char *Data,
IN UINT32 Len
IN UINT32 Len
)
{
UINT32 *LData;
UINT32 *LData;
LData = (UINT32 *)Data;
while (Len > sizeof(UINT32)) {
while (Len > sizeof (UINT32)) {
IoWrite32 (FW_PORT, *LData++);
Len -= sizeof(UINT32);
Len -= sizeof (UINT32);
}
if (Len > 0) {
@@ -163,10 +165,10 @@ BIov_Send (
STATIC
VOID
BIov_SendAll (
IN BIO_VEC b[]
)
IN BIO_VEC b[]
)
{
INT32 i;
INT32 i;
if (b != NULL) {
for (i = 0; b[i].Base; i++) {
@@ -181,22 +183,23 @@ BIov_SendAll (
STATIC
VOID
EFIAPI
BhyveFwCtl_MsgSend(
IN UINT32 OpCode,
BhyveFwCtl_MsgSend (
IN UINT32 OpCode,
IN BIO_VEC Data[]
)
{
BIO_VEC hIov[4];
UINT32 Hdr[3];
UINT32 i;
UINT32 Hdr[3];
UINT32 i;
/* Set up header as an iovec */
for (i = 0; i < 3; i++) {
hIov[i].Base = &Hdr[i];
hIov[i].Len = sizeof(Hdr[0]);
hIov[i].Len = sizeof (Hdr[0]);
}
hIov[i].Base = NULL;
hIov[i].Len = 0;
hIov[i].Len = 0;
/* Initialize header */
Hdr[0] = BIov_WLen (hIov) + BIov_WLen (Data);
@@ -214,13 +217,13 @@ BhyveFwCtl_MsgSend(
STATIC
RETURN_STATUS
EFIAPI
BhyveFwCtl_MsgRecv(
OUT MSG_RX_HDR *Rhdr,
OUT BIO_VEC Data[]
BhyveFwCtl_MsgRecv (
OUT MSG_RX_HDR *Rhdr,
OUT BIO_VEC Data[]
)
{
RETURN_STATUS Status;
UINT32 *Dp;
UINT32 *Dp;
UINT32 Rd;
UINT32 remLen;
INT32 oLen;
@@ -228,7 +231,6 @@ BhyveFwCtl_MsgRecv(
Rd = IoRead32 (FW_PORT);
if (Rd < sizeof (MSG_RX_HDR)) {
;
}
/* Read in header and setup initial error */
@@ -241,7 +243,7 @@ BhyveFwCtl_MsgRecv(
Status = BhyveFwCtl_CvtErr (Rhdr->Err);
remLen = Rd - sizeof (MSG_RX_HDR);
xLen = 0;
xLen = 0;
/*
* A few cases to handle:
@@ -250,47 +252,48 @@ BhyveFwCtl_MsgRecv(
* - the response is zero-length
*/
if (Data != NULL) {
Dp = (UINT32 *)Data[0].Base;
Dp = (UINT32 *)Data[0].Base;
oLen = remLen;
if (remLen > Data[0].Len) {
Status = RETURN_BUFFER_TOO_SMALL;
xLen = remLen - Data[0].Len;
oLen = remLen = Data[0].Len;
xLen = remLen - Data[0].Len;
oLen = remLen = Data[0].Len;
}
while (remLen > 0) {
*Dp++ = IoRead32 (FW_PORT);
*Dp++ = IoRead32 (FW_PORT);
remLen -= sizeof (UINT32);
}
Data[0].Len = oLen;
} else {
/* No user data, but data returned - drop */
if (remLen > 0) {
Status = RETURN_BUFFER_TOO_SMALL;
xLen = remLen;
xLen = remLen;
}
}
/* Drop additional data */
while (xLen > 0) {
(void) IoRead32 (FW_PORT);
(void)IoRead32 (FW_PORT);
xLen -= sizeof (UINT32);
}
return Status;
}
STATIC
RETURN_STATUS
EFIAPI
BhyveFwCtl_Msg(
IN UINT32 OpCode,
IN BIO_VEC Sdata[],
OUT BIO_VEC Rdata[]
)
BhyveFwCtl_Msg (
IN UINT32 OpCode,
IN BIO_VEC Sdata[],
OUT BIO_VEC Rdata[]
)
{
MSG_RX_HDR Rh;
RETURN_STATUS Status;
MSG_RX_HDR Rh;
RETURN_STATUS Status;
Status = RETURN_SUCCESS;
@@ -306,11 +309,11 @@ STATIC
RETURN_STATUS
EFIAPI
BhyveFwCtlGetLen (
IN CONST CHAR8 *Name,
IN OUT UINT32 *Size
IN CONST CHAR8 *Name,
IN OUT UINT32 *Size
)
{
BIO_VEC Req[2], Resp[2];
BIO_VEC Req[2], Resp[2];
RETURN_STATUS Status;
Req[0].Base = (VOID *)Name;
@@ -326,7 +329,7 @@ BhyveFwCtlGetLen (
return Status;
}
#define FMAXSZ 1024
#define FMAXSZ 1024
STATIC struct {
UINT64 fSize;
UINT32 fData[FMAXSZ];
@@ -336,18 +339,19 @@ STATIC
RETURN_STATUS
EFIAPI
BhyveFwCtlGetVal (
IN CONST CHAR8 *Name,
OUT VOID *Item,
IN OUT UINT32 *Size
IN CONST CHAR8 *Name,
OUT VOID *Item,
IN OUT UINT32 *Size
)
{
BIO_VEC Req[2];
BIO_VEC Resp[2];
BIO_VEC Req[2];
BIO_VEC Resp[2];
RETURN_STATUS Status;
/* Make sure temp buffer is larger than passed-in size */
if (*Size > sizeof (FwGetvalBuf.fData))
return RETURN_INVALID_PARAMETER;
if (*Size > sizeof (FwGetvalBuf.fData)) {
return RETURN_INVALID_PARAMETER;
}
Req[0].Base = (VOID *)Name;
Req[0].Len = (UINT32)AsciiStrLen (Name) + 1;
@@ -378,26 +382,26 @@ BhyveFwCtlGetVal (
RETURN_STATUS
EFIAPI
BhyveFwCtlGet (
IN CONST CHAR8 *Name,
OUT VOID *Item,
IN OUT UINTN *Size
IN CONST CHAR8 *Name,
OUT VOID *Item,
IN OUT UINTN *Size
)
{
RETURN_STATUS Status;
RETURN_STATUS Status;
if (mBhyveFwCtlSupported == FALSE)
if (mBhyveFwCtlSupported == FALSE) {
return RETURN_UNSUPPORTED;
}
if (Item == NULL) {
Status = BhyveFwCtlGetLen (Name, (UINT32*)Size);
Status = BhyveFwCtlGetLen (Name, (UINT32 *)Size);
} else {
Status = BhyveFwCtlGetVal (Name, Item, (UINT32*)Size);
Status = BhyveFwCtlGetVal (Name, Item, (UINT32 *)Size);
}
return Status;
}
/**
Library initialization. Probe the host to see if the f/w ctl
interface is supported.

View File

@@ -24,9 +24,9 @@
EFI_STATUS
EFIAPI
VerifyBlob (
IN CONST CHAR16 *BlobName,
IN CONST VOID *Buf,
IN UINT32 BufSize
IN CONST CHAR16 *BlobName,
IN CONST VOID *Buf,
IN UINT32 BufSize
)
{
return EFI_SUCCESS;

View File

@@ -15,7 +15,6 @@
**/
#include <Base.h>
#include <IndustryStandard/Q35MchIch9.h>
@@ -25,7 +24,7 @@
#include <Library/PciExpressLib.h>
#include <Library/PcdLib.h>
STATIC BOOLEAN mRunningOnQ35;
STATIC BOOLEAN mRunningOnQ35;
RETURN_STATUS
EFIAPI
@@ -88,7 +87,7 @@ PciRegisterForRuntimeAccess (
UINT8
EFIAPI
PciRead8 (
IN UINTN Address
IN UINTN Address
)
{
return mRunningOnQ35 ?
@@ -115,8 +114,8 @@ PciRead8 (
UINT8
EFIAPI
PciWrite8 (
IN UINTN Address,
IN UINT8 Value
IN UINTN Address,
IN UINT8 Value
)
{
return mRunningOnQ35 ?
@@ -147,8 +146,8 @@ PciWrite8 (
UINT8
EFIAPI
PciOr8 (
IN UINTN Address,
IN UINT8 OrData
IN UINTN Address,
IN UINT8 OrData
)
{
return mRunningOnQ35 ?
@@ -179,8 +178,8 @@ PciOr8 (
UINT8
EFIAPI
PciAnd8 (
IN UINTN Address,
IN UINT8 AndData
IN UINTN Address,
IN UINT8 AndData
)
{
return mRunningOnQ35 ?
@@ -213,9 +212,9 @@ PciAnd8 (
UINT8
EFIAPI
PciAndThenOr8 (
IN UINTN Address,
IN UINT8 AndData,
IN UINT8 OrData
IN UINTN Address,
IN UINT8 AndData,
IN UINT8 OrData
)
{
return mRunningOnQ35 ?
@@ -247,9 +246,9 @@ PciAndThenOr8 (
UINT8
EFIAPI
PciBitFieldRead8 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit
)
{
return mRunningOnQ35 ?
@@ -284,10 +283,10 @@ PciBitFieldRead8 (
UINT8
EFIAPI
PciBitFieldWrite8 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT8 Value
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT8 Value
)
{
return mRunningOnQ35 ?
@@ -325,10 +324,10 @@ PciBitFieldWrite8 (
UINT8
EFIAPI
PciBitFieldOr8 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT8 OrData
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT8 OrData
)
{
return mRunningOnQ35 ?
@@ -366,10 +365,10 @@ PciBitFieldOr8 (
UINT8
EFIAPI
PciBitFieldAnd8 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT8 AndData
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT8 AndData
)
{
return mRunningOnQ35 ?
@@ -411,11 +410,11 @@ PciBitFieldAnd8 (
UINT8
EFIAPI
PciBitFieldAndThenOr8 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT8 AndData,
IN UINT8 OrData
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT8 AndData,
IN UINT8 OrData
)
{
return mRunningOnQ35 ?
@@ -442,7 +441,7 @@ PciBitFieldAndThenOr8 (
UINT16
EFIAPI
PciRead16 (
IN UINTN Address
IN UINTN Address
)
{
return mRunningOnQ35 ?
@@ -470,8 +469,8 @@ PciRead16 (
UINT16
EFIAPI
PciWrite16 (
IN UINTN Address,
IN UINT16 Value
IN UINTN Address,
IN UINT16 Value
)
{
return mRunningOnQ35 ?
@@ -503,8 +502,8 @@ PciWrite16 (
UINT16
EFIAPI
PciOr16 (
IN UINTN Address,
IN UINT16 OrData
IN UINTN Address,
IN UINT16 OrData
)
{
return mRunningOnQ35 ?
@@ -536,8 +535,8 @@ PciOr16 (
UINT16
EFIAPI
PciAnd16 (
IN UINTN Address,
IN UINT16 AndData
IN UINTN Address,
IN UINT16 AndData
)
{
return mRunningOnQ35 ?
@@ -571,9 +570,9 @@ PciAnd16 (
UINT16
EFIAPI
PciAndThenOr16 (
IN UINTN Address,
IN UINT16 AndData,
IN UINT16 OrData
IN UINTN Address,
IN UINT16 AndData,
IN UINT16 OrData
)
{
return mRunningOnQ35 ?
@@ -606,9 +605,9 @@ PciAndThenOr16 (
UINT16
EFIAPI
PciBitFieldRead16 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit
)
{
return mRunningOnQ35 ?
@@ -644,10 +643,10 @@ PciBitFieldRead16 (
UINT16
EFIAPI
PciBitFieldWrite16 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT16 Value
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT16 Value
)
{
return mRunningOnQ35 ?
@@ -686,10 +685,10 @@ PciBitFieldWrite16 (
UINT16
EFIAPI
PciBitFieldOr16 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT16 OrData
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT16 OrData
)
{
return mRunningOnQ35 ?
@@ -728,10 +727,10 @@ PciBitFieldOr16 (
UINT16
EFIAPI
PciBitFieldAnd16 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT16 AndData
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT16 AndData
)
{
return mRunningOnQ35 ?
@@ -774,11 +773,11 @@ PciBitFieldAnd16 (
UINT16
EFIAPI
PciBitFieldAndThenOr16 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT16 AndData,
IN UINT16 OrData
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT16 AndData,
IN UINT16 OrData
)
{
return mRunningOnQ35 ?
@@ -805,7 +804,7 @@ PciBitFieldAndThenOr16 (
UINT32
EFIAPI
PciRead32 (
IN UINTN Address
IN UINTN Address
)
{
return mRunningOnQ35 ?
@@ -833,8 +832,8 @@ PciRead32 (
UINT32
EFIAPI
PciWrite32 (
IN UINTN Address,
IN UINT32 Value
IN UINTN Address,
IN UINT32 Value
)
{
return mRunningOnQ35 ?
@@ -866,8 +865,8 @@ PciWrite32 (
UINT32
EFIAPI
PciOr32 (
IN UINTN Address,
IN UINT32 OrData
IN UINTN Address,
IN UINT32 OrData
)
{
return mRunningOnQ35 ?
@@ -899,8 +898,8 @@ PciOr32 (
UINT32
EFIAPI
PciAnd32 (
IN UINTN Address,
IN UINT32 AndData
IN UINTN Address,
IN UINT32 AndData
)
{
return mRunningOnQ35 ?
@@ -934,9 +933,9 @@ PciAnd32 (
UINT32
EFIAPI
PciAndThenOr32 (
IN UINTN Address,
IN UINT32 AndData,
IN UINT32 OrData
IN UINTN Address,
IN UINT32 AndData,
IN UINT32 OrData
)
{
return mRunningOnQ35 ?
@@ -969,9 +968,9 @@ PciAndThenOr32 (
UINT32
EFIAPI
PciBitFieldRead32 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit
)
{
return mRunningOnQ35 ?
@@ -1007,10 +1006,10 @@ PciBitFieldRead32 (
UINT32
EFIAPI
PciBitFieldWrite32 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT32 Value
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT32 Value
)
{
return mRunningOnQ35 ?
@@ -1049,10 +1048,10 @@ PciBitFieldWrite32 (
UINT32
EFIAPI
PciBitFieldOr32 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT32 OrData
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT32 OrData
)
{
return mRunningOnQ35 ?
@@ -1091,10 +1090,10 @@ PciBitFieldOr32 (
UINT32
EFIAPI
PciBitFieldAnd32 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT32 AndData
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT32 AndData
)
{
return mRunningOnQ35 ?
@@ -1137,11 +1136,11 @@ PciBitFieldAnd32 (
UINT32
EFIAPI
PciBitFieldAndThenOr32 (
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT32 AndData,
IN UINT32 OrData
IN UINTN Address,
IN UINTN StartBit,
IN UINTN EndBit,
IN UINT32 AndData,
IN UINT32 OrData
)
{
return mRunningOnQ35 ?
@@ -1175,9 +1174,9 @@ PciBitFieldAndThenOr32 (
UINTN
EFIAPI
PciReadBuffer (
IN UINTN StartAddress,
IN UINTN Size,
OUT VOID *Buffer
IN UINTN StartAddress,
IN UINTN Size,
OUT VOID *Buffer
)
{
return mRunningOnQ35 ?
@@ -1212,9 +1211,9 @@ PciReadBuffer (
UINTN
EFIAPI
PciWriteBuffer (
IN UINTN StartAddress,
IN UINTN Size,
IN VOID *Buffer
IN UINTN StartAddress,
IN UINTN Size,
IN VOID *Buffer
)
{
return mRunningOnQ35 ?

View File

@@ -13,7 +13,6 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeLib.h>
/**
This function will be called following a call to the
EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL Read function.
@@ -30,16 +29,15 @@
VOID
EFIAPI
PlatformFvbDataRead (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN EFI_LBA Lba,
IN UINTN Offset,
IN UINTN NumBytes,
IN UINT8 *Buffer
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN EFI_LBA Lba,
IN UINTN Offset,
IN UINTN NumBytes,
IN UINT8 *Buffer
)
{
}
/**
This function will be called following a call to the
EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL Write function.
@@ -54,26 +52,26 @@ PlatformFvbDataRead (
VOID
EFIAPI
PlatformFvbDataWritten (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN EFI_LBA Lba,
IN UINTN Offset,
IN UINTN NumBytes,
IN UINT8 *Buffer
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN EFI_LBA Lba,
IN UINTN Offset,
IN UINTN NumBytes,
IN UINT8 *Buffer
)
{
STATIC EFI_EVENT EventToSignal = NULL;
STATIC EFI_EVENT EventToSignal = NULL;
if (!EfiAtRuntime ()) {
if (EventToSignal == NULL) {
EventToSignal = (EFI_EVENT)(UINTN) PcdGet64 (PcdEmuVariableEvent);
EventToSignal = (EFI_EVENT)(UINTN)PcdGet64 (PcdEmuVariableEvent);
}
if (EventToSignal != NULL) {
gBS->SignalEvent (EventToSignal);
}
}
}
/**
This function will be called following a call to the
EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL Erase function.
@@ -88,10 +86,8 @@ PlatformFvbDataWritten (
VOID
EFIAPI
PlatformFvbBlocksErased (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN VA_LIST List
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN VA_LIST List
)
{
}

View File

@@ -22,49 +22,49 @@
#pragma pack (1)
typedef struct {
EFI_DEVICE_PATH_PROTOCOL FilePathHeader;
CHAR16 FilePath[ARRAY_SIZE (L"kernel")];
EFI_DEVICE_PATH_PROTOCOL FilePathHeader;
CHAR16 FilePath[ARRAY_SIZE (L"kernel")];
} KERNEL_FILE_DEVPATH;
typedef struct {
VENDOR_DEVICE_PATH VenMediaNode;
KERNEL_FILE_DEVPATH FileNode;
EFI_DEVICE_PATH_PROTOCOL EndNode;
VENDOR_DEVICE_PATH VenMediaNode;
KERNEL_FILE_DEVPATH FileNode;
EFI_DEVICE_PATH_PROTOCOL EndNode;
} KERNEL_VENMEDIA_FILE_DEVPATH;
typedef struct {
VENDOR_DEVICE_PATH VenMediaNode;
EFI_DEVICE_PATH_PROTOCOL EndNode;
VENDOR_DEVICE_PATH VenMediaNode;
EFI_DEVICE_PATH_PROTOCOL EndNode;
} SINGLE_VENMEDIA_NODE_DEVPATH;
#pragma pack ()
STATIC CONST KERNEL_VENMEDIA_FILE_DEVPATH mKernelDevicePath = {
STATIC CONST KERNEL_VENMEDIA_FILE_DEVPATH mKernelDevicePath = {
{
{
MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP,
{ sizeof (VENDOR_DEVICE_PATH) }
{ sizeof (VENDOR_DEVICE_PATH) }
},
QEMU_KERNEL_LOADER_FS_MEDIA_GUID
}, {
}, {
{
MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP,
{ sizeof (KERNEL_FILE_DEVPATH) }
{ sizeof (KERNEL_FILE_DEVPATH) }
},
L"kernel",
}, {
}, {
END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ sizeof (EFI_DEVICE_PATH_PROTOCOL) }
}
};
STATIC CONST SINGLE_VENMEDIA_NODE_DEVPATH mQemuKernelLoaderFsDevicePath = {
STATIC CONST SINGLE_VENMEDIA_NODE_DEVPATH mQemuKernelLoaderFsDevicePath = {
{
{
MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP,
{ sizeof (VENDOR_DEVICE_PATH) }
{ sizeof (VENDOR_DEVICE_PATH) }
},
QEMU_KERNEL_LOADER_FS_MEDIA_GUID
}, {
}, {
END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ sizeof (EFI_DEVICE_PATH_PROTOCOL) }
}
@@ -73,28 +73,31 @@ STATIC CONST SINGLE_VENMEDIA_NODE_DEVPATH mQemuKernelLoaderFsDevicePath = {
STATIC
EFI_STATUS
GetQemuKernelLoaderBlobSize (
IN EFI_FILE_HANDLE Root,
IN CHAR16 *FileName,
OUT UINTN *Size
IN EFI_FILE_HANDLE Root,
IN CHAR16 *FileName,
OUT UINTN *Size
)
{
EFI_STATUS Status;
EFI_FILE_HANDLE FileHandle;
UINT64 FileSize;
EFI_STATUS Status;
EFI_FILE_HANDLE FileHandle;
UINT64 FileSize;
Status = Root->Open (Root, &FileHandle, FileName, EFI_FILE_MODE_READ, 0);
if (EFI_ERROR (Status)) {
return Status;
}
Status = FileHandleGetSize (FileHandle, &FileSize);
if (EFI_ERROR (Status)) {
goto CloseFile;
}
if (FileSize > MAX_UINTN) {
Status = EFI_UNSUPPORTED;
goto CloseFile;
}
*Size = (UINTN)FileSize;
*Size = (UINTN)FileSize;
Status = EFI_SUCCESS;
CloseFile:
FileHandle->Close (FileHandle);
@@ -104,29 +107,32 @@ CloseFile:
STATIC
EFI_STATUS
ReadWholeQemuKernelLoaderBlob (
IN EFI_FILE_HANDLE Root,
IN CHAR16 *FileName,
IN UINTN Size,
OUT VOID *Buffer
IN EFI_FILE_HANDLE Root,
IN CHAR16 *FileName,
IN UINTN Size,
OUT VOID *Buffer
)
{
EFI_STATUS Status;
EFI_FILE_HANDLE FileHandle;
UINTN ReadSize;
EFI_STATUS Status;
EFI_FILE_HANDLE FileHandle;
UINTN ReadSize;
Status = Root->Open (Root, &FileHandle, FileName, EFI_FILE_MODE_READ, 0);
if (EFI_ERROR (Status)) {
return Status;
}
ReadSize = Size;
Status = FileHandle->Read (FileHandle, &ReadSize, Buffer);
Status = FileHandle->Read (FileHandle, &ReadSize, Buffer);
if (EFI_ERROR (Status)) {
goto CloseFile;
}
if (ReadSize != Size) {
Status = EFI_PROTOCOL_ERROR;
goto CloseFile;
}
Status = EFI_SUCCESS;
CloseFile:
FileHandle->Close (FileHandle);
@@ -155,19 +161,19 @@ CloseFile:
EFI_STATUS
EFIAPI
QemuLoadKernelImage (
OUT EFI_HANDLE *ImageHandle
OUT EFI_HANDLE *ImageHandle
)
{
EFI_STATUS Status;
EFI_HANDLE KernelImageHandle;
EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage;
EFI_DEVICE_PATH_PROTOCOL *DevicePathNode;
EFI_HANDLE FsVolumeHandle;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FsProtocol;
EFI_FILE_HANDLE Root;
UINTN CommandLineSize;
CHAR8 *CommandLine;
UINTN InitrdSize;
EFI_STATUS Status;
EFI_HANDLE KernelImageHandle;
EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage;
EFI_DEVICE_PATH_PROTOCOL *DevicePathNode;
EFI_HANDLE FsVolumeHandle;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FsProtocol;
EFI_FILE_HANDLE Root;
UINTN CommandLineSize;
CHAR8 *CommandLine;
UINTN InitrdSize;
//
// Load the image. This should call back into the QEMU EFI loader file system.
@@ -181,20 +187,24 @@ QemuLoadKernelImage (
&KernelImageHandle
);
switch (Status) {
case EFI_SUCCESS:
break;
case EFI_SUCCESS:
break;
case EFI_SECURITY_VIOLATION:
//
// In this case, the image was loaded but failed to authenticate.
//
Status = EFI_ACCESS_DENIED;
goto UnloadImage;
case EFI_SECURITY_VIOLATION:
//
// In this case, the image was loaded but failed to authenticate.
//
Status = EFI_ACCESS_DENIED;
goto UnloadImage;
default:
DEBUG ((Status == EFI_NOT_FOUND ? DEBUG_INFO : DEBUG_ERROR,
"%a: LoadImage(): %r\n", __FUNCTION__, Status));
return Status;
default:
DEBUG ((
Status == EFI_NOT_FOUND ? DEBUG_INFO : DEBUG_ERROR,
"%a: LoadImage(): %r\n",
__FUNCTION__,
Status
));
return Status;
}
//
@@ -215,11 +225,11 @@ QemuLoadKernelImage (
// used to query the "initrd" and to read the "cmdline" synthetic files.
//
DevicePathNode = (EFI_DEVICE_PATH_PROTOCOL *)&mQemuKernelLoaderFsDevicePath;
Status = gBS->LocateDevicePath (
&gEfiSimpleFileSystemProtocolGuid,
&DevicePathNode,
&FsVolumeHandle
);
Status = gBS->LocateDevicePath (
&gEfiSimpleFileSystemProtocolGuid,
&DevicePathNode,
&FsVolumeHandle
);
if (EFI_ERROR (Status)) {
goto UnloadImage;
}
@@ -252,8 +262,12 @@ QemuLoadKernelImage (
goto CloseRoot;
}
Status = ReadWholeQemuKernelLoaderBlob (Root, L"cmdline", CommandLineSize,
CommandLine);
Status = ReadWholeQemuKernelLoaderBlob (
Root,
L"cmdline",
CommandLineSize,
CommandLine
);
if (EFI_ERROR (Status)) {
goto FreeCommandLine;
}
@@ -262,8 +276,11 @@ QemuLoadKernelImage (
// Verify NUL-termination of the command line.
//
if (CommandLine[CommandLineSize - 1] != '\0') {
DEBUG ((DEBUG_ERROR, "%a: kernel command line is not NUL-terminated\n",
__FUNCTION__));
DEBUG ((
DEBUG_ERROR,
"%a: kernel command line is not NUL-terminated\n",
__FUNCTION__
));
Status = EFI_PROTOCOL_ERROR;
goto FreeCommandLine;
}
@@ -295,10 +312,11 @@ QemuLoadKernelImage (
KernelLoadedImage->LoadOptionsSize += 2;
KernelLoadedImage->LoadOptions = AllocatePool (
KernelLoadedImage->LoadOptionsSize);
KernelLoadedImage->LoadOptionsSize
);
if (KernelLoadedImage->LoadOptions == NULL) {
KernelLoadedImage->LoadOptionsSize = 0;
Status = EFI_OUT_OF_RESOURCES;
Status = EFI_OUT_OF_RESOURCES;
goto FreeCommandLine;
}
@@ -309,17 +327,22 @@ QemuLoadKernelImage (
(CommandLineSize == 0) ? "" : CommandLine,
(InitrdSize == 0) ? "" : " initrd=initrd"
);
DEBUG ((DEBUG_INFO, "%a: command line: \"%s\"\n", __FUNCTION__,
(CHAR16 *)KernelLoadedImage->LoadOptions));
DEBUG ((
DEBUG_INFO,
"%a: command line: \"%s\"\n",
__FUNCTION__,
(CHAR16 *)KernelLoadedImage->LoadOptions
));
}
*ImageHandle = KernelImageHandle;
Status = EFI_SUCCESS;
Status = EFI_SUCCESS;
FreeCommandLine:
if (CommandLineSize > 0) {
FreePool (CommandLine);
}
CloseRoot:
Root->Close (Root);
UnloadImage:
@@ -348,7 +371,7 @@ UnloadImage:
EFI_STATUS
EFIAPI
QemuStartKernelImage (
IN OUT EFI_HANDLE *ImageHandle
IN OUT EFI_HANDLE *ImageHandle
)
{
return gBS->StartImage (
@@ -374,11 +397,11 @@ QemuStartKernelImage (
EFI_STATUS
EFIAPI
QemuUnloadKernelImage (
IN EFI_HANDLE ImageHandle
IN EFI_HANDLE ImageHandle
)
{
EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage;
EFI_STATUS Status;
EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage;
EFI_STATUS Status;
Status = gBS->OpenProtocol (
ImageHandle,
@@ -396,6 +419,7 @@ QemuUnloadKernelImage (
FreePool (KernelLoadedImage->LoadOptions);
KernelLoadedImage->LoadOptions = NULL;
}
KernelLoadedImage->LoadOptionsSize = 0;
return gBS->UnloadImage (ImageHandle);

View File

@@ -8,7 +8,6 @@
#include "LoadLinuxLib.h"
/**
A simple check of the kernel setup image
@@ -26,21 +25,20 @@ STATIC
EFI_STATUS
EFIAPI
BasicKernelSetupCheck (
IN VOID *KernelSetup
IN VOID *KernelSetup
)
{
return LoadLinuxCheckKernelSetup(KernelSetup, sizeof (struct boot_params));
return LoadLinuxCheckKernelSetup (KernelSetup, sizeof (struct boot_params));
}
EFI_STATUS
EFIAPI
LoadLinuxCheckKernelSetup (
IN VOID *KernelSetup,
IN UINTN KernelSetupSize
IN VOID *KernelSetup,
IN UINTN KernelSetupSize
)
{
struct boot_params *Bp;
struct boot_params *Bp;
if (KernelSetup == NULL) {
return EFI_INVALID_PARAMETER;
@@ -50,34 +48,34 @@ LoadLinuxCheckKernelSetup (
return EFI_UNSUPPORTED;
}
Bp = (struct boot_params*) KernelSetup;
Bp = (struct boot_params *)KernelSetup;
if ((Bp->hdr.signature != 0xAA55) || // Check boot sector signature
(Bp->hdr.header != SETUP_HDR) ||
(Bp->hdr.version < 0x205) || // We only support relocatable kernels
(!Bp->hdr.relocatable_kernel)
) {
)
{
return EFI_UNSUPPORTED;
} else {
return EFI_SUCCESS;
}
}
UINTN
EFIAPI
LoadLinuxGetKernelSize (
IN VOID *KernelSetup,
IN UINTN KernelSize
IN VOID *KernelSetup,
IN UINTN KernelSize
)
{
struct boot_params *Bp;
struct boot_params *Bp;
if (EFI_ERROR (BasicKernelSetupCheck (KernelSetup))) {
return 0;
}
Bp = (struct boot_params*) KernelSetup;
Bp = (struct boot_params *)KernelSetup;
if (Bp->hdr.version > 0x20a) {
return Bp->hdr.init_size;
@@ -89,25 +87,24 @@ LoadLinuxGetKernelSize (
}
}
VOID*
VOID *
EFIAPI
LoadLinuxAllocateKernelSetupPages (
IN UINTN Pages
IN UINTN Pages
)
{
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Address;
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Address;
Address = BASE_1GB;
Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiLoaderData,
Pages,
&Address
);
Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiLoaderData,
Pages,
&Address
);
if (!EFI_ERROR (Status)) {
return (VOID*)(UINTN) Address;
return (VOID *)(UINTN)Address;
} else {
return NULL;
}
@@ -116,19 +113,19 @@ LoadLinuxAllocateKernelSetupPages (
EFI_STATUS
EFIAPI
LoadLinuxInitializeKernelSetup (
IN VOID *KernelSetup
IN VOID *KernelSetup
)
{
EFI_STATUS Status;
UINTN SetupEnd;
struct boot_params *Bp;
EFI_STATUS Status;
UINTN SetupEnd;
struct boot_params *Bp;
Status = BasicKernelSetupCheck (KernelSetup);
if (EFI_ERROR (Status)) {
return Status;
}
Bp = (struct boot_params*) KernelSetup;
Bp = (struct boot_params *)KernelSetup;
SetupEnd = 0x202 + (Bp->hdr.jump & 0xff);
@@ -137,29 +134,32 @@ LoadLinuxInitializeKernelSetup (
//
ZeroMem (KernelSetup, 0x1f1);
ZeroMem (((UINT8 *)KernelSetup) + SetupEnd, 4096 - SetupEnd);
DEBUG ((DEBUG_INFO, "Cleared kernel setup 0-0x1f1, 0x%Lx-0x1000\n",
(UINT64)SetupEnd));
DEBUG ((
DEBUG_INFO,
"Cleared kernel setup 0-0x1f1, 0x%Lx-0x1000\n",
(UINT64)SetupEnd
));
return EFI_SUCCESS;
}
VOID*
VOID *
EFIAPI
LoadLinuxAllocateKernelPages (
IN VOID *KernelSetup,
IN UINTN Pages
IN VOID *KernelSetup,
IN UINTN Pages
)
{
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS KernelAddress;
UINT32 Loop;
struct boot_params *Bp;
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS KernelAddress;
UINT32 Loop;
struct boot_params *Bp;
if (EFI_ERROR (BasicKernelSetupCheck (KernelSetup))) {
return NULL;
}
Bp = (struct boot_params*) KernelSetup;
Bp = (struct boot_params *)KernelSetup;
for (Loop = 1; Loop < 512; Loop++) {
KernelAddress = MultU64x32 (
@@ -173,113 +173,110 @@ LoadLinuxAllocateKernelPages (
&KernelAddress
);
if (!EFI_ERROR (Status)) {
return (VOID*)(UINTN) KernelAddress;
return (VOID *)(UINTN)KernelAddress;
}
}
return NULL;
}
VOID*
VOID *
EFIAPI
LoadLinuxAllocateCommandLinePages (
IN UINTN Pages
IN UINTN Pages
)
{
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Address;
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Address;
Address = 0xa0000;
Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiLoaderData,
Pages,
&Address
);
Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiLoaderData,
Pages,
&Address
);
if (!EFI_ERROR (Status)) {
return (VOID*)(UINTN) Address;
return (VOID *)(UINTN)Address;
} else {
return NULL;
}
}
VOID*
VOID *
EFIAPI
LoadLinuxAllocateInitrdPages (
IN VOID *KernelSetup,
IN UINTN Pages
IN VOID *KernelSetup,
IN UINTN Pages
)
{
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Address;
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS Address;
struct boot_params *Bp;
struct boot_params *Bp;
if (EFI_ERROR (BasicKernelSetupCheck (KernelSetup))) {
return NULL;
}
Bp = (struct boot_params*) KernelSetup;
Bp = (struct boot_params *)KernelSetup;
Address = (EFI_PHYSICAL_ADDRESS)(UINTN) Bp->hdr.ramdisk_max;
Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiLoaderData,
Pages,
&Address
);
Address = (EFI_PHYSICAL_ADDRESS)(UINTN)Bp->hdr.ramdisk_max;
Status = gBS->AllocatePages (
AllocateMaxAddress,
EfiLoaderData,
Pages,
&Address
);
if (!EFI_ERROR (Status)) {
return (VOID*)(UINTN) Address;
return (VOID *)(UINTN)Address;
} else {
return NULL;
}
}
STATIC
VOID
SetupLinuxMemmap (
IN OUT struct boot_params *Bp
IN OUT struct boot_params *Bp
)
{
EFI_STATUS Status;
UINT8 TmpMemoryMap[1];
UINTN MapKey;
UINTN DescriptorSize;
UINT32 DescriptorVersion;
UINTN MemoryMapSize;
EFI_MEMORY_DESCRIPTOR *MemoryMap;
EFI_MEMORY_DESCRIPTOR *MemoryMapPtr;
UINTN Index;
struct efi_info *Efi;
struct e820_entry *LastE820;
struct e820_entry *E820;
UINTN E820EntryCount;
EFI_PHYSICAL_ADDRESS LastEndAddr;
EFI_STATUS Status;
UINT8 TmpMemoryMap[1];
UINTN MapKey;
UINTN DescriptorSize;
UINT32 DescriptorVersion;
UINTN MemoryMapSize;
EFI_MEMORY_DESCRIPTOR *MemoryMap;
EFI_MEMORY_DESCRIPTOR *MemoryMapPtr;
UINTN Index;
struct efi_info *Efi;
struct e820_entry *LastE820;
struct e820_entry *E820;
UINTN E820EntryCount;
EFI_PHYSICAL_ADDRESS LastEndAddr;
//
// Get System MemoryMapSize
//
MemoryMapSize = sizeof (TmpMemoryMap);
Status = gBS->GetMemoryMap (
&MemoryMapSize,
(EFI_MEMORY_DESCRIPTOR *)TmpMemoryMap,
&MapKey,
&DescriptorSize,
&DescriptorVersion
);
Status = gBS->GetMemoryMap (
&MemoryMapSize,
(EFI_MEMORY_DESCRIPTOR *)TmpMemoryMap,
&MapKey,
&DescriptorSize,
&DescriptorVersion
);
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
//
// Enlarge space here, because we will allocate pool now.
//
MemoryMapSize += EFI_PAGE_SIZE;
Status = gBS->AllocatePool (
EfiLoaderData,
MemoryMapSize,
(VOID **) &MemoryMap
);
Status = gBS->AllocatePool (
EfiLoaderData,
MemoryMapSize,
(VOID **)&MemoryMap
);
ASSERT_EFI_ERROR (Status);
//
@@ -294,70 +291,72 @@ SetupLinuxMemmap (
);
ASSERT_EFI_ERROR (Status);
LastE820 = NULL;
E820 = &Bp->e820_map[0];
LastE820 = NULL;
E820 = &Bp->e820_map[0];
E820EntryCount = 0;
LastEndAddr = 0;
MemoryMapPtr = MemoryMap;
LastEndAddr = 0;
MemoryMapPtr = MemoryMap;
for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) {
UINTN E820Type = 0;
UINTN E820Type = 0;
if (MemoryMap->NumberOfPages == 0) {
continue;
}
switch(MemoryMap->Type) {
case EfiReservedMemoryType:
case EfiRuntimeServicesCode:
case EfiRuntimeServicesData:
case EfiMemoryMappedIO:
case EfiMemoryMappedIOPortSpace:
case EfiPalCode:
E820Type = E820_RESERVED;
break;
switch (MemoryMap->Type) {
case EfiReservedMemoryType:
case EfiRuntimeServicesCode:
case EfiRuntimeServicesData:
case EfiMemoryMappedIO:
case EfiMemoryMappedIOPortSpace:
case EfiPalCode:
E820Type = E820_RESERVED;
break;
case EfiUnusableMemory:
E820Type = E820_UNUSABLE;
break;
case EfiUnusableMemory:
E820Type = E820_UNUSABLE;
break;
case EfiACPIReclaimMemory:
E820Type = E820_ACPI;
break;
case EfiACPIReclaimMemory:
E820Type = E820_ACPI;
break;
case EfiLoaderCode:
case EfiLoaderData:
case EfiBootServicesCode:
case EfiBootServicesData:
case EfiConventionalMemory:
E820Type = E820_RAM;
break;
case EfiLoaderCode:
case EfiLoaderData:
case EfiBootServicesCode:
case EfiBootServicesData:
case EfiConventionalMemory:
E820Type = E820_RAM;
break;
case EfiACPIMemoryNVS:
E820Type = E820_NVS;
break;
case EfiACPIMemoryNVS:
E820Type = E820_NVS;
break;
default:
DEBUG ((
DEBUG_ERROR,
"Invalid EFI memory descriptor type (0x%x)!\n",
MemoryMap->Type
));
continue;
default:
DEBUG ((
DEBUG_ERROR,
"Invalid EFI memory descriptor type (0x%x)!\n",
MemoryMap->Type
));
continue;
}
if ((LastE820 != NULL) &&
(LastE820->type == (UINT32) E820Type) &&
(MemoryMap->PhysicalStart == LastEndAddr)) {
LastE820->size += EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);
LastEndAddr += EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);
(LastE820->type == (UINT32)E820Type) &&
(MemoryMap->PhysicalStart == LastEndAddr))
{
LastE820->size += EFI_PAGES_TO_SIZE ((UINTN)MemoryMap->NumberOfPages);
LastEndAddr += EFI_PAGES_TO_SIZE ((UINTN)MemoryMap->NumberOfPages);
} else {
if (E820EntryCount >= ARRAY_SIZE (Bp->e820_map)) {
break;
}
E820->type = (UINT32) E820Type;
E820->addr = MemoryMap->PhysicalStart;
E820->size = EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);
LastE820 = E820;
E820->type = (UINT32)E820Type;
E820->addr = MemoryMap->PhysicalStart;
E820->size = EFI_PAGES_TO_SIZE ((UINTN)MemoryMap->NumberOfPages);
LastE820 = E820;
LastEndAddr = E820->addr + E820->size;
E820++;
E820EntryCount++;
@@ -368,85 +367,83 @@ SetupLinuxMemmap (
//
MemoryMap = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryMap + DescriptorSize);
}
Bp->e820_entries = (UINT8) E820EntryCount;
Efi = &Bp->efi_info;
Efi->efi_systab = (UINT32)(UINTN) gST;
Efi->efi_memdesc_size = (UINT32) DescriptorSize;
Bp->e820_entries = (UINT8)E820EntryCount;
Efi = &Bp->efi_info;
Efi->efi_systab = (UINT32)(UINTN)gST;
Efi->efi_memdesc_size = (UINT32)DescriptorSize;
Efi->efi_memdesc_version = DescriptorVersion;
Efi->efi_memmap = (UINT32)(UINTN) MemoryMapPtr;
Efi->efi_memmap_size = (UINT32) MemoryMapSize;
#ifdef MDE_CPU_IA32
Efi->efi_memmap = (UINT32)(UINTN)MemoryMapPtr;
Efi->efi_memmap_size = (UINT32)MemoryMapSize;
#ifdef MDE_CPU_IA32
Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '3', '2');
#else
Efi->efi_systab_hi = (UINT32) (((UINT64)(UINTN) gST) >> 32);
Efi->efi_memmap_hi = (UINT32) (((UINT64)(UINTN) MemoryMapPtr) >> 32);
#else
Efi->efi_systab_hi = (UINT32)(((UINT64)(UINTN)gST) >> 32);
Efi->efi_memmap_hi = (UINT32)(((UINT64)(UINTN)MemoryMapPtr) >> 32);
Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '6', '4');
#endif
#endif
gBS->ExitBootServices (gImageHandle, MapKey);
}
EFI_STATUS
EFIAPI
LoadLinuxSetCommandLine (
IN OUT VOID *KernelSetup,
IN CHAR8 *CommandLine
IN OUT VOID *KernelSetup,
IN CHAR8 *CommandLine
)
{
EFI_STATUS Status;
struct boot_params *Bp;
EFI_STATUS Status;
struct boot_params *Bp;
Status = BasicKernelSetupCheck (KernelSetup);
if (EFI_ERROR (Status)) {
return Status;
}
Bp = (struct boot_params*) KernelSetup;
Bp = (struct boot_params *)KernelSetup;
Bp->hdr.cmd_line_ptr = (UINT32)(UINTN) CommandLine;
Bp->hdr.cmd_line_ptr = (UINT32)(UINTN)CommandLine;
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
LoadLinuxSetInitrd (
IN OUT VOID *KernelSetup,
IN VOID *Initrd,
IN UINTN InitrdSize
IN OUT VOID *KernelSetup,
IN VOID *Initrd,
IN UINTN InitrdSize
)
{
EFI_STATUS Status;
struct boot_params *Bp;
EFI_STATUS Status;
struct boot_params *Bp;
Status = BasicKernelSetupCheck (KernelSetup);
if (EFI_ERROR (Status)) {
return Status;
}
Bp = (struct boot_params*) KernelSetup;
Bp = (struct boot_params *)KernelSetup;
Bp->hdr.ramdisk_start = (UINT32)(UINTN) Initrd;
Bp->hdr.ramdisk_len = (UINT32) InitrdSize;
Bp->hdr.ramdisk_start = (UINT32)(UINTN)Initrd;
Bp->hdr.ramdisk_len = (UINT32)InitrdSize;
return EFI_SUCCESS;
}
STATIC VOID
FindBits (
unsigned long Mask,
UINT8 *Pos,
UINT8 *Size
unsigned long Mask,
UINT8 *Pos,
UINT8 *Size
)
{
UINT8 First, Len;
UINT8 First, Len;
First = 0;
Len = 0;
Len = 0;
if (Mask) {
while (!(Mask & 0x1)) {
@@ -459,23 +456,23 @@ FindBits (
Len++;
}
}
*Pos = First;
*Pos = First;
*Size = Len;
}
STATIC
EFI_STATUS
SetupGraphicsFromGop (
struct screen_info *Si,
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop
struct screen_info *Si,
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop
)
{
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
EFI_STATUS Status;
UINTN Size;
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
EFI_STATUS Status;
UINTN Size;
Status = Gop->QueryMode(Gop, Gop->Mode->Mode, &Size, &Info);
Status = Gop->QueryMode (Gop, Gop->Mode->Mode, &Size, &Info);
if (EFI_ERROR (Status)) {
return Status;
}
@@ -485,88 +482,98 @@ SetupGraphicsFromGop (
/* EFI framebuffer */
Si->orig_video_isVGA = 0x70;
Si->orig_x = 0;
Si->orig_y = 0;
Si->orig_video_page = 0;
Si->orig_video_mode = 0;
Si->orig_video_cols = 0;
Si->orig_video_lines = 0;
Si->orig_x = 0;
Si->orig_y = 0;
Si->orig_video_page = 0;
Si->orig_video_mode = 0;
Si->orig_video_cols = 0;
Si->orig_video_lines = 0;
Si->orig_video_ega_bx = 0;
Si->orig_video_points = 0;
Si->lfb_base = (UINT32) Gop->Mode->FrameBufferBase;
Si->lfb_size = (UINT32) Gop->Mode->FrameBufferSize;
Si->lfb_width = (UINT16) Info->HorizontalResolution;
Si->lfb_height = (UINT16) Info->VerticalResolution;
Si->pages = 1;
Si->lfb_base = (UINT32)Gop->Mode->FrameBufferBase;
Si->lfb_size = (UINT32)Gop->Mode->FrameBufferSize;
Si->lfb_width = (UINT16)Info->HorizontalResolution;
Si->lfb_height = (UINT16)Info->VerticalResolution;
Si->pages = 1;
Si->vesapm_seg = 0;
Si->vesapm_off = 0;
if (Info->PixelFormat == PixelRedGreenBlueReserved8BitPerColor) {
Si->lfb_depth = 32;
Si->red_size = 8;
Si->red_pos = 0;
Si->green_size = 8;
Si->green_pos = 8;
Si->blue_size = 8;
Si->blue_pos = 16;
Si->rsvd_size = 8;
Si->rsvd_pos = 24;
Si->lfb_linelength = (UINT16) (Info->PixelsPerScanLine * 4);
Si->lfb_depth = 32;
Si->red_size = 8;
Si->red_pos = 0;
Si->green_size = 8;
Si->green_pos = 8;
Si->blue_size = 8;
Si->blue_pos = 16;
Si->rsvd_size = 8;
Si->rsvd_pos = 24;
Si->lfb_linelength = (UINT16)(Info->PixelsPerScanLine * 4);
} else if (Info->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) {
Si->lfb_depth = 32;
Si->red_size = 8;
Si->red_pos = 16;
Si->green_size = 8;
Si->green_pos = 8;
Si->blue_size = 8;
Si->blue_pos = 0;
Si->rsvd_size = 8;
Si->rsvd_pos = 24;
Si->lfb_linelength = (UINT16) (Info->PixelsPerScanLine * 4);
Si->lfb_depth = 32;
Si->red_size = 8;
Si->red_pos = 16;
Si->green_size = 8;
Si->green_pos = 8;
Si->blue_size = 8;
Si->blue_pos = 0;
Si->rsvd_size = 8;
Si->rsvd_pos = 24;
Si->lfb_linelength = (UINT16)(Info->PixelsPerScanLine * 4);
} else if (Info->PixelFormat == PixelBitMask) {
FindBits(Info->PixelInformation.RedMask,
&Si->red_pos, &Si->red_size);
FindBits(Info->PixelInformation.GreenMask,
&Si->green_pos, &Si->green_size);
FindBits(Info->PixelInformation.BlueMask,
&Si->blue_pos, &Si->blue_size);
FindBits(Info->PixelInformation.ReservedMask,
&Si->rsvd_pos, &Si->rsvd_size);
FindBits (
Info->PixelInformation.RedMask,
&Si->red_pos,
&Si->red_size
);
FindBits (
Info->PixelInformation.GreenMask,
&Si->green_pos,
&Si->green_size
);
FindBits (
Info->PixelInformation.BlueMask,
&Si->blue_pos,
&Si->blue_size
);
FindBits (
Info->PixelInformation.ReservedMask,
&Si->rsvd_pos,
&Si->rsvd_size
);
Si->lfb_depth = Si->red_size + Si->green_size +
Si->blue_size + Si->rsvd_size;
Si->lfb_linelength = (UINT16) ((Info->PixelsPerScanLine * Si->lfb_depth) / 8);
Si->blue_size + Si->rsvd_size;
Si->lfb_linelength = (UINT16)((Info->PixelsPerScanLine * Si->lfb_depth) / 8);
} else {
Si->lfb_depth = 4;
Si->red_size = 0;
Si->red_pos = 0;
Si->green_size = 0;
Si->green_pos = 0;
Si->blue_size = 0;
Si->blue_pos = 0;
Si->rsvd_size = 0;
Si->rsvd_pos = 0;
Si->lfb_depth = 4;
Si->red_size = 0;
Si->red_pos = 0;
Si->green_size = 0;
Si->green_pos = 0;
Si->blue_size = 0;
Si->blue_pos = 0;
Si->rsvd_size = 0;
Si->rsvd_pos = 0;
Si->lfb_linelength = Si->lfb_width / 2;
}
return Status;
}
STATIC
EFI_STATUS
SetupGraphics (
IN OUT struct boot_params *Bp
IN OUT struct boot_params *Bp
)
{
EFI_STATUS Status;
EFI_HANDLE *HandleBuffer;
UINTN HandleCount;
UINTN Index;
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
EFI_STATUS Status;
EFI_HANDLE *HandleBuffer;
UINTN HandleCount;
UINTN Index;
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
ZeroMem ((VOID*)&Bp->screen_info, sizeof(Bp->screen_info));
ZeroMem ((VOID *)&Bp->screen_info, sizeof (Bp->screen_info));
Status = gBS->LocateHandleBuffer (
ByProtocol,
@@ -580,7 +587,7 @@ SetupGraphics (
Status = gBS->HandleProtocol (
HandleBuffer[Index],
&gEfiGraphicsOutputProtocolGuid,
(VOID*) &Gop
(VOID *)&Gop
);
if (EFI_ERROR (Status)) {
continue;
@@ -599,11 +606,10 @@ SetupGraphics (
return EFI_NOT_FOUND;
}
STATIC
EFI_STATUS
SetupLinuxBootParams (
IN OUT struct boot_params *Bp
IN OUT struct boot_params *Bp
)
{
SetupGraphics (Bp);
@@ -613,7 +619,6 @@ SetupLinuxBootParams (
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
LoadLinux (
@@ -621,7 +626,7 @@ LoadLinux (
IN OUT VOID *KernelSetup
)
{
EFI_STATUS Status;
EFI_STATUS Status;
struct boot_params *Bp;
Status = BasicKernelSetupCheck (KernelSetup);
@@ -629,9 +634,9 @@ LoadLinux (
return Status;
}
Bp = (struct boot_params *) KernelSetup;
Bp = (struct boot_params *)KernelSetup;
if (Bp->hdr.version < 0x205 || !Bp->hdr.relocatable_kernel) {
if ((Bp->hdr.version < 0x205) || !Bp->hdr.relocatable_kernel) {
//
// We only support relocatable kernels
//
@@ -640,13 +645,14 @@ LoadLinux (
InitLinuxDescriptorTables ();
Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;
if (Bp->hdr.version >= 0x20c && Bp->hdr.handover_offset &&
(Bp->hdr.xloadflags & (sizeof (UINTN) == 4 ? BIT2 : BIT3))) {
Bp->hdr.code32_start = (UINT32)(UINTN)Kernel;
if ((Bp->hdr.version >= 0x20c) && Bp->hdr.handover_offset &&
(Bp->hdr.xloadflags & ((sizeof (UINTN) == 4) ? BIT2 : BIT3)))
{
DEBUG ((DEBUG_INFO, "Jumping to kernel EFI handover point at ofs %x\n", Bp->hdr.handover_offset));
DisableInterrupts ();
JumpToUefiKernel ((VOID*) gImageHandle, (VOID*) gST, KernelSetup, Kernel);
JumpToUefiKernel ((VOID *)gImageHandle, (VOID *)gST, KernelSetup, Kernel);
}
//
@@ -657,8 +663,7 @@ LoadLinux (
DEBUG ((DEBUG_INFO, "Jumping to kernel\n"));
DisableInterrupts ();
SetLinuxDescriptorTables ();
JumpToKernel (Kernel, (VOID*) KernelSetup);
JumpToKernel (Kernel, (VOID *)KernelSetup);
return EFI_SUCCESS;
}

View File

@@ -8,7 +8,6 @@
#include "LoadLinuxLib.h"
//
// Local structure definitions
//
@@ -20,33 +19,33 @@
//
typedef struct _GDT_ENTRY {
UINT16 Limit15_0;
UINT16 Base15_0;
UINT8 Base23_16;
UINT8 Type;
UINT8 Limit19_16_and_flags;
UINT8 Base31_24;
UINT16 Limit15_0;
UINT16 Base15_0;
UINT8 Base23_16;
UINT8 Type;
UINT8 Limit19_16_and_flags;
UINT8 Base31_24;
} GDT_ENTRY;
typedef
struct _GDT_ENTRIES {
GDT_ENTRY Null;
GDT_ENTRY Null2;
GDT_ENTRY Linear;
GDT_ENTRY LinearCode;
GDT_ENTRY TaskSegment;
GDT_ENTRY Spare4;
GDT_ENTRY Spare5;
struct _GDT_ENTRIES {
GDT_ENTRY Null;
GDT_ENTRY Null2;
GDT_ENTRY Linear;
GDT_ENTRY LinearCode;
GDT_ENTRY TaskSegment;
GDT_ENTRY Spare4;
GDT_ENTRY Spare5;
} GDT_ENTRIES;
#pragma pack ()
STATIC GDT_ENTRIES *mGdt = NULL;
STATIC GDT_ENTRIES *mGdt = NULL;
//
// Global descriptor table (GDT) Template
//
STATIC GDT_ENTRIES GdtTemplate = {
STATIC GDT_ENTRIES GdtTemplate = {
//
// Null
//
@@ -146,7 +145,6 @@ InitLinuxDescriptorTables (
// Initialize all GDT entries
//
CopyMem (mGdt, &GdtTemplate, sizeof (GdtTemplate));
}
/**
@@ -158,18 +156,17 @@ SetLinuxDescriptorTables (
VOID
)
{
IA32_DESCRIPTOR GdtPtr;
IA32_DESCRIPTOR IdtPtr;
IA32_DESCRIPTOR GdtPtr;
IA32_DESCRIPTOR IdtPtr;
//
// Write GDT register
//
GdtPtr.Base = (UINT32)(UINTN)(VOID*) mGdt;
GdtPtr.Limit = (UINT16) (sizeof (GdtTemplate) - 1);
GdtPtr.Base = (UINT32)(UINTN)(VOID *)mGdt;
GdtPtr.Limit = (UINT16)(sizeof (GdtTemplate) - 1);
AsmWriteGdtr (&GdtPtr);
IdtPtr.Base = (UINT32) 0;
IdtPtr.Limit = (UINT16) 0;
IdtPtr.Base = (UINT32)0;
IdtPtr.Limit = (UINT16)0;
AsmWriteIdtr (&IdtPtr);
}

View File

@@ -26,17 +26,17 @@
VOID
EFIAPI
JumpToKernel (
VOID *KernelStart,
VOID *KernelBootParams
VOID *KernelStart,
VOID *KernelBootParams
);
VOID
EFIAPI
JumpToUefiKernel (
EFI_HANDLE ImageHandle,
EFI_SYSTEM_TABLE *SystemTable,
VOID *KernelBootParams,
VOID *KernelStart
EFI_HANDLE ImageHandle,
EFI_SYSTEM_TABLE *SystemTable,
VOID *KernelBootParams,
VOID *KernelStart
);
VOID
@@ -50,4 +50,3 @@ SetLinuxDescriptorTables (
);
#endif

View File

@@ -29,17 +29,17 @@
STATIC
VOID *
AllocateMemoryBelow4G (
IN EFI_MEMORY_TYPE MemoryType,
IN UINTN Size
IN EFI_MEMORY_TYPE MemoryType,
IN UINTN Size
)
{
UINTN Pages;
EFI_PHYSICAL_ADDRESS Address;
EFI_STATUS Status;
VOID* Buffer;
VOID *Buffer;
UINTN AllocRemaining;
Pages = EFI_SIZE_TO_PAGES (Size);
Pages = EFI_SIZE_TO_PAGES (Size);
Address = 0xffffffff;
//
@@ -49,36 +49,35 @@ AllocateMemoryBelow4G (
// allocations, and use these to allocate memory for small buffers.
//
ASSERT (mLockBoxGlobal->Signature == LOCK_BOX_GLOBAL_SIGNATURE);
if ((UINTN) mLockBoxGlobal->SubPageRemaining >= Size) {
Buffer = (VOID*)(UINTN) mLockBoxGlobal->SubPageBuffer;
mLockBoxGlobal->SubPageBuffer += (UINT32) Size;
mLockBoxGlobal->SubPageRemaining -= (UINT32) Size;
if ((UINTN)mLockBoxGlobal->SubPageRemaining >= Size) {
Buffer = (VOID *)(UINTN)mLockBoxGlobal->SubPageBuffer;
mLockBoxGlobal->SubPageBuffer += (UINT32)Size;
mLockBoxGlobal->SubPageRemaining -= (UINT32)Size;
return Buffer;
}
Status = gBS->AllocatePages (
AllocateMaxAddress,
MemoryType,
Pages,
&Address
);
Status = gBS->AllocatePages (
AllocateMaxAddress,
MemoryType,
Pages,
&Address
);
if (EFI_ERROR (Status)) {
return NULL;
}
Buffer = (VOID *) (UINTN) Address;
Buffer = (VOID *)(UINTN)Address;
ZeroMem (Buffer, EFI_PAGES_TO_SIZE (Pages));
AllocRemaining = EFI_PAGES_TO_SIZE (Pages) - Size;
if (AllocRemaining > (UINTN) mLockBoxGlobal->SubPageRemaining) {
mLockBoxGlobal->SubPageBuffer = (UINT32) (Address + Size);
mLockBoxGlobal->SubPageRemaining = (UINT32) AllocRemaining;
if (AllocRemaining > (UINTN)mLockBoxGlobal->SubPageRemaining) {
mLockBoxGlobal->SubPageBuffer = (UINT32)(Address + Size);
mLockBoxGlobal->SubPageRemaining = (UINT32)AllocRemaining;
}
return Buffer;
}
/**
Allocates a buffer of type EfiACPIMemoryNVS.
@@ -102,7 +101,6 @@ AllocateAcpiNvsPool (
return AllocateMemoryBelow4G (EfiACPIMemoryNVS, AllocationSize);
}
EFI_STATUS
EFIAPI
LockBoxDxeLibInitialize (
@@ -110,8 +108,8 @@ LockBoxDxeLibInitialize (
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
VOID *Interface;
EFI_STATUS Status;
VOID *Interface;
Status = LockBoxLibInitialize ();
if (!EFI_ERROR (Status)) {

View File

@@ -18,17 +18,17 @@
#pragma pack(1)
typedef struct {
EFI_GUID Guid;
EFI_PHYSICAL_ADDRESS OrigAddress;
EFI_PHYSICAL_ADDRESS CopyAddress;
UINT32 Size;
UINT64 Attributes;
EFI_GUID Guid;
EFI_PHYSICAL_ADDRESS OrigAddress;
EFI_PHYSICAL_ADDRESS CopyAddress;
UINT32 Size;
UINT64 Attributes;
} LOCK_BOX_ENTRY;
#pragma pack()
LOCK_BOX_GLOBAL *mLockBoxGlobal = NULL;
STATIC LOCK_BOX_ENTRY *StartOfEntries = NULL;
STATIC LOCK_BOX_ENTRY *EndOfEntries = NULL;
LOCK_BOX_GLOBAL *mLockBoxGlobal = NULL;
STATIC LOCK_BOX_ENTRY *StartOfEntries = NULL;
STATIC LOCK_BOX_ENTRY *EndOfEntries = NULL;
RETURN_STATUS
EFIAPI
@@ -36,7 +36,7 @@ LockBoxLibInitialize (
VOID
)
{
UINTN NumEntries;
UINTN NumEntries;
ASSERT (!FeaturePcdGet (PcdSmmSmramRequire));
@@ -44,10 +44,10 @@ LockBoxLibInitialize (
return RETURN_UNSUPPORTED;
}
mLockBoxGlobal = (LOCK_BOX_GLOBAL *)(UINTN) PcdGet32 (PcdOvmfLockBoxStorageBase);
StartOfEntries = ((LOCK_BOX_ENTRY *) (mLockBoxGlobal + 1));
NumEntries = ((PcdGet32 (PcdOvmfLockBoxStorageSize) - sizeof (LOCK_BOX_GLOBAL)) /
sizeof (LOCK_BOX_ENTRY));
mLockBoxGlobal = (LOCK_BOX_GLOBAL *)(UINTN)PcdGet32 (PcdOvmfLockBoxStorageBase);
StartOfEntries = ((LOCK_BOX_ENTRY *)(mLockBoxGlobal + 1));
NumEntries = ((PcdGet32 (PcdOvmfLockBoxStorageSize) - sizeof (LOCK_BOX_GLOBAL)) /
sizeof (LOCK_BOX_ENTRY));
EndOfEntries = StartOfEntries + NumEntries;
if (mLockBoxGlobal->Signature != LOCK_BOX_GLOBAL_SIGNATURE) {
//
@@ -57,10 +57,10 @@ LockBoxLibInitialize (
//
mLockBoxGlobal->Signature = LOCK_BOX_GLOBAL_SIGNATURE;
}
return RETURN_SUCCESS;
}
/**
Find LockBox entry based on GUID.
@@ -80,13 +80,13 @@ STATIC
LOCK_BOX_ENTRY *
EFIAPI
FindHeaderByGuid (
IN CONST EFI_GUID *Guid
IN CONST EFI_GUID *Guid
)
{
LOCK_BOX_ENTRY *Header;
LOCK_BOX_ENTRY *Header;
for (Header = StartOfEntries; Header < EndOfEntries; Header++) {
if (Header->Size == 0 || CompareGuid (Guid, &Header->Guid)) {
if ((Header->Size == 0) || CompareGuid (Guid, &Header->Guid)) {
return Header;
}
}
@@ -94,7 +94,6 @@ FindHeaderByGuid (
return NULL;
}
/**
This function will save confidential information to lockbox.
@@ -115,18 +114,24 @@ FindHeaderByGuid (
RETURN_STATUS
EFIAPI
SaveLockBox (
IN GUID *Guid,
IN VOID *Buffer,
IN UINTN Length
IN GUID *Guid,
IN VOID *Buffer,
IN UINTN Length
)
{
LOCK_BOX_ENTRY *Header;
LOCK_BOX_ENTRY *Header;
VOID *CopyBuffer;
DEBUG ((DEBUG_VERBOSE, "%a: Guid=%g Buffer=%p Length=0x%x\n", __FUNCTION__,
Guid, Buffer, (UINT32) Length));
DEBUG ((
DEBUG_VERBOSE,
"%a: Guid=%g Buffer=%p Length=0x%x\n",
__FUNCTION__,
Guid,
Buffer,
(UINT32)Length
));
if (Guid == NULL || Buffer == NULL || Length == 0) {
if ((Guid == NULL) || (Buffer == NULL) || (Length == 0)) {
return RETURN_INVALID_PARAMETER;
}
@@ -152,9 +157,9 @@ SaveLockBox (
// overwrite the current terminator header with new metadata
//
CopyGuid (&Header->Guid, Guid);
Header->OrigAddress = (UINTN) Buffer;
Header->CopyAddress = (UINTN) CopyBuffer;
Header->Size = (UINT32) Length;
Header->OrigAddress = (UINTN)Buffer;
Header->CopyAddress = (UINTN)CopyBuffer;
Header->Size = (UINT32)Length;
Header->Attributes = 0;
//
@@ -165,7 +170,6 @@ SaveLockBox (
return RETURN_SUCCESS;
}
/**
This function will set lockbox attributes.
@@ -183,29 +187,34 @@ SaveLockBox (
RETURN_STATUS
EFIAPI
SetLockBoxAttributes (
IN GUID *Guid,
IN UINT64 Attributes
IN GUID *Guid,
IN UINT64 Attributes
)
{
LOCK_BOX_ENTRY *Header;
LOCK_BOX_ENTRY *Header;
DEBUG ((DEBUG_VERBOSE, "%a: Guid=%g Attributes=0x%Lx\n", __FUNCTION__, Guid,
Attributes));
DEBUG ((
DEBUG_VERBOSE,
"%a: Guid=%g Attributes=0x%Lx\n",
__FUNCTION__,
Guid,
Attributes
));
if (Guid == NULL) {
return RETURN_INVALID_PARAMETER;
}
Header = FindHeaderByGuid (Guid);
if (!Header || Header->Size == 0) {
if (!Header || (Header->Size == 0)) {
return RETURN_NOT_FOUND;
}
Header->Attributes = Attributes;
return RETURN_SUCCESS;
}
/**
This function will update confidential information to lockbox.
@@ -233,37 +242,43 @@ SetLockBoxAttributes (
RETURN_STATUS
EFIAPI
UpdateLockBox (
IN GUID *Guid,
IN UINTN Offset,
IN VOID *Buffer,
IN UINTN Length
IN GUID *Guid,
IN UINTN Offset,
IN VOID *Buffer,
IN UINTN Length
)
{
LOCK_BOX_ENTRY *Header;
LOCK_BOX_ENTRY *Header;
DEBUG ((DEBUG_VERBOSE, "%a: Guid=%g Offset=0x%x Length=0x%x\n", __FUNCTION__,
Guid, (UINT32) Offset, (UINT32) Length));
DEBUG ((
DEBUG_VERBOSE,
"%a: Guid=%g Offset=0x%x Length=0x%x\n",
__FUNCTION__,
Guid,
(UINT32)Offset,
(UINT32)Length
));
if (Guid == NULL || Buffer == NULL || Length == 0) {
if ((Guid == NULL) || (Buffer == NULL) || (Length == 0)) {
return RETURN_INVALID_PARAMETER;
}
Header = FindHeaderByGuid (Guid);
if (!Header || Header->Size == 0) {
if (!Header || (Header->Size == 0)) {
return RETURN_NOT_FOUND;
}
if (Header->Size < Offset ||
Length > Header->Size - Offset) {
if ((Header->Size < Offset) ||
(Length > Header->Size - Offset))
{
return RETURN_BUFFER_TOO_SMALL;
}
CopyMem ((UINT8 *)(UINTN) (Header->CopyAddress) + Offset, Buffer, Length);
CopyMem ((UINT8 *)(UINTN)(Header->CopyAddress) + Offset, Buffer, Length);
return RETURN_SUCCESS;
}
/**
This function will restore confidential information from lockbox.
@@ -290,24 +305,30 @@ UpdateLockBox (
RETURN_STATUS
EFIAPI
RestoreLockBox (
IN GUID *Guid,
IN VOID *Buffer OPTIONAL,
IN OUT UINTN *Length OPTIONAL
IN GUID *Guid,
IN VOID *Buffer OPTIONAL,
IN OUT UINTN *Length OPTIONAL
)
{
LOCK_BOX_ENTRY *Header;
LOCK_BOX_ENTRY *Header;
DEBUG ((DEBUG_VERBOSE, "%a: Guid=%g Buffer=%p\n", __FUNCTION__, Guid,
Buffer));
DEBUG ((
DEBUG_VERBOSE,
"%a: Guid=%g Buffer=%p\n",
__FUNCTION__,
Guid,
Buffer
));
if ((Guid == NULL) ||
((Buffer == NULL) && (Length != NULL)) ||
((Buffer != NULL) && (Length == NULL))) {
((Buffer != NULL) && (Length == NULL)))
{
return EFI_INVALID_PARAMETER;
}
Header = FindHeaderByGuid (Guid);
if (!Header || Header->Size == 0) {
if (!Header || (Header->Size == 0)) {
return RETURN_NOT_FOUND;
}
@@ -315,10 +336,12 @@ RestoreLockBox (
if (!(Header->Attributes & LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE)) {
return RETURN_WRITE_PROTECTED;
}
if (Header->OrigAddress + (Header->Size - 1) > MAX_ADDRESS) {
return RETURN_UNSUPPORTED;
}
Buffer = (VOID *)(UINTN) Header->OrigAddress;
Buffer = (VOID *)(UINTN)Header->OrigAddress;
}
//
@@ -332,15 +355,15 @@ RestoreLockBox (
*Length = Header->Size;
return EFI_BUFFER_TOO_SMALL;
}
*Length = Header->Size;
}
CopyMem (Buffer, (VOID*)(UINTN) Header->CopyAddress, Header->Size);
CopyMem (Buffer, (VOID *)(UINTN)Header->CopyAddress, Header->Size);
return RETURN_SUCCESS;
}
/**
This function will restore confidential information from all lockbox which
have RestoreInPlace attribute.
@@ -356,22 +379,30 @@ RestoreAllLockBoxInPlace (
VOID
)
{
LOCK_BOX_ENTRY *Header;
LOCK_BOX_ENTRY *Header;
for (Header = StartOfEntries;
Header < EndOfEntries && Header->Size > 0;
Header++) {
Header++)
{
if (Header->Attributes & LOCK_BOX_ATTRIBUTE_RESTORE_IN_PLACE) {
VOID *Buffer;
VOID *Buffer;
if (Header->OrigAddress + (Header->Size - 1) > MAX_ADDRESS) {
return RETURN_UNSUPPORTED;
}
Buffer = (VOID *)(UINTN) Header->OrigAddress;
CopyMem (Buffer, (VOID*)(UINTN)Header->CopyAddress, Header->Size);
DEBUG ((DEBUG_VERBOSE, "%a: Guid=%g Buffer=%p\n", __FUNCTION__,
&Header->Guid, Buffer));
Buffer = (VOID *)(UINTN)Header->OrigAddress;
CopyMem (Buffer, (VOID *)(UINTN)Header->CopyAddress, Header->Size);
DEBUG ((
DEBUG_VERBOSE,
"%a: Guid=%g Buffer=%p\n",
__FUNCTION__,
&Header->Guid,
Buffer
));
}
}
return RETURN_SUCCESS;
}

View File

@@ -12,14 +12,14 @@
#pragma pack(1)
typedef struct {
UINT32 Signature;
UINT32 SubPageBuffer;
UINT32 SubPageRemaining;
UINT32 Signature;
UINT32 SubPageBuffer;
UINT32 SubPageRemaining;
} LOCK_BOX_GLOBAL;
#define LOCK_BOX_GLOBAL_SIGNATURE SIGNATURE_32('L', 'B', 'G', 'S')
#define LOCK_BOX_GLOBAL_SIGNATURE SIGNATURE_32('L', 'B', 'G', 'S')
extern LOCK_BOX_GLOBAL *mLockBoxGlobal;
extern LOCK_BOX_GLOBAL *mLockBoxGlobal;
#pragma pack()
@@ -43,12 +43,10 @@ AllocateAcpiNvsPool (
IN UINTN AllocationSize
);
RETURN_STATUS
EFIAPI
LockBoxLibInitialize (
VOID
);
#endif

View File

@@ -12,7 +12,6 @@
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
/**
Open the NvVars file for reading or writing
@@ -26,14 +25,14 @@
**/
EFI_STATUS
GetNvVarsFile (
IN EFI_HANDLE FsHandle,
IN BOOLEAN ReadingFile,
OUT EFI_FILE_HANDLE *NvVarsFile
IN EFI_HANDLE FsHandle,
IN BOOLEAN ReadingFile,
OUT EFI_FILE_HANDLE *NvVarsFile
)
{
EFI_STATUS Status;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
EFI_FILE_HANDLE Root;
EFI_STATUS Status;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
EFI_FILE_HANDLE Root;
//
// Get the FileSystem protocol on that handle
@@ -63,19 +62,18 @@ GetNvVarsFile (
NvVarsFile,
L"NvVars",
ReadingFile ?
EFI_FILE_MODE_READ :
(
EFI_FILE_MODE_CREATE |
EFI_FILE_MODE_READ |
EFI_FILE_MODE_WRITE
),
EFI_FILE_MODE_READ :
(
EFI_FILE_MODE_CREATE |
EFI_FILE_MODE_READ |
EFI_FILE_MODE_WRITE
),
0
);
return Status;
}
/**
Open the NvVars file for reading or writing
@@ -87,15 +85,15 @@ GetNvVarsFile (
**/
VOID
NvVarsFileReadCheckup (
IN EFI_FILE_HANDLE File,
OUT BOOLEAN *Exists,
OUT UINTN *Size
IN EFI_FILE_HANDLE File,
OUT BOOLEAN *Exists,
OUT UINTN *Size
)
{
EFI_FILE_INFO *FileInfo;
EFI_FILE_INFO *FileInfo;
*Exists = FALSE;
*Size = 0;
*Size = 0;
FileInfo = FileHandleGetInfo (File);
if (FileInfo == NULL) {
@@ -108,12 +106,11 @@ NvVarsFileReadCheckup (
}
*Exists = TRUE;
*Size = (UINTN) FileInfo->FileSize;
*Size = (UINTN)FileInfo->FileSize;
FreePool (FileInfo);
}
/**
Open the NvVars file for reading or writing
@@ -125,11 +122,11 @@ NvVarsFileReadCheckup (
**/
EFI_STATUS
FileHandleEmpty (
IN EFI_FILE_HANDLE File
IN EFI_FILE_HANDLE File
)
{
EFI_STATUS Status;
EFI_FILE_INFO *FileInfo;
EFI_STATUS Status;
EFI_FILE_INFO *FileInfo;
//
// Retrieve the FileInfo structure
@@ -160,14 +157,13 @@ FileHandleEmpty (
// Set the file size to 0.
//
FileInfo->FileSize = 0;
Status = FileHandleSetInfo (File, FileInfo);
Status = FileHandleSetInfo (File, FileInfo);
FreePool (FileInfo);
return Status;
}
/**
Reads a file to a newly allocated buffer
@@ -178,18 +174,18 @@ FileHandleEmpty (
contents. NULL if an error occurred.
**/
VOID*
VOID *
FileHandleReadToNewBuffer (
IN EFI_FILE_HANDLE FileHandle,
IN UINTN ReadSize
IN EFI_FILE_HANDLE FileHandle,
IN UINTN ReadSize
)
{
EFI_STATUS Status;
UINTN ActualReadSize;
VOID *FileContents;
EFI_STATUS Status;
UINTN ActualReadSize;
VOID *FileContents;
ActualReadSize = ReadSize;
FileContents = AllocatePool (ReadSize);
FileContents = AllocatePool (ReadSize);
if (FileContents != NULL) {
Status = FileHandleRead (
FileHandle,
@@ -205,7 +201,6 @@ FileHandleReadToNewBuffer (
return FileContents;
}
/**
Reads the contents of the NvVars file on the file system
@@ -216,15 +211,15 @@ FileHandleReadToNewBuffer (
**/
EFI_STATUS
ReadNvVarsFile (
IN EFI_HANDLE FsHandle
IN EFI_HANDLE FsHandle
)
{
EFI_STATUS Status;
EFI_FILE_HANDLE File;
UINTN FileSize;
BOOLEAN FileExists;
VOID *FileContents;
EFI_HANDLE SerializedVariables;
EFI_STATUS Status;
EFI_FILE_HANDLE File;
UINTN FileSize;
BOOLEAN FileExists;
VOID *FileContents;
EFI_HANDLE SerializedVariables;
Status = GetNvVarsFile (FsHandle, TRUE, &File);
if (EFI_ERROR (Status)) {
@@ -265,7 +260,6 @@ ReadNvVarsFile (
return Status;
}
/**
Writes a variable to indicate that the NV variables
have been loaded from the file system.
@@ -277,28 +271,27 @@ SetNvVarsVariable (
VOID
)
{
BOOLEAN VarData;
UINTN Size;
BOOLEAN VarData;
UINTN Size;
//
// Write a variable to indicate we've already loaded the
// variable data. If it is found, we skip the loading on
// subsequent attempts.
//
Size = sizeof (VarData);
Size = sizeof (VarData);
VarData = TRUE;
gRT->SetVariable (
L"NvVars",
&gEfiSimpleFileSystemProtocolGuid,
EFI_VARIABLE_NON_VOLATILE |
EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS,
EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS,
Size,
(VOID*) &VarData
(VOID *)&VarData
);
}
/**
Loads the non-volatile variables from the NvVars file on the
given file system.
@@ -310,12 +303,12 @@ SetNvVarsVariable (
**/
EFI_STATUS
LoadNvVarsFromFs (
EFI_HANDLE FsHandle
EFI_HANDLE FsHandle
)
{
EFI_STATUS Status;
BOOLEAN VarData;
UINTN Size;
EFI_STATUS Status;
BOOLEAN VarData;
UINTN Size;
DEBUG ((DEBUG_INFO, "FsAccess.c: LoadNvVarsFromFs\n"));
@@ -328,15 +321,15 @@ LoadNvVarsFromFs (
// want to re-load the file as it would overwrite newer changes
// made to the variables.
//
Size = sizeof (VarData);
Size = sizeof (VarData);
VarData = TRUE;
Status = gRT->GetVariable (
L"NvVars",
&gEfiSimpleFileSystemProtocolGuid,
NULL,
&Size,
(VOID*) &VarData
);
Status = gRT->GetVariable (
L"NvVars",
&gEfiSimpleFileSystemProtocolGuid,
NULL,
&Size,
(VOID *)&VarData
);
if (Status == EFI_SUCCESS) {
DEBUG ((DEBUG_INFO, "NV Variables were already loaded\n"));
return EFI_ALREADY_STARTED;
@@ -356,7 +349,7 @@ LoadNvVarsFromFs (
// variable data. If it is found, we skip the loading on
// subsequent attempts.
//
SetNvVarsVariable();
SetNvVarsVariable ();
DEBUG ((
DEBUG_INFO,
@@ -367,22 +360,21 @@ LoadNvVarsFromFs (
return Status;
}
STATIC
RETURN_STATUS
EFIAPI
IterateVariablesCallbackAddAllNvVariables (
IN VOID *Context,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
IN VOID *Context,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
)
{
EFI_HANDLE Instance;
Instance = (EFI_HANDLE) Context;
Instance = (EFI_HANDLE)Context;
//
// Only save non-volatile variables
@@ -401,7 +393,6 @@ IterateVariablesCallbackAddAllNvVariables (
);
}
/**
Saves the non-volatile variables into the NvVars file on the
given file system.
@@ -413,15 +404,15 @@ IterateVariablesCallbackAddAllNvVariables (
**/
EFI_STATUS
SaveNvVarsToFs (
EFI_HANDLE FsHandle
EFI_HANDLE FsHandle
)
{
EFI_STATUS Status;
EFI_FILE_HANDLE File;
UINTN WriteSize;
UINTN VariableDataSize;
VOID *VariableData;
EFI_HANDLE SerializedVariables;
EFI_STATUS Status;
EFI_FILE_HANDLE File;
UINTN WriteSize;
UINTN VariableDataSize;
VOID *VariableData;
EFI_HANDLE SerializedVariables;
SerializedVariables = NULL;
@@ -432,19 +423,19 @@ SaveNvVarsToFs (
Status = SerializeVariablesIterateSystemVariables (
IterateVariablesCallbackAddAllNvVariables,
(VOID*) SerializedVariables
(VOID *)SerializedVariables
);
if (EFI_ERROR (Status)) {
return Status;
}
VariableData = NULL;
VariableData = NULL;
VariableDataSize = 0;
Status = SerializeVariablesToBuffer (
SerializedVariables,
NULL,
&VariableDataSize
);
Status = SerializeVariablesToBuffer (
SerializedVariables,
NULL,
&VariableDataSize
);
if (Status == RETURN_BUFFER_TOO_SMALL) {
VariableData = AllocatePool (VariableDataSize);
if (VariableData == NULL) {
@@ -483,7 +474,7 @@ SaveNvVarsToFs (
}
WriteSize = VariableDataSize;
Status = FileHandleWrite (File, &WriteSize, VariableData);
Status = FileHandleWrite (File, &WriteSize, VariableData);
if (EFI_ERROR (Status)) {
return Status;
}
@@ -496,13 +487,10 @@ SaveNvVarsToFs (
// variable data. If it is found, we skip the loading on
// subsequent attempts.
//
SetNvVarsVariable();
SetNvVarsVariable ();
DEBUG ((DEBUG_INFO, "Saved NV Variables to NvVars file\n"));
}
return Status;
}

View File

@@ -10,8 +10,7 @@
#include <Library/DebugLib.h>
#include <Library/NvVarsFileLib.h>
EFI_HANDLE mNvVarsFileLibFsHandle = NULL;
EFI_HANDLE mNvVarsFileLibFsHandle = NULL;
/**
Attempts to connect the NvVarsFileLib to the specified file system.
@@ -26,10 +25,10 @@ EFI_HANDLE mNvVarsFileLibFsHandle = NULL;
EFI_STATUS
EFIAPI
ConnectNvVarsToFileSystem (
IN EFI_HANDLE FsHandle
IN EFI_HANDLE FsHandle
)
{
EFI_STATUS Status;
EFI_STATUS Status;
//
// We might fail to load the variable, since the file system initially
@@ -49,7 +48,6 @@ ConnectNvVarsToFileSystem (
return Status;
}
/**
Update non-volatile variables stored on the file system.
@@ -73,5 +71,3 @@ UpdateNvVarsOnFileSystem (
return SaveNvVarsToFs (mNvVarsFileLibFsHandle);
}
}

View File

@@ -33,10 +33,9 @@
**/
EFI_STATUS
LoadNvVarsFromFs (
EFI_HANDLE FsHandle
EFI_HANDLE FsHandle
);
/**
Saves the non-volatile variables into the NvVars file on the
given file system.
@@ -48,8 +47,7 @@ LoadNvVarsFromFs (
**/
EFI_STATUS
SaveNvVarsToFs (
EFI_HANDLE FsHandle
EFI_HANDLE FsHandle
);
#endif

View File

@@ -16,8 +16,7 @@
#include <Protocol/PciHostBridgeResourceAllocation.h> // EFI_PCI_HOST_BRIDGE...
#include <Protocol/PciRootBridgeIo.h> // EFI_PCI_ATTRIBUTE_I...
STATIC PCI_ROOT_BRIDGE_APERTURE mNonExistAperture = { MAX_UINT64, 0 };
STATIC PCI_ROOT_BRIDGE_APERTURE mNonExistAperture = { MAX_UINT64, 0 };
/**
Return all the root bridge instances in an array.
@@ -31,59 +30,58 @@ STATIC PCI_ROOT_BRIDGE_APERTURE mNonExistAperture = { MAX_UINT64, 0 };
PCI_ROOT_BRIDGE *
EFIAPI
PciHostBridgeGetRootBridges (
UINTN *Count
UINTN *Count
)
{
UINT64 Attributes;
UINT64 AllocationAttributes;
PCI_ROOT_BRIDGE_APERTURE Io;
PCI_ROOT_BRIDGE_APERTURE Mem;
PCI_ROOT_BRIDGE_APERTURE MemAbove4G;
UINT64 Attributes;
UINT64 AllocationAttributes;
PCI_ROOT_BRIDGE_APERTURE Io;
PCI_ROOT_BRIDGE_APERTURE Mem;
PCI_ROOT_BRIDGE_APERTURE MemAbove4G;
ZeroMem (&Io, sizeof (Io));
ZeroMem (&Mem, sizeof (Mem));
ZeroMem (&MemAbove4G, sizeof (MemAbove4G));
Attributes = EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO |
EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO |
EFI_PCI_ATTRIBUTE_ISA_IO_16 |
EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO |
EFI_PCI_ATTRIBUTE_VGA_MEMORY |
EFI_PCI_ATTRIBUTE_VGA_IO_16 |
EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16;
EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO |
EFI_PCI_ATTRIBUTE_ISA_IO_16 |
EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO |
EFI_PCI_ATTRIBUTE_VGA_MEMORY |
EFI_PCI_ATTRIBUTE_VGA_IO_16 |
EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16;
AllocationAttributes = EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM;
if (PcdGet64 (PcdPciMmio64Size) > 0) {
AllocationAttributes |= EFI_PCI_HOST_BRIDGE_MEM64_DECODE;
MemAbove4G.Base = PcdGet64 (PcdPciMmio64Base);
MemAbove4G.Limit = PcdGet64 (PcdPciMmio64Base) +
PcdGet64 (PcdPciMmio64Size) - 1;
MemAbove4G.Base = PcdGet64 (PcdPciMmio64Base);
MemAbove4G.Limit = PcdGet64 (PcdPciMmio64Base) +
PcdGet64 (PcdPciMmio64Size) - 1;
} else {
CopyMem (&MemAbove4G, &mNonExistAperture, sizeof (mNonExistAperture));
}
Io.Base = PcdGet64 (PcdPciIoBase);
Io.Limit = PcdGet64 (PcdPciIoBase) + (PcdGet64 (PcdPciIoSize) - 1);
Mem.Base = PcdGet64 (PcdPciMmio32Base);
Io.Base = PcdGet64 (PcdPciIoBase);
Io.Limit = PcdGet64 (PcdPciIoBase) + (PcdGet64 (PcdPciIoSize) - 1);
Mem.Base = PcdGet64 (PcdPciMmio32Base);
Mem.Limit = PcdGet64 (PcdPciMmio32Base) + (PcdGet64 (PcdPciMmio32Size) - 1);
return PciHostBridgeUtilityGetRootBridges (
Count,
Attributes,
AllocationAttributes,
FALSE,
PcdGet16 (PcdOvmfHostBridgePciDevId) != INTEL_Q35_MCH_DEVICE_ID,
0,
PCI_MAX_BUS,
&Io,
&Mem,
&MemAbove4G,
&mNonExistAperture,
&mNonExistAperture
);
Count,
Attributes,
AllocationAttributes,
FALSE,
PcdGet16 (PcdOvmfHostBridgePciDevId) != INTEL_Q35_MCH_DEVICE_ID,
0,
PCI_MAX_BUS,
&Io,
&Mem,
&MemAbove4G,
&mNonExistAperture,
&mNonExistAperture
);
}
/**
Free the root bridge instances array returned from
PciHostBridgeGetRootBridges().
@@ -94,14 +92,13 @@ PciHostBridgeGetRootBridges (
VOID
EFIAPI
PciHostBridgeFreeRootBridges (
PCI_ROOT_BRIDGE *Bridges,
UINTN Count
PCI_ROOT_BRIDGE *Bridges,
UINTN Count
)
{
PciHostBridgeUtilityFreeRootBridges (Bridges, Count);
}
/**
Inform the platform that the resource conflict happens.
@@ -119,8 +116,8 @@ PciHostBridgeFreeRootBridges (
VOID
EFIAPI
PciHostBridgeResourceConflict (
EFI_HANDLE HostBridgeHandle,
VOID *Configuration
EFI_HANDLE HostBridgeHandle,
VOID *Configuration
)
{
PciHostBridgeUtilityResourceConflict (Configuration);

View File

@@ -11,5 +11,5 @@
PCI_ROOT_BRIDGE *
ScanForRootBridges (
UINTN *NumberOfRootBridges
);
UINTN *NumberOfRootBridges
);

View File

@@ -24,13 +24,12 @@
PCI_ROOT_BRIDGE *
EFIAPI
PciHostBridgeGetRootBridges (
UINTN *Count
UINTN *Count
)
{
return ScanForRootBridges (Count);
}
/**
Free the root bridge instances array returned from
PciHostBridgeGetRootBridges().
@@ -41,14 +40,13 @@ PciHostBridgeGetRootBridges (
VOID
EFIAPI
PciHostBridgeFreeRootBridges (
PCI_ROOT_BRIDGE *Bridges,
UINTN Count
PCI_ROOT_BRIDGE *Bridges,
UINTN Count
)
{
PciHostBridgeUtilityFreeRootBridges (Bridges, Count);
}
/**
Inform the platform that the resource conflict happens.
@@ -66,8 +64,8 @@ PciHostBridgeFreeRootBridges (
VOID
EFIAPI
PciHostBridgeResourceConflict (
EFI_HANDLE HostBridgeHandle,
VOID *Configuration
EFI_HANDLE HostBridgeHandle,
VOID *Configuration
)
{
PciHostBridgeUtilityResourceConflict (Configuration);

View File

@@ -23,9 +23,9 @@
STATIC
VOID
PcatPciRootBridgeBarExisted (
IN UINTN Address,
OUT UINT32 *OriginalValue,
OUT UINT32 *Value
IN UINTN Address,
OUT UINT32 *OriginalValue,
OUT UINT32 *Value
)
{
//
@@ -48,15 +48,15 @@ PcatPciRootBridgeBarExisted (
EnableInterrupts ();
}
#define PCI_COMMAND_DECODE ((UINT16)(EFI_PCI_COMMAND_IO_SPACE | \
#define PCI_COMMAND_DECODE ((UINT16)(EFI_PCI_COMMAND_IO_SPACE |\
EFI_PCI_COMMAND_MEMORY_SPACE))
STATIC
VOID
PcatPciRootBridgeDecodingDisable (
IN UINTN Address
IN UINTN Address
)
{
UINT16 Value;
UINT16 Value;
Value = PciRead16 (Address);
if (Value & PCI_COMMAND_DECODE) {
@@ -67,59 +67,63 @@ PcatPciRootBridgeDecodingDisable (
STATIC
VOID
PcatPciRootBridgeParseBars (
IN UINT16 Command,
IN UINTN Bus,
IN UINTN Device,
IN UINTN Function,
IN UINTN BarOffsetBase,
IN UINTN BarOffsetEnd,
IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G
IN UINT16 Command,
IN UINTN Bus,
IN UINTN Device,
IN UINTN Function,
IN UINTN BarOffsetBase,
IN UINTN BarOffsetEnd,
IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G
)
)
{
UINT32 OriginalValue;
UINT32 Value;
UINT32 OriginalUpperValue;
UINT32 UpperValue;
UINT64 Mask;
UINTN Offset;
UINT64 Base;
UINT64 Length;
UINT64 Limit;
PCI_ROOT_BRIDGE_APERTURE *MemAperture;
UINT32 OriginalValue;
UINT32 Value;
UINT32 OriginalUpperValue;
UINT32 UpperValue;
UINT64 Mask;
UINTN Offset;
UINT64 Base;
UINT64 Length;
UINT64 Limit;
PCI_ROOT_BRIDGE_APERTURE *MemAperture;
// Disable address decoding for every device before OVMF starts sizing it
PcatPciRootBridgeDecodingDisable (
PCI_LIB_ADDRESS (Bus, Device, Function, PCI_COMMAND_OFFSET)
);
);
for (Offset = BarOffsetBase; Offset < BarOffsetEnd; Offset += sizeof (UINT32)) {
PcatPciRootBridgeBarExisted (
PCI_LIB_ADDRESS (Bus, Device, Function, Offset),
&OriginalValue, &Value
);
&OriginalValue,
&Value
);
if (Value == 0) {
continue;
}
if ((Value & BIT0) == BIT0) {
//
// IO Bar
//
if (Command & EFI_PCI_COMMAND_IO_SPACE) {
Mask = 0xfffffffc;
Base = OriginalValue & Mask;
Mask = 0xfffffffc;
Base = OriginalValue & Mask;
Length = ((~(Value & Mask)) & Mask) + 0x04;
if (!(Value & 0xFFFF0000)) {
Length &= 0x0000FFFF;
}
Limit = Base + Length - 1;
if (Base < Limit) {
if (Io->Base > Base) {
Io->Base = Base;
}
if (Io->Limit < Limit) {
Io->Limit = Limit;
}
@@ -130,9 +134,8 @@ PcatPciRootBridgeParseBars (
// Mem Bar
//
if (Command & EFI_PCI_COMMAND_MEMORY_SPACE) {
Mask = 0xfffffff0;
Base = OriginalValue & Mask;
Mask = 0xfffffff0;
Base = OriginalValue & Mask;
Length = Value & Mask;
if ((Value & (BIT1 | BIT2)) == 0) {
@@ -151,10 +154,10 @@ PcatPciRootBridgeParseBars (
PCI_LIB_ADDRESS (Bus, Device, Function, Offset),
&OriginalUpperValue,
&UpperValue
);
);
Base = Base | LShiftU64 ((UINT64) OriginalUpperValue, 32);
Length = Length | LShiftU64 ((UINT64) UpperValue, 32);
Base = Base | LShiftU64 ((UINT64)OriginalUpperValue, 32);
Length = Length | LShiftU64 ((UINT64)UpperValue, 32);
Length = (~Length) + 1;
if (Base < BASE_4GB) {
@@ -169,6 +172,7 @@ PcatPciRootBridgeParseBars (
if (MemAperture->Base > Base) {
MemAperture->Base = Base;
}
if (MemAperture->Limit < Limit) {
MemAperture->Limit = Limit;
}
@@ -178,31 +182,30 @@ PcatPciRootBridgeParseBars (
}
}
STATIC PCI_ROOT_BRIDGE_APERTURE mNonExistAperture = { MAX_UINT64, 0 };
STATIC PCI_ROOT_BRIDGE_APERTURE mNonExistAperture = { MAX_UINT64, 0 };
PCI_ROOT_BRIDGE *
ScanForRootBridges (
UINTN *NumberOfRootBridges
UINTN *NumberOfRootBridges
)
{
UINTN PrimaryBus;
UINTN SubBus;
UINT8 Device;
UINT8 Function;
UINTN NumberOfDevices;
UINTN Address;
PCI_TYPE01 Pci;
UINT64 Attributes;
UINT64 Base;
UINT64 Limit;
UINT64 Value;
PCI_ROOT_BRIDGE_APERTURE Io, Mem, MemAbove4G, *MemAperture;
PCI_ROOT_BRIDGE *RootBridges;
UINTN BarOffsetEnd;
UINTN PrimaryBus;
UINTN SubBus;
UINT8 Device;
UINT8 Function;
UINTN NumberOfDevices;
UINTN Address;
PCI_TYPE01 Pci;
UINT64 Attributes;
UINT64 Base;
UINT64 Limit;
UINT64 Value;
PCI_ROOT_BRIDGE_APERTURE Io, Mem, MemAbove4G, *MemAperture;
PCI_ROOT_BRIDGE *RootBridges;
UINTN BarOffsetEnd;
*NumberOfRootBridges = 0;
RootBridges = NULL;
RootBridges = NULL;
//
// After scanning all the PCI devices on the PCI root bridge's primary bus,
@@ -210,7 +213,7 @@ ScanForRootBridges (
// root bridge's subordinate bus number + 1.
//
for (PrimaryBus = 0; PrimaryBus <= PCI_MAX_BUS; PrimaryBus = SubBus + 1) {
SubBus = PrimaryBus;
SubBus = PrimaryBus;
Attributes = 0;
ZeroMem (&Io, sizeof (Io));
@@ -221,9 +224,7 @@ ScanForRootBridges (
// Scan all the PCI devices on the primary bus of the PCI root bridge
//
for (Device = 0, NumberOfDevices = 0; Device <= PCI_MAX_DEVICE; Device++) {
for (Function = 0; Function <= PCI_MAX_FUNC; Function++) {
//
// Compute the PCI configuration address of the PCI device to probe
//
@@ -290,16 +291,18 @@ ScanForRootBridges (
// Get the I/O range that the PPB is decoding
//
Value = Pci.Bridge.IoBase & 0x0f;
Base = ((UINT32) Pci.Bridge.IoBase & 0xf0) << 8;
Limit = (((UINT32) Pci.Bridge.IoLimit & 0xf0) << 8) | 0x0fff;
Base = ((UINT32)Pci.Bridge.IoBase & 0xf0) << 8;
Limit = (((UINT32)Pci.Bridge.IoLimit & 0xf0) << 8) | 0x0fff;
if (Value == BIT0) {
Base |= ((UINT32) Pci.Bridge.IoBaseUpper16 << 16);
Limit |= ((UINT32) Pci.Bridge.IoLimitUpper16 << 16);
Base |= ((UINT32)Pci.Bridge.IoBaseUpper16 << 16);
Limit |= ((UINT32)Pci.Bridge.IoLimitUpper16 << 16);
}
if (Base < Limit) {
if (Io.Base > Base) {
Io.Base = Base;
}
if (Io.Limit < Limit) {
Io.Limit = Limit;
}
@@ -308,12 +311,13 @@ ScanForRootBridges (
//
// Get the Memory range that the PPB is decoding
//
Base = ((UINT32) Pci.Bridge.MemoryBase & 0xfff0) << 16;
Limit = (((UINT32) Pci.Bridge.MemoryLimit & 0xfff0) << 16) | 0xfffff;
Base = ((UINT32)Pci.Bridge.MemoryBase & 0xfff0) << 16;
Limit = (((UINT32)Pci.Bridge.MemoryLimit & 0xfff0) << 16) | 0xfffff;
if (Base < Limit) {
if (Mem.Base > Base) {
Mem.Base = Base;
}
if (Mem.Limit < Limit) {
Mem.Limit = Limit;
}
@@ -324,19 +328,21 @@ ScanForRootBridges (
// and merge it into Memory range
//
Value = Pci.Bridge.PrefetchableMemoryBase & 0x0f;
Base = ((UINT32) Pci.Bridge.PrefetchableMemoryBase & 0xfff0) << 16;
Limit = (((UINT32) Pci.Bridge.PrefetchableMemoryLimit & 0xfff0)
Base = ((UINT32)Pci.Bridge.PrefetchableMemoryBase & 0xfff0) << 16;
Limit = (((UINT32)Pci.Bridge.PrefetchableMemoryLimit & 0xfff0)
<< 16) | 0xfffff;
MemAperture = &Mem;
if (Value == BIT0) {
Base |= LShiftU64 (Pci.Bridge.PrefetchableBaseUpper32, 32);
Limit |= LShiftU64 (Pci.Bridge.PrefetchableLimitUpper32, 32);
Base |= LShiftU64 (Pci.Bridge.PrefetchableBaseUpper32, 32);
Limit |= LShiftU64 (Pci.Bridge.PrefetchableLimitUpper32, 32);
MemAperture = &MemAbove4G;
}
if (Base < Limit) {
if (MemAperture->Base > Base) {
MemAperture->Base = Base;
}
if (MemAperture->Limit < Limit) {
MemAperture->Limit = Limit;
}
@@ -346,18 +352,22 @@ ScanForRootBridges (
// Look at the PPB Configuration for legacy decoding attributes
//
if ((Pci.Bridge.BridgeControl & EFI_PCI_BRIDGE_CONTROL_ISA)
== EFI_PCI_BRIDGE_CONTROL_ISA) {
== EFI_PCI_BRIDGE_CONTROL_ISA)
{
Attributes |= EFI_PCI_ATTRIBUTE_ISA_IO;
Attributes |= EFI_PCI_ATTRIBUTE_ISA_IO_16;
Attributes |= EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO;
}
if ((Pci.Bridge.BridgeControl & EFI_PCI_BRIDGE_CONTROL_VGA)
== EFI_PCI_BRIDGE_CONTROL_VGA) {
== EFI_PCI_BRIDGE_CONTROL_VGA)
{
Attributes |= EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO;
Attributes |= EFI_PCI_ATTRIBUTE_VGA_MEMORY;
Attributes |= EFI_PCI_ATTRIBUTE_VGA_IO;
if ((Pci.Bridge.BridgeControl & EFI_PCI_BRIDGE_CONTROL_VGA_16)
!= 0) {
!= 0)
{
Attributes |= EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16;
Attributes |= EFI_PCI_ATTRIBUTE_VGA_IO_16;
}
@@ -382,21 +392,28 @@ ScanForRootBridges (
OFFSET_OF (PCI_TYPE00, Device.Bar),
BarOffsetEnd,
&Io,
&Mem, &MemAbove4G
);
&Mem,
&MemAbove4G
);
//
// See if the PCI device is an IDE controller
//
if (IS_CLASS2 (&Pci, PCI_CLASS_MASS_STORAGE,
PCI_CLASS_MASS_STORAGE_IDE)) {
if (IS_CLASS2 (
&Pci,
PCI_CLASS_MASS_STORAGE,
PCI_CLASS_MASS_STORAGE_IDE
))
{
if (Pci.Hdr.ClassCode[0] & 0x80) {
Attributes |= EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO;
Attributes |= EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO;
}
if (Pci.Hdr.ClassCode[0] & 0x01) {
Attributes |= EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO;
}
if (Pci.Hdr.ClassCode[0] & 0x04) {
Attributes |= EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO;
}
@@ -408,7 +425,8 @@ ScanForRootBridges (
//
if (IS_CLASS2 (&Pci, PCI_CLASS_OLD, PCI_CLASS_OLD_VGA) ||
IS_CLASS2 (&Pci, PCI_CLASS_DISPLAY, PCI_CLASS_DISPLAY_VGA)
) {
)
{
Attributes |= EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO;
Attributes |= EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16;
Attributes |= EFI_PCI_ATTRIBUTE_VGA_MEMORY;
@@ -421,9 +439,10 @@ ScanForRootBridges (
// or ISA_POSITIVE_DECODE Bridge device
//
if (Pci.Hdr.ClassCode[2] == PCI_CLASS_BRIDGE) {
if (Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA ||
Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_EISA ||
Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE) {
if ((Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA) ||
(Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_EISA) ||
(Pci.Hdr.ClassCode[1] == PCI_CLASS_BRIDGE_ISA_PDECODE))
{
Attributes |= EFI_PCI_ATTRIBUTE_ISA_IO;
Attributes |= EFI_PCI_ATTRIBUTE_ISA_IO_16;
Attributes |= EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO;
@@ -434,7 +453,7 @@ ScanForRootBridges (
// If this device is not a multi function device, then skip the rest
// of this PCI device
//
if (Function == 0 && !IS_PCI_MULTI_FUNC (&Pci)) {
if ((Function == 0) && !IS_PCI_MULTI_FUNC (&Pci)) {
break;
}
}
@@ -446,18 +465,26 @@ ScanForRootBridges (
//
if (NumberOfDevices > 0) {
RootBridges = ReallocatePool (
(*NumberOfRootBridges) * sizeof (PCI_ROOT_BRIDGE),
(*NumberOfRootBridges + 1) * sizeof (PCI_ROOT_BRIDGE),
RootBridges
);
(*NumberOfRootBridges) * sizeof (PCI_ROOT_BRIDGE),
(*NumberOfRootBridges + 1) * sizeof (PCI_ROOT_BRIDGE),
RootBridges
);
ASSERT (RootBridges != NULL);
PciHostBridgeUtilityInitRootBridge (
Attributes, Attributes, 0,
FALSE, TRUE /* NoExtendedConfigSpace */,
(UINT8) PrimaryBus, (UINT8) SubBus,
&Io, &Mem, &MemAbove4G, &mNonExistAperture, &mNonExistAperture,
Attributes,
Attributes,
0,
FALSE,
TRUE /* NoExtendedConfigSpace */,
(UINT8)PrimaryBus,
(UINT8)SubBus,
&Io,
&Mem,
&MemAbove4G,
&mNonExistAperture,
&mNonExistAperture,
&RootBridges[*NumberOfRootBridges]
);
);
RootBridges[*NumberOfRootBridges].ResourceAssigned = TRUE;
//
// Increment the index for the next PCI Root Bridge

View File

@@ -20,35 +20,32 @@
#include <Library/PciLib.h>
#include <Library/QemuFwCfgLib.h>
#pragma pack(1)
typedef struct {
ACPI_HID_DEVICE_PATH AcpiDevicePath;
EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
ACPI_HID_DEVICE_PATH AcpiDevicePath;
EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
} OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH;
#pragma pack ()
GLOBAL_REMOVE_IF_UNREFERENCED
CHAR16 *mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[] = {
CHAR16 *mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[] = {
L"Mem", L"I/O", L"Bus"
};
STATIC
CONST
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {
{
{
ACPI_DEVICE_PATH,
ACPI_DP,
{
(UINT8) (sizeof(ACPI_HID_DEVICE_PATH)),
(UINT8) ((sizeof(ACPI_HID_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (ACPI_HID_DEVICE_PATH)),
(UINT8)((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
}
},
EISA_PNP_ID(0x0A03), // HID
0 // UID
EISA_PNP_ID (0x0A03), // HID
0 // UID
},
{
@@ -61,7 +58,6 @@ OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {
}
};
/**
Utility function to initialize a PCI_ROOT_BRIDGE structure.
@@ -112,22 +108,22 @@ OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {
EFI_STATUS
EFIAPI
PciHostBridgeUtilityInitRootBridge (
IN UINT64 Supports,
IN UINT64 Attributes,
IN UINT64 AllocAttributes,
IN BOOLEAN DmaAbove4G,
IN BOOLEAN NoExtendedConfigSpace,
IN UINT8 RootBusNumber,
IN UINT8 MaxSubBusNumber,
IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
IN PCI_ROOT_BRIDGE_APERTURE *PMem,
IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G,
OUT PCI_ROOT_BRIDGE *RootBus
IN UINT64 Supports,
IN UINT64 Attributes,
IN UINT64 AllocAttributes,
IN BOOLEAN DmaAbove4G,
IN BOOLEAN NoExtendedConfigSpace,
IN UINT8 RootBusNumber,
IN UINT8 MaxSubBusNumber,
IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
IN PCI_ROOT_BRIDGE_APERTURE *PMem,
IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G,
OUT PCI_ROOT_BRIDGE *RootBus
)
{
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH *DevicePath;
OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH *DevicePath;
//
// Be safe if other fields are added to PCI_ROOT_BRIDGE later.
@@ -142,8 +138,8 @@ PciHostBridgeUtilityInitRootBridge (
RootBus->DmaAbove4G = DmaAbove4G;
RootBus->AllocationAttributes = AllocAttributes;
RootBus->Bus.Base = RootBusNumber;
RootBus->Bus.Limit = MaxSubBusNumber;
RootBus->Bus.Base = RootBusNumber;
RootBus->Bus.Limit = MaxSubBusNumber;
CopyMem (&RootBus->Io, Io, sizeof (*Io));
CopyMem (&RootBus->Mem, Mem, sizeof (*Mem));
CopyMem (&RootBus->MemAbove4G, MemAbove4G, sizeof (*MemAbove4G));
@@ -152,22 +148,28 @@ PciHostBridgeUtilityInitRootBridge (
RootBus->NoExtendedConfigSpace = NoExtendedConfigSpace;
DevicePath = AllocateCopyPool (sizeof mRootBridgeDevicePathTemplate,
&mRootBridgeDevicePathTemplate);
DevicePath = AllocateCopyPool (
sizeof mRootBridgeDevicePathTemplate,
&mRootBridgeDevicePathTemplate
);
if (DevicePath == NULL) {
DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, EFI_OUT_OF_RESOURCES));
return EFI_OUT_OF_RESOURCES;
}
DevicePath->AcpiDevicePath.UID = RootBusNumber;
RootBus->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)DevicePath;
DEBUG ((DEBUG_INFO,
DevicePath->AcpiDevicePath.UID = RootBusNumber;
RootBus->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)DevicePath;
DEBUG ((
DEBUG_INFO,
"%a: populated root bus %d, with room for %d subordinate bus(es)\n",
__FUNCTION__, RootBusNumber, MaxSubBusNumber - RootBusNumber));
__FUNCTION__,
RootBusNumber,
MaxSubBusNumber - RootBusNumber
));
return EFI_SUCCESS;
}
/**
Utility function to uninitialize a PCI_ROOT_BRIDGE structure set up with
PciHostBridgeUtilityInitRootBridge().
@@ -180,13 +182,12 @@ PciHostBridgeUtilityInitRootBridge (
VOID
EFIAPI
PciHostBridgeUtilityUninitRootBridge (
IN PCI_ROOT_BRIDGE *RootBus
IN PCI_ROOT_BRIDGE *RootBus
)
{
FreePool (RootBus->DevicePath);
}
/**
Utility function to return all the root bridge instances in an array.
@@ -219,34 +220,40 @@ PciHostBridgeUtilityUninitRootBridge (
PCI_ROOT_BRIDGE *
EFIAPI
PciHostBridgeUtilityGetRootBridges (
OUT UINTN *Count,
IN UINT64 Attributes,
IN UINT64 AllocationAttributes,
IN BOOLEAN DmaAbove4G,
IN BOOLEAN NoExtendedConfigSpace,
IN UINTN BusMin,
IN UINTN BusMax,
IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
IN PCI_ROOT_BRIDGE_APERTURE *PMem,
IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G
OUT UINTN *Count,
IN UINT64 Attributes,
IN UINT64 AllocationAttributes,
IN BOOLEAN DmaAbove4G,
IN BOOLEAN NoExtendedConfigSpace,
IN UINTN BusMin,
IN UINTN BusMax,
IN PCI_ROOT_BRIDGE_APERTURE *Io,
IN PCI_ROOT_BRIDGE_APERTURE *Mem,
IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
IN PCI_ROOT_BRIDGE_APERTURE *PMem,
IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G
)
{
EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM FwCfgItem;
UINTN FwCfgSize;
UINT64 ExtraRootBridges;
PCI_ROOT_BRIDGE *Bridges;
UINTN Initialized;
UINTN LastRootBridgeNumber;
UINTN RootBridgeNumber;
EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM FwCfgItem;
UINTN FwCfgSize;
UINT64 ExtraRootBridges;
PCI_ROOT_BRIDGE *Bridges;
UINTN Initialized;
UINTN LastRootBridgeNumber;
UINTN RootBridgeNumber;
*Count = 0;
if (BusMin > BusMax || BusMax > PCI_MAX_BUS) {
DEBUG ((DEBUG_ERROR, "%a: invalid bus range with BusMin %Lu and BusMax "
"%Lu\n", __FUNCTION__, (UINT64)BusMin, (UINT64)BusMax));
if ((BusMin > BusMax) || (BusMax > PCI_MAX_BUS)) {
DEBUG ((
DEBUG_ERROR,
"%a: invalid bus range with BusMin %Lu and BusMax "
"%Lu\n",
__FUNCTION__,
(UINT64)BusMin,
(UINT64)BusMax
));
return NULL;
}
@@ -255,7 +262,7 @@ PciHostBridgeUtilityGetRootBridges (
// search below. If there is no hint, the feature is missing.
//
Status = QemuFwCfgFindFile ("etc/extra-pci-roots", &FwCfgItem, &FwCfgSize);
if (EFI_ERROR (Status) || FwCfgSize != sizeof ExtraRootBridges) {
if (EFI_ERROR (Status) || (FwCfgSize != sizeof ExtraRootBridges)) {
ExtraRootBridges = 0;
} else {
QemuFwCfgSelectItem (FwCfgItem);
@@ -269,12 +276,22 @@ PciHostBridgeUtilityGetRootBridges (
// invalid behavior.
//
if (ExtraRootBridges > BusMax - BusMin) {
DEBUG ((DEBUG_ERROR, "%a: invalid count of extra root buses (%Lu) "
"reported by QEMU\n", __FUNCTION__, ExtraRootBridges));
DEBUG ((
DEBUG_ERROR,
"%a: invalid count of extra root buses (%Lu) "
"reported by QEMU\n",
__FUNCTION__,
ExtraRootBridges
));
return NULL;
}
DEBUG ((DEBUG_INFO, "%a: %Lu extra root buses reported by QEMU\n",
__FUNCTION__, ExtraRootBridges));
DEBUG ((
DEBUG_INFO,
"%a: %Lu extra root buses reported by QEMU\n",
__FUNCTION__,
ExtraRootBridges
));
}
//
@@ -285,6 +302,7 @@ PciHostBridgeUtilityGetRootBridges (
DEBUG ((DEBUG_ERROR, "%a: %r\n", __FUNCTION__, EFI_OUT_OF_RESOURCES));
return NULL;
}
Initialized = 0;
//
@@ -299,15 +317,24 @@ PciHostBridgeUtilityGetRootBridges (
//
for (RootBridgeNumber = BusMin + 1;
RootBridgeNumber <= BusMax && Initialized < ExtraRootBridges;
++RootBridgeNumber) {
UINTN Device;
++RootBridgeNumber)
{
UINTN Device;
for (Device = 0; Device <= PCI_MAX_DEVICE; ++Device) {
if (PciRead16 (PCI_LIB_ADDRESS (RootBridgeNumber, Device, 0,
PCI_VENDOR_ID_OFFSET)) != MAX_UINT16) {
if (PciRead16 (
PCI_LIB_ADDRESS (
RootBridgeNumber,
Device,
0,
PCI_VENDOR_ID_OFFSET
)
) != MAX_UINT16)
{
break;
}
}
if (Device <= PCI_MAX_DEVICE) {
//
// Found the next root bus. We can now install the *previous* one,
@@ -315,23 +342,24 @@ PciHostBridgeUtilityGetRootBridges (
// subordinate buses that might exist behind PCI bridges hanging off it.
//
Status = PciHostBridgeUtilityInitRootBridge (
Attributes,
Attributes,
AllocationAttributes,
DmaAbove4G,
NoExtendedConfigSpace,
(UINT8) LastRootBridgeNumber,
(UINT8) (RootBridgeNumber - 1),
Io,
Mem,
MemAbove4G,
PMem,
PMemAbove4G,
&Bridges[Initialized]
);
Attributes,
Attributes,
AllocationAttributes,
DmaAbove4G,
NoExtendedConfigSpace,
(UINT8)LastRootBridgeNumber,
(UINT8)(RootBridgeNumber - 1),
Io,
Mem,
MemAbove4G,
PMem,
PMemAbove4G,
&Bridges[Initialized]
);
if (EFI_ERROR (Status)) {
goto FreeBridges;
}
++Initialized;
LastRootBridgeNumber = RootBridgeNumber;
}
@@ -342,23 +370,24 @@ PciHostBridgeUtilityGetRootBridges (
// we've found no extra root buses).
//
Status = PciHostBridgeUtilityInitRootBridge (
Attributes,
Attributes,
AllocationAttributes,
DmaAbove4G,
NoExtendedConfigSpace,
(UINT8) LastRootBridgeNumber,
(UINT8) BusMax,
Io,
Mem,
MemAbove4G,
PMem,
PMemAbove4G,
&Bridges[Initialized]
);
Attributes,
Attributes,
AllocationAttributes,
DmaAbove4G,
NoExtendedConfigSpace,
(UINT8)LastRootBridgeNumber,
(UINT8)BusMax,
Io,
Mem,
MemAbove4G,
PMem,
PMemAbove4G,
&Bridges[Initialized]
);
if (EFI_ERROR (Status)) {
goto FreeBridges;
}
++Initialized;
*Count = Initialized;
@@ -374,7 +403,6 @@ FreeBridges:
return NULL;
}
/**
Utility function to free root bridge instances array from
PciHostBridgeUtilityGetRootBridges().
@@ -385,13 +413,14 @@ FreeBridges:
VOID
EFIAPI
PciHostBridgeUtilityFreeRootBridges (
IN PCI_ROOT_BRIDGE *Bridges,
IN UINTN Count
IN PCI_ROOT_BRIDGE *Bridges,
IN UINTN Count
)
{
if (Bridges == NULL && Count == 0) {
if ((Bridges == NULL) && (Count == 0)) {
return;
}
ASSERT (Bridges != NULL && Count > 0);
do {
@@ -402,7 +431,6 @@ PciHostBridgeUtilityFreeRootBridges (
FreePool (Bridges);
}
/**
Utility function to inform the platform that the resource conflict happens.
@@ -423,38 +451,46 @@ PciHostBridgeUtilityResourceConflict (
IN VOID *Configuration
)
{
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;
UINTN RootBridgeIndex;
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;
UINTN RootBridgeIndex;
DEBUG ((DEBUG_ERROR, "PciHostBridge: Resource conflict happens!\n"));
RootBridgeIndex = 0;
Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Configuration;
Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)Configuration;
while (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {
DEBUG ((DEBUG_ERROR, "RootBridge[%d]:\n", RootBridgeIndex++));
for (; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) {
ASSERT (Descriptor->ResType <
ARRAY_SIZE (mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr)
);
DEBUG ((DEBUG_ERROR, " %s: Length/Alignment = 0x%lx / 0x%lx\n",
mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[Descriptor->ResType],
Descriptor->AddrLen, Descriptor->AddrRangeMax
));
for ( ; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) {
ASSERT (
Descriptor->ResType <
ARRAY_SIZE (mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr)
);
DEBUG ((
DEBUG_ERROR,
" %s: Length/Alignment = 0x%lx / 0x%lx\n",
mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[Descriptor->ResType],
Descriptor->AddrLen,
Descriptor->AddrRangeMax
));
if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {
DEBUG ((DEBUG_ERROR, " Granularity/SpecificFlag = %ld / %02x%s\n",
Descriptor->AddrSpaceGranularity, Descriptor->SpecificFlag,
((Descriptor->SpecificFlag &
EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE
) != 0) ? L" (Prefetchable)" : L""
));
DEBUG ((
DEBUG_ERROR,
" Granularity/SpecificFlag = %ld / %02x%s\n",
Descriptor->AddrSpaceGranularity,
Descriptor->SpecificFlag,
((Descriptor->SpecificFlag &
EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE
) != 0) ? L" (Prefetchable)" : L""
));
}
}
//
// Skip the END descriptor for root bridge
//
ASSERT (Descriptor->Desc == ACPI_END_TAG_DESCRIPTOR);
Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)(
(EFI_ACPI_END_TAG_DESCRIPTOR *)Descriptor + 1
);
(EFI_ACPI_END_TAG_DESCRIPTOR *)Descriptor + 1
);
}
}

View File

@@ -36,16 +36,14 @@
#include <Pi/PiStatusCode.h>
//
// Convenience variables for the status codes that are relevant for LoadImage()
// and StartImage() preparations and return codes.
//
STATIC EFI_STATUS_CODE_VALUE mLoadPrep;
STATIC EFI_STATUS_CODE_VALUE mLoadFail;
STATIC EFI_STATUS_CODE_VALUE mStartPrep;
STATIC EFI_STATUS_CODE_VALUE mStartFail;
STATIC EFI_STATUS_CODE_VALUE mLoadPrep;
STATIC EFI_STATUS_CODE_VALUE mLoadFail;
STATIC EFI_STATUS_CODE_VALUE mStartPrep;
STATIC EFI_STATUS_CODE_VALUE mStartFail;
/**
Handle status codes reported through ReportStatusCodeLib /
@@ -79,29 +77,31 @@ STATIC
EFI_STATUS
EFIAPI
HandleStatusCode (
IN EFI_STATUS_CODE_TYPE CodeType,
IN EFI_STATUS_CODE_VALUE Value,
IN UINT32 Instance,
IN EFI_GUID *CallerId,
IN EFI_STATUS_CODE_DATA *Data
IN EFI_STATUS_CODE_TYPE CodeType,
IN EFI_STATUS_CODE_VALUE Value,
IN UINT32 Instance,
IN EFI_GUID *CallerId,
IN EFI_STATUS_CODE_DATA *Data
)
{
UINTN VariableSize;
UINT16 BootCurrent;
EFI_STATUS Status;
CHAR16 BootOptionName[ARRAY_SIZE (L"Boot####")];
EFI_BOOT_MANAGER_LOAD_OPTION BmBootOption;
BOOLEAN DevPathStringIsDynamic;
CHAR16 *DevPathString;
UINTN VariableSize;
UINT16 BootCurrent;
EFI_STATUS Status;
CHAR16 BootOptionName[ARRAY_SIZE (L"Boot####")];
EFI_BOOT_MANAGER_LOAD_OPTION BmBootOption;
BOOLEAN DevPathStringIsDynamic;
CHAR16 *DevPathString;
//
// Ignore all status codes that are irrelevant for LoadImage() and
// StartImage() preparations and return codes.
//
if (Value != mLoadPrep && Value != mLoadFail &&
Value != mStartPrep && Value != mStartFail) {
if ((Value != mLoadPrep) && (Value != mLoadFail) &&
(Value != mStartPrep) && (Value != mStartFail))
{
return EFI_SUCCESS;
}
//
// Ignore status codes that are not reported by the same containing module.
//
@@ -112,13 +112,18 @@ HandleStatusCode (
//
// Sanity-check Data in case of failure reports.
//
if ((Value == mLoadFail || Value == mStartFail) &&
(Data == NULL ||
Data->HeaderSize != sizeof *Data ||
Data->Size != sizeof (EFI_RETURN_STATUS_EXTENDED_DATA) - sizeof *Data ||
!CompareGuid (&Data->Type, &gEfiStatusCodeSpecificDataGuid))) {
DEBUG ((DEBUG_ERROR, "%a:%a: malformed Data\n", gEfiCallerBaseName,
__FUNCTION__));
if (((Value == mLoadFail) || (Value == mStartFail)) &&
((Data == NULL) ||
(Data->HeaderSize != sizeof *Data) ||
(Data->Size != sizeof (EFI_RETURN_STATUS_EXTENDED_DATA) - sizeof *Data) ||
!CompareGuid (&Data->Type, &gEfiStatusCodeSpecificDataGuid)))
{
DEBUG ((
DEBUG_ERROR,
"%a:%a: malformed Data\n",
gEfiCallerBaseName,
__FUNCTION__
));
return EFI_INVALID_PARAMETER;
}
@@ -126,33 +131,59 @@ HandleStatusCode (
// Get the number of the Boot#### option that the status code applies to.
//
VariableSize = sizeof BootCurrent;
Status = gRT->GetVariable (EFI_BOOT_CURRENT_VARIABLE_NAME,
&gEfiGlobalVariableGuid, NULL /* Attributes */,
&VariableSize, &BootCurrent);
Status = gRT->GetVariable (
EFI_BOOT_CURRENT_VARIABLE_NAME,
&gEfiGlobalVariableGuid,
NULL /* Attributes */,
&VariableSize,
&BootCurrent
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a:%a: failed to get %g:\"%s\": %r\n",
gEfiCallerBaseName, __FUNCTION__, &gEfiGlobalVariableGuid,
EFI_BOOT_CURRENT_VARIABLE_NAME, Status));
DEBUG ((
DEBUG_ERROR,
"%a:%a: failed to get %g:\"%s\": %r\n",
gEfiCallerBaseName,
__FUNCTION__,
&gEfiGlobalVariableGuid,
EFI_BOOT_CURRENT_VARIABLE_NAME,
Status
));
return Status;
}
if (VariableSize != sizeof BootCurrent) {
DEBUG ((DEBUG_ERROR, "%a:%a: got %Lu bytes for %g:\"%s\", expected %Lu\n",
gEfiCallerBaseName, __FUNCTION__, (UINT64)VariableSize,
&gEfiGlobalVariableGuid, EFI_BOOT_CURRENT_VARIABLE_NAME,
(UINT64)sizeof BootCurrent));
DEBUG ((
DEBUG_ERROR,
"%a:%a: got %Lu bytes for %g:\"%s\", expected %Lu\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)VariableSize,
&gEfiGlobalVariableGuid,
EFI_BOOT_CURRENT_VARIABLE_NAME,
(UINT64)sizeof BootCurrent
));
return EFI_INCOMPATIBLE_VERSION;
}
//
// Get the Boot#### option that the status code applies to.
//
UnicodeSPrint (BootOptionName, sizeof BootOptionName, L"Boot%04x",
BootCurrent);
UnicodeSPrint (
BootOptionName,
sizeof BootOptionName,
L"Boot%04x",
BootCurrent
);
Status = EfiBootManagerVariableToLoadOption (BootOptionName, &BmBootOption);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR,
DEBUG ((
DEBUG_ERROR,
"%a:%a: EfiBootManagerVariableToLoadOption(\"%s\"): %r\n",
gEfiCallerBaseName, __FUNCTION__, BootOptionName, Status));
gEfiCallerBaseName,
__FUNCTION__,
BootOptionName,
Status
));
return Status;
}
@@ -160,20 +191,20 @@ HandleStatusCode (
// Format the device path.
//
DevPathStringIsDynamic = TRUE;
DevPathString = ConvertDevicePathToText (
BmBootOption.FilePath,
FALSE, // DisplayOnly
FALSE // AllowShortcuts
);
DevPathString = ConvertDevicePathToText (
BmBootOption.FilePath,
FALSE, // DisplayOnly
FALSE // AllowShortcuts
);
if (DevPathString == NULL) {
DevPathStringIsDynamic = FALSE;
DevPathString = L"<out of memory while formatting device path>";
DevPathString = L"<out of memory while formatting device path>";
}
//
// Print the message to the console.
//
if (Value == mLoadPrep || Value == mStartPrep) {
if ((Value == mLoadPrep) || (Value == mStartPrep)) {
Print (
L"%a: %a %s \"%s\" from %s\n",
gEfiCallerBaseName,
@@ -200,11 +231,11 @@ HandleStatusCode (
if (DevPathStringIsDynamic) {
FreePool (DevPathString);
}
EfiBootManagerFreeLoadOption (&BmBootOption);
return EFI_SUCCESS;
}
/**
Unregister HandleStatusCode() at ExitBootServices().
@@ -219,17 +250,16 @@ STATIC
VOID
EFIAPI
UnregisterAtExitBootServices (
IN EFI_EVENT Event,
IN VOID *Context
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_RSC_HANDLER_PROTOCOL *StatusCodeRouter;
EFI_RSC_HANDLER_PROTOCOL *StatusCodeRouter;
StatusCodeRouter = Context;
StatusCodeRouter->Unregister (HandleStatusCode);
}
/**
Register a status code handler for printing the Boot Manager's LoadImage()
and StartImage() preparations, and return codes, to the UEFI console.
@@ -246,12 +276,15 @@ PlatformBmPrintScRegisterHandler (
VOID
)
{
EFI_STATUS Status;
EFI_RSC_HANDLER_PROTOCOL *StatusCodeRouter;
EFI_EVENT ExitBootEvent;
EFI_STATUS Status;
EFI_RSC_HANDLER_PROTOCOL *StatusCodeRouter;
EFI_EVENT ExitBootEvent;
Status = gBS->LocateProtocol (&gEfiRscHandlerProtocolGuid,
NULL /* Registration */, (VOID **)&StatusCodeRouter);
Status = gBS->LocateProtocol (
&gEfiRscHandlerProtocolGuid,
NULL /* Registration */,
(VOID **)&StatusCodeRouter
);
ASSERT_EFI_ERROR (Status);
if (EFI_ERROR (Status)) {
return Status;
@@ -260,9 +293,9 @@ PlatformBmPrintScRegisterHandler (
//
// Set the EFI_STATUS_CODE_VALUE convenience variables.
//
mLoadPrep = PcdGet32 (PcdProgressCodeOsLoaderLoad);
mLoadFail = (EFI_SOFTWARE_DXE_BS_DRIVER |
EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR);
mLoadPrep = PcdGet32 (PcdProgressCodeOsLoaderLoad);
mLoadFail = (EFI_SOFTWARE_DXE_BS_DRIVER |
EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR);
mStartPrep = PcdGet32 (PcdProgressCodeOsLoaderStart);
mStartFail = (EFI_SOFTWARE_DXE_BS_DRIVER |
EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED);
@@ -272,8 +305,13 @@ PlatformBmPrintScRegisterHandler (
//
Status = StatusCodeRouter->Register (HandleStatusCode, TPL_CALLBACK);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a:%a: failed to register status code handler: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a:%a: failed to register status code handler: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return Status;
}
@@ -294,8 +332,14 @@ PlatformBmPrintScRegisterHandler (
//
// We have to unregister the callback right now, and fail the function.
//
DEBUG ((DEBUG_ERROR, "%a:%a: failed to create ExitBootServices() event: "
"%r\n", gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a:%a: failed to create ExitBootServices() event: "
"%r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
StatusCodeRouter->Unregister (HandleStatusCode);
return Status;
}

File diff suppressed because it is too large Load Diff

View File

@@ -17,7 +17,6 @@ Abstract:
#ifndef _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
#define _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
#include <PiDxe.h>
#include <IndustryStandard/Pci.h>
@@ -64,11 +63,11 @@ Abstract:
#include <OvmfPlatforms.h>
extern EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[];
extern ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode;
extern ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode;
extern UART_DEVICE_PATH gUartDeviceNode;
extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
extern EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[];
extern ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode;
extern ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode;
extern UART_DEVICE_PATH gUartDeviceNode;
extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
#define PCI_DEVICE_PATH_NODE(Func, Dev) \
{ \
@@ -150,20 +149,20 @@ extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
} \
}
#define PCI_CLASS_SCC 0x07
#define PCI_SUBCLASS_SERIAL 0x00
#define PCI_IF_16550 0x02
#define IS_PCI_16550SERIAL(_p) IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
#define PCI_CLASS_SCC 0x07
#define PCI_SUBCLASS_SERIAL 0x00
#define PCI_IF_16550 0x02
#define IS_PCI_16550SERIAL(_p) IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
typedef struct {
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN ConnectType;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN ConnectType;
} PLATFORM_CONSOLE_CONNECT_ENTRY;
#define CONSOLE_OUT BIT0
#define CONSOLE_IN BIT1
#define STD_ERROR BIT2
#define CONSOLE_OUT BIT0
#define CONSOLE_IN BIT1
#define STD_ERROR BIT2
extern PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[];
extern PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[];
@@ -173,7 +172,7 @@ extern PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[];
VOID
PlatformInitializeConsole (
IN PLATFORM_CONSOLE_CONNECT_ENTRY *PlatformConsole
IN PLATFORM_CONSOLE_CONNECT_ENTRY *PlatformConsole
);
/**

View File

@@ -16,10 +16,10 @@
//
#pragma pack (1)
typedef struct {
VENDOR_DEVICE_PATH VendorHardware;
UART_DEVICE_PATH Uart;
VENDOR_DEVICE_PATH TerminalType;
EFI_DEVICE_PATH_PROTOCOL End;
VENDOR_DEVICE_PATH VendorHardware;
UART_DEVICE_PATH Uart;
VENDOR_DEVICE_PATH TerminalType;
EFI_DEVICE_PATH_PROTOCOL End;
} VENDOR_UART_DEVICE_PATH;
#pragma pack ()
@@ -28,8 +28,8 @@ typedef struct {
//
#pragma pack (1)
typedef struct {
USB_CLASS_DEVICE_PATH Keyboard;
EFI_DEVICE_PATH_PROTOCOL End;
USB_CLASS_DEVICE_PATH Keyboard;
EFI_DEVICE_PATH_PROTOCOL End;
} USB_KEYBOARD_DEVICE_PATH;
#pragma pack ()
@@ -38,33 +38,32 @@ typedef struct {
//
#pragma pack (1)
typedef struct {
VENDOR_DEVICE_PATH Vendor;
ACPI_ADR_DEVICE_PATH AcpiAdr;
EFI_DEVICE_PATH_PROTOCOL End;
VENDOR_DEVICE_PATH Vendor;
ACPI_ADR_DEVICE_PATH AcpiAdr;
EFI_DEVICE_PATH_PROTOCOL End;
} VENDOR_RAMFB_DEVICE_PATH;
#pragma pack ()
ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode = gPnpPs2Keyboard;
ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode = gPnp16550ComPort;
UART_DEVICE_PATH gUartDeviceNode = gUart;
VENDOR_DEVICE_PATH gTerminalTypeDeviceNode = gPcAnsiTerminal;
ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode = gPnpPs2Keyboard;
ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode = gPnp16550ComPort;
UART_DEVICE_PATH gUartDeviceNode = gUart;
VENDOR_DEVICE_PATH gTerminalTypeDeviceNode = gPcAnsiTerminal;
//
// Platform specific keyboard device path
//
//
// Debug Agent UART Device Path
//
VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
EFI_DEBUG_AGENT_GUID,
@@ -74,8 +73,8 @@ VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
MESSAGING_DEVICE_PATH,
MSG_UART_DP,
{
(UINT8) (sizeof (UART_DEVICE_PATH)),
(UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (UART_DEVICE_PATH)),
(UINT8)((sizeof (UART_DEVICE_PATH)) >> 8)
}
},
0, // Reserved
@@ -88,7 +87,7 @@ VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
gEndEntire
};
STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
{
{
MESSAGING_DEVICE_PATH,
@@ -107,14 +106,14 @@ STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
gEndEntire
};
STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
QEMU_RAMFB_GUID,
@@ -124,8 +123,8 @@ STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
ACPI_DEVICE_PATH,
ACPI_ADR_DP,
{
(UINT8) (sizeof (ACPI_ADR_DEVICE_PATH)),
(UINT8) ((sizeof (ACPI_ADR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (ACPI_ADR_DEVICE_PATH)),
(UINT8)((sizeof (ACPI_ADR_DEVICE_PATH)) >> 8)
}
},
ACPI_DISPLAY_ADR (
@@ -142,14 +141,14 @@ STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
gEndEntire
};
STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {
STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
EDKII_SERIAL_PORT_LIB_VENDOR_GUID
@@ -159,8 +158,8 @@ STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {
MESSAGING_DEVICE_PATH,
MSG_UART_DP,
{
(UINT8) (sizeof (UART_DEVICE_PATH)),
(UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (UART_DEVICE_PATH)),
(UINT8)((sizeof (UART_DEVICE_PATH)) >> 8)
}
},
0,
@@ -176,9 +175,9 @@ STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {
//
// Predefined platform default console device path
//
PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
{
(EFI_DEVICE_PATH_PROTOCOL *) &gDebugAgentUartDevicePath,
(EFI_DEVICE_PATH_PROTOCOL *)&gDebugAgentUartDevicePath,
(CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
},
{
@@ -195,7 +194,7 @@ PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
}
};
PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[] = {
PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[] = {
{
(EFI_DEVICE_PATH_PROTOCOL *)&gXenConsoleDevicePath,
(CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
@@ -209,5 +208,4 @@ PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[] = {
//
// Predefined platform connect sequence
//
EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[] = { NULL };
EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[] = { NULL };

View File

@@ -13,14 +13,13 @@
#include <Library/ReportStatusCodeLib.h>
#include <Library/UefiLib.h>
EFI_STATUS
TryRunningQemuKernel (
VOID
)
{
EFI_STATUS Status;
EFI_HANDLE KernelImageHandle;
EFI_STATUS Status;
EFI_HANDLE KernelImageHandle;
Status = QemuLoadKernelImage (&KernelImageHandle);
if (EFI_ERROR (Status)) {
@@ -30,18 +29,24 @@ TryRunningQemuKernel (
//
// Signal the EVT_SIGNAL_READY_TO_BOOT event
//
EfiSignalEventReadyToBoot();
EfiSignalEventReadyToBoot ();
REPORT_STATUS_CODE (EFI_PROGRESS_CODE,
(EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT));
REPORT_STATUS_CODE (
EFI_PROGRESS_CODE,
(EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT)
);
//
// Start the image.
//
Status = QemuStartKernelImage (&KernelImageHandle);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: QemuStartKernelImage(): %r\n", __FUNCTION__,
Status));
DEBUG ((
DEBUG_ERROR,
"%a: QemuStartKernelImage(): %r\n",
__FUNCTION__,
Status
));
}
QemuUnloadKernelImage (KernelImageHandle);

File diff suppressed because it is too large Load Diff

View File

@@ -18,7 +18,6 @@ Abstract:
#ifndef _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
#define _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
#include <PiDxe.h>
#include <IndustryStandard/Pci.h>
@@ -65,11 +64,11 @@ Abstract:
#include <OvmfPlatforms.h>
extern EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[];
extern ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode;
extern ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode;
extern UART_DEVICE_PATH gUartDeviceNode;
extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
extern EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[];
extern ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode;
extern ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode;
extern UART_DEVICE_PATH gUartDeviceNode;
extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
#define PCI_DEVICE_PATH_NODE(Func, Dev) \
{ \
@@ -151,20 +150,20 @@ extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
} \
}
#define PCI_CLASS_SCC 0x07
#define PCI_SUBCLASS_SERIAL 0x00
#define PCI_IF_16550 0x02
#define IS_PCI_16550SERIAL(_p) IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
#define PCI_CLASS_SCC 0x07
#define PCI_SUBCLASS_SERIAL 0x00
#define PCI_IF_16550 0x02
#define IS_PCI_16550SERIAL(_p) IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
typedef struct {
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN ConnectType;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN ConnectType;
} PLATFORM_CONSOLE_CONNECT_ENTRY;
#define CONSOLE_OUT BIT0
#define CONSOLE_IN BIT1
#define STD_ERROR BIT2
#define CONSOLE_OUT BIT0
#define CONSOLE_IN BIT1
#define STD_ERROR BIT2
extern PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[];
//
@@ -173,7 +172,7 @@ extern PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[];
VOID
PlatformInitializeConsole (
IN PLATFORM_CONSOLE_CONNECT_ENTRY *PlatformConsole
IN PLATFORM_CONSOLE_CONNECT_ENTRY *PlatformConsole
);
/**

View File

@@ -16,10 +16,10 @@
//
#pragma pack(1)
typedef struct {
VENDOR_DEVICE_PATH VendorHardware;
UART_DEVICE_PATH Uart;
VENDOR_DEVICE_PATH TerminalType;
EFI_DEVICE_PATH_PROTOCOL End;
VENDOR_DEVICE_PATH VendorHardware;
UART_DEVICE_PATH Uart;
VENDOR_DEVICE_PATH TerminalType;
EFI_DEVICE_PATH_PROTOCOL End;
} VENDOR_UART_DEVICE_PATH;
#pragma pack()
@@ -28,8 +28,8 @@ typedef struct {
//
#pragma pack (1)
typedef struct {
USB_CLASS_DEVICE_PATH Keyboard;
EFI_DEVICE_PATH_PROTOCOL End;
USB_CLASS_DEVICE_PATH Keyboard;
EFI_DEVICE_PATH_PROTOCOL End;
} USB_KEYBOARD_DEVICE_PATH;
#pragma pack ()
@@ -38,33 +38,32 @@ typedef struct {
//
#pragma pack (1)
typedef struct {
VENDOR_DEVICE_PATH Vendor;
ACPI_ADR_DEVICE_PATH AcpiAdr;
EFI_DEVICE_PATH_PROTOCOL End;
VENDOR_DEVICE_PATH Vendor;
ACPI_ADR_DEVICE_PATH AcpiAdr;
EFI_DEVICE_PATH_PROTOCOL End;
} VENDOR_RAMFB_DEVICE_PATH;
#pragma pack ()
ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode = gPnpPs2Keyboard;
ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode = gPnp16550ComPort;
UART_DEVICE_PATH gUartDeviceNode = gUart;
VENDOR_DEVICE_PATH gTerminalTypeDeviceNode = gPcAnsiTerminal;
ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode = gPnpPs2Keyboard;
ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode = gPnp16550ComPort;
UART_DEVICE_PATH gUartDeviceNode = gUart;
VENDOR_DEVICE_PATH gTerminalTypeDeviceNode = gPcAnsiTerminal;
//
// Platform specific keyboard device path
//
//
// Debug Agent UART Device Path
//
VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
EFI_DEBUG_AGENT_GUID,
@@ -74,8 +73,8 @@ VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
MESSAGING_DEVICE_PATH,
MSG_UART_DP,
{
(UINT8) (sizeof (UART_DEVICE_PATH)),
(UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (UART_DEVICE_PATH)),
(UINT8)((sizeof (UART_DEVICE_PATH)) >> 8)
}
},
0, // Reserved
@@ -88,7 +87,7 @@ VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
gEndEntire
};
STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
{
{
MESSAGING_DEVICE_PATH,
@@ -107,14 +106,14 @@ STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
gEndEntire
};
STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
QEMU_RAMFB_GUID,
@@ -124,8 +123,8 @@ STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
ACPI_DEVICE_PATH,
ACPI_ADR_DP,
{
(UINT8) (sizeof (ACPI_ADR_DEVICE_PATH)),
(UINT8) ((sizeof (ACPI_ADR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (ACPI_ADR_DEVICE_PATH)),
(UINT8)((sizeof (ACPI_ADR_DEVICE_PATH)) >> 8)
}
},
ACPI_DISPLAY_ADR (
@@ -145,9 +144,9 @@ STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
//
// Predefined platform default console device path
//
PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
{
(EFI_DEVICE_PATH_PROTOCOL *) &gDebugAgentUartDevicePath,
(EFI_DEVICE_PATH_PROTOCOL *)&gDebugAgentUartDevicePath,
(CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
},
{
@@ -167,5 +166,4 @@ PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
//
// Predefined platform connect sequence
//
EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[] = { NULL };
EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[] = { NULL };

File diff suppressed because it is too large Load Diff

View File

@@ -18,7 +18,6 @@ Abstract:
#ifndef _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
#define _PLATFORM_SPECIFIC_BDS_PLATFORM_H_
#include <PiDxe.h>
#include <IndustryStandard/Pci.h>
@@ -60,11 +59,11 @@ Abstract:
#include <OvmfPlatforms.h>
extern EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[];
extern ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode;
extern ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode;
extern UART_DEVICE_PATH gUartDeviceNode;
extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
extern EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[];
extern ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode;
extern ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode;
extern UART_DEVICE_PATH gUartDeviceNode;
extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
#define PCI_DEVICE_PATH_NODE(Func, Dev) \
{ \
@@ -146,20 +145,20 @@ extern VENDOR_DEVICE_PATH gTerminalTypeDeviceNode;
} \
}
#define PCI_CLASS_SCC 0x07
#define PCI_SUBCLASS_SERIAL 0x00
#define PCI_IF_16550 0x02
#define IS_PCI_16550SERIAL(_p) IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
#define PCI_CLASS_SCC 0x07
#define PCI_SUBCLASS_SERIAL 0x00
#define PCI_IF_16550 0x02
#define IS_PCI_16550SERIAL(_p) IS_CLASS3 (_p, PCI_CLASS_SCC, PCI_SUBCLASS_SERIAL, PCI_IF_16550)
#define IS_PCI_ISA_PDECODE(_p) IS_CLASS3 (_p, PCI_CLASS_BRIDGE, PCI_CLASS_BRIDGE_ISA_PDECODE, 0)
typedef struct {
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN ConnectType;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN ConnectType;
} PLATFORM_CONSOLE_CONNECT_ENTRY;
#define CONSOLE_OUT BIT0
#define CONSOLE_IN BIT1
#define STD_ERROR BIT2
#define CONSOLE_OUT BIT0
#define CONSOLE_IN BIT1
#define STD_ERROR BIT2
extern PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[];
extern PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[];
@@ -169,7 +168,7 @@ extern PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[];
VOID
PlatformInitializeConsole (
IN PLATFORM_CONSOLE_CONNECT_ENTRY *PlatformConsole
IN PLATFORM_CONSOLE_CONNECT_ENTRY *PlatformConsole
);
/**

View File

@@ -17,10 +17,10 @@
//
#pragma pack (1)
typedef struct {
VENDOR_DEVICE_PATH VendorHardware;
UART_DEVICE_PATH Uart;
VENDOR_DEVICE_PATH TerminalType;
EFI_DEVICE_PATH_PROTOCOL End;
VENDOR_DEVICE_PATH VendorHardware;
UART_DEVICE_PATH Uart;
VENDOR_DEVICE_PATH TerminalType;
EFI_DEVICE_PATH_PROTOCOL End;
} VENDOR_UART_DEVICE_PATH;
#pragma pack ()
@@ -29,8 +29,8 @@ typedef struct {
//
#pragma pack (1)
typedef struct {
USB_CLASS_DEVICE_PATH Keyboard;
EFI_DEVICE_PATH_PROTOCOL End;
USB_CLASS_DEVICE_PATH Keyboard;
EFI_DEVICE_PATH_PROTOCOL End;
} USB_KEYBOARD_DEVICE_PATH;
#pragma pack ()
@@ -39,33 +39,32 @@ typedef struct {
//
#pragma pack (1)
typedef struct {
VENDOR_DEVICE_PATH Vendor;
ACPI_ADR_DEVICE_PATH AcpiAdr;
EFI_DEVICE_PATH_PROTOCOL End;
VENDOR_DEVICE_PATH Vendor;
ACPI_ADR_DEVICE_PATH AcpiAdr;
EFI_DEVICE_PATH_PROTOCOL End;
} VENDOR_RAMFB_DEVICE_PATH;
#pragma pack ()
ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode = gPnpPs2Keyboard;
ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode = gPnp16550ComPort;
UART_DEVICE_PATH gUartDeviceNode = gUart;
VENDOR_DEVICE_PATH gTerminalTypeDeviceNode = gPcAnsiTerminal;
ACPI_HID_DEVICE_PATH gPnpPs2KeyboardDeviceNode = gPnpPs2Keyboard;
ACPI_HID_DEVICE_PATH gPnp16550ComPortDeviceNode = gPnp16550ComPort;
UART_DEVICE_PATH gUartDeviceNode = gUart;
VENDOR_DEVICE_PATH gTerminalTypeDeviceNode = gPcAnsiTerminal;
//
// Platform specific keyboard device path
//
//
// Debug Agent UART Device Path
//
VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
EFI_DEBUG_AGENT_GUID,
@@ -75,8 +74,8 @@ VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
MESSAGING_DEVICE_PATH,
MSG_UART_DP,
{
(UINT8) (sizeof (UART_DEVICE_PATH)),
(UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (UART_DEVICE_PATH)),
(UINT8)((sizeof (UART_DEVICE_PATH)) >> 8)
}
},
0, // Reserved
@@ -89,7 +88,7 @@ VENDOR_UART_DEVICE_PATH gDebugAgentUartDevicePath = {
gEndEntire
};
STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
{
{
MESSAGING_DEVICE_PATH,
@@ -108,14 +107,14 @@ STATIC USB_KEYBOARD_DEVICE_PATH gUsbKeyboardDevicePath = {
gEndEntire
};
STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
QEMU_RAMFB_GUID,
@@ -125,8 +124,8 @@ STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
ACPI_DEVICE_PATH,
ACPI_ADR_DP,
{
(UINT8) (sizeof (ACPI_ADR_DEVICE_PATH)),
(UINT8) ((sizeof (ACPI_ADR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (ACPI_ADR_DEVICE_PATH)),
(UINT8)((sizeof (ACPI_ADR_DEVICE_PATH)) >> 8)
}
},
ACPI_DISPLAY_ADR (
@@ -143,14 +142,14 @@ STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
gEndEntire
};
STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {
STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
EDKII_SERIAL_PORT_LIB_VENDOR_GUID
@@ -160,8 +159,8 @@ STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {
MESSAGING_DEVICE_PATH,
MSG_UART_DP,
{
(UINT8) (sizeof (UART_DEVICE_PATH)),
(UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)
(UINT8)(sizeof (UART_DEVICE_PATH)),
(UINT8)((sizeof (UART_DEVICE_PATH)) >> 8)
}
},
0,
@@ -177,9 +176,9 @@ STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {
//
// Predefined platform default console device path
//
PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
{
(EFI_DEVICE_PATH_PROTOCOL *) &gDebugAgentUartDevicePath,
(EFI_DEVICE_PATH_PROTOCOL *)&gDebugAgentUartDevicePath,
(CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
},
{
@@ -196,7 +195,7 @@ PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] = {
}
};
PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[] = {
PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[] = {
{
(EFI_DEVICE_PATH_PROTOCOL *)&gXenConsoleDevicePath,
(CONSOLE_OUT | CONSOLE_IN | STD_ERROR)
@@ -210,5 +209,4 @@ PLATFORM_CONSOLE_CONNECT_ENTRY gXenPlatformConsole[] = {
//
// Predefined platform connect sequence
//
EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[] = { NULL };
EFI_DEVICE_PATH_PROTOCOL *gPlatformConnectSequence[] = { NULL };

View File

@@ -13,14 +13,13 @@
#include <Library/ReportStatusCodeLib.h>
#include <Library/UefiLib.h>
EFI_STATUS
TryRunningQemuKernel (
VOID
)
{
EFI_STATUS Status;
EFI_HANDLE KernelImageHandle;
EFI_STATUS Status;
EFI_HANDLE KernelImageHandle;
Status = QemuLoadKernelImage (&KernelImageHandle);
if (EFI_ERROR (Status)) {
@@ -30,18 +29,24 @@ TryRunningQemuKernel (
//
// Signal the EVT_SIGNAL_READY_TO_BOOT event
//
EfiSignalEventReadyToBoot();
EfiSignalEventReadyToBoot ();
REPORT_STATUS_CODE (EFI_PROGRESS_CODE,
(EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT));
REPORT_STATUS_CODE (
EFI_PROGRESS_CODE,
(EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT)
);
//
// Start the image.
//
Status = QemuStartKernelImage (&KernelImageHandle);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: QemuStartKernelImage(): %r\n", __FUNCTION__,
Status));
DEBUG ((
DEBUG_ERROR,
"%a: QemuStartKernelImage(): %r\n",
__FUNCTION__,
Status
));
}
QemuUnloadKernelImage (KernelImageHandle);

View File

@@ -15,7 +15,7 @@
//
// The constant value that is read from the debug I/O port
//
#define BOCHS_DEBUG_PORT_MAGIC 0xE9
#define BOCHS_DEBUG_PORT_MAGIC 0xE9
/**
Return the result of detecting the debug I/O port device.

View File

@@ -27,7 +27,7 @@
// VA_LIST can not initialize to NULL for all compiler, so we use this to
// indicate a null VA_LIST
//
VA_LIST mVaListNull;
VA_LIST mVaListNull;
/**
Prints a debug message to the debug output device if the specified error level is enabled.
@@ -52,14 +52,13 @@ DebugPrint (
...
)
{
VA_LIST Marker;
VA_LIST Marker;
VA_START (Marker, Format);
DebugVPrint (ErrorLevel, Format, Marker);
VA_END (Marker);
}
/**
Prints a debug message to the debug output device if the specified
error level is enabled base on Null-terminated format string and a
@@ -79,14 +78,14 @@ DebugPrint (
**/
VOID
DebugPrintMarker (
IN UINTN ErrorLevel,
IN CONST CHAR8 *Format,
IN VA_LIST VaListMarker,
IN BASE_LIST BaseListMarker
IN UINTN ErrorLevel,
IN CONST CHAR8 *Format,
IN VA_LIST VaListMarker,
IN BASE_LIST BaseListMarker
)
{
CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH];
UINTN Length;
CHAR8 Buffer[MAX_DEBUG_MESSAGE_LENGTH];
UINTN Length;
//
// If Format is NULL, then ASSERT().
@@ -96,8 +95,9 @@ DebugPrintMarker (
//
// Check if the global mask disables this message or the device is inactive
//
if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0 ||
!PlatformDebugLibIoPortFound ()) {
if (((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) ||
!PlatformDebugLibIoPortFound ())
{
return;
}
@@ -116,7 +116,6 @@ DebugPrintMarker (
IoWriteFifo8 (PcdGet16 (PcdDebugIoPort), Length, Buffer);
}
/**
Prints a debug message to the debug output device if the specified
error level is enabled.
@@ -135,15 +134,14 @@ DebugPrintMarker (
VOID
EFIAPI
DebugVPrint (
IN UINTN ErrorLevel,
IN CONST CHAR8 *Format,
IN VA_LIST VaListMarker
IN UINTN ErrorLevel,
IN CONST CHAR8 *Format,
IN VA_LIST VaListMarker
)
{
DebugPrintMarker (ErrorLevel, Format, VaListMarker, NULL);
}
/**
Prints a debug message to the debug output device if the specified
error level is enabled.
@@ -164,15 +162,14 @@ DebugVPrint (
VOID
EFIAPI
DebugBPrint (
IN UINTN ErrorLevel,
IN CONST CHAR8 *Format,
IN BASE_LIST BaseListMarker
IN UINTN ErrorLevel,
IN CONST CHAR8 *Format,
IN BASE_LIST BaseListMarker
)
{
DebugPrintMarker (ErrorLevel, Format, mVaListNull, BaseListMarker);
}
/**
Prints an assert message containing a filename, line number, and description.
This may be followed by a breakpoint or a dead loop.
@@ -208,8 +205,14 @@ DebugAssert (
//
// Generate the ASSERT() message in Ascii format
//
Length = AsciiSPrint (Buffer, sizeof Buffer, "ASSERT %a(%Lu): %a\n",
FileName, (UINT64)LineNumber, Description);
Length = AsciiSPrint (
Buffer,
sizeof Buffer,
"ASSERT %a(%Lu): %a\n",
FileName,
(UINT64)LineNumber,
Description
);
//
// Send the print string to the debug I/O port, if present
@@ -221,14 +224,13 @@ DebugAssert (
//
// Generate a Breakpoint, DeadLoop, or NOP based on PCD settings
//
if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) {
if ((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) {
CpuBreakpoint ();
} else if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) {
} else if ((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) {
CpuDeadLoop ();
}
}
/**
Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer.
@@ -259,10 +261,9 @@ DebugClearMemory (
//
// SetMem() checks for the the ASSERT() condition on Length and returns Buffer
//
return SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue));
return SetMem (Buffer, Length, PcdGet8 (PcdDebugClearMemoryValue));
}
/**
Returns TRUE if ASSERT() macros are enabled.
@@ -279,10 +280,9 @@ DebugAssertEnabled (
VOID
)
{
return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0);
return (BOOLEAN)((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0);
}
/**
Returns TRUE if DEBUG() macros are enabled.
@@ -299,10 +299,9 @@ DebugPrintEnabled (
VOID
)
{
return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0);
return (BOOLEAN)((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0);
}
/**
Returns TRUE if DEBUG_CODE() macros are enabled.
@@ -319,10 +318,9 @@ DebugCodeEnabled (
VOID
)
{
return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0);
return (BOOLEAN)((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0);
}
/**
Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled.
@@ -339,7 +337,7 @@ DebugClearMemoryEnabled (
VOID
)
{
return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0);
return (BOOLEAN)((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0);
}
/**
@@ -354,8 +352,8 @@ DebugClearMemoryEnabled (
BOOLEAN
EFIAPI
DebugPrintLevelEnabled (
IN CONST UINTN ErrorLevel
IN CONST UINTN ErrorLevel
)
{
return (BOOLEAN) ((ErrorLevel & PcdGet32(PcdFixedDebugPrintErrorLevel)) != 0);
return (BOOLEAN)((ErrorLevel & PcdGet32 (PcdFixedDebugPrintErrorLevel)) != 0);
}

View File

@@ -13,12 +13,12 @@
//
// Set to TRUE if the debug I/O port has been checked
//
STATIC BOOLEAN mDebugIoPortChecked = FALSE;
STATIC BOOLEAN mDebugIoPortChecked = FALSE;
//
// Set to TRUE if the debug I/O port is enabled
//
STATIC BOOLEAN mDebugIoPortFound = FALSE;
STATIC BOOLEAN mDebugIoPortFound = FALSE;
/**
This constructor function must not do anything.
@@ -58,8 +58,9 @@ PlatformDebugLibIoPortFound (
)
{
if (!mDebugIoPortChecked) {
mDebugIoPortFound = PlatformDebugLibIoPortDetect ();
mDebugIoPortFound = PlatformDebugLibIoPortDetect ();
mDebugIoPortChecked = TRUE;
}
return mDebugIoPortFound;
}

View File

@@ -9,7 +9,6 @@
#include "PiDxe.h"
#include <Library/PlatformFvbLib.h>
/**
This function will be called following a call to the
EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL Read function.
@@ -26,16 +25,15 @@
VOID
EFIAPI
PlatformFvbDataRead (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN EFI_LBA Lba,
IN UINTN Offset,
IN UINTN NumBytes,
IN UINT8 *Buffer
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN EFI_LBA Lba,
IN UINTN Offset,
IN UINTN NumBytes,
IN UINT8 *Buffer
)
{
}
/**
This function will be called following a call to the
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL Write function.
@@ -50,16 +48,15 @@ PlatformFvbDataRead (
VOID
EFIAPI
PlatformFvbDataWritten (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN EFI_LBA Lba,
IN UINTN Offset,
IN UINTN NumBytes,
IN UINT8 *Buffer
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN EFI_LBA Lba,
IN UINTN Offset,
IN UINTN NumBytes,
IN UINT8 *Buffer
)
{
}
/**
This function will be called following a call to the
EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL Erase function.
@@ -74,10 +71,8 @@ PlatformFvbDataWritten (
VOID
EFIAPI
PlatformFvbBlocksErased (
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN VA_LIST List
IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
IN VA_LIST List
)
{
}

View File

@@ -16,19 +16,29 @@ SetPxeBcPcds (
VOID
)
{
BOOLEAN FwCfgBool;
RETURN_STATUS PcdStatus;
BOOLEAN FwCfgBool;
RETURN_STATUS PcdStatus;
if (!RETURN_ERROR (QemuFwCfgParseBool ("opt/org.tianocore/IPv4PXESupport",
&FwCfgBool))) {
if (!RETURN_ERROR (
QemuFwCfgParseBool (
"opt/org.tianocore/IPv4PXESupport",
&FwCfgBool
)
))
{
PcdStatus = PcdSet8S (PcdIPv4PXESupport, FwCfgBool);
if (RETURN_ERROR (PcdStatus)) {
return PcdStatus;
}
}
if (!RETURN_ERROR (QemuFwCfgParseBool ("opt/org.tianocore/IPv6PXESupport",
&FwCfgBool))) {
if (!RETURN_ERROR (
QemuFwCfgParseBool (
"opt/org.tianocore/IPv6PXESupport",
&FwCfgBool
)
))
{
PcdStatus = PcdSet8S (PcdIPv6PXESupport, FwCfgBool);
if (RETURN_ERROR (PcdStatus)) {
return PcdStatus;

View File

@@ -28,11 +28,10 @@
// BusNumbers is NULL.
//
struct EXTRA_ROOT_BUS_MAP_STRUCT {
UINT32 *BusNumbers;
UINTN Count;
UINT32 *BusNumbers;
UINTN Count;
};
/**
An ORDERED_COLLECTION_USER_COMPARE function that compares root bridge
protocol device paths based on UID.
@@ -51,12 +50,12 @@ STATIC
INTN
EFIAPI
RootBridgePathCompare (
IN CONST VOID *UserStruct1,
IN CONST VOID *UserStruct2
IN CONST VOID *UserStruct1,
IN CONST VOID *UserStruct2
)
{
CONST ACPI_HID_DEVICE_PATH *Acpi1;
CONST ACPI_HID_DEVICE_PATH *Acpi2;
CONST ACPI_HID_DEVICE_PATH *Acpi1;
CONST ACPI_HID_DEVICE_PATH *Acpi2;
Acpi1 = UserStruct1;
Acpi2 = UserStruct2;
@@ -66,7 +65,6 @@ RootBridgePathCompare (
0;
}
/**
An ORDERED_COLLECTION_KEY_COMPARE function that compares a root bridge
protocol device path against a UID.
@@ -86,12 +84,12 @@ STATIC
INTN
EFIAPI
RootBridgePathKeyCompare (
IN CONST VOID *StandaloneKey,
IN CONST VOID *UserStruct
IN CONST VOID *StandaloneKey,
IN CONST VOID *UserStruct
)
{
CONST UINT32 *Uid;
CONST ACPI_HID_DEVICE_PATH *Acpi;
CONST UINT32 *Uid;
CONST ACPI_HID_DEVICE_PATH *Acpi;
Uid = StandaloneKey;
Acpi = UserStruct;
@@ -101,7 +99,6 @@ RootBridgePathKeyCompare (
0;
}
/**
Create a structure that maps the relative positions of PCI root buses to bus
numbers.
@@ -129,31 +126,37 @@ RootBridgePathKeyCompare (
**/
EFI_STATUS
CreateExtraRootBusMap (
OUT EXTRA_ROOT_BUS_MAP **ExtraRootBusMap
OUT EXTRA_ROOT_BUS_MAP **ExtraRootBusMap
)
{
EFI_STATUS Status;
UINTN NumHandles;
EFI_HANDLE *Handles;
ORDERED_COLLECTION *Collection;
EXTRA_ROOT_BUS_MAP *Map;
UINTN Idx;
ORDERED_COLLECTION_ENTRY *Entry, *Entry2;
EFI_STATUS Status;
UINTN NumHandles;
EFI_HANDLE *Handles;
ORDERED_COLLECTION *Collection;
EXTRA_ROOT_BUS_MAP *Map;
UINTN Idx;
ORDERED_COLLECTION_ENTRY *Entry, *Entry2;
//
// Handles and Collection are temporary / helper variables, while in Map we
// build the return value.
//
Status = gBS->LocateHandleBuffer (ByProtocol,
&gEfiPciRootBridgeIoProtocolGuid, NULL /* SearchKey */,
&NumHandles, &Handles);
if (EFI_ERROR (Status)) {
Status = gBS->LocateHandleBuffer (
ByProtocol,
&gEfiPciRootBridgeIoProtocolGuid,
NULL /* SearchKey */,
&NumHandles,
&Handles
);
if (EFI_ERROR (Status)) {
return Status;
}
Collection = OrderedCollectionInit (RootBridgePathCompare,
RootBridgePathKeyCompare);
Collection = OrderedCollectionInit (
RootBridgePathCompare,
RootBridgePathKeyCompare
);
if (Collection == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto FreeHandles;
@@ -169,10 +172,13 @@ CreateExtraRootBusMap (
// Collect the ACPI device path protocols of the root bridges.
//
for (Idx = 0; Idx < NumHandles; ++Idx) {
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
Status = gBS->HandleProtocol (Handles[Idx], &gEfiDevicePathProtocolGuid,
(VOID**)&DevicePath);
Status = gBS->HandleProtocol (
Handles[Idx],
&gEfiDevicePathProtocolGuid,
(VOID **)&DevicePath
);
if (EFI_ERROR (Status)) {
goto FreeMap;
}
@@ -182,14 +188,16 @@ CreateExtraRootBusMap (
// nonzero (ie. the root bridge that the bus number belongs to is "extra",
// not the main one). In that case, link the device path into Collection.
//
if (DevicePathType (DevicePath) == ACPI_DEVICE_PATH &&
DevicePathSubType (DevicePath) == ACPI_DP &&
((ACPI_HID_DEVICE_PATH *)DevicePath)->HID == EISA_PNP_ID(0x0A03) &&
((ACPI_HID_DEVICE_PATH *)DevicePath)->UID > 0) {
if ((DevicePathType (DevicePath) == ACPI_DEVICE_PATH) &&
(DevicePathSubType (DevicePath) == ACPI_DP) &&
(((ACPI_HID_DEVICE_PATH *)DevicePath)->HID == EISA_PNP_ID (0x0A03)) &&
(((ACPI_HID_DEVICE_PATH *)DevicePath)->UID > 0))
{
Status = OrderedCollectionInsert (Collection, NULL, DevicePath);
if (EFI_ERROR (Status)) {
goto FreeMap;
}
++Map->Count;
}
}
@@ -208,24 +216,29 @@ CreateExtraRootBusMap (
//
// Now collect the bus numbers of the extra PCI root buses into Map.
//
Idx = 0;
Idx = 0;
Entry = OrderedCollectionMin (Collection);
while (Idx < Map->Count) {
ACPI_HID_DEVICE_PATH *Acpi;
ACPI_HID_DEVICE_PATH *Acpi;
ASSERT (Entry != NULL);
Acpi = OrderedCollectionUserStruct (Entry);
Acpi = OrderedCollectionUserStruct (Entry);
Map->BusNumbers[Idx] = Acpi->UID;
DEBUG ((DEBUG_VERBOSE,
DEBUG ((
DEBUG_VERBOSE,
"%a: extra bus position 0x%Lx maps to bus number (UID) 0x%x\n",
__FUNCTION__, (UINT64)(Idx + 1), Acpi->UID));
__FUNCTION__,
(UINT64)(Idx + 1),
Acpi->UID
));
++Idx;
Entry = OrderedCollectionNext (Entry);
}
ASSERT (Entry == NULL);
*ExtraRootBusMap = Map;
Status = EFI_SUCCESS;
Status = EFI_SUCCESS;
//
// Fall through in order to release temporaries.
@@ -236,15 +249,18 @@ FreeMap:
if (Map->BusNumbers != NULL) {
FreePool (Map->BusNumbers);
}
FreePool (Map);
}
FreeCollection:
for (Entry = OrderedCollectionMin (Collection); Entry != NULL;
Entry = Entry2) {
Entry = Entry2)
{
Entry2 = OrderedCollectionNext (Entry);
OrderedCollectionDelete (Collection, Entry, NULL);
}
OrderedCollectionUninit (Collection);
FreeHandles:
@@ -253,7 +269,6 @@ FreeHandles:
return Status;
}
/**
Release a map created with CreateExtraRootBusMap().
@@ -261,12 +276,13 @@ FreeHandles:
*/
VOID
DestroyExtraRootBusMap (
IN EXTRA_ROOT_BUS_MAP *ExtraRootBusMap
IN EXTRA_ROOT_BUS_MAP *ExtraRootBusMap
)
{
if (ExtraRootBusMap->BusNumbers != NULL) {
FreePool (ExtraRootBusMap->BusNumbers);
}
FreePool (ExtraRootBusMap);
}
@@ -291,17 +307,19 @@ DestroyExtraRootBusMap (
**/
EFI_STATUS
MapRootBusPosToBusNr (
IN CONST EXTRA_ROOT_BUS_MAP *ExtraRootBusMap,
IN UINT64 RootBusPos,
OUT UINT32 *RootBusNr
IN CONST EXTRA_ROOT_BUS_MAP *ExtraRootBusMap,
IN UINT64 RootBusPos,
OUT UINT32 *RootBusNr
)
{
if (RootBusPos == 0) {
return EFI_INVALID_PARAMETER;
}
if (RootBusPos > ExtraRootBusMap->Count) {
return EFI_NOT_FOUND;
}
*RootBusNr = ExtraRootBusMap->BusNumbers[(UINTN)RootBusPos - 1];
return EFI_SUCCESS;
}

View File

@@ -16,19 +16,19 @@ typedef struct EXTRA_ROOT_BUS_MAP_STRUCT EXTRA_ROOT_BUS_MAP;
EFI_STATUS
CreateExtraRootBusMap (
OUT EXTRA_ROOT_BUS_MAP **ExtraRootBusMap
OUT EXTRA_ROOT_BUS_MAP **ExtraRootBusMap
);
VOID
DestroyExtraRootBusMap (
IN EXTRA_ROOT_BUS_MAP *ExtraRootBusMap
IN EXTRA_ROOT_BUS_MAP *ExtraRootBusMap
);
EFI_STATUS
MapRootBusPosToBusNr (
IN CONST EXTRA_ROOT_BUS_MAP *ExtraRootBusMap,
IN UINT64 RootBusPos,
OUT UINT32 *RootBusNr
IN CONST EXTRA_ROOT_BUS_MAP *ExtraRootBusMap,
IN UINT64 RootBusPos,
OUT UINT32 *RootBusNr
);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -23,10 +23,10 @@
#include "QemuFwCfgLibInternal.h"
STATIC BOOLEAN mQemuFwCfgSupported = FALSE;
STATIC BOOLEAN mQemuFwCfgDmaSupported;
STATIC BOOLEAN mQemuFwCfgSupported = FALSE;
STATIC BOOLEAN mQemuFwCfgDmaSupported;
STATIC EDKII_IOMMU_PROTOCOL *mIoMmuProtocol;
STATIC EDKII_IOMMU_PROTOCOL *mIoMmuProtocol;
/**
Returns a boolean indicating if the firmware configuration interface
@@ -47,21 +47,20 @@ QemuFwCfgIsAvailable (
return InternalQemuFwCfgIsAvailable ();
}
RETURN_STATUS
EFIAPI
QemuFwCfgInitialize (
VOID
)
{
UINT32 Signature;
UINT32 Revision;
UINT32 Signature;
UINT32 Revision;
//
// Enable the access routines while probing to see if it is supported.
// For probing we always use the IO Port (IoReadFifo8()) access method.
//
mQemuFwCfgSupported = TRUE;
mQemuFwCfgSupported = TRUE;
mQemuFwCfgDmaSupported = FALSE;
QemuFwCfgSelectItem (QemuFwCfgItemSignature);
@@ -72,7 +71,8 @@ QemuFwCfgInitialize (
DEBUG ((DEBUG_INFO, "FW CFG Revision: 0x%x\n", Revision));
if ((Signature != SIGNATURE_32 ('Q', 'E', 'M', 'U')) ||
(Revision < 1)
) {
)
{
DEBUG ((DEBUG_INFO, "QemuFwCfg interface not supported.\n"));
mQemuFwCfgSupported = FALSE;
return RETURN_SUCCESS;
@@ -86,18 +86,24 @@ QemuFwCfgInitialize (
}
if (mQemuFwCfgDmaSupported && MemEncryptSevIsEnabled ()) {
EFI_STATUS Status;
EFI_STATUS Status;
//
// IoMmuDxe driver must have installed the IOMMU protocol. If we are not
// able to locate the protocol then something must have gone wrong.
//
Status = gBS->LocateProtocol (&gEdkiiIoMmuProtocolGuid, NULL,
(VOID **)&mIoMmuProtocol);
Status = gBS->LocateProtocol (
&gEdkiiIoMmuProtocolGuid,
NULL,
(VOID **)&mIoMmuProtocol
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR,
DEBUG ((
DEBUG_ERROR,
"QemuFwCfgSevDma %a:%a Failed to locate IOMMU protocol.\n",
gEfiCallerBaseName, __FUNCTION__));
gEfiCallerBaseName,
__FUNCTION__
));
ASSERT (FALSE);
CpuDeadLoop ();
}
@@ -106,7 +112,6 @@ QemuFwCfgInitialize (
return RETURN_SUCCESS;
}
/**
Returns a boolean indicating if the firmware configuration interface is
available for library-internal purposes.
@@ -148,8 +153,8 @@ InternalQemuFwCfgDmaIsAvailable (
STATIC
VOID
AllocFwCfgDmaAccessBuffer (
OUT VOID **Access,
OUT VOID **MapInfo
OUT VOID **Access,
OUT VOID **MapInfo
)
{
UINTN Size;
@@ -159,7 +164,7 @@ AllocFwCfgDmaAccessBuffer (
EFI_PHYSICAL_ADDRESS DmaAddress;
VOID *Mapping;
Size = sizeof (FW_CFG_DMA_ACCESS);
Size = sizeof (FW_CFG_DMA_ACCESS);
NumPages = EFI_SIZE_TO_PAGES (Size);
//
@@ -176,9 +181,12 @@ AllocFwCfgDmaAccessBuffer (
EDKII_IOMMU_ATTRIBUTE_DUAL_ADDRESS_CYCLE
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR,
"%a:%a failed to allocate FW_CFG_DMA_ACCESS\n", gEfiCallerBaseName,
__FUNCTION__));
DEBUG ((
DEBUG_ERROR,
"%a:%a failed to allocate FW_CFG_DMA_ACCESS\n",
gEfiCallerBaseName,
__FUNCTION__
));
ASSERT (FALSE);
CpuDeadLoop ();
}
@@ -202,9 +210,12 @@ AllocFwCfgDmaAccessBuffer (
);
if (EFI_ERROR (Status)) {
mIoMmuProtocol->FreeBuffer (mIoMmuProtocol, NumPages, HostAddress);
DEBUG ((DEBUG_ERROR,
"%a:%a failed to Map() FW_CFG_DMA_ACCESS\n", gEfiCallerBaseName,
__FUNCTION__));
DEBUG ((
DEBUG_ERROR,
"%a:%a failed to Map() FW_CFG_DMA_ACCESS\n",
gEfiCallerBaseName,
__FUNCTION__
));
ASSERT (FALSE);
CpuDeadLoop ();
}
@@ -212,14 +223,19 @@ AllocFwCfgDmaAccessBuffer (
if (Size < sizeof (FW_CFG_DMA_ACCESS)) {
mIoMmuProtocol->Unmap (mIoMmuProtocol, Mapping);
mIoMmuProtocol->FreeBuffer (mIoMmuProtocol, NumPages, HostAddress);
DEBUG ((DEBUG_ERROR,
"%a:%a failed to Map() - requested 0x%Lx got 0x%Lx\n", gEfiCallerBaseName,
__FUNCTION__, (UINT64)sizeof (FW_CFG_DMA_ACCESS), (UINT64)Size));
DEBUG ((
DEBUG_ERROR,
"%a:%a failed to Map() - requested 0x%Lx got 0x%Lx\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)sizeof (FW_CFG_DMA_ACCESS),
(UINT64)Size
));
ASSERT (FALSE);
CpuDeadLoop ();
}
*Access = HostAddress;
*Access = HostAddress;
*MapInfo = Mapping;
}
@@ -231,8 +247,8 @@ AllocFwCfgDmaAccessBuffer (
STATIC
VOID
FreeFwCfgDmaAccessBuffer (
IN VOID *Access,
IN VOID *Mapping
IN VOID *Access,
IN VOID *Mapping
)
{
UINTN NumPages;
@@ -242,18 +258,26 @@ FreeFwCfgDmaAccessBuffer (
Status = mIoMmuProtocol->Unmap (mIoMmuProtocol, Mapping);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR,
"%a:%a failed to UnMap() Mapping 0x%Lx\n", gEfiCallerBaseName,
__FUNCTION__, (UINT64)(UINTN)Mapping));
DEBUG ((
DEBUG_ERROR,
"%a:%a failed to UnMap() Mapping 0x%Lx\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)(UINTN)Mapping
));
ASSERT (FALSE);
CpuDeadLoop ();
}
Status = mIoMmuProtocol->FreeBuffer (mIoMmuProtocol, NumPages, Access);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR,
"%a:%a failed to Free() 0x%Lx\n", gEfiCallerBaseName, __FUNCTION__,
(UINT64)(UINTN)Access));
DEBUG ((
DEBUG_ERROR,
"%a:%a failed to Free() 0x%Lx\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)(UINTN)Access
));
ASSERT (FALSE);
CpuDeadLoop ();
}
@@ -274,41 +298,51 @@ MapFwCfgDmaDataBuffer (
OUT VOID **MapInfo
)
{
EFI_STATUS Status;
UINTN NumberOfBytes;
VOID *Mapping;
EFI_PHYSICAL_ADDRESS PhysicalAddress;
EFI_STATUS Status;
UINTN NumberOfBytes;
VOID *Mapping;
EFI_PHYSICAL_ADDRESS PhysicalAddress;
NumberOfBytes = Size;
Status = mIoMmuProtocol->Map (
mIoMmuProtocol,
(IsWrite ?
EdkiiIoMmuOperationBusMasterRead64 :
EdkiiIoMmuOperationBusMasterWrite64),
HostAddress,
&NumberOfBytes,
&PhysicalAddress,
&Mapping
);
Status = mIoMmuProtocol->Map (
mIoMmuProtocol,
(IsWrite ?
EdkiiIoMmuOperationBusMasterRead64 :
EdkiiIoMmuOperationBusMasterWrite64),
HostAddress,
&NumberOfBytes,
&PhysicalAddress,
&Mapping
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR,
"%a:%a failed to Map() Address 0x%Lx Size 0x%Lx\n", gEfiCallerBaseName,
__FUNCTION__, (UINT64)(UINTN)HostAddress, (UINT64)Size));
DEBUG ((
DEBUG_ERROR,
"%a:%a failed to Map() Address 0x%Lx Size 0x%Lx\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)(UINTN)HostAddress,
(UINT64)Size
));
ASSERT (FALSE);
CpuDeadLoop ();
}
if (NumberOfBytes < Size) {
mIoMmuProtocol->Unmap (mIoMmuProtocol, Mapping);
DEBUG ((DEBUG_ERROR,
"%a:%a failed to Map() - requested 0x%x got 0x%Lx\n", gEfiCallerBaseName,
__FUNCTION__, Size, (UINT64)NumberOfBytes));
DEBUG ((
DEBUG_ERROR,
"%a:%a failed to Map() - requested 0x%x got 0x%Lx\n",
gEfiCallerBaseName,
__FUNCTION__,
Size,
(UINT64)NumberOfBytes
));
ASSERT (FALSE);
CpuDeadLoop ();
}
*DeviceAddress = PhysicalAddress;
*MapInfo = Mapping;
*MapInfo = Mapping;
}
STATIC
@@ -321,9 +355,13 @@ UnmapFwCfgDmaDataBuffer (
Status = mIoMmuProtocol->Unmap (mIoMmuProtocol, Mapping);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR,
"%a:%a failed to UnMap() Mapping 0x%Lx\n", gEfiCallerBaseName,
__FUNCTION__, (UINT64)(UINTN)Mapping));
DEBUG ((
DEBUG_ERROR,
"%a:%a failed to UnMap() Mapping 0x%Lx\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)(UINTN)Mapping
));
ASSERT (FALSE);
CpuDeadLoop ();
}
@@ -346,29 +384,31 @@ UnmapFwCfgDmaDataBuffer (
**/
VOID
InternalQemuFwCfgDmaBytes (
IN UINT32 Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
IN UINT32 Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
)
{
volatile FW_CFG_DMA_ACCESS LocalAccess;
volatile FW_CFG_DMA_ACCESS *Access;
UINT32 AccessHigh, AccessLow;
UINT32 Status;
VOID *AccessMapping, *DataMapping;
VOID *DataBuffer;
volatile FW_CFG_DMA_ACCESS LocalAccess;
volatile FW_CFG_DMA_ACCESS *Access;
UINT32 AccessHigh, AccessLow;
UINT32 Status;
VOID *AccessMapping, *DataMapping;
VOID *DataBuffer;
ASSERT (Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ ||
Control == FW_CFG_DMA_CTL_SKIP);
ASSERT (
Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ ||
Control == FW_CFG_DMA_CTL_SKIP
);
if (Size == 0) {
return;
}
Access = &LocalAccess;
Access = &LocalAccess;
AccessMapping = NULL;
DataMapping = NULL;
DataBuffer = Buffer;
DataMapping = NULL;
DataBuffer = Buffer;
//
// When SEV is enabled, map Buffer to DMA address before issuing the DMA
@@ -397,7 +437,7 @@ InternalQemuFwCfgDmaBytes (
&DataMapping
);
DataBuffer = (VOID *) (UINTN) DataBufferAddress;
DataBuffer = (VOID *)(UINTN)DataBufferAddress;
}
}
@@ -416,7 +456,7 @@ InternalQemuFwCfgDmaBytes (
//
AccessHigh = (UINT32)RShiftU64 ((UINTN)Access, 32);
AccessLow = (UINT32)(UINTN)Access;
IoWrite32 (FW_CFG_IO_DMA_ADDRESS, SwapBytes32 (AccessHigh));
IoWrite32 (FW_CFG_IO_DMA_ADDRESS, SwapBytes32 (AccessHigh));
IoWrite32 (FW_CFG_IO_DMA_ADDRESS + 4, SwapBytes32 (AccessLow));
//

View File

@@ -19,7 +19,6 @@
#include "QemuFwCfgLibInternal.h"
/**
Selects a firmware configuration item for reading.
@@ -32,11 +31,11 @@
VOID
EFIAPI
QemuFwCfgSelectItem (
IN FIRMWARE_CONFIG_ITEM QemuFwCfgItem
IN FIRMWARE_CONFIG_ITEM QemuFwCfgItem
)
{
DEBUG ((DEBUG_INFO, "Select Item: 0x%x\n", (UINT16)(UINTN) QemuFwCfgItem));
IoWrite16 (FW_CFG_IO_SELECTOR, (UINT16)(UINTN) QemuFwCfgItem);
DEBUG ((DEBUG_INFO, "Select Item: 0x%x\n", (UINT16)(UINTN)QemuFwCfgItem));
IoWrite16 (FW_CFG_IO_SELECTOR, (UINT16)(UINTN)QemuFwCfgItem);
}
/**
@@ -49,18 +48,18 @@ QemuFwCfgSelectItem (
VOID
EFIAPI
InternalQemuFwCfgReadBytes (
IN UINTN Size,
IN VOID *Buffer OPTIONAL
IN UINTN Size,
IN VOID *Buffer OPTIONAL
)
{
if (InternalQemuFwCfgDmaIsAvailable () && Size <= MAX_UINT32) {
if (InternalQemuFwCfgDmaIsAvailable () && (Size <= MAX_UINT32)) {
InternalQemuFwCfgDmaBytes ((UINT32)Size, Buffer, FW_CFG_DMA_CTL_READ);
return;
}
IoReadFifo8 (FW_CFG_IO_DATA, Size, Buffer);
}
/**
Reads firmware configuration bytes into a buffer
@@ -75,8 +74,8 @@ InternalQemuFwCfgReadBytes (
VOID
EFIAPI
QemuFwCfgReadBytes (
IN UINTN Size,
IN VOID *Buffer
IN UINTN Size,
IN VOID *Buffer
)
{
if (InternalQemuFwCfgIsAvailable ()) {
@@ -100,20 +99,20 @@ QemuFwCfgReadBytes (
VOID
EFIAPI
QemuFwCfgWriteBytes (
IN UINTN Size,
IN VOID *Buffer
IN UINTN Size,
IN VOID *Buffer
)
{
if (InternalQemuFwCfgIsAvailable ()) {
if (InternalQemuFwCfgDmaIsAvailable () && Size <= MAX_UINT32) {
if (InternalQemuFwCfgDmaIsAvailable () && (Size <= MAX_UINT32)) {
InternalQemuFwCfgDmaBytes ((UINT32)Size, Buffer, FW_CFG_DMA_CTL_WRITE);
return;
}
IoWriteFifo8 (FW_CFG_IO_DATA, Size, Buffer);
}
}
/**
Skip bytes in the firmware configuration item.
@@ -126,17 +125,17 @@ QemuFwCfgWriteBytes (
VOID
EFIAPI
QemuFwCfgSkipBytes (
IN UINTN Size
IN UINTN Size
)
{
UINTN ChunkSize;
UINT8 SkipBuffer[256];
UINTN ChunkSize;
UINT8 SkipBuffer[256];
if (!InternalQemuFwCfgIsAvailable ()) {
return;
}
if (InternalQemuFwCfgDmaIsAvailable () && Size <= MAX_UINT32) {
if (InternalQemuFwCfgDmaIsAvailable () && (Size <= MAX_UINT32)) {
InternalQemuFwCfgDmaBytes ((UINT32)Size, NULL, FW_CFG_DMA_CTL_SKIP);
return;
}
@@ -157,7 +156,6 @@ QemuFwCfgSkipBytes (
}
}
/**
Reads a UINT8 firmware configuration value
@@ -170,14 +168,13 @@ QemuFwCfgRead8 (
VOID
)
{
UINT8 Result;
UINT8 Result;
QemuFwCfgReadBytes (sizeof (Result), &Result);
return Result;
}
/**
Reads a UINT16 firmware configuration value
@@ -190,14 +187,13 @@ QemuFwCfgRead16 (
VOID
)
{
UINT16 Result;
UINT16 Result;
QemuFwCfgReadBytes (sizeof (Result), &Result);
return Result;
}
/**
Reads a UINT32 firmware configuration value
@@ -210,14 +206,13 @@ QemuFwCfgRead32 (
VOID
)
{
UINT32 Result;
UINT32 Result;
QemuFwCfgReadBytes (sizeof (Result), &Result);
return Result;
}
/**
Reads a UINT64 firmware configuration value
@@ -230,14 +225,13 @@ QemuFwCfgRead64 (
VOID
)
{
UINT64 Result;
UINT64 Result;
QemuFwCfgReadBytes (sizeof (Result), &Result);
return Result;
}
/**
Find the configuration item corresponding to the firmware configuration file.
@@ -259,8 +253,8 @@ QemuFwCfgFindFile (
OUT UINTN *Size
)
{
UINT32 Count;
UINT32 Idx;
UINT32 Count;
UINT32 Idx;
if (!InternalQemuFwCfgIsAvailable ()) {
return RETURN_UNSUPPORTED;
@@ -270,15 +264,15 @@ QemuFwCfgFindFile (
Count = SwapBytes32 (QemuFwCfgRead32 ());
for (Idx = 0; Idx < Count; ++Idx) {
UINT32 FileSize;
UINT16 FileSelect;
UINT16 FileReserved;
CHAR8 FName[QEMU_FW_CFG_FNAME_SIZE];
UINT32 FileSize;
UINT16 FileSelect;
UINT16 FileReserved;
CHAR8 FName[QEMU_FW_CFG_FNAME_SIZE];
FileSize = QemuFwCfgRead32 ();
FileSelect = QemuFwCfgRead16 ();
FileReserved = QemuFwCfgRead16 ();
(VOID) FileReserved; /* Force a do-nothing reference. */
(VOID)FileReserved; /* Force a do-nothing reference. */
InternalQemuFwCfgReadBytes (sizeof (FName), FName);
if (AsciiStrCmp (Name, FName) == 0) {

View File

@@ -25,7 +25,6 @@ InternalQemuFwCfgIsAvailable (
VOID
);
/**
Returns a boolean indicating whether QEMU provides the DMA-like access method
for fw_cfg.
@@ -55,9 +54,9 @@ InternalQemuFwCfgDmaIsAvailable (
**/
VOID
InternalQemuFwCfgDmaBytes (
IN UINT32 Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
IN UINT32 Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
);
#endif

View File

@@ -20,9 +20,9 @@
#include <Protocol/FdtClient.h>
STATIC UINTN mFwCfgSelectorAddress;
STATIC UINTN mFwCfgDataAddress;
STATIC UINTN mFwCfgDmaAddress;
STATIC UINTN mFwCfgSelectorAddress;
STATIC UINTN mFwCfgDataAddress;
STATIC UINTN mFwCfgDmaAddress;
/**
Reads firmware configuration bytes into a buffer
@@ -32,7 +32,7 @@ STATIC UINTN mFwCfgDmaAddress;
**/
typedef
VOID (EFIAPI READ_BYTES_FUNCTION) (
VOID(EFIAPI READ_BYTES_FUNCTION)(
IN UINTN Size,
IN VOID *Buffer OPTIONAL
);
@@ -45,7 +45,7 @@ VOID (EFIAPI READ_BYTES_FUNCTION) (
**/
typedef
VOID (EFIAPI WRITE_BYTES_FUNCTION) (
VOID(EFIAPI WRITE_BYTES_FUNCTION)(
IN UINTN Size,
IN VOID *Buffer OPTIONAL
);
@@ -57,27 +57,26 @@ VOID (EFIAPI WRITE_BYTES_FUNCTION) (
**/
typedef
VOID (EFIAPI SKIP_BYTES_FUNCTION) (
VOID(EFIAPI SKIP_BYTES_FUNCTION)(
IN UINTN Size
);
//
// Forward declaration of the two implementations we have.
//
STATIC READ_BYTES_FUNCTION MmioReadBytes;
STATIC WRITE_BYTES_FUNCTION MmioWriteBytes;
STATIC SKIP_BYTES_FUNCTION MmioSkipBytes;
STATIC READ_BYTES_FUNCTION DmaReadBytes;
STATIC WRITE_BYTES_FUNCTION DmaWriteBytes;
STATIC SKIP_BYTES_FUNCTION DmaSkipBytes;
STATIC READ_BYTES_FUNCTION MmioReadBytes;
STATIC WRITE_BYTES_FUNCTION MmioWriteBytes;
STATIC SKIP_BYTES_FUNCTION MmioSkipBytes;
STATIC READ_BYTES_FUNCTION DmaReadBytes;
STATIC WRITE_BYTES_FUNCTION DmaWriteBytes;
STATIC SKIP_BYTES_FUNCTION DmaSkipBytes;
//
// These correspond to the implementation we detect at runtime.
//
STATIC READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes;
STATIC WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes;
STATIC SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes;
STATIC READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes;
STATIC WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes;
STATIC SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes;
/**
Returns a boolean indicating if the firmware configuration interface
@@ -98,36 +97,46 @@ QemuFwCfgIsAvailable (
return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0);
}
RETURN_STATUS
EFIAPI
QemuFwCfgInitialize (
VOID
)
{
EFI_STATUS Status;
FDT_CLIENT_PROTOCOL *FdtClient;
CONST UINT64 *Reg;
UINT32 RegSize;
UINTN AddressCells, SizeCells;
UINT64 FwCfgSelectorAddress;
UINT64 FwCfgSelectorSize;
UINT64 FwCfgDataAddress;
UINT64 FwCfgDataSize;
UINT64 FwCfgDmaAddress;
UINT64 FwCfgDmaSize;
EFI_STATUS Status;
FDT_CLIENT_PROTOCOL *FdtClient;
CONST UINT64 *Reg;
UINT32 RegSize;
UINTN AddressCells, SizeCells;
UINT64 FwCfgSelectorAddress;
UINT64 FwCfgSelectorSize;
UINT64 FwCfgDataAddress;
UINT64 FwCfgDataSize;
UINT64 FwCfgDmaAddress;
UINT64 FwCfgDmaSize;
Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL,
(VOID **)&FdtClient);
Status = gBS->LocateProtocol (
&gFdtClientProtocolGuid,
NULL,
(VOID **)&FdtClient
);
ASSERT_EFI_ERROR (Status);
Status = FdtClient->FindCompatibleNodeReg (FdtClient, "qemu,fw-cfg-mmio",
(CONST VOID **)&Reg, &AddressCells, &SizeCells,
&RegSize);
Status = FdtClient->FindCompatibleNodeReg (
FdtClient,
"qemu,fw-cfg-mmio",
(CONST VOID **)&Reg,
&AddressCells,
&SizeCells,
&RegSize
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN,
DEBUG ((
DEBUG_WARN,
"%a: No 'qemu,fw-cfg-mmio' compatible DT node found (Status == %r)\n",
__FUNCTION__, Status));
__FUNCTION__,
Status
));
return EFI_SUCCESS;
}
@@ -156,8 +165,12 @@ QemuFwCfgInitialize (
mFwCfgSelectorAddress = FwCfgSelectorAddress;
mFwCfgDataAddress = FwCfgDataAddress;
DEBUG ((DEBUG_INFO, "Found FwCfg @ 0x%Lx/0x%Lx\n", FwCfgSelectorAddress,
FwCfgDataAddress));
DEBUG ((
DEBUG_INFO,
"Found FwCfg @ 0x%Lx/0x%Lx\n",
FwCfgSelectorAddress,
FwCfgDataAddress
));
if (SwapBytes64 (Reg[1]) >= 0x18) {
FwCfgDmaAddress = FwCfgDataAddress + 0x10;
@@ -174,7 +187,7 @@ QemuFwCfgInitialize (
}
if (QemuFwCfgIsAvailable ()) {
UINT32 Signature;
UINT32 Signature;
QemuFwCfgSelectItem (QemuFwCfgItemSignature);
Signature = QemuFwCfgRead32 ();
@@ -184,15 +197,15 @@ QemuFwCfgInitialize (
// feature bitmap (which we read without DMA) to confirm the feature.
//
if (FwCfgDmaAddress != 0) {
UINT32 Features;
UINT32 Features;
QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion);
Features = QemuFwCfgRead32 ();
if ((Features & FW_CFG_F_DMA) != 0) {
mFwCfgDmaAddress = FwCfgDmaAddress;
InternalQemuFwCfgReadBytes = DmaReadBytes;
mFwCfgDmaAddress = FwCfgDmaAddress;
InternalQemuFwCfgReadBytes = DmaReadBytes;
InternalQemuFwCfgWriteBytes = DmaWriteBytes;
InternalQemuFwCfgSkipBytes = DmaSkipBytes;
InternalQemuFwCfgSkipBytes = DmaSkipBytes;
}
}
} else {
@@ -200,10 +213,10 @@ QemuFwCfgInitialize (
mFwCfgDataAddress = 0;
}
}
return RETURN_SUCCESS;
}
/**
Selects a firmware configuration item for reading.
@@ -216,7 +229,7 @@ QemuFwCfgInitialize (
VOID
EFIAPI
QemuFwCfgSelectItem (
IN FIRMWARE_CONFIG_ITEM QemuFwCfgItem
IN FIRMWARE_CONFIG_ITEM QemuFwCfgItem
)
{
if (QemuFwCfgIsAvailable ()) {
@@ -224,7 +237,6 @@ QemuFwCfgSelectItem (
}
}
/**
Slow READ_BYTES_FUNCTION.
**/
@@ -232,50 +244,53 @@ STATIC
VOID
EFIAPI
MmioReadBytes (
IN UINTN Size,
IN VOID *Buffer OPTIONAL
IN UINTN Size,
IN VOID *Buffer OPTIONAL
)
{
UINTN Left;
UINT8 *Ptr;
UINT8 *End;
UINTN Left;
UINT8 *Ptr;
UINT8 *End;
#if defined(MDE_CPU_AARCH64) || defined(MDE_CPU_RISCV64)
#if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64)
Left = Size & 7;
#else
#else
Left = Size & 3;
#endif
#endif
Size -= Left;
Ptr = Buffer;
End = Ptr + Size;
Ptr = Buffer;
End = Ptr + Size;
#if defined(MDE_CPU_AARCH64) || defined(MDE_CPU_RISCV64)
#if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64)
while (Ptr < End) {
*(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress);
Ptr += 8;
Ptr += 8;
}
if (Left & 4) {
*(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress);
Ptr += 4;
Ptr += 4;
}
#else
#else
while (Ptr < End) {
*(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress);
Ptr += 4;
Ptr += 4;
}
#endif
#endif
if (Left & 2) {
*(UINT16 *)Ptr = MmioRead16 (mFwCfgDataAddress);
Ptr += 2;
Ptr += 2;
}
if (Left & 1) {
*Ptr = MmioRead8 (mFwCfgDataAddress);
}
}
/**
Transfer an array of bytes, or skip a number of bytes, using the DMA
interface.
@@ -294,16 +309,18 @@ MmioReadBytes (
STATIC
VOID
DmaTransferBytes (
IN UINTN Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
IN UINTN Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
)
{
volatile FW_CFG_DMA_ACCESS Access;
UINT32 Status;
volatile FW_CFG_DMA_ACCESS Access;
UINT32 Status;
ASSERT (Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ ||
Control == FW_CFG_DMA_CTL_SKIP);
ASSERT (
Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ ||
Control == FW_CFG_DMA_CTL_SKIP
);
if (Size == 0) {
return;
@@ -323,11 +340,11 @@ DmaTransferBytes (
//
// This will fire off the transfer.
//
#if defined(MDE_CPU_AARCH64) || defined(MDE_CPU_RISCV64)
#if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64)
MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access));
#else
#else
MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access));
#endif
#endif
//
// We shouldn't look at Access.Control before starting the transfer.
@@ -345,7 +362,6 @@ DmaTransferBytes (
MemoryFence ();
}
/**
Fast READ_BYTES_FUNCTION.
**/
@@ -353,14 +369,13 @@ STATIC
VOID
EFIAPI
DmaReadBytes (
IN UINTN Size,
IN VOID *Buffer OPTIONAL
IN UINTN Size,
IN VOID *Buffer OPTIONAL
)
{
DmaTransferBytes (Size, Buffer, FW_CFG_DMA_CTL_READ);
}
/**
Reads firmware configuration bytes into a buffer
@@ -374,8 +389,8 @@ DmaReadBytes (
VOID
EFIAPI
QemuFwCfgReadBytes (
IN UINTN Size,
IN VOID *Buffer
IN UINTN Size,
IN VOID *Buffer
)
{
if (QemuFwCfgIsAvailable ()) {
@@ -385,7 +400,6 @@ QemuFwCfgReadBytes (
}
}
/**
Slow WRITE_BYTES_FUNCTION.
**/
@@ -393,18 +407,17 @@ STATIC
VOID
EFIAPI
MmioWriteBytes (
IN UINTN Size,
IN VOID *Buffer OPTIONAL
IN UINTN Size,
IN VOID *Buffer OPTIONAL
)
{
UINTN Idx;
UINTN Idx;
for (Idx = 0; Idx < Size; ++Idx) {
MmioWrite8 (mFwCfgDataAddress, ((UINT8 *)Buffer)[Idx]);
}
}
/**
Fast WRITE_BYTES_FUNCTION.
**/
@@ -412,14 +425,13 @@ STATIC
VOID
EFIAPI
DmaWriteBytes (
IN UINTN Size,
IN VOID *Buffer OPTIONAL
IN UINTN Size,
IN VOID *Buffer OPTIONAL
)
{
DmaTransferBytes (Size, Buffer, FW_CFG_DMA_CTL_WRITE);
}
/**
Write firmware configuration bytes from a buffer
@@ -433,8 +445,8 @@ DmaWriteBytes (
VOID
EFIAPI
QemuFwCfgWriteBytes (
IN UINTN Size,
IN VOID *Buffer
IN UINTN Size,
IN VOID *Buffer
)
{
if (QemuFwCfgIsAvailable ()) {
@@ -442,7 +454,6 @@ QemuFwCfgWriteBytes (
}
}
/**
Slow SKIP_BYTES_FUNCTION.
**/
@@ -450,11 +461,11 @@ STATIC
VOID
EFIAPI
MmioSkipBytes (
IN UINTN Size
IN UINTN Size
)
{
UINTN ChunkSize;
UINT8 SkipBuffer[256];
UINTN ChunkSize;
UINT8 SkipBuffer[256];
//
// Emulate the skip by reading data in chunks, and throwing it away. The
@@ -470,7 +481,6 @@ MmioSkipBytes (
}
}
/**
Fast SKIP_BYTES_FUNCTION.
**/
@@ -478,13 +488,12 @@ STATIC
VOID
EFIAPI
DmaSkipBytes (
IN UINTN Size
IN UINTN Size
)
{
DmaTransferBytes (Size, NULL, FW_CFG_DMA_CTL_SKIP);
}
/**
Skip bytes in the firmware configuration item.
@@ -497,7 +506,7 @@ DmaSkipBytes (
VOID
EFIAPI
QemuFwCfgSkipBytes (
IN UINTN Size
IN UINTN Size
)
{
if (QemuFwCfgIsAvailable ()) {
@@ -505,7 +514,6 @@ QemuFwCfgSkipBytes (
}
}
/**
Reads a UINT8 firmware configuration value
@@ -518,13 +526,12 @@ QemuFwCfgRead8 (
VOID
)
{
UINT8 Result;
UINT8 Result;
QemuFwCfgReadBytes (sizeof Result, &Result);
return Result;
}
/**
Reads a UINT16 firmware configuration value
@@ -537,13 +544,12 @@ QemuFwCfgRead16 (
VOID
)
{
UINT16 Result;
UINT16 Result;
QemuFwCfgReadBytes (sizeof Result, &Result);
return Result;
}
/**
Reads a UINT32 firmware configuration value
@@ -556,13 +562,12 @@ QemuFwCfgRead32 (
VOID
)
{
UINT32 Result;
UINT32 Result;
QemuFwCfgReadBytes (sizeof Result, &Result);
return Result;
}
/**
Reads a UINT64 firmware configuration value
@@ -575,13 +580,12 @@ QemuFwCfgRead64 (
VOID
)
{
UINT64 Result;
UINT64 Result;
QemuFwCfgReadBytes (sizeof Result, &Result);
return Result;
}
/**
Find the configuration item corresponding to the firmware configuration file.
@@ -603,8 +607,8 @@ QemuFwCfgFindFile (
OUT UINTN *Size
)
{
UINT32 Count;
UINT32 Idx;
UINT32 Count;
UINT32 Idx;
if (!QemuFwCfgIsAvailable ()) {
return RETURN_UNSUPPORTED;
@@ -614,9 +618,9 @@ QemuFwCfgFindFile (
Count = SwapBytes32 (QemuFwCfgRead32 ());
for (Idx = 0; Idx < Count; ++Idx) {
UINT32 FileSize;
UINT16 FileSelect;
CHAR8 FName[QEMU_FW_CFG_FNAME_SIZE];
UINT32 FileSize;
UINT16 FileSelect;
CHAR8 FName[QEMU_FW_CFG_FNAME_SIZE];
FileSize = QemuFwCfgRead32 ();
FileSelect = QemuFwCfgRead16 ();
@@ -624,7 +628,7 @@ QemuFwCfgFindFile (
InternalQemuFwCfgReadBytes (sizeof (FName), FName);
if (AsciiStrCmp (Name, FName) == 0) {
*Item = (FIRMWARE_CONFIG_ITEM) SwapBytes16 (FileSelect);
*Item = (FIRMWARE_CONFIG_ITEM)SwapBytes16 (FileSelect);
*Size = SwapBytes32 (FileSize);
return RETURN_SUCCESS;
}

View File

@@ -32,7 +32,6 @@ QemuFwCfgIsAvailable (
return FALSE;
}
/**
Selects a firmware configuration item for reading.
@@ -45,13 +44,12 @@ QemuFwCfgIsAvailable (
VOID
EFIAPI
QemuFwCfgSelectItem (
IN FIRMWARE_CONFIG_ITEM QemuFwCfgItem
IN FIRMWARE_CONFIG_ITEM QemuFwCfgItem
)
{
ASSERT (FALSE);
}
/**
Reads firmware configuration bytes into a buffer
@@ -66,14 +64,13 @@ QemuFwCfgSelectItem (
VOID
EFIAPI
QemuFwCfgReadBytes (
IN UINTN Size,
IN VOID *Buffer OPTIONAL
IN UINTN Size,
IN VOID *Buffer OPTIONAL
)
{
ASSERT (FALSE);
}
/**
Writes firmware configuration bytes from a buffer
@@ -88,14 +85,13 @@ QemuFwCfgReadBytes (
VOID
EFIAPI
QemuFwCfgWriteBytes (
IN UINTN Size,
IN VOID *Buffer
IN UINTN Size,
IN VOID *Buffer
)
{
ASSERT (FALSE);
}
/**
Skip bytes in the firmware configuration item.
@@ -108,13 +104,12 @@ QemuFwCfgWriteBytes (
VOID
EFIAPI
QemuFwCfgSkipBytes (
IN UINTN Size
IN UINTN Size
)
{
ASSERT (FALSE);
}
/**
Reads a UINT8 firmware configuration value
@@ -131,7 +126,6 @@ QemuFwCfgRead8 (
return 0;
}
/**
Reads a UINT16 firmware configuration value
@@ -148,7 +142,6 @@ QemuFwCfgRead16 (
return 0;
}
/**
Reads a UINT32 firmware configuration value
@@ -165,7 +158,6 @@ QemuFwCfgRead32 (
return 0;
}
/**
Reads a UINT64 firmware configuration value
@@ -182,7 +174,6 @@ QemuFwCfgRead64 (
return 0;
}
/**
Find the configuration item corresponding to the firmware configuration file.
@@ -206,4 +197,3 @@ QemuFwCfgFindFile (
{
return RETURN_UNSUPPORTED;
}

View File

@@ -17,9 +17,8 @@
#include "QemuFwCfgLibInternal.h"
STATIC BOOLEAN mQemuFwCfgSupported = FALSE;
STATIC BOOLEAN mQemuFwCfgDmaSupported;
STATIC BOOLEAN mQemuFwCfgSupported = FALSE;
STATIC BOOLEAN mQemuFwCfgDmaSupported;
/**
Returns a boolean indicating if the firmware configuration interface
@@ -40,21 +39,20 @@ QemuFwCfgIsAvailable (
return InternalQemuFwCfgIsAvailable ();
}
RETURN_STATUS
EFIAPI
QemuFwCfgInitialize (
VOID
)
{
UINT32 Signature;
UINT32 Revision;
UINT32 Signature;
UINT32 Revision;
//
// Enable the access routines while probing to see if it is supported.
// For probing we always use the IO Port (IoReadFifo8()) access method.
//
mQemuFwCfgSupported = TRUE;
mQemuFwCfgSupported = TRUE;
mQemuFwCfgDmaSupported = FALSE;
QemuFwCfgSelectItem (QemuFwCfgItemSignature);
@@ -65,7 +63,8 @@ QemuFwCfgInitialize (
DEBUG ((DEBUG_INFO, "FW CFG Revision: 0x%x\n", Revision));
if ((Signature != SIGNATURE_32 ('Q', 'E', 'M', 'U')) ||
(Revision < 1)
) {
)
{
DEBUG ((DEBUG_INFO, "QemuFwCfg interface not supported.\n"));
mQemuFwCfgSupported = FALSE;
return RETURN_SUCCESS;
@@ -87,10 +86,10 @@ QemuFwCfgInitialize (
DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));
}
}
return RETURN_SUCCESS;
}
/**
Returns a boolean indicating if the firmware configuration interface is
available for library-internal purposes.
@@ -140,17 +139,19 @@ InternalQemuFwCfgDmaIsAvailable (
**/
VOID
InternalQemuFwCfgDmaBytes (
IN UINT32 Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
IN UINT32 Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
)
{
volatile FW_CFG_DMA_ACCESS Access;
UINT32 AccessHigh, AccessLow;
UINT32 Status;
volatile FW_CFG_DMA_ACCESS Access;
UINT32 AccessHigh, AccessLow;
UINT32 Status;
ASSERT (Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ ||
Control == FW_CFG_DMA_CTL_SKIP);
ASSERT (
Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ ||
Control == FW_CFG_DMA_CTL_SKIP
);
if (Size == 0) {
return;
@@ -177,7 +178,7 @@ InternalQemuFwCfgDmaBytes (
//
AccessHigh = (UINT32)RShiftU64 ((UINTN)&Access, 32);
AccessLow = (UINT32)(UINTN)&Access;
IoWrite32 (FW_CFG_IO_DMA_ADDRESS, SwapBytes32 (AccessHigh));
IoWrite32 (FW_CFG_IO_DMA_ADDRESS, SwapBytes32 (AccessHigh));
IoWrite32 (FW_CFG_IO_DMA_ADDRESS + 4, SwapBytes32 (AccessLow));
//
@@ -198,4 +199,3 @@ InternalQemuFwCfgDmaBytes (
//
MemoryFence ();
}

View File

@@ -33,8 +33,8 @@ QemuFwCfgIsAvailable (
VOID
)
{
UINT32 Signature;
UINT32 Revision;
UINT32 Signature;
UINT32 Revision;
QemuFwCfgSelectItem (QemuFwCfgItemSignature);
Signature = QemuFwCfgRead32 ();
@@ -44,7 +44,8 @@ QemuFwCfgIsAvailable (
DEBUG ((DEBUG_INFO, "FW CFG Revision: 0x%x\n", Revision));
if ((Signature != SIGNATURE_32 ('Q', 'E', 'M', 'U')) ||
(Revision < 1)
) {
)
{
DEBUG ((DEBUG_INFO, "QemuFwCfg interface not supported.\n"));
return FALSE;
}
@@ -53,7 +54,6 @@ QemuFwCfgIsAvailable (
return TRUE;
}
/**
Returns a boolean indicating if the firmware configuration interface is
available for library-internal purposes.
@@ -108,9 +108,9 @@ InternalQemuFwCfgDmaIsAvailable (
**/
VOID
InternalQemuFwCfgDmaBytes (
IN UINT32 Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
IN UINT32 Size,
IN OUT VOID *Buffer OPTIONAL,
IN UINT32 Control
)
{
//

View File

@@ -33,7 +33,6 @@ QemuFwCfgS3Enabled (
return FALSE;
}
/**
Install the client module's FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION callback for
when the production of ACPI S3 Boot Script opcodes becomes possible.
@@ -91,13 +90,12 @@ QemuFwCfgS3Enabled (
@return Error codes from underlying functions.
**/
RETURN_STATUS
EFIAPI
QemuFwCfgS3CallWhenBootScriptReady (
IN FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION *Callback,
IN OUT VOID *Context OPTIONAL,
IN UINTN ScratchBufferSize
IN FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION *Callback,
IN OUT VOID *Context OPTIONAL,
IN UINTN ScratchBufferSize
)
{
ASSERT (FALSE);

View File

@@ -53,15 +53,14 @@
RETURN_STATUS
EFIAPI
QemuFwCfgS3ScriptWriteBytes (
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
)
{
ASSERT (FALSE);
return RETURN_UNSUPPORTED;
}
/**
Produce ACPI S3 Boot Script opcodes that (optionally) select an fw_cfg item,
and transfer data from it.
@@ -104,15 +103,14 @@ QemuFwCfgS3ScriptWriteBytes (
RETURN_STATUS
EFIAPI
QemuFwCfgS3ScriptReadBytes (
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
)
{
ASSERT (FALSE);
return RETURN_UNSUPPORTED;
}
/**
Produce ACPI S3 Boot Script opcodes that (optionally) select an fw_cfg item,
and increase its offset.
@@ -148,15 +146,14 @@ QemuFwCfgS3ScriptReadBytes (
RETURN_STATUS
EFIAPI
QemuFwCfgS3ScriptSkipBytes (
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
)
{
ASSERT (FALSE);
return RETURN_UNSUPPORTED;
}
/**
Produce ACPI S3 Boot Script opcodes that check a value in ScratchBuffer.
@@ -210,10 +207,10 @@ QemuFwCfgS3ScriptSkipBytes (
RETURN_STATUS
EFIAPI
QemuFwCfgS3ScriptCheckValue (
IN VOID *ScratchData,
IN UINT8 ValueSize,
IN UINT64 ValueMask,
IN UINT64 Value
IN VOID *ScratchData,
IN UINT8 ValueSize,
IN UINT64 ValueMask,
IN UINT64 Value
)
{
ASSERT (FALSE);

View File

@@ -14,34 +14,32 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/S3SaveState.h>
//
// Event to signal when the S3SaveState protocol interface is installed.
//
STATIC EFI_EVENT mS3SaveStateInstalledEvent;
STATIC EFI_EVENT mS3SaveStateInstalledEvent;
//
// Reference to the S3SaveState protocol interface, after it is installed.
//
STATIC EFI_S3_SAVE_STATE_PROTOCOL *mS3SaveState;
STATIC EFI_S3_SAVE_STATE_PROTOCOL *mS3SaveState;
//
// The control structure is allocated in reserved memory, aligned at 8 bytes.
// The client-requested ScratchBuffer will be allocated adjacently, also
// aligned at 8 bytes.
//
#define RESERVED_MEM_ALIGNMENT 8
#define RESERVED_MEM_ALIGNMENT 8
STATIC FW_CFG_DMA_ACCESS *mDmaAccess;
STATIC VOID *mScratchBuffer;
STATIC UINTN mScratchBufferSize;
STATIC FW_CFG_DMA_ACCESS *mDmaAccess;
STATIC VOID *mScratchBuffer;
STATIC UINTN mScratchBufferSize;
//
// Callback provided by the client, for appending ACPI S3 Boot Script opcodes.
// To be called from S3SaveStateInstalledNotify().
//
STATIC FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION *mCallback;
STATIC FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION *mCallback;
/**
Event notification function for mS3SaveStateInstalledEvent.
@@ -50,32 +48,40 @@ STATIC
VOID
EFIAPI
S3SaveStateInstalledNotify (
IN EFI_EVENT Event,
IN VOID *Context
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_STATUS Status;
EFI_STATUS Status;
ASSERT (Event == mS3SaveStateInstalledEvent);
Status = gBS->LocateProtocol (&gEfiS3SaveStateProtocolGuid,
NULL /* Registration */, (VOID **)&mS3SaveState);
Status = gBS->LocateProtocol (
&gEfiS3SaveStateProtocolGuid,
NULL /* Registration */,
(VOID **)&mS3SaveState
);
if (EFI_ERROR (Status)) {
return;
}
ASSERT (mCallback != NULL);
DEBUG ((DEBUG_INFO, "%a: %a: DmaAccess@0x%Lx ScratchBuffer@[0x%Lx+0x%Lx]\n",
gEfiCallerBaseName, __FUNCTION__, (UINT64)(UINTN)mDmaAccess,
(UINT64)(UINTN)mScratchBuffer, (UINT64)mScratchBufferSize));
DEBUG ((
DEBUG_INFO,
"%a: %a: DmaAccess@0x%Lx ScratchBuffer@[0x%Lx+0x%Lx]\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)(UINTN)mDmaAccess,
(UINT64)(UINTN)mScratchBuffer,
(UINT64)mScratchBufferSize
));
mCallback (Context, mScratchBuffer);
gBS->CloseEvent (mS3SaveStateInstalledEvent);
mS3SaveStateInstalledEvent = NULL;
}
/**
Install the client module's FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION callback for
when the production of ACPI S3 Boot Script opcodes becomes possible.
@@ -136,13 +142,13 @@ S3SaveStateInstalledNotify (
RETURN_STATUS
EFIAPI
QemuFwCfgS3CallWhenBootScriptReady (
IN FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION *Callback,
IN OUT VOID *Context OPTIONAL,
IN UINTN ScratchBufferSize
IN FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION *Callback,
IN OUT VOID *Context OPTIONAL,
IN UINTN ScratchBufferSize
)
{
EFI_STATUS Status;
VOID *Registration;
EFI_STATUS Status;
VOID *Registration;
//
// Basic fw_cfg is certainly available, as we can only be here after a
@@ -151,8 +157,12 @@ QemuFwCfgS3CallWhenBootScriptReady (
ASSERT (QemuFwCfgIsAvailable ());
QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion);
if ((QemuFwCfgRead32 () & FW_CFG_F_DMA) == 0) {
DEBUG ((DEBUG_ERROR, "%a: %a: fw_cfg DMA unavailable\n",
gEfiCallerBaseName, __FUNCTION__));
DEBUG ((
DEBUG_ERROR,
"%a: %a: fw_cfg DMA unavailable\n",
gEfiCallerBaseName,
__FUNCTION__
));
return RETURN_NOT_FOUND;
}
@@ -161,37 +171,69 @@ QemuFwCfgS3CallWhenBootScriptReady (
// client data together.
//
if (ScratchBufferSize >
MAX_UINT32 - (RESERVED_MEM_ALIGNMENT - 1) - sizeof *mDmaAccess) {
DEBUG ((DEBUG_ERROR, "%a: %a: ScratchBufferSize too big: %Lu\n",
gEfiCallerBaseName, __FUNCTION__, (UINT64)ScratchBufferSize));
MAX_UINT32 - (RESERVED_MEM_ALIGNMENT - 1) - sizeof *mDmaAccess)
{
DEBUG ((
DEBUG_ERROR,
"%a: %a: ScratchBufferSize too big: %Lu\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)ScratchBufferSize
));
return RETURN_BAD_BUFFER_SIZE;
}
mDmaAccess = AllocateReservedPool ((RESERVED_MEM_ALIGNMENT - 1) +
sizeof *mDmaAccess + ScratchBufferSize);
mDmaAccess = AllocateReservedPool (
(RESERVED_MEM_ALIGNMENT - 1) +
sizeof *mDmaAccess + ScratchBufferSize
);
if (mDmaAccess == NULL) {
DEBUG ((DEBUG_ERROR, "%a: %a: AllocateReservedPool(): out of resources\n",
gEfiCallerBaseName, __FUNCTION__));
DEBUG ((
DEBUG_ERROR,
"%a: %a: AllocateReservedPool(): out of resources\n",
gEfiCallerBaseName,
__FUNCTION__
));
return RETURN_OUT_OF_RESOURCES;
}
mDmaAccess = ALIGN_POINTER (mDmaAccess, RESERVED_MEM_ALIGNMENT);
//
// Set up a protocol notify for EFI_S3_SAVE_STATE_PROTOCOL. Forward the
// client's Context to the callback.
//
Status = gBS->CreateEvent (EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
S3SaveStateInstalledNotify, Context,
&mS3SaveStateInstalledEvent);
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_CALLBACK,
S3SaveStateInstalledNotify,
Context,
&mS3SaveStateInstalledEvent
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: CreateEvent(): %r\n", gEfiCallerBaseName,
__FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: CreateEvent(): %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
goto FreeDmaAccess;
}
Status = gBS->RegisterProtocolNotify (&gEfiS3SaveStateProtocolGuid,
mS3SaveStateInstalledEvent, &Registration);
Status = gBS->RegisterProtocolNotify (
&gEfiS3SaveStateProtocolGuid,
mS3SaveStateInstalledEvent,
&Registration
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: RegisterProtocolNotify(): %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: RegisterProtocolNotify(): %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
goto CloseEvent;
}
@@ -201,26 +243,31 @@ QemuFwCfgS3CallWhenBootScriptReady (
// integral multiple of RESERVED_MEM_ALIGNMENT.
//
ASSERT (sizeof *mDmaAccess % RESERVED_MEM_ALIGNMENT == 0);
mScratchBuffer = mDmaAccess + 1;
mScratchBuffer = mDmaAccess + 1;
mScratchBufferSize = ScratchBufferSize;
mCallback = Callback;
mCallback = Callback;
//
// Kick the event; EFI_S3_SAVE_STATE_PROTOCOL could be available already.
//
Status = gBS->SignalEvent (mS3SaveStateInstalledEvent);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: SignalEvent(): %r\n", gEfiCallerBaseName,
__FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: SignalEvent(): %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
goto NullGlobals;
}
return RETURN_SUCCESS;
NullGlobals:
mScratchBuffer = NULL;
mScratchBuffer = NULL;
mScratchBufferSize = 0;
mCallback = NULL;
mCallback = NULL;
CloseEvent:
gBS->CloseEvent (mS3SaveStateInstalledEvent);
@@ -233,7 +280,6 @@ FreeDmaAccess:
return (RETURN_STATUS)Status;
}
/**
Produce ACPI S3 Boot Script opcodes that (optionally) select an fw_cfg item,
and transfer data to it.
@@ -277,22 +323,23 @@ FreeDmaAccess:
RETURN_STATUS
EFIAPI
QemuFwCfgS3ScriptWriteBytes (
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
)
{
UINTN Count;
EFI_STATUS Status;
UINT64 AccessAddress;
UINT32 ControlPollData;
UINT32 ControlPollMask;
UINTN Count;
EFI_STATUS Status;
UINT64 AccessAddress;
UINT32 ControlPollData;
UINT32 ControlPollMask;
ASSERT (mDmaAccess != NULL);
ASSERT (mS3SaveState != NULL);
if (FirmwareConfigItem < -1 || FirmwareConfigItem > MAX_UINT16) {
if ((FirmwareConfigItem < -1) || (FirmwareConfigItem > MAX_UINT16)) {
return RETURN_INVALID_PARAMETER;
}
if (NumberOfBytes > mScratchBufferSize) {
return RETURN_BAD_BUFFER_SIZE;
}
@@ -305,6 +352,7 @@ QemuFwCfgS3ScriptWriteBytes (
mDmaAccess->Control |= FW_CFG_DMA_CTL_SELECT;
mDmaAccess->Control |= (UINT32)FirmwareConfigItem << 16;
}
mDmaAccess->Control = SwapBytes32 (mDmaAccess->Control);
//
@@ -321,7 +369,7 @@ QemuFwCfgS3ScriptWriteBytes (
// script. When executed at S3 resume, this opcode will restore all of them
// in-place.
//
Count = (UINTN)mScratchBuffer + NumberOfBytes - (UINTN)mDmaAccess;
Count = (UINTN)mScratchBuffer + NumberOfBytes - (UINTN)mDmaAccess;
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE, // OpCode
@@ -331,8 +379,13 @@ QemuFwCfgS3ScriptWriteBytes (
(VOID *)mDmaAccess // Buffer
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}
@@ -343,17 +396,22 @@ QemuFwCfgS3ScriptWriteBytes (
// transfer.
//
AccessAddress = SwapBytes64 ((UINTN)mDmaAccess);
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_IO_WRITE_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)FW_CFG_IO_DMA_ADDRESS, // Address
(UINTN)2, // Count
(VOID *)&AccessAddress // Buffer
);
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_IO_WRITE_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)FW_CFG_IO_DMA_ADDRESS, // Address
(UINTN)2, // Count
(VOID *)&AccessAddress // Buffer
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_IO_WRITE_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_IO_WRITE_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}
@@ -364,25 +422,29 @@ QemuFwCfgS3ScriptWriteBytes (
//
ControlPollData = 0;
ControlPollMask = MAX_UINT32;
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_MEM_POLL_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)(UINTN)&mDmaAccess->Control, // Address
(VOID *)&ControlPollData, // Data
(VOID *)&ControlPollMask, // DataMask
MAX_UINT64 // Delay
);
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_MEM_POLL_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)(UINTN)&mDmaAccess->Control, // Address
(VOID *)&ControlPollData, // Data
(VOID *)&ControlPollMask, // DataMask
MAX_UINT64 // Delay
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}
return RETURN_SUCCESS;
}
/**
Produce ACPI S3 Boot Script opcodes that (optionally) select an fw_cfg item,
and transfer data from it.
@@ -425,21 +487,22 @@ QemuFwCfgS3ScriptWriteBytes (
RETURN_STATUS
EFIAPI
QemuFwCfgS3ScriptReadBytes (
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
)
{
EFI_STATUS Status;
UINT64 AccessAddress;
UINT32 ControlPollData;
UINT32 ControlPollMask;
EFI_STATUS Status;
UINT64 AccessAddress;
UINT32 ControlPollData;
UINT32 ControlPollMask;
ASSERT (mDmaAccess != NULL);
ASSERT (mS3SaveState != NULL);
if (FirmwareConfigItem < -1 || FirmwareConfigItem > MAX_UINT16) {
if ((FirmwareConfigItem < -1) || (FirmwareConfigItem > MAX_UINT16)) {
return RETURN_INVALID_PARAMETER;
}
if (NumberOfBytes > mScratchBufferSize) {
return RETURN_BAD_BUFFER_SIZE;
}
@@ -452,6 +515,7 @@ QemuFwCfgS3ScriptReadBytes (
mDmaAccess->Control |= FW_CFG_DMA_CTL_SELECT;
mDmaAccess->Control |= (UINT32)FirmwareConfigItem << 16;
}
mDmaAccess->Control = SwapBytes32 (mDmaAccess->Control);
//
@@ -476,8 +540,13 @@ QemuFwCfgS3ScriptReadBytes (
(VOID *)mDmaAccess // Buffer
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}
@@ -488,17 +557,22 @@ QemuFwCfgS3ScriptReadBytes (
// transfer.
//
AccessAddress = SwapBytes64 ((UINTN)mDmaAccess);
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_IO_WRITE_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)FW_CFG_IO_DMA_ADDRESS, // Address
(UINTN)2, // Count
(VOID *)&AccessAddress // Buffer
);
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_IO_WRITE_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)FW_CFG_IO_DMA_ADDRESS, // Address
(UINTN)2, // Count
(VOID *)&AccessAddress // Buffer
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_IO_WRITE_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_IO_WRITE_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}
@@ -509,25 +583,29 @@ QemuFwCfgS3ScriptReadBytes (
//
ControlPollData = 0;
ControlPollMask = MAX_UINT32;
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_MEM_POLL_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)(UINTN)&mDmaAccess->Control, // Address
(VOID *)&ControlPollData, // Data
(VOID *)&ControlPollMask, // DataMask
MAX_UINT64 // Delay
);
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_MEM_POLL_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)(UINTN)&mDmaAccess->Control, // Address
(VOID *)&ControlPollData, // Data
(VOID *)&ControlPollMask, // DataMask
MAX_UINT64 // Delay
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}
return RETURN_SUCCESS;
}
/**
Produce ACPI S3 Boot Script opcodes that (optionally) select an fw_cfg item,
and increase its offset.
@@ -563,21 +641,22 @@ QemuFwCfgS3ScriptReadBytes (
RETURN_STATUS
EFIAPI
QemuFwCfgS3ScriptSkipBytes (
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
IN INT32 FirmwareConfigItem,
IN UINTN NumberOfBytes
)
{
EFI_STATUS Status;
UINT64 AccessAddress;
UINT32 ControlPollData;
UINT32 ControlPollMask;
EFI_STATUS Status;
UINT64 AccessAddress;
UINT32 ControlPollData;
UINT32 ControlPollMask;
ASSERT (mDmaAccess != NULL);
ASSERT (mS3SaveState != NULL);
if (FirmwareConfigItem < -1 || FirmwareConfigItem > MAX_UINT16) {
if ((FirmwareConfigItem < -1) || (FirmwareConfigItem > MAX_UINT16)) {
return RETURN_INVALID_PARAMETER;
}
if (NumberOfBytes > MAX_UINT32) {
return RETURN_BAD_BUFFER_SIZE;
}
@@ -590,9 +669,10 @@ QemuFwCfgS3ScriptSkipBytes (
mDmaAccess->Control |= FW_CFG_DMA_CTL_SELECT;
mDmaAccess->Control |= (UINT32)FirmwareConfigItem << 16;
}
mDmaAccess->Control = SwapBytes32 (mDmaAccess->Control);
mDmaAccess->Length = SwapBytes32 ((UINT32)NumberOfBytes);
mDmaAccess->Length = SwapBytes32 ((UINT32)NumberOfBytes);
mDmaAccess->Address = 0;
//
@@ -608,8 +688,13 @@ QemuFwCfgS3ScriptSkipBytes (
(VOID *)mDmaAccess // Buffer
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_MEM_WRITE_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}
@@ -620,17 +705,22 @@ QemuFwCfgS3ScriptSkipBytes (
// transfer.
//
AccessAddress = SwapBytes64 ((UINTN)mDmaAccess);
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_IO_WRITE_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)FW_CFG_IO_DMA_ADDRESS, // Address
(UINTN)2, // Count
(VOID *)&AccessAddress // Buffer
);
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_IO_WRITE_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)FW_CFG_IO_DMA_ADDRESS, // Address
(UINTN)2, // Count
(VOID *)&AccessAddress // Buffer
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_IO_WRITE_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_IO_WRITE_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}
@@ -641,25 +731,29 @@ QemuFwCfgS3ScriptSkipBytes (
//
ControlPollData = 0;
ControlPollMask = MAX_UINT32;
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_MEM_POLL_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)(UINTN)&mDmaAccess->Control, // Address
(VOID *)&ControlPollData, // Data
(VOID *)&ControlPollMask, // DataMask
MAX_UINT64 // Delay
);
Status = mS3SaveState->Write (
mS3SaveState, // This
EFI_BOOT_SCRIPT_MEM_POLL_OPCODE, // OpCode
EfiBootScriptWidthUint32, // Width
(UINT64)(UINTN)&mDmaAccess->Control, // Address
(VOID *)&ControlPollData, // Data
(VOID *)&ControlPollMask, // DataMask
MAX_UINT64 // Delay
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}
return RETURN_SUCCESS;
}
/**
Produce ACPI S3 Boot Script opcodes that check a value in ScratchBuffer.
@@ -713,41 +807,42 @@ QemuFwCfgS3ScriptSkipBytes (
RETURN_STATUS
EFIAPI
QemuFwCfgS3ScriptCheckValue (
IN VOID *ScratchData,
IN UINT8 ValueSize,
IN UINT64 ValueMask,
IN UINT64 Value
IN VOID *ScratchData,
IN UINT8 ValueSize,
IN UINT64 ValueMask,
IN UINT64 Value
)
{
EFI_BOOT_SCRIPT_WIDTH Width;
EFI_STATUS Status;
EFI_BOOT_SCRIPT_WIDTH Width;
EFI_STATUS Status;
ASSERT (mS3SaveState != NULL);
switch (ValueSize) {
case 1:
Width = EfiBootScriptWidthUint8;
break;
case 1:
Width = EfiBootScriptWidthUint8;
break;
case 2:
Width = EfiBootScriptWidthUint16;
break;
case 2:
Width = EfiBootScriptWidthUint16;
break;
case 4:
Width = EfiBootScriptWidthUint32;
break;
case 4:
Width = EfiBootScriptWidthUint32;
break;
case 8:
Width = EfiBootScriptWidthUint64;
break;
case 8:
Width = EfiBootScriptWidthUint64;
break;
default:
return RETURN_INVALID_PARAMETER;
default:
return RETURN_INVALID_PARAMETER;
}
if (ValueSize < 8 &&
(RShiftU64 (ValueMask, ValueSize * 8) > 0 ||
RShiftU64 (Value, ValueSize * 8) > 0)) {
if ((ValueSize < 8) &&
((RShiftU64 (ValueMask, ValueSize * 8) > 0) ||
(RShiftU64 (Value, ValueSize * 8) > 0)))
{
return RETURN_INVALID_PARAMETER;
}
@@ -758,7 +853,8 @@ QemuFwCfgS3ScriptCheckValue (
if (((UINTN)ScratchData < (UINTN)mScratchBuffer) ||
((UINTN)ScratchData > MAX_UINTN - ValueSize) ||
((UINTN)ScratchData + ValueSize >
(UINTN)mScratchBuffer + mScratchBufferSize)) {
(UINTN)mScratchBuffer + mScratchBufferSize))
{
return RETURN_BAD_BUFFER_SIZE;
}
@@ -777,8 +873,13 @@ QemuFwCfgS3ScriptCheckValue (
MAX_UINT64 // Delay
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %a: EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: %r\n",
gEfiCallerBaseName, __FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: %a: EFI_BOOT_SCRIPT_MEM_POLL_OPCODE: %r\n",
gEfiCallerBaseName,
__FUNCTION__,
Status
));
return (RETURN_STATUS)Status;
}

View File

@@ -71,9 +71,9 @@
RETURN_STATUS
EFIAPI
QemuFwCfgS3CallWhenBootScriptReady (
IN FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION *Callback,
IN OUT VOID *Context OPTIONAL,
IN UINTN ScratchBufferSize
IN FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION *Callback,
IN OUT VOID *Context OPTIONAL,
IN UINTN ScratchBufferSize
)
{
return RETURN_UNSUPPORTED;

View File

@@ -27,16 +27,17 @@ QemuFwCfgS3Enabled (
VOID
)
{
RETURN_STATUS Status;
FIRMWARE_CONFIG_ITEM FwCfgItem;
UINTN FwCfgSize;
UINT8 SystemStates[6];
RETURN_STATUS Status;
FIRMWARE_CONFIG_ITEM FwCfgItem;
UINTN FwCfgSize;
UINT8 SystemStates[6];
Status = QemuFwCfgFindFile ("etc/system-states", &FwCfgItem, &FwCfgSize);
if (Status != RETURN_SUCCESS || FwCfgSize != sizeof SystemStates) {
if ((Status != RETURN_SUCCESS) || (FwCfgSize != sizeof SystemStates)) {
return FALSE;
}
QemuFwCfgSelectItem (FwCfgItem);
QemuFwCfgReadBytes (sizeof SystemStates, SystemStates);
return (BOOLEAN) (SystemStates[3] & BIT7);
return (BOOLEAN)(SystemStates[3] & BIT7);
}

View File

@@ -20,20 +20,20 @@
// Size of the longest valid BOOL string (see the "mTrueString" and
// "mFalseString" arrays below), including the terminating NUL.
//
#define BOOL_STRING_MAX_SIZE (sizeof "disabled")
#define BOOL_STRING_MAX_SIZE (sizeof "disabled")
//
// Length of "\r\n", not including the terminating NUL.
//
#define CRLF_LENGTH (sizeof "\r\n" - 1)
#define CRLF_LENGTH (sizeof "\r\n" - 1)
//
// Words recognized as representing TRUE or FALSE.
//
STATIC CONST CHAR8 * CONST mTrueString[] = {
STATIC CONST CHAR8 *CONST mTrueString[] = {
"true", "yes", "y", "enable", "enabled", "1"
};
STATIC CONST CHAR8 * CONST mFalseString[] = {
STATIC CONST CHAR8 *CONST mFalseString[] = {
"false", "no", "n", "disable", "disabled", "0"
};
@@ -85,14 +85,14 @@ STATIC CONST CHAR8 * CONST mFalseString[] = {
STATIC
RETURN_STATUS
QemuFwCfgGetAsString (
IN CONST CHAR8 *FileName,
IN OUT UINTN *BufferSize,
OUT CHAR8 *Buffer
IN CONST CHAR8 *FileName,
IN OUT UINTN *BufferSize,
OUT CHAR8 *Buffer
)
{
RETURN_STATUS Status;
FIRMWARE_CONFIG_ITEM FwCfgItem;
UINTN FwCfgSize;
RETURN_STATUS Status;
FIRMWARE_CONFIG_ITEM FwCfgItem;
UINTN FwCfgSize;
if (!QemuFwCfgIsAvailable ()) {
return RETURN_UNSUPPORTED;
@@ -102,6 +102,7 @@ QemuFwCfgGetAsString (
if (RETURN_ERROR (Status)) {
return Status;
}
if (FwCfgSize > *BufferSize) {
return RETURN_PROTOCOL_ERROR;
}
@@ -112,18 +113,20 @@ QemuFwCfgGetAsString (
//
// If Buffer is already NUL-terminated due to fw_cfg contents, we're done.
//
if (FwCfgSize > 0 && Buffer[FwCfgSize - 1] == '\0') {
if ((FwCfgSize > 0) && (Buffer[FwCfgSize - 1] == '\0')) {
*BufferSize = FwCfgSize;
return RETURN_SUCCESS;
}
//
// Otherwise, append a NUL byte to Buffer (if we have room for it).
//
if (FwCfgSize == *BufferSize) {
return RETURN_PROTOCOL_ERROR;
}
Buffer[FwCfgSize] = '\0';
*BufferSize = FwCfgSize + 1;
*BufferSize = FwCfgSize + 1;
return RETURN_SUCCESS;
}
@@ -142,25 +145,26 @@ QemuFwCfgGetAsString (
STATIC
VOID
StripNewline (
IN OUT UINTN *BufferSize,
IN OUT CHAR8 *Buffer
IN OUT UINTN *BufferSize,
IN OUT CHAR8 *Buffer
)
{
UINTN InSize, OutSize;
UINTN InSize, OutSize;
InSize = *BufferSize;
InSize = *BufferSize;
OutSize = InSize;
if (InSize >= 3 &&
Buffer[InSize - 3] == '\r' && Buffer[InSize - 2] == '\n') {
if ((InSize >= 3) &&
(Buffer[InSize - 3] == '\r') && (Buffer[InSize - 2] == '\n'))
{
OutSize = InSize - 2;
} else if (InSize >= 2 && Buffer[InSize - 2] == '\n') {
} else if ((InSize >= 2) && (Buffer[InSize - 2] == '\n')) {
OutSize = InSize - 1;
}
if (OutSize < InSize) {
Buffer[OutSize - 1] = '\0';
*BufferSize = OutSize;
*BufferSize = OutSize;
}
}
@@ -203,20 +207,20 @@ StripNewline (
STATIC
RETURN_STATUS
QemuFwCfgParseUint64WithLimit (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
IN UINT64 Limit,
OUT UINT64 *Value
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
IN UINT64 Limit,
OUT UINT64 *Value
)
{
UINTN Uint64StringSize;
CHAR8 Uint64String[UINT64_STRING_MAX_SIZE + CRLF_LENGTH];
RETURN_STATUS Status;
CHAR8 *EndPointer;
UINT64 Uint64;
UINTN Uint64StringSize;
CHAR8 Uint64String[UINT64_STRING_MAX_SIZE + CRLF_LENGTH];
RETURN_STATUS Status;
CHAR8 *EndPointer;
UINT64 Uint64;
Uint64StringSize = sizeof Uint64String;
Status = QemuFwCfgGetAsString (FileName, &Uint64StringSize, Uint64String);
Status = QemuFwCfgGetAsString (FileName, &Uint64StringSize, Uint64String);
if (RETURN_ERROR (Status)) {
return Status;
}
@@ -228,6 +232,7 @@ QemuFwCfgParseUint64WithLimit (
} else {
Status = AsciiStrDecimalToUint64S (Uint64String, &EndPointer, &Uint64);
}
if (RETURN_ERROR (Status)) {
return Status;
}
@@ -236,7 +241,7 @@ QemuFwCfgParseUint64WithLimit (
// Report a wire protocol error if the subject sequence is empty, or trailing
// garbage is present, or Limit is not honored.
//
if (EndPointer == Uint64String || *EndPointer != '\0' || Uint64 > Limit) {
if ((EndPointer == Uint64String) || (*EndPointer != '\0') || (Uint64 > Limit)) {
return RETURN_PROTOCOL_ERROR;
}
@@ -263,17 +268,17 @@ QemuFwCfgSimpleParserInit (
RETURN_STATUS
EFIAPI
QemuFwCfgParseBool (
IN CONST CHAR8 *FileName,
OUT BOOLEAN *Value
IN CONST CHAR8 *FileName,
OUT BOOLEAN *Value
)
{
UINTN BoolStringSize;
CHAR8 BoolString[BOOL_STRING_MAX_SIZE + CRLF_LENGTH];
RETURN_STATUS Status;
UINTN Idx;
UINTN BoolStringSize;
CHAR8 BoolString[BOOL_STRING_MAX_SIZE + CRLF_LENGTH];
RETURN_STATUS Status;
UINTN Idx;
BoolStringSize = sizeof BoolString;
Status = QemuFwCfgGetAsString (FileName, &BoolStringSize, BoolString);
Status = QemuFwCfgGetAsString (FileName, &BoolStringSize, BoolString);
if (RETURN_ERROR (Status)) {
return Status;
}
@@ -300,19 +305,24 @@ QemuFwCfgParseBool (
RETURN_STATUS
EFIAPI
QemuFwCfgParseUint8 (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT8 *Value
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT8 *Value
)
{
RETURN_STATUS Status;
UINT64 Uint64;
RETURN_STATUS Status;
UINT64 Uint64;
Status = QemuFwCfgParseUint64WithLimit (FileName, ParseAsHex, MAX_UINT8,
&Uint64);
Status = QemuFwCfgParseUint64WithLimit (
FileName,
ParseAsHex,
MAX_UINT8,
&Uint64
);
if (RETURN_ERROR (Status)) {
return Status;
}
*Value = (UINT8)Uint64;
return RETURN_SUCCESS;
}
@@ -320,19 +330,24 @@ QemuFwCfgParseUint8 (
RETURN_STATUS
EFIAPI
QemuFwCfgParseUint16 (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT16 *Value
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT16 *Value
)
{
RETURN_STATUS Status;
UINT64 Uint64;
RETURN_STATUS Status;
UINT64 Uint64;
Status = QemuFwCfgParseUint64WithLimit (FileName, ParseAsHex, MAX_UINT16,
&Uint64);
Status = QemuFwCfgParseUint64WithLimit (
FileName,
ParseAsHex,
MAX_UINT16,
&Uint64
);
if (RETURN_ERROR (Status)) {
return Status;
}
*Value = (UINT16)Uint64;
return RETURN_SUCCESS;
}
@@ -340,19 +355,24 @@ QemuFwCfgParseUint16 (
RETURN_STATUS
EFIAPI
QemuFwCfgParseUint32 (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT32 *Value
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT32 *Value
)
{
RETURN_STATUS Status;
UINT64 Uint64;
RETURN_STATUS Status;
UINT64 Uint64;
Status = QemuFwCfgParseUint64WithLimit (FileName, ParseAsHex, MAX_UINT32,
&Uint64);
Status = QemuFwCfgParseUint64WithLimit (
FileName,
ParseAsHex,
MAX_UINT32,
&Uint64
);
if (RETURN_ERROR (Status)) {
return Status;
}
*Value = (UINT32)Uint64;
return RETURN_SUCCESS;
}
@@ -360,19 +380,24 @@ QemuFwCfgParseUint32 (
RETURN_STATUS
EFIAPI
QemuFwCfgParseUint64 (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT64 *Value
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINT64 *Value
)
{
RETURN_STATUS Status;
UINT64 Uint64;
RETURN_STATUS Status;
UINT64 Uint64;
Status = QemuFwCfgParseUint64WithLimit (FileName, ParseAsHex, MAX_UINT64,
&Uint64);
Status = QemuFwCfgParseUint64WithLimit (
FileName,
ParseAsHex,
MAX_UINT64,
&Uint64
);
if (RETURN_ERROR (Status)) {
return Status;
}
*Value = Uint64;
return RETURN_SUCCESS;
}
@@ -380,19 +405,24 @@ QemuFwCfgParseUint64 (
RETURN_STATUS
EFIAPI
QemuFwCfgParseUintn (
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINTN *Value
IN CONST CHAR8 *FileName,
IN BOOLEAN ParseAsHex,
OUT UINTN *Value
)
{
RETURN_STATUS Status;
UINT64 Uint64;
RETURN_STATUS Status;
UINT64 Uint64;
Status = QemuFwCfgParseUint64WithLimit (FileName, ParseAsHex, MAX_UINTN,
&Uint64);
Status = QemuFwCfgParseUint64WithLimit (
FileName,
ParseAsHex,
MAX_UINTN,
&Uint64
);
if (RETURN_ERROR (Status)) {
return Status;
}
*Value = (UINTN)Uint64;
return RETURN_SUCCESS;
}

View File

@@ -28,21 +28,21 @@ ResetShutdown (
VOID
)
{
UINT16 AcpiPmBaseAddress;
UINT16 HostBridgeDevId;
UINT16 AcpiPmBaseAddress;
UINT16 HostBridgeDevId;
AcpiPmBaseAddress = 0;
HostBridgeDevId = PciRead16 (OVMF_HOSTBRIDGE_DID);
HostBridgeDevId = PciRead16 (OVMF_HOSTBRIDGE_DID);
switch (HostBridgeDevId) {
case INTEL_82441_DEVICE_ID:
AcpiPmBaseAddress = PIIX4_PMBA_VALUE;
break;
case INTEL_Q35_MCH_DEVICE_ID:
AcpiPmBaseAddress = ICH9_PMBASE_VALUE;
break;
default:
ASSERT (FALSE);
CpuDeadLoop ();
case INTEL_82441_DEVICE_ID:
AcpiPmBaseAddress = PIIX4_PMBA_VALUE;
break;
case INTEL_Q35_MCH_DEVICE_ID:
AcpiPmBaseAddress = ICH9_PMBASE_VALUE;
break;
default:
ASSERT (FALSE);
CpuDeadLoop ();
}
IoBitFieldWrite16 (AcpiPmBaseAddress + 4, 10, 13, 0);

View File

@@ -15,29 +15,29 @@
#include <Library/ResetSystemLib.h> // ResetShutdown()
#include <OvmfPlatforms.h> // PIIX4_PMBA_VALUE
STATIC UINT16 mAcpiPmBaseAddress;
STATIC UINT16 mAcpiPmBaseAddress;
EFI_STATUS
EFIAPI
DxeResetInit (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
UINT16 HostBridgeDevId;
UINT16 HostBridgeDevId;
HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);
switch (HostBridgeDevId) {
case INTEL_82441_DEVICE_ID:
mAcpiPmBaseAddress = PIIX4_PMBA_VALUE;
break;
case INTEL_Q35_MCH_DEVICE_ID:
mAcpiPmBaseAddress = ICH9_PMBASE_VALUE;
break;
default:
ASSERT (FALSE);
CpuDeadLoop ();
return EFI_UNSUPPORTED;
case INTEL_82441_DEVICE_ID:
mAcpiPmBaseAddress = PIIX4_PMBA_VALUE;
break;
case INTEL_Q35_MCH_DEVICE_ID:
mAcpiPmBaseAddress = ICH9_PMBASE_VALUE;
break;
default:
ASSERT (FALSE);
CpuDeadLoop ();
return EFI_UNSUPPORTED;
}
return EFI_SUCCESS;

View File

@@ -37,8 +37,11 @@ DxeResetSystemLibMicrovmConstructor (
return RETURN_UNSUPPORTED;
}
Status = gDS->SetMemorySpaceAttributes (Address, SIZE_4KB,
Descriptor.Attributes | EFI_MEMORY_RUNTIME);
Status = gDS->SetMemorySpaceAttributes (
Address,
SIZE_4KB,
Descriptor.Attributes | EFI_MEMORY_RUNTIME
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, "%a: SetMemorySpaceAttributes failed\n", __FUNCTION__));
return RETURN_UNSUPPORTED;

View File

@@ -52,7 +52,6 @@ ResetWarm (
CpuDeadLoop ();
}
/**
This function causes a systemwide reset. The exact type of the reset is
defined by the EFI_GUID that follows the Null-terminated Unicode string
@@ -68,8 +67,8 @@ ResetWarm (
VOID
EFIAPI
ResetPlatformSpecific (
IN UINTN DataSize,
IN VOID *ResetData
IN UINTN DataSize,
IN VOID *ResetData
)
{
ResetCold ();
@@ -91,30 +90,30 @@ ResetPlatformSpecific (
VOID
EFIAPI
ResetSystem (
IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus,
IN UINTN DataSize,
IN VOID *ResetData OPTIONAL
IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus,
IN UINTN DataSize,
IN VOID *ResetData OPTIONAL
)
{
switch (ResetType) {
case EfiResetWarm:
ResetWarm ();
break;
case EfiResetWarm:
ResetWarm ();
break;
case EfiResetCold:
ResetCold ();
break;
case EfiResetCold:
ResetCold ();
break;
case EfiResetShutdown:
ResetShutdown ();
break;
case EfiResetShutdown:
ResetShutdown ();
break;
case EfiResetPlatformSpecific:
ResetPlatformSpecific (DataSize, ResetData);
break;
case EfiResetPlatformSpecific:
ResetPlatformSpecific (DataSize, ResetData);
break;
default:
break;
default:
break;
}
}

View File

@@ -16,9 +16,12 @@
#include <Library/UefiRuntimeLib.h> // EfiGoneVirtual()
#include <OvmfPlatforms.h> // PIIX4_PMBA_VALUE
static UINTN MicrovmGedBase (VOID)
static UINTN
MicrovmGedBase (
VOID
)
{
VOID *Address = (VOID*)(UINTN) MICROVM_GED_MMIO_BASE_REGS;
VOID *Address = (VOID *)(UINTN)MICROVM_GED_MMIO_BASE_REGS;
if (EfiGoneVirtual ()) {
EfiConvertPointer (0, &Address);
@@ -27,63 +30,82 @@ static UINTN MicrovmGedBase (VOID)
DEBUG ((DEBUG_INFO, "%a: physical -> 0x%x\n", __FUNCTION__, Address));
}
return (UINTN) Address;
return (UINTN)Address;
}
static VOID MicrovmReset (VOID)
static VOID
MicrovmReset (
VOID
)
{
UINTN Address = MicrovmGedBase();
UINTN Address = MicrovmGedBase ();
DEBUG ((DEBUG_INFO, "%a: microvm reset via ged\n", __FUNCTION__));
MmioWrite8 (Address + MICROVM_ACPI_GED_REG_RESET,
MICROVM_ACPI_GED_RESET_VALUE);
MmioWrite8 (
Address + MICROVM_ACPI_GED_REG_RESET,
MICROVM_ACPI_GED_RESET_VALUE
);
CpuDeadLoop ();
}
static VOID MicrovmShutdown (VOID)
static VOID
MicrovmShutdown (
VOID
)
{
UINTN Address = MicrovmGedBase();
UINTN Address = MicrovmGedBase ();
DEBUG ((DEBUG_INFO, "%a: microvm poweroff via ged\n", __FUNCTION__));
MmioWrite8 (Address + MICROVM_ACPI_GED_REG_SLEEP_CTL,
(1 << 5) /* enable bit */ |
(5 << 2) /* typ == S5 */);
MmioWrite8 (
Address + MICROVM_ACPI_GED_REG_SLEEP_CTL,
(1 << 5) /* enable bit */ |
(5 << 2) /* typ == S5 */
);
CpuDeadLoop ();
}
VOID EFIAPI ResetCold (VOID)
VOID EFIAPI
ResetCold (
VOID
)
{
MicrovmReset();
MicrovmReset ();
}
VOID EFIAPI ResetWarm (VOID)
VOID EFIAPI
ResetWarm (
VOID
)
{
MicrovmReset();
MicrovmReset ();
}
VOID
EFIAPI
ResetPlatformSpecific (
IN UINTN DataSize,
IN VOID *ResetData
IN UINTN DataSize,
IN VOID *ResetData
)
{
MicrovmReset();
MicrovmReset ();
}
VOID
EFIAPI
ResetSystem (
IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus,
IN UINTN DataSize,
IN VOID *ResetData OPTIONAL
IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus,
IN UINTN DataSize,
IN VOID *ResetData OPTIONAL
)
{
MicrovmReset();
MicrovmReset ();
}
VOID EFIAPI ResetShutdown (VOID)
VOID EFIAPI
ResetShutdown (
VOID
)
{
MicrovmShutdown();
MicrovmShutdown ();
}

View File

@@ -25,7 +25,6 @@
**/
/**
Unpacks the next variable from the buffer
@@ -49,55 +48,55 @@
STATIC
EFI_STATUS
UnpackVariableFromBuffer (
IN VOID *Buffer,
IN UINTN MaxSize,
OUT CHAR16 **Name,
OUT UINT32 *NameSize,
OUT EFI_GUID **Guid,
OUT UINT32 *Attributes,
OUT UINT32 *DataSize,
OUT VOID **Data,
OUT UINTN *SizeUsed
IN VOID *Buffer,
IN UINTN MaxSize,
OUT CHAR16 **Name,
OUT UINT32 *NameSize,
OUT EFI_GUID **Guid,
OUT UINT32 *Attributes,
OUT UINT32 *DataSize,
OUT VOID **Data,
OUT UINTN *SizeUsed
)
{
UINT8 *BytePtr;
UINTN Offset;
BytePtr = (UINT8*)Buffer;
Offset = 0;
BytePtr = (UINT8 *)Buffer;
Offset = 0;
*NameSize = *(UINT32*) (BytePtr + Offset);
Offset = Offset + sizeof (UINT32);
*NameSize = *(UINT32 *)(BytePtr + Offset);
Offset = Offset + sizeof (UINT32);
if (Offset > MaxSize) {
return EFI_INVALID_PARAMETER;
}
*Name = (CHAR16*) (BytePtr + Offset);
Offset = Offset + *(UINT32*)BytePtr;
*Name = (CHAR16 *)(BytePtr + Offset);
Offset = Offset + *(UINT32 *)BytePtr;
if (Offset > MaxSize) {
return EFI_INVALID_PARAMETER;
}
*Guid = (EFI_GUID*) (BytePtr + Offset);
*Guid = (EFI_GUID *)(BytePtr + Offset);
Offset = Offset + sizeof (EFI_GUID);
if (Offset > MaxSize) {
return EFI_INVALID_PARAMETER;
}
*Attributes = *(UINT32*) (BytePtr + Offset);
Offset = Offset + sizeof (UINT32);
*Attributes = *(UINT32 *)(BytePtr + Offset);
Offset = Offset + sizeof (UINT32);
if (Offset > MaxSize) {
return EFI_INVALID_PARAMETER;
}
*DataSize = *(UINT32*) (BytePtr + Offset);
Offset = Offset + sizeof (UINT32);
*DataSize = *(UINT32 *)(BytePtr + Offset);
Offset = Offset + sizeof (UINT32);
if (Offset > MaxSize) {
return EFI_INVALID_PARAMETER;
}
*Data = (VOID*) (BytePtr + Offset);
*Data = (VOID *)(BytePtr + Offset);
Offset = Offset + *DataSize;
if (Offset > MaxSize) {
return EFI_INVALID_PARAMETER;
@@ -108,7 +107,6 @@ UnpackVariableFromBuffer (
return EFI_SUCCESS;
}
/**
Iterates through the variables in the buffer, and calls a callback
function for each variable found.
@@ -130,34 +128,35 @@ IterateVariablesInBuffer (
IN UINTN MaxSize
)
{
RETURN_STATUS Status;
UINTN TotalSizeUsed;
UINTN SizeUsed;
RETURN_STATUS Status;
UINTN TotalSizeUsed;
UINTN SizeUsed;
CHAR16 *Name;
UINT32 NameSize;
CHAR16 *AlignedName;
UINT32 AlignedNameMaxSize;
EFI_GUID *Guid;
UINT32 Attributes;
UINT32 DataSize;
VOID *Data;
CHAR16 *Name;
UINT32 NameSize;
CHAR16 *AlignedName;
UINT32 AlignedNameMaxSize;
EFI_GUID *Guid;
UINT32 Attributes;
UINT32 DataSize;
VOID *Data;
SizeUsed = 0;
AlignedName = NULL;
SizeUsed = 0;
AlignedName = NULL;
AlignedNameMaxSize = 0;
Name = NULL;
Guid = NULL;
Attributes = 0;
DataSize = 0;
Data = NULL;
Name = NULL;
Guid = NULL;
Attributes = 0;
DataSize = 0;
Data = NULL;
for (
Status = EFI_SUCCESS, TotalSizeUsed = 0;
!EFI_ERROR (Status) && (TotalSizeUsed < MaxSize);
) {
Status = EFI_SUCCESS, TotalSizeUsed = 0;
!EFI_ERROR (Status) && (TotalSizeUsed < MaxSize);
)
{
Status = UnpackVariableFromBuffer (
(VOID*) ((UINT8*) Buffer + TotalSizeUsed),
(VOID *)((UINT8 *)Buffer + TotalSizeUsed),
(MaxSize - TotalSizeUsed),
&Name,
&NameSize,
@@ -179,11 +178,14 @@ IterateVariablesInBuffer (
if (AlignedName != NULL) {
FreePool (AlignedName);
}
AlignedName = AllocatePool (NameSize);
}
if (AlignedName == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (AlignedName, Name, NameSize);
TotalSizeUsed = TotalSizeUsed + SizeUsed;
@@ -191,15 +193,14 @@ IterateVariablesInBuffer (
//
// Run the callback function
//
Status = (*CallbackFunction) (
CallbackContext,
AlignedName,
Guid,
Attributes,
DataSize,
Data
);
Status = (*CallbackFunction)(
CallbackContext,
AlignedName,
Guid,
Attributes,
DataSize,
Data
);
}
if (AlignedName != NULL) {
@@ -222,38 +223,36 @@ IterateVariablesInBuffer (
return EFI_SUCCESS;
}
STATIC
RETURN_STATUS
EFIAPI
IterateVariablesCallbackNop (
IN VOID *Context,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
IN VOID *Context,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
)
{
return RETURN_SUCCESS;
}
STATIC
RETURN_STATUS
EFIAPI
IterateVariablesCallbackSetInInstance (
IN VOID *Context,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
IN VOID *Context,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
)
{
EFI_HANDLE Instance;
Instance = (EFI_HANDLE) Context;
Instance = (EFI_HANDLE)Context;
return SerializeVariablesAddVariable (
Instance,
@@ -265,47 +264,54 @@ IterateVariablesCallbackSetInInstance (
);
}
STATIC
RETURN_STATUS
EFIAPI
IterateVariablesCallbackSetSystemVariable (
IN VOID *Context,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
IN VOID *Context,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
)
{
EFI_STATUS Status;
STATIC CONST UINT32 AuthMask =
EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS |
EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;
EFI_STATUS Status;
STATIC CONST UINT32 AuthMask =
EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS |
EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;
Status = gRT->SetVariable (
VariableName,
VendorGuid,
Attributes,
DataSize,
Data
);
VariableName,
VendorGuid,
Attributes,
DataSize,
Data
);
if (Status == EFI_SECURITY_VIOLATION && (Attributes & AuthMask) != 0) {
DEBUG ((DEBUG_WARN, "%a: setting authenticated variable \"%s\" "
"failed with EFI_SECURITY_VIOLATION, ignoring\n", __FUNCTION__,
VariableName));
if ((Status == EFI_SECURITY_VIOLATION) && ((Attributes & AuthMask) != 0)) {
DEBUG ((
DEBUG_WARN,
"%a: setting authenticated variable \"%s\" "
"failed with EFI_SECURITY_VIOLATION, ignoring\n",
__FUNCTION__,
VariableName
));
Status = EFI_SUCCESS;
} else if (Status == EFI_WRITE_PROTECTED) {
DEBUG ((DEBUG_WARN, "%a: setting ReadOnly variable \"%s\" "
"failed with EFI_WRITE_PROTECTED, ignoring\n", __FUNCTION__,
VariableName));
DEBUG ((
DEBUG_WARN,
"%a: setting ReadOnly variable \"%s\" "
"failed with EFI_WRITE_PROTECTED, ignoring\n",
__FUNCTION__,
VariableName
));
Status = EFI_SUCCESS;
}
return Status;
}
STATIC
RETURN_STATUS
EnsureExtraBufferSpace (
@@ -313,8 +319,8 @@ EnsureExtraBufferSpace (
IN UINTN Size
)
{
VOID *NewBuffer;
UINTN NewSize;
VOID *NewBuffer;
UINTN NewSize;
NewSize = Instance->DataSize + Size;
if (NewSize <= Instance->BufferSize) {
@@ -336,13 +342,12 @@ EnsureExtraBufferSpace (
FreePool (Instance->BufferPtr);
}
Instance->BufferPtr = NewBuffer;
Instance->BufferPtr = NewBuffer;
Instance->BufferSize = NewSize;
return RETURN_SUCCESS;
}
STATIC
VOID
AppendToBuffer (
@@ -351,7 +356,7 @@ AppendToBuffer (
IN UINTN Size
)
{
UINTN NewSize;
UINTN NewSize;
ASSERT (Instance != NULL);
ASSERT (Data != NULL);
@@ -360,7 +365,7 @@ AppendToBuffer (
ASSERT ((Instance->DataSize + Size) <= Instance->BufferSize);
CopyMem (
(VOID*) (((UINT8*) (Instance->BufferPtr)) + Instance->DataSize),
(VOID *)(((UINT8 *)(Instance->BufferPtr)) + Instance->DataSize),
Data,
Size
);
@@ -368,7 +373,6 @@ AppendToBuffer (
Instance->DataSize = NewSize;
}
/**
Creates a new variable serialization instance
@@ -383,7 +387,7 @@ AppendToBuffer (
RETURN_STATUS
EFIAPI
SerializeVariablesNewInstance (
OUT EFI_HANDLE *Handle
OUT EFI_HANDLE *Handle
)
{
SV_INSTANCE *New;
@@ -395,11 +399,10 @@ SerializeVariablesNewInstance (
New->Signature = SV_SIGNATURE;
*Handle = (EFI_HANDLE) New;
*Handle = (EFI_HANDLE)New;
return RETURN_SUCCESS;
}
/**
Free memory associated with a variable serialization instance
@@ -414,10 +417,10 @@ SerializeVariablesNewInstance (
RETURN_STATUS
EFIAPI
SerializeVariablesFreeInstance (
IN EFI_HANDLE Handle
IN EFI_HANDLE Handle
)
{
SV_INSTANCE *Instance;
SV_INSTANCE *Instance;
Instance = SV_FROM_HANDLE (Handle);
@@ -436,7 +439,6 @@ SerializeVariablesFreeInstance (
return RETURN_SUCCESS;
}
/**
Creates a new variable serialization instance using the given
binary representation of the variables to fill the new instance
@@ -457,12 +459,12 @@ SerializeVariablesFreeInstance (
RETURN_STATUS
EFIAPI
SerializeVariablesNewInstanceFromBuffer (
OUT EFI_HANDLE *Handle,
IN VOID *Buffer,
IN UINTN Size
OUT EFI_HANDLE *Handle,
IN VOID *Buffer,
IN UINTN Size
)
{
RETURN_STATUS Status;
RETURN_STATUS Status;
Status = SerializeVariablesNewInstance (Handle);
if (RETURN_ERROR (Status)) {
@@ -482,7 +484,7 @@ SerializeVariablesNewInstanceFromBuffer (
Status = IterateVariablesInBuffer (
IterateVariablesCallbackSetInInstance,
(VOID*) *Handle,
(VOID *)*Handle,
Buffer,
Size
);
@@ -494,7 +496,6 @@ SerializeVariablesNewInstanceFromBuffer (
return Status;
}
/**
Iterates all variables found with RuntimeServices GetNextVariableName
@@ -512,40 +513,40 @@ SerializeVariablesNewInstanceFromBuffer (
RETURN_STATUS
EFIAPI
SerializeVariablesIterateSystemVariables (
IN VARIABLE_SERIALIZATION_ITERATION_CALLBACK CallbackFunction,
IN VOID *Context
IN VARIABLE_SERIALIZATION_ITERATION_CALLBACK CallbackFunction,
IN VOID *Context
)
{
RETURN_STATUS Status;
UINTN VariableNameBufferSize;
UINTN VariableNameSize;
CHAR16 *VariableName;
EFI_GUID VendorGuid;
UINTN VariableDataBufferSize;
UINTN VariableDataSize;
VOID *VariableData;
UINT32 VariableAttributes;
VOID *NewBuffer;
RETURN_STATUS Status;
UINTN VariableNameBufferSize;
UINTN VariableNameSize;
CHAR16 *VariableName;
EFI_GUID VendorGuid;
UINTN VariableDataBufferSize;
UINTN VariableDataSize;
VOID *VariableData;
UINT32 VariableAttributes;
VOID *NewBuffer;
//
// Initialize the variable name and data buffer variables.
//
VariableNameBufferSize = sizeof (CHAR16);
VariableName = AllocateZeroPool (VariableNameBufferSize);
VariableName = AllocateZeroPool (VariableNameBufferSize);
VariableDataBufferSize = 0;
VariableData = NULL;
VariableData = NULL;
for (;;) {
for ( ; ;) {
//
// Get the next variable name and guid
//
VariableNameSize = VariableNameBufferSize;
Status = gRT->GetNextVariableName (
&VariableNameSize,
VariableName,
&VendorGuid
);
Status = gRT->GetNextVariableName (
&VariableNameSize,
VariableName,
&VendorGuid
);
if (Status == EFI_BUFFER_TOO_SMALL) {
//
// The currently allocated VariableName buffer is too small,
@@ -557,11 +558,13 @@ SerializeVariablesIterateSystemVariables (
Status = EFI_OUT_OF_RESOURCES;
break;
}
CopyMem (NewBuffer, VariableName, VariableNameBufferSize);
if (VariableName != NULL) {
FreePool (VariableName);
}
VariableName = NewBuffer;
VariableName = NewBuffer;
VariableNameBufferSize = VariableNameSize;
//
@@ -578,6 +581,7 @@ SerializeVariablesIterateSystemVariables (
if (Status == EFI_NOT_FOUND) {
Status = EFI_SUCCESS;
}
break;
}
@@ -585,13 +589,13 @@ SerializeVariablesIterateSystemVariables (
// Get the variable data and attributes
//
VariableDataSize = VariableDataBufferSize;
Status = gRT->GetVariable (
VariableName,
&VendorGuid,
&VariableAttributes,
&VariableDataSize,
VariableData
);
Status = gRT->GetVariable (
VariableName,
&VendorGuid,
&VariableAttributes,
&VariableDataSize,
VariableData
);
if (Status == EFI_BUFFER_TOO_SMALL) {
//
// The currently allocated VariableData buffer is too small,
@@ -599,14 +603,16 @@ SerializeVariablesIterateSystemVariables (
//
if (VariableDataBufferSize != 0) {
FreePool (VariableData);
VariableData = NULL;
VariableData = NULL;
VariableDataBufferSize = 0;
}
VariableData = AllocatePool (VariableDataSize);
if (VariableData == NULL) {
Status = EFI_OUT_OF_RESOURCES;
break;
}
VariableDataBufferSize = VariableDataSize;
//
@@ -620,6 +626,7 @@ SerializeVariablesIterateSystemVariables (
VariableData
);
}
if (EFI_ERROR (Status)) {
break;
}
@@ -627,18 +634,17 @@ SerializeVariablesIterateSystemVariables (
//
// Run the callback function
//
Status = (*CallbackFunction) (
Context,
VariableName,
&VendorGuid,
VariableAttributes,
VariableDataSize,
VariableData
);
Status = (*CallbackFunction)(
Context,
VariableName,
&VendorGuid,
VariableAttributes,
VariableDataSize,
VariableData
);
if (EFI_ERROR (Status)) {
break;
}
}
if (VariableName != NULL) {
@@ -652,7 +658,6 @@ SerializeVariablesIterateSystemVariables (
return Status;
}
/**
Iterates all variables found in the variable serialization instance
@@ -671,12 +676,12 @@ SerializeVariablesIterateSystemVariables (
RETURN_STATUS
EFIAPI
SerializeVariablesIterateInstanceVariables (
IN EFI_HANDLE Handle,
IN VARIABLE_SERIALIZATION_ITERATION_CALLBACK CallbackFunction,
IN VOID *Context
IN EFI_HANDLE Handle,
IN VARIABLE_SERIALIZATION_ITERATION_CALLBACK CallbackFunction,
IN VOID *Context
)
{
SV_INSTANCE *Instance;
SV_INSTANCE *Instance;
Instance = SV_FROM_HANDLE (Handle);
@@ -692,7 +697,6 @@ SerializeVariablesIterateInstanceVariables (
}
}
/**
Sets all variables found in the variable serialization instance
@@ -708,7 +712,7 @@ SerializeVariablesIterateInstanceVariables (
RETURN_STATUS
EFIAPI
SerializeVariablesSetSerializedVariables (
IN EFI_HANDLE Handle
IN EFI_HANDLE Handle
)
{
return SerializeVariablesIterateInstanceVariables (
@@ -718,7 +722,6 @@ SerializeVariablesSetSerializedVariables (
);
}
/**
Adds a variable to the variable serialization instance
@@ -740,12 +743,12 @@ SerializeVariablesSetSerializedVariables (
RETURN_STATUS
EFIAPI
SerializeVariablesAddVariable (
IN EFI_HANDLE Handle,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
IN EFI_HANDLE Handle,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
)
{
RETURN_STATUS Status;
@@ -757,10 +760,11 @@ SerializeVariablesAddVariable (
Instance = SV_FROM_HANDLE (Handle);
if ((Instance->Signature != SV_SIGNATURE) ||
(VariableName == NULL) || (VendorGuid == NULL) || (Data == NULL)) {
(VariableName == NULL) || (VendorGuid == NULL) || (Data == NULL))
{
}
SerializedNameSize = (UINT32) StrSize (VariableName);
SerializedNameSize = (UINT32)StrSize (VariableName);
SerializedSize =
sizeof (SerializedNameSize) +
@@ -781,28 +785,28 @@ SerializeVariablesAddVariable (
//
// Add name size (UINT32)
//
AppendToBuffer (Instance, (VOID*) &SerializedNameSize, sizeof (SerializedNameSize));
AppendToBuffer (Instance, (VOID *)&SerializedNameSize, sizeof (SerializedNameSize));
//
// Add variable unicode name string
//
AppendToBuffer (Instance, (VOID*) VariableName, SerializedNameSize);
AppendToBuffer (Instance, (VOID *)VariableName, SerializedNameSize);
//
// Add variable GUID
//
AppendToBuffer (Instance, (VOID*) VendorGuid, sizeof (*VendorGuid));
AppendToBuffer (Instance, (VOID *)VendorGuid, sizeof (*VendorGuid));
//
// Add variable attributes
//
AppendToBuffer (Instance, (VOID*) &Attributes, sizeof (Attributes));
AppendToBuffer (Instance, (VOID *)&Attributes, sizeof (Attributes));
//
// Add variable data size (UINT32)
//
SerializedDataSize = (UINT32) DataSize;
AppendToBuffer (Instance, (VOID*) &SerializedDataSize, sizeof (SerializedDataSize));
SerializedDataSize = (UINT32)DataSize;
AppendToBuffer (Instance, (VOID *)&SerializedDataSize, sizeof (SerializedDataSize));
//
// Add variable data
@@ -812,7 +816,6 @@ SerializeVariablesAddVariable (
return RETURN_SUCCESS;
}
/**
Serializes the variables known to this instance into the
provided buffer.
@@ -839,12 +842,12 @@ SerializeVariablesAddVariable (
RETURN_STATUS
EFIAPI
SerializeVariablesToBuffer (
IN EFI_HANDLE Handle,
OUT VOID *Buffer,
IN OUT UINTN *Size
IN EFI_HANDLE Handle,
OUT VOID *Buffer,
IN OUT UINTN *Size
)
{
SV_INSTANCE *Instance;
SV_INSTANCE *Instance;
Instance = SV_FROM_HANDLE (Handle);
@@ -866,4 +869,3 @@ SerializeVariablesToBuffer (
return RETURN_SUCCESS;
}

View File

@@ -19,15 +19,14 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#define SV_FROM_HANDLE(a) CR (a, SV_INSTANCE, Signature, SV_SIGNATURE)
#define SV_SIGNATURE SIGNATURE_32 ('S', 'V', 'A', 'R')
#define SV_FROM_HANDLE(a) CR (a, SV_INSTANCE, Signature, SV_SIGNATURE)
#define SV_SIGNATURE SIGNATURE_32 ('S', 'V', 'A', 'R')
typedef struct {
UINT32 Signature;
VOID *BufferPtr;
UINTN BufferSize;
UINTN DataSize;
UINT32 Signature;
VOID *BufferPtr;
UINTN BufferSize;
UINTN DataSize;
} SV_INSTANCE;
#endif

View File

@@ -20,8 +20,8 @@
#include <Library/QemuFwCfgLib.h>
typedef union {
SMBIOS_TABLE_ENTRY_POINT V2;
SMBIOS_TABLE_3_0_ENTRY_POINT V3;
SMBIOS_TABLE_ENTRY_POINT V2;
SMBIOS_TABLE_3_0_ENTRY_POINT V3;
} QEMU_SMBIOS_ANCHOR;
RETURN_STATUS
@@ -30,11 +30,11 @@ DetectSmbiosVersion (
VOID
)
{
FIRMWARE_CONFIG_ITEM Anchor, Tables;
UINTN AnchorSize, TablesSize;
QEMU_SMBIOS_ANCHOR QemuAnchor;
UINT16 SmbiosVersion;
RETURN_STATUS PcdStatus;
FIRMWARE_CONFIG_ITEM Anchor, Tables;
UINTN AnchorSize, TablesSize;
QEMU_SMBIOS_ANCHOR QemuAnchor;
UINT16 SmbiosVersion;
RETURN_STATUS PcdStatus;
if (PcdGetBool (PcdQemuSmbiosValidated)) {
//
@@ -45,53 +45,76 @@ DetectSmbiosVersion (
return RETURN_SUCCESS;
}
if (RETURN_ERROR (QemuFwCfgFindFile (
"etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) ||
RETURN_ERROR (QemuFwCfgFindFile (
"etc/smbios/smbios-tables", &Tables, &TablesSize)) ||
TablesSize == 0) {
if (RETURN_ERROR (
QemuFwCfgFindFile (
"etc/smbios/smbios-anchor",
&Anchor,
&AnchorSize
)
) ||
RETURN_ERROR (
QemuFwCfgFindFile (
"etc/smbios/smbios-tables",
&Tables,
&TablesSize
)
) ||
(TablesSize == 0))
{
return RETURN_SUCCESS;
}
QemuFwCfgSelectItem (Anchor);
switch (AnchorSize) {
case sizeof QemuAnchor.V2:
QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
case sizeof QemuAnchor.V2:
QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
if (QemuAnchor.V2.MajorVersion != 2 ||
QemuAnchor.V2.TableLength != TablesSize ||
CompareMem (QemuAnchor.V2.AnchorString, "_SM_", 4) != 0 ||
CompareMem (QemuAnchor.V2.IntermediateAnchorString, "_DMI_", 5) != 0) {
if ((QemuAnchor.V2.MajorVersion != 2) ||
(QemuAnchor.V2.TableLength != TablesSize) ||
(CompareMem (QemuAnchor.V2.AnchorString, "_SM_", 4) != 0) ||
(CompareMem (QemuAnchor.V2.IntermediateAnchorString, "_DMI_", 5) != 0))
{
return RETURN_SUCCESS;
}
SmbiosVersion = (UINT16)(QemuAnchor.V2.MajorVersion << 8 |
QemuAnchor.V2.MinorVersion);
break;
case sizeof QemuAnchor.V3:
QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
if ((QemuAnchor.V3.MajorVersion != 3) ||
(QemuAnchor.V3.TableMaximumSize != TablesSize) ||
(CompareMem (QemuAnchor.V3.AnchorString, "_SM3_", 5) != 0))
{
return RETURN_SUCCESS;
}
SmbiosVersion = (UINT16)(QemuAnchor.V3.MajorVersion << 8 |
QemuAnchor.V3.MinorVersion);
DEBUG ((
DEBUG_INFO,
"%a: SMBIOS 3.x DocRev from QEMU: 0x%02x\n",
__FUNCTION__,
QemuAnchor.V3.DocRev
));
PcdStatus = PcdSet8S (PcdSmbiosDocRev, QemuAnchor.V3.DocRev);
ASSERT_RETURN_ERROR (PcdStatus);
break;
default:
return RETURN_SUCCESS;
}
SmbiosVersion = (UINT16)(QemuAnchor.V2.MajorVersion << 8 |
QemuAnchor.V2.MinorVersion);
break;
case sizeof QemuAnchor.V3:
QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
if (QemuAnchor.V3.MajorVersion != 3 ||
QemuAnchor.V3.TableMaximumSize != TablesSize ||
CompareMem (QemuAnchor.V3.AnchorString, "_SM3_", 5) != 0) {
return RETURN_SUCCESS;
}
SmbiosVersion = (UINT16)(QemuAnchor.V3.MajorVersion << 8 |
QemuAnchor.V3.MinorVersion);
DEBUG ((DEBUG_INFO, "%a: SMBIOS 3.x DocRev from QEMU: 0x%02x\n",
__FUNCTION__, QemuAnchor.V3.DocRev));
PcdStatus = PcdSet8S (PcdSmbiosDocRev, QemuAnchor.V3.DocRev);
ASSERT_RETURN_ERROR (PcdStatus);
break;
default:
return RETURN_SUCCESS;
}
DEBUG ((DEBUG_INFO, "%a: SMBIOS version from QEMU: 0x%04x\n", __FUNCTION__,
SmbiosVersion));
DEBUG ((
DEBUG_INFO,
"%a: SMBIOS version from QEMU: 0x%04x\n",
__FUNCTION__,
SmbiosVersion
));
PcdStatus = PcdSet16S (PcdSmbiosVersion, SmbiosVersion);
ASSERT_RETURN_ERROR (PcdStatus);

View File

@@ -25,7 +25,7 @@
//
// EFER register LMA bit
//
#define LMA BIT10
#define LMA BIT10
/**
The constructor function
@@ -88,9 +88,9 @@ SmmCpuFeaturesInitializeProcessor (
// Configure SMBASE.
//
CpuState = (QEMU_SMRAM_SAVE_STATE_MAP *)(UINTN)(
SMM_DEFAULT_SMBASE +
SMRAM_SAVE_STATE_MAP_OFFSET
);
SMM_DEFAULT_SMBASE +
SMRAM_SAVE_STATE_MAP_OFFSET
);
if ((CpuState->x86.SMMRevId & 0xFFFF) == 0) {
CpuState->x86.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex];
} else {
@@ -142,13 +142,13 @@ SmmCpuFeaturesHookReturnFromSmm (
IN UINT64 NewInstructionPointer
)
{
UINT64 OriginalInstructionPointer;
QEMU_SMRAM_SAVE_STATE_MAP *CpuSaveState;
UINT64 OriginalInstructionPointer;
QEMU_SMRAM_SAVE_STATE_MAP *CpuSaveState;
CpuSaveState = (QEMU_SMRAM_SAVE_STATE_MAP *)CpuState;
if ((CpuSaveState->x86.SMMRevId & 0xFFFF) == 0) {
OriginalInstructionPointer = (UINT64)CpuSaveState->x86._EIP;
CpuSaveState->x86._EIP = (UINT32)NewInstructionPointer;
CpuSaveState->x86._EIP = (UINT32)NewInstructionPointer;
//
// Clear the auto HALT restart flag so the RSM instruction returns
// program control to the instruction following the HLT instruction.
@@ -163,6 +163,7 @@ SmmCpuFeaturesHookReturnFromSmm (
} else {
CpuSaveState->x64._RIP = (UINT32)NewInstructionPointer;
}
//
// Clear the auto HALT restart flag so the RSM instruction returns
// program control to the instruction following the HLT instruction.
@@ -171,10 +172,11 @@ SmmCpuFeaturesHookReturnFromSmm (
CpuSaveState->x64.AutoHALTRestart &= ~BIT0;
}
}
return OriginalInstructionPointer;
}
STATIC CPU_HOT_EJECT_DATA *mCpuHotEjectData = NULL;
STATIC CPU_HOT_EJECT_DATA *mCpuHotEjectData = NULL;
/**
Initialize mCpuHotEjectData if PcdCpuMaxLogicalProcessorNumber > 1.
@@ -208,7 +210,8 @@ InitCpuHotEjectData (
if (RETURN_ERROR (SafeUintnMult (MaxNumberOfCpus, sizeof (UINT64), &Size)) ||
RETURN_ERROR (SafeUintnAdd (Size, sizeof (*mCpuHotEjectData), &Size)) ||
RETURN_ERROR (SafeUintnAdd (Size, sizeof (UINT64) - 1, &Size))) {
RETURN_ERROR (SafeUintnAdd (Size, sizeof (UINT64) - 1, &Size)))
{
DEBUG ((DEBUG_ERROR, "%a: invalid CPU_HOT_EJECT_DATA\n", __FUNCTION__));
goto Fatal;
}
@@ -219,11 +222,13 @@ InitCpuHotEjectData (
goto Fatal;
}
mCpuHotEjectData->Handler = NULL;
mCpuHotEjectData->Handler = NULL;
mCpuHotEjectData->ArrayLength = MaxNumberOfCpus;
mCpuHotEjectData->QemuSelectorMap = ALIGN_POINTER (mCpuHotEjectData + 1,
sizeof (UINT64));
mCpuHotEjectData->QemuSelectorMap = ALIGN_POINTER (
mCpuHotEjectData + 1,
sizeof (UINT64)
);
//
// We use mCpuHotEjectData->QemuSelectorMap to map
// ProcessorNum -> QemuSelector. Initialize to invalid values.
@@ -235,8 +240,10 @@ InitCpuHotEjectData (
//
// Expose address of CPU Hot eject Data structure
//
PcdStatus = PcdSet64S (PcdCpuHotEjectDataAddress,
(UINTN)(VOID *)mCpuHotEjectData);
PcdStatus = PcdSet64S (
PcdCpuHotEjectDataAddress,
(UINTN)(VOID *)mCpuHotEjectData
);
ASSERT_RETURN_ERROR (PcdStatus);
return;
@@ -258,10 +265,9 @@ SmmCpuFeaturesSmmRelocationComplete (
VOID
)
{
EFI_STATUS Status;
UINTN MapPagesBase;
UINTN MapPagesCount;
EFI_STATUS Status;
UINTN MapPagesBase;
UINTN MapPagesCount;
InitCpuHotEjectData ();
@@ -286,8 +292,12 @@ SmmCpuFeaturesSmmRelocationComplete (
MapPagesCount // NumPages
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: MemEncryptSevSetPageEncMask(): %r\n",
__FUNCTION__, Status));
DEBUG ((
DEBUG_ERROR,
"%a: MemEncryptSevSetPageEncMask(): %r\n",
__FUNCTION__,
Status
));
ASSERT (FALSE);
CpuDeadLoop ();
}
@@ -458,7 +468,7 @@ SmmCpuFeaturesRendezvousExit (
//
if (mCpuHotEjectData != NULL) {
CPU_HOT_EJECT_HANDLER Handler;
CPU_HOT_EJECT_HANDLER Handler;
//
// As the comment above mentions, mCpuHotEjectData->Handler might be
@@ -477,7 +487,7 @@ SmmCpuFeaturesRendezvousExit (
// ordered-after the AllCpusInSync loop by using a MemoryFence() with
// acquire semantics.
//
MemoryFence();
MemoryFence ();
Handler = mCpuHotEjectData->Handler;
@@ -564,21 +574,21 @@ SmmCpuFeaturesSetSmmRegister (
/// Macro used to simplify the lookup table entries of type
/// CPU_SMM_SAVE_STATE_LOOKUP_ENTRY
///
#define SMM_CPU_OFFSET(Field) OFFSET_OF (QEMU_SMRAM_SAVE_STATE_MAP, Field)
#define SMM_CPU_OFFSET(Field) OFFSET_OF (QEMU_SMRAM_SAVE_STATE_MAP, Field)
///
/// Macro used to simplify the lookup table entries of type
/// CPU_SMM_SAVE_STATE_REGISTER_RANGE
///
#define SMM_REGISTER_RANGE(Start, End) { Start, End, End - Start + 1 }
#define SMM_REGISTER_RANGE(Start, End) { Start, End, End - Start + 1 }
///
/// Structure used to describe a range of registers
///
typedef struct {
EFI_SMM_SAVE_STATE_REGISTER Start;
EFI_SMM_SAVE_STATE_REGISTER End;
UINTN Length;
EFI_SMM_SAVE_STATE_REGISTER Start;
EFI_SMM_SAVE_STATE_REGISTER End;
UINTN Length;
} CPU_SMM_SAVE_STATE_REGISTER_RANGE;
///
@@ -586,22 +596,22 @@ typedef struct {
/// associated with each supported EFI_SMM_SAVE_STATE_REGISTER value
///
#define SMM_SAVE_STATE_REGISTER_FIRST_INDEX 1
#define SMM_SAVE_STATE_REGISTER_FIRST_INDEX 1
typedef struct {
UINT8 Width32;
UINT8 Width64;
UINT16 Offset32;
UINT16 Offset64Lo;
UINT16 Offset64Hi;
BOOLEAN Writeable;
UINT8 Width32;
UINT8 Width64;
UINT16 Offset32;
UINT16 Offset64Lo;
UINT16 Offset64Hi;
BOOLEAN Writeable;
} CPU_SMM_SAVE_STATE_LOOKUP_ENTRY;
///
/// Table used by GetRegisterIndex() to convert an EFI_SMM_SAVE_STATE_REGISTER
/// value to an index into a table of type CPU_SMM_SAVE_STATE_LOOKUP_ENTRY
///
STATIC CONST CPU_SMM_SAVE_STATE_REGISTER_RANGE mSmmCpuRegisterRanges[] = {
STATIC CONST CPU_SMM_SAVE_STATE_REGISTER_RANGE mSmmCpuRegisterRanges[] = {
SMM_REGISTER_RANGE (
EFI_SMM_SAVE_STATE_REGISTER_GDTBASE,
EFI_SMM_SAVE_STATE_REGISTER_LDTINFO
@@ -614,14 +624,14 @@ STATIC CONST CPU_SMM_SAVE_STATE_REGISTER_RANGE mSmmCpuRegisterRanges[] = {
EFI_SMM_SAVE_STATE_REGISTER_RFLAGS,
EFI_SMM_SAVE_STATE_REGISTER_CR4
),
{ (EFI_SMM_SAVE_STATE_REGISTER)0, (EFI_SMM_SAVE_STATE_REGISTER)0, 0 }
{ (EFI_SMM_SAVE_STATE_REGISTER)0, (EFI_SMM_SAVE_STATE_REGISTER)0,0 }
};
///
/// Lookup table used to retrieve the widths and offsets associated with each
/// supported EFI_SMM_SAVE_STATE_REGISTER value
///
STATIC CONST CPU_SMM_SAVE_STATE_LOOKUP_ENTRY mSmmCpuWidthOffset[] = {
STATIC CONST CPU_SMM_SAVE_STATE_LOOKUP_ENTRY mSmmCpuWidthOffset[] = {
{
0, // Width32
0, // Width64
@@ -1001,13 +1011,17 @@ GetRegisterIndex (
for (Index = 0, Offset = SMM_SAVE_STATE_REGISTER_FIRST_INDEX;
mSmmCpuRegisterRanges[Index].Length != 0;
Index++) {
if (Register >= mSmmCpuRegisterRanges[Index].Start &&
Register <= mSmmCpuRegisterRanges[Index].End) {
Index++)
{
if ((Register >= mSmmCpuRegisterRanges[Index].Start) &&
(Register <= mSmmCpuRegisterRanges[Index].End))
{
return Register - mSmmCpuRegisterRanges[Index].Start + Offset;
}
Offset += mSmmCpuRegisterRanges[Index].Length;
}
return 0;
}
@@ -1037,10 +1051,10 @@ GetRegisterIndex (
STATIC
EFI_STATUS
ReadSaveStateRegisterByIndex (
IN UINTN CpuIndex,
IN UINTN RegisterIndex,
IN UINTN Width,
OUT VOID *Buffer
IN UINTN CpuIndex,
IN UINTN RegisterIndex,
IN UINTN Width,
OUT VOID *Buffer
)
{
QEMU_SMRAM_SAVE_STATE_MAP *CpuSaveState;
@@ -1067,7 +1081,7 @@ ReadSaveStateRegisterByIndex (
//
// Write return buffer
//
ASSERT(CpuSaveState != NULL);
ASSERT (CpuSaveState != NULL);
CopyMem (
Buffer,
(UINT8 *)CpuSaveState + mSmmCpuWidthOffset[RegisterIndex].Offset32,
@@ -1109,6 +1123,7 @@ ReadSaveStateRegisterByIndex (
);
}
}
return EFI_SUCCESS;
}
@@ -1139,7 +1154,7 @@ SmmCpuFeaturesReadSaveStateRegister (
OUT VOID *Buffer
)
{
UINTN RegisterIndex;
UINTN RegisterIndex;
QEMU_SMRAM_SAVE_STATE_MAP *CpuSaveState;
//
@@ -1215,7 +1230,7 @@ SmmCpuFeaturesWriteSaveStateRegister (
IN CONST VOID *Buffer
)
{
UINTN RegisterIndex;
UINTN RegisterIndex;
QEMU_SMRAM_SAVE_STATE_MAP *CpuSaveState;
//
@@ -1272,6 +1287,7 @@ SmmCpuFeaturesWriteSaveStateRegister (
if (Width > mSmmCpuWidthOffset[RegisterIndex].Width32) {
return EFI_INVALID_PARAMETER;
}
//
// Write SMM State register
//
@@ -1317,6 +1333,7 @@ SmmCpuFeaturesWriteSaveStateRegister (
);
}
}
return EFI_SUCCESS;
}
@@ -1357,9 +1374,8 @@ SmmCpuFeaturesCompleteSmmReadyToLock (
VOID *
EFIAPI
SmmCpuFeaturesAllocatePageTableMemory (
IN UINTN Pages
IN UINTN Pages
)
{
return NULL;
}

View File

@@ -75,13 +75,13 @@ ClearTopLevelSmiStatus (
EFI_STATUS
EFIAPI
PlatformSmmBspElection (
OUT BOOLEAN *IsBsp
OUT BOOLEAN *IsBsp
)
{
MSR_IA32_APIC_BASE_REGISTER ApicBaseMsr;
MSR_IA32_APIC_BASE_REGISTER ApicBaseMsr;
ApicBaseMsr.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE);
*IsBsp = (BOOLEAN)(ApicBaseMsr.Bits.BSP == 1);
*IsBsp = (BOOLEAN)(ApicBaseMsr.Bits.BSP == 1);
return EFI_SUCCESS;
}
@@ -105,10 +105,10 @@ PlatformSmmBspElection (
EFI_STATUS
EFIAPI
GetPlatformPageTableAttribute (
IN UINT64 Address,
IN OUT SMM_PAGE_SIZE_TYPE *PageSize,
IN OUT UINTN *NumOfPages,
IN OUT UINTN *PageAttribute
IN UINT64 Address,
IN OUT SMM_PAGE_SIZE_TYPE *PageSize,
IN OUT UINTN *NumOfPages,
IN OUT UINTN *PageAttribute
)
{
return EFI_UNSUPPORTED;

View File

@@ -12,7 +12,7 @@
VOID
EFIAPI
Tcg2PhysicalPresenceLibProcessRequest (
IN TPM2B_AUTH *PlatformAuth OPTIONAL
IN TPM2B_AUTH *PlatformAuth OPTIONAL
)
{
//

View File

@@ -36,14 +36,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/Tcg2PhysicalPresenceLib.h>
#define CONFIRM_BUFFER_SIZE 4096
#define CONFIRM_BUFFER_SIZE 4096
EFI_HII_HANDLE mTcg2PpStringPackHandle;
EFI_HII_HANDLE mTcg2PpStringPackHandle;
#define TPM_PPI_FLAGS (QEMU_TPM_PPI_FUNC_ALLOWED_USR_REQ)
STATIC volatile QEMU_TPM_PPI *mPpi;
#define TPM_PPI_FLAGS (QEMU_TPM_PPI_FUNC_ALLOWED_USR_REQ)
STATIC volatile QEMU_TPM_PPI *mPpi;
/**
Reads QEMU PPI config from fw_cfg.
@@ -56,12 +55,12 @@ STATIC volatile QEMU_TPM_PPI *mPpi;
STATIC
EFI_STATUS
QemuTpmReadConfig (
OUT QEMU_FWCFG_TPM_CONFIG *Config
OUT QEMU_FWCFG_TPM_CONFIG *Config
)
{
EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM FwCfgItem;
UINTN FwCfgSize;
EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM FwCfgItem;
UINTN FwCfgSize;
Status = QemuFwCfgFindFile ("etc/tpm/config", &FwCfgItem, &FwCfgSize);
if (EFI_ERROR (Status)) {
@@ -77,7 +76,6 @@ QemuTpmReadConfig (
return EFI_SUCCESS;
}
/**
Initializes QEMU PPI memory region.
@@ -90,11 +88,11 @@ QemuTpmInitPPI (
VOID
)
{
EFI_STATUS Status;
QEMU_FWCFG_TPM_CONFIG Config;
EFI_PHYSICAL_ADDRESS PpiAddress64;
EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor;
UINTN Idx;
EFI_STATUS Status;
QEMU_FWCFG_TPM_CONFIG Config;
EFI_PHYSICAL_ADDRESS PpiAddress64;
EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor;
UINTN Idx;
if (mPpi != NULL) {
return EFI_SUCCESS;
@@ -114,19 +112,22 @@ QemuTpmInitPPI (
PpiAddress64 = (UINTN)mPpi;
if ((PpiAddress64 & ~(UINT64)EFI_PAGE_MASK) !=
((PpiAddress64 + sizeof *mPpi - 1) & ~(UINT64)EFI_PAGE_MASK)) {
((PpiAddress64 + sizeof *mPpi - 1) & ~(UINT64)EFI_PAGE_MASK))
{
DEBUG ((DEBUG_ERROR, "[TPM2PP] mPpi crosses a page boundary\n"));
goto InvalidPpiAddress;
}
Status = gDS->GetMemorySpaceDescriptor (PpiAddress64, &Descriptor);
if (EFI_ERROR (Status) && Status != EFI_NOT_FOUND) {
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
ASSERT_EFI_ERROR (Status);
goto InvalidPpiAddress;
}
if (!EFI_ERROR (Status) &&
(Descriptor.GcdMemoryType != EfiGcdMemoryTypeMemoryMappedIo &&
Descriptor.GcdMemoryType != EfiGcdMemoryTypeNonExistent)) {
((Descriptor.GcdMemoryType != EfiGcdMemoryTypeMemoryMappedIo) &&
(Descriptor.GcdMemoryType != EfiGcdMemoryTypeNonExistent)))
{
DEBUG ((DEBUG_ERROR, "[TPM2PP] mPpi has an invalid memory type\n"));
goto InvalidPpiAddress;
}
@@ -134,24 +135,25 @@ QemuTpmInitPPI (
for (Idx = 0; Idx < ARRAY_SIZE (mPpi->Func); Idx++) {
mPpi->Func[Idx] = 0;
}
if (Config.TpmVersion == QEMU_TPM_VERSION_2) {
mPpi->Func[TCG2_PHYSICAL_PRESENCE_NO_ACTION] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_CLEAR] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_CHANGE_EPS] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_LOG_ALL_DIGESTS] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_NO_ACTION] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_CLEAR] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_CHANGE_EPS] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_LOG_ALL_DIGESTS] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID] = TPM_PPI_FLAGS;
mPpi->Func[TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID] = TPM_PPI_FLAGS;
}
if (mPpi->In == 0) {
mPpi->In = 1;
mPpi->Request = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
mPpi->In = 1;
mPpi->Request = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
mPpi->LastRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
mPpi->NextStep = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
mPpi->NextStep = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
}
return EFI_SUCCESS;
@@ -161,7 +163,6 @@ InvalidPpiAddress:
return EFI_PROTOCOL_ERROR;
}
/**
Get string by string id from HII Interface.
@@ -174,13 +175,12 @@ InvalidPpiAddress:
STATIC
CHAR16 *
Tcg2PhysicalPresenceGetStringById (
IN EFI_STRING_ID Id
IN EFI_STRING_ID Id
)
{
return HiiGetString (mTcg2PpStringPackHandle, Id, NULL);
}
/**
Send ClearControl and Clear command to TPM.
@@ -195,12 +195,12 @@ Tcg2PhysicalPresenceGetStringById (
EFI_STATUS
EFIAPI
Tpm2CommandClear (
IN TPM2B_AUTH *PlatformAuth OPTIONAL
IN TPM2B_AUTH *PlatformAuth OPTIONAL
)
{
EFI_STATUS Status;
TPMS_AUTH_COMMAND *AuthSession;
TPMS_AUTH_COMMAND LocalAuthSession;
EFI_STATUS Status;
TPMS_AUTH_COMMAND *AuthSession;
TPMS_AUTH_COMMAND LocalAuthSession;
if (PlatformAuth == NULL) {
AuthSession = NULL;
@@ -208,7 +208,7 @@ Tpm2CommandClear (
AuthSession = &LocalAuthSession;
ZeroMem (&LocalAuthSession, sizeof (LocalAuthSession));
LocalAuthSession.sessionHandle = TPM_RS_PW;
LocalAuthSession.hmac.size = PlatformAuth->size;
LocalAuthSession.hmac.size = PlatformAuth->size;
CopyMem (LocalAuthSession.hmac.buffer, PlatformAuth->buffer, PlatformAuth->size);
}
@@ -218,6 +218,7 @@ Tpm2CommandClear (
if (EFI_ERROR (Status)) {
goto Done;
}
DEBUG ((DEBUG_INFO, "Tpm2Clear ... \n"));
Status = Tpm2Clear (TPM_RH_PLATFORM, AuthSession);
DEBUG ((DEBUG_INFO, "Tpm2Clear - %r\n", Status));
@@ -227,7 +228,6 @@ Done:
return Status;
}
/**
Change EPS.
@@ -238,12 +238,12 @@ Done:
STATIC
EFI_STATUS
Tpm2CommandChangeEps (
IN TPM2B_AUTH *PlatformAuth OPTIONAL
IN TPM2B_AUTH *PlatformAuth OPTIONAL
)
{
EFI_STATUS Status;
TPMS_AUTH_COMMAND *AuthSession;
TPMS_AUTH_COMMAND LocalAuthSession;
EFI_STATUS Status;
TPMS_AUTH_COMMAND *AuthSession;
TPMS_AUTH_COMMAND LocalAuthSession;
if (PlatformAuth == NULL) {
AuthSession = NULL;
@@ -251,18 +251,17 @@ Tpm2CommandChangeEps (
AuthSession = &LocalAuthSession;
ZeroMem (&LocalAuthSession, sizeof (LocalAuthSession));
LocalAuthSession.sessionHandle = TPM_RS_PW;
LocalAuthSession.hmac.size = PlatformAuth->size;
LocalAuthSession.hmac.size = PlatformAuth->size;
CopyMem (LocalAuthSession.hmac.buffer, PlatformAuth->buffer, PlatformAuth->size);
}
Status = Tpm2ChangeEPS (TPM_RH_PLATFORM, AuthSession);
DEBUG ((DEBUG_INFO, "Tpm2ChangeEPS - %r\n", Status));
ZeroMem (&LocalAuthSession.hmac, sizeof(LocalAuthSession.hmac));
ZeroMem (&LocalAuthSession.hmac, sizeof (LocalAuthSession.hmac));
return Status;
}
/**
Execute physical presence operation requested by the OS.
@@ -278,14 +277,14 @@ Tpm2CommandChangeEps (
STATIC
UINT32
Tcg2ExecutePhysicalPresence (
IN TPM2B_AUTH *PlatformAuth OPTIONAL,
IN UINT32 CommandCode,
IN UINT32 CommandParameter
IN TPM2B_AUTH *PlatformAuth OPTIONAL,
IN UINT32 CommandCode,
IN UINT32 CommandParameter
)
{
EFI_STATUS Status;
EFI_TCG2_EVENT_ALGORITHM_BITMAP TpmHashAlgorithmBitmap;
UINT32 ActivePcrBanks;
EFI_STATUS Status;
EFI_TCG2_EVENT_ALGORITHM_BITMAP TpmHashAlgorithmBitmap;
UINT32 ActivePcrBanks;
switch (CommandCode) {
case TCG2_PHYSICAL_PRESENCE_CLEAR:
@@ -309,8 +308,8 @@ Tcg2ExecutePhysicalPresence (
// Firmware has to ensure that at least one PCR banks is active.
// If not, an error is returned and no action is taken.
//
if (CommandParameter == 0 || (CommandParameter & (~TpmHashAlgorithmBitmap)) != 0) {
DEBUG((DEBUG_ERROR, "PCR banks %x to allocate are not supported by TPM. Skip operation\n", CommandParameter));
if ((CommandParameter == 0) || ((CommandParameter & (~TpmHashAlgorithmBitmap)) != 0)) {
DEBUG ((DEBUG_ERROR, "PCR banks %x to allocate are not supported by TPM. Skip operation\n", CommandParameter));
return TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE;
}
@@ -348,7 +347,6 @@ Tcg2ExecutePhysicalPresence (
}
}
/**
Read the specified key for user confirmation.
@@ -361,12 +359,12 @@ Tcg2ExecutePhysicalPresence (
STATIC
BOOLEAN
Tcg2ReadUserKey (
IN BOOLEAN CautionKey
IN BOOLEAN CautionKey
)
{
EFI_STATUS Status;
EFI_INPUT_KEY Key;
UINT16 InputKey;
EFI_STATUS Status;
EFI_INPUT_KEY Key;
UINT16 InputKey;
InputKey = 0;
do {
@@ -376,9 +374,11 @@ Tcg2ReadUserKey (
if (Key.ScanCode == SCAN_ESC) {
InputKey = Key.ScanCode;
}
if ((Key.ScanCode == SCAN_F10) && !CautionKey) {
InputKey = Key.ScanCode;
}
if ((Key.ScanCode == SCAN_F12) && CautionKey) {
InputKey = Key.ScanCode;
}
@@ -392,7 +392,6 @@ Tcg2ReadUserKey (
return FALSE;
}
/**
Fill Buffer With BootHashAlg.
@@ -414,35 +413,43 @@ Tcg2FillBufferWithBootHashAlg (
if (Buffer[0] != 0) {
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {
if (Buffer[0] != 0) {
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {
if (Buffer[0] != 0) {
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {
if (Buffer[0] != 0) {
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {
if (Buffer[0] != 0) {
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L", ", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
StrnCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256", (BufferSize / sizeof (CHAR16)) - StrLen (Buffer) - 1);
}
}
/**
Display the confirm text and get user confirmation.
@@ -455,8 +462,8 @@ Tcg2FillBufferWithBootHashAlg (
STATIC
BOOLEAN
Tcg2UserConfirm (
IN UINT32 TpmPpCommand,
IN UINT32 TpmPpCommandParameter
IN UINT32 TpmPpCommand,
IN UINT32 TpmPpCommandParameter
)
{
CHAR16 *ConfirmText;
@@ -485,13 +492,12 @@ Tcg2UserConfirm (
ASSERT (mTcg2PpStringPackHandle != NULL);
switch (TpmPpCommand) {
case TCG2_PHYSICAL_PRESENCE_CLEAR:
case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR:
case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2:
case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3:
CautionKey = TRUE;
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR));
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR));
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
@@ -505,14 +511,14 @@ Tcg2UserConfirm (
break;
case TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS:
Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) &Tcg2Protocol);
Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **)&Tcg2Protocol);
ASSERT_EFI_ERROR (Status);
ProtocolCapability.Size = sizeof(ProtocolCapability);
Status = Tcg2Protocol->GetCapability (
Tcg2Protocol,
&ProtocolCapability
);
ProtocolCapability.Size = sizeof (ProtocolCapability);
Status = Tcg2Protocol->GetCapability (
Tcg2Protocol,
&ProtocolCapability
);
ASSERT_EFI_ERROR (Status);
Status = Tcg2Protocol->GetActivePcrBanks (
@@ -522,7 +528,7 @@ Tcg2UserConfirm (
ASSERT_EFI_ERROR (Status);
CautionKey = TRUE;
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_SET_PCR_BANKS));
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_SET_PCR_BANKS));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR));
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
@@ -536,8 +542,8 @@ Tcg2UserConfirm (
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
Tcg2FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), TpmPpCommandParameter);
Tcg2FillBufferWithBootHashAlg (TempBuffer2, sizeof(TempBuffer2), CurrentPCRBanks);
Tcg2FillBufferWithBootHashAlg (TempBuffer, sizeof (TempBuffer), TpmPpCommandParameter);
Tcg2FillBufferWithBootHashAlg (TempBuffer2, sizeof (TempBuffer2), CurrentPCRBanks);
TmpStr1 = AllocateZeroPool (BufSize);
ASSERT (TmpStr1 != NULL);
@@ -551,7 +557,7 @@ Tcg2UserConfirm (
case TCG2_PHYSICAL_PRESENCE_CHANGE_EPS:
CautionKey = TRUE;
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CHANGE_EPS));
TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CHANGE_EPS));
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR));
UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2);
@@ -602,6 +608,7 @@ Tcg2UserConfirm (
} else {
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_ACCEPT_KEY));
}
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
@@ -618,6 +625,7 @@ Tcg2UserConfirm (
} else {
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_ACCEPT_KEY));
}
StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1);
FreePool (TmpStr1);
@@ -629,6 +637,7 @@ Tcg2UserConfirm (
TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_REJECT_KEY));
}
BufSize -= StrSize (ConfirmText);
UnicodeSPrint (ConfirmText + StrLen (ConfirmText), BufSize, TmpStr1, TmpStr2);
@@ -650,7 +659,6 @@ Tcg2UserConfirm (
return FALSE;
}
/**
Check if there is a valid physical presence command request. Also updates parameter value
to whether the requested physical presence command already confirmed by user
@@ -667,11 +675,11 @@ Tcg2UserConfirm (
STATIC
BOOLEAN
Tcg2HaveValidTpmRequest (
OUT BOOLEAN *RequestConfirmed
OUT BOOLEAN *RequestConfirmed
)
{
EFI_TCG2_PROTOCOL *Tcg2Protocol;
EFI_STATUS Status;
EFI_TCG2_PROTOCOL *Tcg2Protocol;
EFI_STATUS Status;
*RequestConfirmed = FALSE;
@@ -679,7 +687,7 @@ Tcg2HaveValidTpmRequest (
//
// Need TCG2 protocol.
//
Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) &Tcg2Protocol);
Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **)&Tcg2Protocol);
if (EFI_ERROR (Status)) {
return FALSE;
}
@@ -714,7 +722,6 @@ Tcg2HaveValidTpmRequest (
return TRUE;
}
/**
Check and execute the requested physical presence command.
@@ -723,10 +730,10 @@ Tcg2HaveValidTpmRequest (
STATIC
VOID
Tcg2ExecutePendingTpmRequest (
IN TPM2B_AUTH *PlatformAuth OPTIONAL
IN TPM2B_AUTH *PlatformAuth OPTIONAL
)
{
BOOLEAN RequestConfirmed;
BOOLEAN RequestConfirmed;
if (mPpi->Request == TCG2_PHYSICAL_PRESENCE_NO_ACTION) {
//
@@ -744,8 +751,9 @@ Tcg2ExecutePendingTpmRequest (
} else {
mPpi->Response = TCG_PP_OPERATION_RESPONSE_BIOS_FAILURE;
}
mPpi->LastRequest = mPpi->Request;
mPpi->Request = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
mPpi->LastRequest = mPpi->Request;
mPpi->Request = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
mPpi->RequestParameter = 0;
return;
}
@@ -763,17 +771,17 @@ Tcg2ExecutePendingTpmRequest (
mPpi->Response = TCG_PP_OPERATION_RESPONSE_USER_ABORT;
if (RequestConfirmed) {
mPpi->Response = Tcg2ExecutePhysicalPresence (
PlatformAuth,
mPpi->Request,
mPpi->RequestParameter
);
PlatformAuth,
mPpi->Request,
mPpi->RequestParameter
);
}
//
// Clear request
//
mPpi->LastRequest = mPpi->Request;
mPpi->Request = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
mPpi->LastRequest = mPpi->Request;
mPpi->Request = TCG2_PHYSICAL_PRESENCE_NO_ACTION;
mPpi->RequestParameter = 0;
if (mPpi->Response == TCG_PP_OPERATION_RESPONSE_USER_ABORT) {
@@ -784,24 +792,25 @@ Tcg2ExecutePendingTpmRequest (
// Reset system to make new TPM settings in effect
//
switch (mPpi->LastRequest) {
case TCG2_PHYSICAL_PRESENCE_CLEAR:
case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR:
case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2:
case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3:
case TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS:
case TCG2_PHYSICAL_PRESENCE_CHANGE_EPS:
case TCG2_PHYSICAL_PRESENCE_LOG_ALL_DIGESTS:
break;
case TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID:
case TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID:
break;
default:
if (mPpi->Request != TCG2_PHYSICAL_PRESENCE_NO_ACTION) {
case TCG2_PHYSICAL_PRESENCE_CLEAR:
case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR:
case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_2:
case TCG2_PHYSICAL_PRESENCE_ENABLE_CLEAR_3:
case TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS:
case TCG2_PHYSICAL_PRESENCE_CHANGE_EPS:
case TCG2_PHYSICAL_PRESENCE_LOG_ALL_DIGESTS:
break;
}
return;
case TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID:
case TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID:
break;
default:
if (mPpi->Request != TCG2_PHYSICAL_PRESENCE_NO_ACTION) {
break;
}
return;
}
Print (L"Rebooting system to make TPM2 settings in effect\n");
@@ -809,7 +818,6 @@ Tcg2ExecutePendingTpmRequest (
ASSERT (FALSE);
}
/**
Check and execute the pending TPM request.
@@ -826,15 +834,15 @@ Tcg2ExecutePendingTpmRequest (
VOID
EFIAPI
Tcg2PhysicalPresenceLibProcessRequest (
IN TPM2B_AUTH *PlatformAuth OPTIONAL
IN TPM2B_AUTH *PlatformAuth OPTIONAL
)
{
EFI_STATUS Status;
EFI_STATUS Status;
Status = QemuTpmInitPPI ();
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, "[TPM2PP] no PPI\n"));
return ;
return;
}
//
@@ -842,14 +850,13 @@ Tcg2PhysicalPresenceLibProcessRequest (
//
if (GetBootModeHob () == BOOT_ON_S4_RESUME) {
DEBUG ((DEBUG_INFO, "S4 Resume, Skip TPM PP process!\n"));
return ;
return;
}
DEBUG ((DEBUG_INFO, "[TPM2PP] PPRequest=%x (PPRequestParameter=%x)\n", mPpi->Request, mPpi->RequestParameter));
Tcg2ExecutePendingTpmRequest (PlatformAuth);
}
/**
The handler for TPM physical presence function:
Return TPM Operation Response to OS Environment.
@@ -862,11 +869,11 @@ Tcg2PhysicalPresenceLibProcessRequest (
UINT32
EFIAPI
Tcg2PhysicalPresenceLibReturnOperationResponseToOsFunction (
OUT UINT32 *MostRecentRequest,
OUT UINT32 *Response
OUT UINT32 *MostRecentRequest,
OUT UINT32 *Response
)
{
EFI_STATUS Status;
EFI_STATUS Status;
DEBUG ((DEBUG_INFO, "[TPM2PP] ReturnOperationResponseToOsFunction\n"));
@@ -884,7 +891,6 @@ Tcg2PhysicalPresenceLibReturnOperationResponseToOsFunction (
return TCG_PP_RETURN_TPM_OPERATION_RESPONSE_SUCCESS;
}
/**
The handler for TPM physical presence function:
Submit TPM Operation Request to Pre-OS Environment and
@@ -901,11 +907,11 @@ Tcg2PhysicalPresenceLibReturnOperationResponseToOsFunction (
UINT32
EFIAPI
Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (
IN UINT32 OperationRequest,
IN UINT32 RequestParameter
IN UINT32 OperationRequest,
IN UINT32 RequestParameter
)
{
EFI_STATUS Status;
EFI_STATUS Status;
DEBUG ((DEBUG_INFO, "[TPM2PP] SubmitRequestToPreOSFunction, Request = %x, %x\n", OperationRequest, RequestParameter));
@@ -915,7 +921,7 @@ Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (
return TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE;
}
mPpi->Request = OperationRequest;
mPpi->Request = OperationRequest;
mPpi->RequestParameter = RequestParameter;
return TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS;

View File

@@ -36,16 +36,23 @@ SetCaCerts (
VOID
)
{
EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM HttpsCaCertsItem;
UINTN HttpsCaCertsSize;
VOID *HttpsCaCerts;
EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM HttpsCaCertsItem;
UINTN HttpsCaCertsSize;
VOID *HttpsCaCerts;
Status = QemuFwCfgFindFile ("etc/edk2/https/cacerts", &HttpsCaCertsItem,
&HttpsCaCertsSize);
Status = QemuFwCfgFindFile (
"etc/edk2/https/cacerts",
&HttpsCaCertsItem,
&HttpsCaCertsSize
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_VERBOSE, "%a:%a: not touching CA cert list\n",
gEfiCallerBaseName, __FUNCTION__));
DEBUG ((
DEBUG_VERBOSE,
"%a:%a: not touching CA cert list\n",
gEfiCallerBaseName,
__FUNCTION__
));
return;
}
@@ -72,23 +79,36 @@ SetCaCerts (
//
// This is fatal.
//
DEBUG ((DEBUG_ERROR, "%a:%a: failed to delete %g:\"%s\"\n",
gEfiCallerBaseName, __FUNCTION__, &gEfiTlsCaCertificateGuid,
EFI_TLS_CA_CERTIFICATE_VARIABLE));
DEBUG ((
DEBUG_ERROR,
"%a:%a: failed to delete %g:\"%s\"\n",
gEfiCallerBaseName,
__FUNCTION__,
&gEfiTlsCaCertificateGuid,
EFI_TLS_CA_CERTIFICATE_VARIABLE
));
ASSERT_EFI_ERROR (Status);
CpuDeadLoop ();
}
if (HttpsCaCertsSize == 0) {
DEBUG ((DEBUG_VERBOSE, "%a:%a: applied empty CA cert list\n",
gEfiCallerBaseName, __FUNCTION__));
DEBUG ((
DEBUG_VERBOSE,
"%a:%a: applied empty CA cert list\n",
gEfiCallerBaseName,
__FUNCTION__
));
return;
}
HttpsCaCerts = AllocatePool (HttpsCaCertsSize);
if (HttpsCaCerts == NULL) {
DEBUG ((DEBUG_ERROR, "%a:%a: failed to allocate HttpsCaCerts\n",
gEfiCallerBaseName, __FUNCTION__));
DEBUG ((
DEBUG_ERROR,
"%a:%a: failed to allocate HttpsCaCerts\n",
gEfiCallerBaseName,
__FUNCTION__
));
return;
}
@@ -103,14 +123,25 @@ SetCaCerts (
HttpsCaCerts // Data
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a:%a: failed to set %g:\"%s\": %r\n",
gEfiCallerBaseName, __FUNCTION__, &gEfiTlsCaCertificateGuid,
EFI_TLS_CA_CERTIFICATE_VARIABLE, Status));
DEBUG ((
DEBUG_ERROR,
"%a:%a: failed to set %g:\"%s\": %r\n",
gEfiCallerBaseName,
__FUNCTION__,
&gEfiTlsCaCertificateGuid,
EFI_TLS_CA_CERTIFICATE_VARIABLE,
Status
));
goto FreeHttpsCaCerts;
}
DEBUG ((DEBUG_VERBOSE, "%a:%a: stored CA cert list (%Lu byte(s))\n",
gEfiCallerBaseName, __FUNCTION__, (UINT64)HttpsCaCertsSize));
DEBUG ((
DEBUG_VERBOSE,
"%a:%a: stored CA cert list (%Lu byte(s))\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)HttpsCaCertsSize
));
FreeHttpsCaCerts:
FreePool (HttpsCaCerts);
@@ -130,18 +161,26 @@ SetCipherSuites (
VOID
)
{
EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM HttpsCiphersItem;
UINTN HttpsCiphersSize;
VOID *HttpsCiphers;
EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM HttpsCiphersItem;
UINTN HttpsCiphersSize;
VOID *HttpsCiphers;
Status = QemuFwCfgFindFile ("etc/edk2/https/ciphers", &HttpsCiphersItem,
&HttpsCiphersSize);
Status = QemuFwCfgFindFile (
"etc/edk2/https/ciphers",
&HttpsCiphersItem,
&HttpsCiphersSize
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_VERBOSE, "%a:%a: not touching cipher suites\n",
gEfiCallerBaseName, __FUNCTION__));
DEBUG ((
DEBUG_VERBOSE,
"%a:%a: not touching cipher suites\n",
gEfiCallerBaseName,
__FUNCTION__
));
return;
}
//
// From this point on, any failure is fatal. An ordered cipher preference
// list is available from QEMU, thus we cannot let the firmware attempt HTTPS
@@ -161,23 +200,36 @@ SetCipherSuites (
NULL // Data
);
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
DEBUG ((DEBUG_ERROR, "%a:%a: failed to delete %g:\"%s\"\n",
gEfiCallerBaseName, __FUNCTION__, &gEdkiiHttpTlsCipherListGuid,
EDKII_HTTP_TLS_CIPHER_LIST_VARIABLE));
DEBUG ((
DEBUG_ERROR,
"%a:%a: failed to delete %g:\"%s\"\n",
gEfiCallerBaseName,
__FUNCTION__,
&gEdkiiHttpTlsCipherListGuid,
EDKII_HTTP_TLS_CIPHER_LIST_VARIABLE
));
goto Done;
}
if (HttpsCiphersSize == 0) {
DEBUG ((DEBUG_ERROR, "%a:%a: list of cipher suites must not be empty\n",
gEfiCallerBaseName, __FUNCTION__));
DEBUG ((
DEBUG_ERROR,
"%a:%a: list of cipher suites must not be empty\n",
gEfiCallerBaseName,
__FUNCTION__
));
Status = EFI_INVALID_PARAMETER;
goto Done;
}
HttpsCiphers = AllocatePool (HttpsCiphersSize);
if (HttpsCiphers == NULL) {
DEBUG ((DEBUG_ERROR, "%a:%a: failed to allocate HttpsCiphers\n",
gEfiCallerBaseName, __FUNCTION__));
DEBUG ((
DEBUG_ERROR,
"%a:%a: failed to allocate HttpsCiphers\n",
gEfiCallerBaseName,
__FUNCTION__
));
Status = EFI_OUT_OF_RESOURCES;
goto Done;
}
@@ -193,14 +245,24 @@ SetCipherSuites (
HttpsCiphers // Data
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a:%a: failed to set %g:\"%s\"\n",
gEfiCallerBaseName, __FUNCTION__, &gEdkiiHttpTlsCipherListGuid,
EDKII_HTTP_TLS_CIPHER_LIST_VARIABLE));
DEBUG ((
DEBUG_ERROR,
"%a:%a: failed to set %g:\"%s\"\n",
gEfiCallerBaseName,
__FUNCTION__,
&gEdkiiHttpTlsCipherListGuid,
EDKII_HTTP_TLS_CIPHER_LIST_VARIABLE
));
goto FreeHttpsCiphers;
}
DEBUG ((DEBUG_VERBOSE, "%a:%a: stored list of cipher suites (%Lu byte(s))\n",
gEfiCallerBaseName, __FUNCTION__, (UINT64)HttpsCiphersSize));
DEBUG ((
DEBUG_VERBOSE,
"%a:%a: stored list of cipher suites (%Lu byte(s))\n",
gEfiCallerBaseName,
__FUNCTION__,
(UINT64)HttpsCiphersSize
));
FreeHttpsCiphers:
FreePool (HttpsCiphers);

View File

@@ -10,7 +10,6 @@
#include "UefiPciCapPciIoLib.h"
/**
Transfer bytes between the config space of a given PCI device and a memory
buffer.
@@ -46,18 +45,18 @@
STATIC
EFI_STATUS
ProtoDevTransferConfig (
IN EFI_PCI_IO_PROTOCOL *PciIo,
IN EFI_PCI_IO_PROTOCOL_CONFIG TransferFunction,
IN UINT16 ConfigOffset,
IN OUT UINT8 *Buffer,
IN UINT16 Size
IN EFI_PCI_IO_PROTOCOL *PciIo,
IN EFI_PCI_IO_PROTOCOL_CONFIG TransferFunction,
IN UINT16 ConfigOffset,
IN OUT UINT8 *Buffer,
IN UINT16 Size
)
{
while (Size > 0) {
EFI_PCI_IO_PROTOCOL_WIDTH Width;
UINT16 Count;
EFI_STATUS Status;
UINT16 Progress;
EFI_PCI_IO_PROTOCOL_WIDTH Width;
UINT16 Count;
EFI_STATUS Status;
UINT16 Progress;
//
// Pick the largest access size that is allowed by the remaining transfer
@@ -67,29 +66,31 @@ ProtoDevTransferConfig (
// possible in one iteration of the loop. Otherwise, transfer only one
// unit, to improve the alignment.
//
if (Size >= 4 && (ConfigOffset & 3) == 0) {
if ((Size >= 4) && ((ConfigOffset & 3) == 0)) {
Width = EfiPciIoWidthUint32;
Count = Size >> Width;
} else if (Size >= 2 && (ConfigOffset & 1) == 0) {
} else if ((Size >= 2) && ((ConfigOffset & 1) == 0)) {
Width = EfiPciIoWidthUint16;
Count = 1;
} else {
Width = EfiPciIoWidthUint8;
Count = 1;
}
Status = TransferFunction (PciIo, Width, ConfigOffset, Count, Buffer);
if (EFI_ERROR (Status)) {
return Status;
}
Progress = Count << Width;
ConfigOffset += Progress;
Buffer += Progress;
Size -= Progress;
}
return EFI_SUCCESS;
}
/**
Read the config space of a given PCI device (both normal and extended).
@@ -121,20 +122,24 @@ STATIC
RETURN_STATUS
EFIAPI
ProtoDevReadConfig (
IN PCI_CAP_DEV *PciDevice,
IN UINT16 SourceOffset,
OUT VOID *DestinationBuffer,
IN UINT16 Size
IN PCI_CAP_DEV *PciDevice,
IN UINT16 SourceOffset,
OUT VOID *DestinationBuffer,
IN UINT16 Size
)
{
PROTO_DEV *ProtoDev;
PROTO_DEV *ProtoDev;
ProtoDev = PROTO_DEV_FROM_PCI_CAP_DEV (PciDevice);
return ProtoDevTransferConfig (ProtoDev->PciIo, ProtoDev->PciIo->Pci.Read,
SourceOffset, DestinationBuffer, Size);
return ProtoDevTransferConfig (
ProtoDev->PciIo,
ProtoDev->PciIo->Pci.Read,
SourceOffset,
DestinationBuffer,
Size
);
}
/**
Write the config space of a given PCI device (both normal and extended).
@@ -166,20 +171,24 @@ STATIC
RETURN_STATUS
EFIAPI
ProtoDevWriteConfig (
IN PCI_CAP_DEV *PciDevice,
IN UINT16 DestinationOffset,
IN VOID *SourceBuffer,
IN UINT16 Size
IN PCI_CAP_DEV *PciDevice,
IN UINT16 DestinationOffset,
IN VOID *SourceBuffer,
IN UINT16 Size
)
{
PROTO_DEV *ProtoDev;
PROTO_DEV *ProtoDev;
ProtoDev = PROTO_DEV_FROM_PCI_CAP_DEV (PciDevice);
return ProtoDevTransferConfig (ProtoDev->PciIo, ProtoDev->PciIo->Pci.Write,
DestinationOffset, SourceBuffer, Size);
return ProtoDevTransferConfig (
ProtoDev->PciIo,
ProtoDev->PciIo->Pci.Write,
DestinationOffset,
SourceBuffer,
Size
);
}
/**
Create a PCI_CAP_DEV object from an EFI_PCI_IO_PROTOCOL instance. The config
space accessors are based upon EFI_PCI_IO_PROTOCOL.Pci.Read() and
@@ -197,11 +206,11 @@ ProtoDevWriteConfig (
EFI_STATUS
EFIAPI
PciCapPciIoDeviceInit (
IN EFI_PCI_IO_PROTOCOL *PciIo,
OUT PCI_CAP_DEV **PciDevice
IN EFI_PCI_IO_PROTOCOL *PciIo,
OUT PCI_CAP_DEV **PciDevice
)
{
PROTO_DEV *ProtoDev;
PROTO_DEV *ProtoDev;
ProtoDev = AllocatePool (sizeof *ProtoDev);
if (ProtoDev == NULL) {
@@ -217,7 +226,6 @@ PciCapPciIoDeviceInit (
return EFI_SUCCESS;
}
/**
Free the resources used by PciDevice.
@@ -227,10 +235,10 @@ PciCapPciIoDeviceInit (
VOID
EFIAPI
PciCapPciIoDeviceUninit (
IN PCI_CAP_DEV *PciDevice
IN PCI_CAP_DEV *PciDevice
)
{
PROTO_DEV *ProtoDev;
PROTO_DEV *ProtoDev;
ProtoDev = PROTO_DEV_FROM_PCI_CAP_DEV (PciDevice);
FreePool (ProtoDev);

View File

@@ -14,22 +14,22 @@
#include <Library/PciCapPciIoLib.h>
#define PROTO_DEV_SIG SIGNATURE_64 ('P', 'C', 'P', 'I', 'O', 'P', 'R', 'T')
#define PROTO_DEV_SIG SIGNATURE_64 ('P', 'C', 'P', 'I', 'O', 'P', 'R', 'T')
typedef struct {
//
// Signature identifying the derived class.
//
UINT64 Signature;
UINT64 Signature;
//
// Members added by the derived class, specific to the use of
// EFI_PCI_IO_PROTOCOL.
//
EFI_PCI_IO_PROTOCOL *PciIo;
EFI_PCI_IO_PROTOCOL *PciIo;
//
// Base class.
//
PCI_CAP_DEV BaseDevice;
PCI_CAP_DEV BaseDevice;
} PROTO_DEV;
#define PROTO_DEV_FROM_PCI_CAP_DEV(PciDevice) \

View File

@@ -17,7 +17,6 @@
#include <Library/VirtioLib.h>
/**
Configure a virtio ring.
@@ -48,14 +47,14 @@
EFI_STATUS
EFIAPI
VirtioRingInit (
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN UINT16 QueueSize,
OUT VRING *Ring
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN UINT16 QueueSize,
OUT VRING *Ring
)
{
EFI_STATUS Status;
UINTN RingSize;
volatile UINT8 *RingPagesPtr;
EFI_STATUS Status;
UINTN RingSize;
volatile UINT8 *RingPagesPtr;
RingSize = ALIGN_VALUE (
sizeof *Ring->Desc * QueueSize +
@@ -63,66 +62,70 @@ VirtioRingInit (
sizeof *Ring->Avail.Idx +
sizeof *Ring->Avail.Ring * QueueSize +
sizeof *Ring->Avail.UsedEvent,
EFI_PAGE_SIZE);
EFI_PAGE_SIZE
);
RingSize += ALIGN_VALUE (
sizeof *Ring->Used.Flags +
sizeof *Ring->Used.Idx +
sizeof *Ring->Used.UsedElem * QueueSize +
sizeof *Ring->Used.AvailEvent,
EFI_PAGE_SIZE);
EFI_PAGE_SIZE
);
//
// Allocate a shared ring buffer
//
Ring->NumPages = EFI_SIZE_TO_PAGES (RingSize);
Status = VirtIo->AllocateSharedPages (
VirtIo,
Ring->NumPages,
&Ring->Base
);
Status = VirtIo->AllocateSharedPages (
VirtIo,
Ring->NumPages,
&Ring->Base
);
if (EFI_ERROR (Status)) {
return Status;
}
SetMem (Ring->Base, RingSize, 0x00);
RingPagesPtr = Ring->Base;
Ring->Desc = (volatile VOID *) RingPagesPtr;
Ring->Desc = (volatile VOID *)RingPagesPtr;
RingPagesPtr += sizeof *Ring->Desc * QueueSize;
Ring->Avail.Flags = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Avail.Flags;
Ring->Avail.Flags = (volatile VOID *)RingPagesPtr;
RingPagesPtr += sizeof *Ring->Avail.Flags;
Ring->Avail.Idx = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Avail.Idx;
Ring->Avail.Idx = (volatile VOID *)RingPagesPtr;
RingPagesPtr += sizeof *Ring->Avail.Idx;
Ring->Avail.Ring = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Avail.Ring * QueueSize;
Ring->Avail.Ring = (volatile VOID *)RingPagesPtr;
RingPagesPtr += sizeof *Ring->Avail.Ring * QueueSize;
Ring->Avail.UsedEvent = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Avail.UsedEvent;
Ring->Avail.UsedEvent = (volatile VOID *)RingPagesPtr;
RingPagesPtr += sizeof *Ring->Avail.UsedEvent;
RingPagesPtr = (volatile UINT8 *) Ring->Base +
ALIGN_VALUE (RingPagesPtr - (volatile UINT8 *) Ring->Base,
EFI_PAGE_SIZE);
RingPagesPtr = (volatile UINT8 *)Ring->Base +
ALIGN_VALUE (
RingPagesPtr - (volatile UINT8 *)Ring->Base,
EFI_PAGE_SIZE
);
Ring->Used.Flags = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.Flags;
Ring->Used.Flags = (volatile VOID *)RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.Flags;
Ring->Used.Idx = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.Idx;
Ring->Used.Idx = (volatile VOID *)RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.Idx;
Ring->Used.UsedElem = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.UsedElem * QueueSize;
Ring->Used.UsedElem = (volatile VOID *)RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.UsedElem * QueueSize;
Ring->Used.AvailEvent = (volatile VOID *) RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.AvailEvent;
Ring->Used.AvailEvent = (volatile VOID *)RingPagesPtr;
RingPagesPtr += sizeof *Ring->Used.AvailEvent;
Ring->QueueSize = QueueSize;
return EFI_SUCCESS;
}
/**
Tear down the internal resources of a configured virtio ring.
@@ -139,15 +142,14 @@ VirtioRingInit (
VOID
EFIAPI
VirtioRingUninit (
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN OUT VRING *Ring
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN OUT VRING *Ring
)
{
VirtIo->FreeSharedPages (VirtIo, Ring->NumPages, Ring->Base);
SetMem (Ring, sizeof *Ring, 0x00);
}
/**
Turn off interrupt notifications from the host, and prepare for appending
@@ -163,15 +165,15 @@ VirtioRingUninit (
VOID
EFIAPI
VirtioPrepare (
IN OUT VRING *Ring,
OUT DESC_INDICES *Indices
IN OUT VRING *Ring,
OUT DESC_INDICES *Indices
)
{
//
// Prepare for virtio-0.9.5, 2.4.2 Receiving Used Buffers From the Device.
// We're going to poll the answer, the host should not send an interrupt.
//
*Ring->Avail.Flags = (UINT16) VRING_AVAIL_F_NO_INTERRUPT;
*Ring->Avail.Flags = (UINT16)VRING_AVAIL_F_NO_INTERRUPT;
//
// Prepare for virtio-0.9.5, 2.4.1 Supplying Buffers to the Device.
@@ -224,14 +226,14 @@ VirtioPrepare (
VOID
EFIAPI
VirtioAppendDesc (
IN OUT VRING *Ring,
IN UINT64 BufferDeviceAddress,
IN UINT32 BufferSize,
IN UINT16 Flags,
IN OUT DESC_INDICES *Indices
IN OUT VRING *Ring,
IN UINT64 BufferDeviceAddress,
IN UINT32 BufferSize,
IN UINT16 Flags,
IN OUT DESC_INDICES *Indices
)
{
volatile VRING_DESC *Desc;
volatile VRING_DESC *Desc;
Desc = &Ring->Desc[Indices->NextDescIdx++ % Ring->QueueSize];
Desc->Addr = BufferDeviceAddress;
@@ -240,7 +242,6 @@ VirtioAppendDesc (
Desc->Next = Indices->NextDescIdx % Ring->QueueSize;
}
/**
Notify the host about the descriptor chain just built, and wait until the
@@ -271,17 +272,17 @@ VirtioAppendDesc (
EFI_STATUS
EFIAPI
VirtioFlush (
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN UINT16 VirtQueueId,
IN OUT VRING *Ring,
IN DESC_INDICES *Indices,
OUT UINT32 *UsedLen OPTIONAL
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN UINT16 VirtQueueId,
IN OUT VRING *Ring,
IN DESC_INDICES *Indices,
OUT UINT32 *UsedLen OPTIONAL
)
{
UINT16 NextAvailIdx;
UINT16 LastUsedIdx;
EFI_STATUS Status;
UINTN PollPeriodUsecs;
UINT16 NextAvailIdx;
UINT16 LastUsedIdx;
EFI_STATUS Status;
UINTN PollPeriodUsecs;
//
// virtio-0.9.5, 2.4.1.2 Updating the Available Ring
@@ -295,21 +296,21 @@ VirtioFlush (
// (Due to our lock-step progress, this is where the host will produce the
// used element with the head descriptor's index in it.)
//
LastUsedIdx = NextAvailIdx;
LastUsedIdx = NextAvailIdx;
Ring->Avail.Ring[NextAvailIdx++ % Ring->QueueSize] =
Indices->HeadDescIdx % Ring->QueueSize;
//
// virtio-0.9.5, 2.4.1.3 Updating the Index Field
//
MemoryFence();
MemoryFence ();
*Ring->Avail.Idx = NextAvailIdx;
//
// virtio-0.9.5, 2.4.1.4 Notifying the Device -- gratuitous notifications are
// OK.
//
MemoryFence();
MemoryFence ();
Status = VirtIo->SetQueueNotify (VirtIo, VirtQueueId);
if (EFI_ERROR (Status)) {
return Status;
@@ -324,20 +325,21 @@ VirtioFlush (
// Keep slowing down until we reach a poll period of slightly above 1 ms.
//
PollPeriodUsecs = 1;
MemoryFence();
MemoryFence ();
while (*Ring->Used.Idx != NextAvailIdx) {
gBS->Stall (PollPeriodUsecs); // calls AcpiTimerLib::MicroSecondDelay
if (PollPeriodUsecs < 1024) {
PollPeriodUsecs *= 2;
}
MemoryFence();
MemoryFence ();
}
MemoryFence();
MemoryFence ();
if (UsedLen != NULL) {
volatile CONST VRING_USED_ELEM *UsedElem;
volatile CONST VRING_USED_ELEM *UsedElem;
UsedElem = &Ring->Used.UsedElem[LastUsedIdx % Ring->QueueSize];
ASSERT (UsedElem->Id == Indices->HeadDescIdx);
@@ -347,7 +349,6 @@ VirtioFlush (
return EFI_SUCCESS;
}
/**
Report the feature bits to the VirtIo 1.0 device that the VirtIo 1.0 driver
@@ -388,12 +389,12 @@ VirtioFlush (
EFI_STATUS
EFIAPI
Virtio10WriteFeatures (
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN UINT64 Features,
IN OUT UINT8 *DeviceStatus
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN UINT64 Features,
IN OUT UINT8 *DeviceStatus
)
{
EFI_STATUS Status;
EFI_STATUS Status;
if (VirtIo->Revision < VIRTIO_SPEC_REVISION (1, 0, 0)) {
return EFI_UNSUPPORTED;
@@ -405,7 +406,7 @@ Virtio10WriteFeatures (
}
*DeviceStatus |= VSTAT_FEATURES_OK;
Status = VirtIo->SetDeviceStatus (VirtIo, *DeviceStatus);
Status = VirtIo->SetDeviceStatus (VirtIo, *DeviceStatus);
if (EFI_ERROR (Status)) {
return Status;
}
@@ -479,7 +480,7 @@ VirtioMapAllBytesInSharedBuffer (
UINTN Size;
EFI_PHYSICAL_ADDRESS PhysicalAddress;
Size = NumberOfBytes;
Size = NumberOfBytes;
Status = VirtIo->MapSharedBuffer (
VirtIo,
Operation,
@@ -496,7 +497,7 @@ VirtioMapAllBytesInSharedBuffer (
goto Failed;
}
*Mapping = MapInfo;
*Mapping = MapInfo;
*DeviceAddress = PhysicalAddress;
return EFI_SUCCESS;
@@ -526,10 +527,10 @@ Failed:
EFI_STATUS
EFIAPI
VirtioRingMap (
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN VRING *Ring,
OUT UINT64 *RingBaseShift,
OUT VOID **Mapping
IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
IN VRING *Ring,
OUT UINT64 *RingBaseShift,
OUT VOID **Mapping
)
{
EFI_STATUS Status;

View File

@@ -14,26 +14,26 @@
#include "VirtioMmioDevice.h"
STATIC CONST VIRTIO_DEVICE_PROTOCOL mMmioDeviceProtocolTemplate = {
0, // Revision
0, // SubSystemDeviceId
VirtioMmioGetDeviceFeatures, // GetDeviceFeatures
VirtioMmioSetGuestFeatures, // SetGuestFeatures
VirtioMmioSetQueueAddress, // SetQueueAddress
VirtioMmioSetQueueSel, // SetQueueSel
VirtioMmioSetQueueNotify, // SetQueueNotify
VirtioMmioSetQueueAlignment, // SetQueueAlign
VirtioMmioSetPageSize, // SetPageSize
VirtioMmioGetQueueSize, // GetQueueNumMax
VirtioMmioSetQueueSize, // SetQueueNum
VirtioMmioGetDeviceStatus, // GetDeviceStatus
VirtioMmioSetDeviceStatus, // SetDeviceStatus
VirtioMmioDeviceWrite, // WriteDevice
VirtioMmioDeviceRead, // ReadDevice
VirtioMmioAllocateSharedPages, // AllocateSharedPages
VirtioMmioFreeSharedPages, // FreeSharedPages
VirtioMmioMapSharedBuffer, // MapSharedBuffer
VirtioMmioUnmapSharedBuffer // UnmapSharedBuffer
STATIC CONST VIRTIO_DEVICE_PROTOCOL mMmioDeviceProtocolTemplate = {
0, // Revision
0, // SubSystemDeviceId
VirtioMmioGetDeviceFeatures, // GetDeviceFeatures
VirtioMmioSetGuestFeatures, // SetGuestFeatures
VirtioMmioSetQueueAddress, // SetQueueAddress
VirtioMmioSetQueueSel, // SetQueueSel
VirtioMmioSetQueueNotify, // SetQueueNotify
VirtioMmioSetQueueAlignment, // SetQueueAlign
VirtioMmioSetPageSize, // SetPageSize
VirtioMmioGetQueueSize, // GetQueueNumMax
VirtioMmioSetQueueSize, // SetQueueNum
VirtioMmioGetDeviceStatus, // GetDeviceStatus
VirtioMmioSetDeviceStatus, // SetDeviceStatus
VirtioMmioDeviceWrite, // WriteDevice
VirtioMmioDeviceRead, // ReadDevice
VirtioMmioAllocateSharedPages, // AllocateSharedPages
VirtioMmioFreeSharedPages, // FreeSharedPages
VirtioMmioMapSharedBuffer, // MapSharedBuffer
VirtioMmioUnmapSharedBuffer // UnmapSharedBuffer
};
/**
@@ -54,19 +54,22 @@ EFI_STATUS
EFIAPI
VirtioMmioInit (
IN PHYSICAL_ADDRESS BaseAddress,
IN OUT VIRTIO_MMIO_DEVICE *Device
IN OUT VIRTIO_MMIO_DEVICE *Device
)
{
UINT32 MagicValue;
UINT32 MagicValue;
//
// Initialize VirtIo Mmio Device
//
CopyMem (&Device->VirtioDevice, &mMmioDeviceProtocolTemplate,
sizeof (VIRTIO_DEVICE_PROTOCOL));
Device->BaseAddress = BaseAddress;
CopyMem (
&Device->VirtioDevice,
&mMmioDeviceProtocolTemplate,
sizeof (VIRTIO_DEVICE_PROTOCOL)
);
Device->BaseAddress = BaseAddress;
Device->VirtioDevice.SubSystemDeviceId =
MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID);
MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID);
//
// Double-check MMIO-specific values
@@ -78,24 +81,31 @@ VirtioMmioInit (
Device->Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION);
switch (Device->Version) {
case VIRTIO_MMIO_DEVICE_VERSION_0_95:
DEBUG ((DEBUG_INFO, "%a virtio 0.9.5, id %d\n", __FUNCTION__,
Device->VirtioDevice.SubSystemDeviceId));
Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5);
break;
case VIRTIO_MMIO_DEVICE_VERSION_1_00:
DEBUG ((DEBUG_INFO, "%a virtio 1.0, id %d\n", __FUNCTION__,
Device->VirtioDevice.SubSystemDeviceId));
Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (1, 0, 0);
break;
default:
return EFI_UNSUPPORTED;
case VIRTIO_MMIO_DEVICE_VERSION_0_95:
DEBUG ((
DEBUG_INFO,
"%a virtio 0.9.5, id %d\n",
__FUNCTION__,
Device->VirtioDevice.SubSystemDeviceId
));
Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5);
break;
case VIRTIO_MMIO_DEVICE_VERSION_1_00:
DEBUG ((
DEBUG_INFO,
"%a virtio 1.0, id %d\n",
__FUNCTION__,
Device->VirtioDevice.SubSystemDeviceId
));
Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (1, 0, 0);
break;
default:
return EFI_UNSUPPORTED;
}
return EFI_SUCCESS;
}
/**
Uninitialize the internals of a virtio-mmio device that has been successfully
@@ -104,12 +114,11 @@ VirtioMmioInit (
@param[in, out] Device The device to clean up.
**/
STATIC
VOID
EFIAPI
VirtioMmioUninit (
IN VIRTIO_MMIO_DEVICE *Device
IN VIRTIO_MMIO_DEVICE *Device
)
{
//
@@ -120,16 +129,17 @@ VirtioMmioUninit (
EFI_STATUS
VirtioMmioInstallDevice (
IN PHYSICAL_ADDRESS BaseAddress,
IN EFI_HANDLE Handle
IN PHYSICAL_ADDRESS BaseAddress,
IN EFI_HANDLE Handle
)
{
EFI_STATUS Status;
VIRTIO_MMIO_DEVICE *VirtIo;
VIRTIO_MMIO_DEVICE *VirtIo;
if (!BaseAddress) {
return EFI_INVALID_PARAMETER;
}
if (Handle == NULL) {
return EFI_INVALID_PARAMETER;
}
@@ -152,9 +162,12 @@ VirtioMmioInstallDevice (
//
// Install VIRTIO_DEVICE_PROTOCOL to Handle
//
Status = gBS->InstallProtocolInterface (&Handle,
&gVirtioDeviceProtocolGuid, EFI_NATIVE_INTERFACE,
&VirtIo->VirtioDevice);
Status = gBS->InstallProtocolInterface (
&Handle,
&gVirtioDeviceProtocolGuid,
EFI_NATIVE_INTERFACE,
&VirtIo->VirtioDevice
);
if (EFI_ERROR (Status)) {
goto UninitVirtio;
}
@@ -171,7 +184,7 @@ FreeVirtioMem:
EFI_STATUS
VirtioMmioUninstallDevice (
IN EFI_HANDLE DeviceHandle
IN EFI_HANDLE DeviceHandle
)
{
VIRTIO_DEVICE_PROTOCOL *VirtioDevice;
@@ -198,9 +211,11 @@ VirtioMmioUninstallDevice (
//
// Uninstall the protocol interface
//
Status = gBS->UninstallProtocolInterface (DeviceHandle,
&gVirtioDeviceProtocolGuid, &MmioDevice->VirtioDevice
);
Status = gBS->UninstallProtocolInterface (
DeviceHandle,
&gVirtioDeviceProtocolGuid,
&MmioDevice->VirtioDevice
);
if (EFI_ERROR (Status)) {
return Status;
}

View File

@@ -22,17 +22,16 @@
#include <Library/VirtioMmioDeviceLib.h>
#include <Library/MemoryAllocationLib.h>
#define VIRTIO_MMIO_DEVICE_SIGNATURE SIGNATURE_32 ('V', 'M', 'I', 'O')
#define VIRTIO_MMIO_DEVICE_SIGNATURE SIGNATURE_32 ('V', 'M', 'I', 'O')
#define VIRTIO_MMIO_DEVICE_VERSION_0_95 1
#define VIRTIO_MMIO_DEVICE_VERSION_1_00 2
typedef struct {
UINT32 Signature;
UINT32 Version;
UINT16 QueueNum;
VIRTIO_DEVICE_PROTOCOL VirtioDevice;
PHYSICAL_ADDRESS BaseAddress;
UINT32 Signature;
UINT32 Version;
UINT16 QueueNum;
VIRTIO_DEVICE_PROTOCOL VirtioDevice;
PHYSICAL_ADDRESS BaseAddress;
} VIRTIO_MMIO_DEVICE;
#define VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE(Device) \
@@ -46,27 +45,27 @@ typedef struct {
EFI_STATUS
EFIAPI
VirtioMmioDeviceRead (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN FieldOFfset,
IN UINTN FieldSize,
IN UINTN BufferSize,
OUT VOID* Buffer
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN FieldOFfset,
IN UINTN FieldSize,
IN UINTN BufferSize,
OUT VOID *Buffer
);
EFI_STATUS
EFIAPI
VirtioMmioDeviceWrite (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN FieldOffset,
IN UINTN FieldSize,
IN UINT64 Value
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN FieldOffset,
IN UINTN FieldSize,
IN UINT64 Value
);
EFI_STATUS
EFIAPI
VirtioMmioGetDeviceFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
OUT UINT64 *DeviceFeatures
IN VIRTIO_DEVICE_PROTOCOL *This,
OUT UINT64 *DeviceFeatures
);
EFI_STATUS
@@ -86,28 +85,28 @@ VirtioMmioGetDeviceStatus (
EFI_STATUS
EFIAPI
VirtioMmioSetQueueSize (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT16 QueueSize
);
EFI_STATUS
EFIAPI
VirtioMmioSetDeviceStatus (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT8 DeviceStatus
);
EFI_STATUS
EFIAPI
VirtioMmioSetQueueNotify (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT16 QueueNotify
);
EFI_STATUS
EFIAPI
VirtioMmioSetQueueSel (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT16 Sel
);
@@ -122,56 +121,56 @@ VirtioMmioSetQueueAddress (
EFI_STATUS
EFIAPI
VirtioMmioSetQueueAlignment (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT32 Alignment
);
EFI_STATUS
EFIAPI
VirtioMmioSetPageSize (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT32 PageSize
);
EFI_STATUS
EFIAPI
VirtioMmioSetGuestFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT64 Features
);
EFI_STATUS
EFIAPI
VirtioMmioAllocateSharedPages (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN NumPages,
OUT VOID **HostAddress
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN NumPages,
OUT VOID **HostAddress
);
VOID
EFIAPI
VirtioMmioFreeSharedPages (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN NumPages,
IN VOID *HostAddress
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN NumPages,
IN VOID *HostAddress
);
EFI_STATUS
EFIAPI
VirtioMmioMapSharedBuffer (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_MAP_OPERATION Operation,
IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes,
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_MAP_OPERATION Operation,
IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes,
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping
);
EFI_STATUS
EFIAPI
VirtioMmioUnmapSharedBuffer (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VOID *Mapping
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VOID *Mapping
);
#endif // _VIRTIO_MMIO_DEVICE_INTERNAL_H_

View File

@@ -15,12 +15,12 @@
EFI_STATUS
EFIAPI
VirtioMmioGetDeviceFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
OUT UINT64 *DeviceFeatures
IN VIRTIO_DEVICE_PROTOCOL *This,
OUT UINT64 *DeviceFeatures
)
{
VIRTIO_MMIO_DEVICE *Device;
UINT32 LowBits, HighBits;
VIRTIO_MMIO_DEVICE *Device;
UINT32 LowBits, HighBits;
if (DeviceFeatures == NULL) {
return EFI_INVALID_PARAMETER;
@@ -34,8 +34,8 @@ VirtioMmioGetDeviceFeatures (
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES_SEL, 0);
LowBits = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES);
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES_SEL, 1);
HighBits = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES);
*DeviceFeatures = LShiftU64(HighBits, 32) | LowBits;
HighBits = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES);
*DeviceFeatures = LShiftU64 (HighBits, 32) | LowBits;
}
return EFI_SUCCESS;
@@ -48,7 +48,7 @@ VirtioMmioGetQueueSize (
OUT UINT16 *QueueNumMax
)
{
VIRTIO_MMIO_DEVICE *Device;
VIRTIO_MMIO_DEVICE *Device;
if (QueueNumMax == NULL) {
return EFI_INVALID_PARAMETER;
@@ -68,7 +68,7 @@ VirtioMmioGetDeviceStatus (
OUT UINT8 *DeviceStatus
)
{
VIRTIO_MMIO_DEVICE *Device;
VIRTIO_MMIO_DEVICE *Device;
if (DeviceStatus == NULL) {
return EFI_INVALID_PARAMETER;
@@ -84,11 +84,11 @@ VirtioMmioGetDeviceStatus (
EFI_STATUS
EFIAPI
VirtioMmioSetQueueSize (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT16 QueueSize
)
{
VIRTIO_MMIO_DEVICE *Device;
VIRTIO_MMIO_DEVICE *Device;
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
@@ -104,11 +104,11 @@ VirtioMmioSetQueueSize (
EFI_STATUS
EFIAPI
VirtioMmioSetDeviceStatus (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT8 DeviceStatus
)
{
VIRTIO_MMIO_DEVICE *Device;
VIRTIO_MMIO_DEVICE *Device;
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
@@ -120,11 +120,11 @@ VirtioMmioSetDeviceStatus (
EFI_STATUS
EFIAPI
VirtioMmioSetQueueNotify (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT16 QueueNotify
)
{
VIRTIO_MMIO_DEVICE *Device;
VIRTIO_MMIO_DEVICE *Device;
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
@@ -136,11 +136,11 @@ VirtioMmioSetQueueNotify (
EFI_STATUS
EFIAPI
VirtioMmioSetQueueAlignment (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT32 Alignment
)
{
VIRTIO_MMIO_DEVICE *Device;
VIRTIO_MMIO_DEVICE *Device;
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
@@ -152,11 +152,11 @@ VirtioMmioSetQueueAlignment (
EFI_STATUS
EFIAPI
VirtioMmioSetPageSize (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT32 PageSize
)
{
VIRTIO_MMIO_DEVICE *Device;
VIRTIO_MMIO_DEVICE *Device;
if (PageSize != EFI_PAGE_SIZE) {
return EFI_UNSUPPORTED;
@@ -174,11 +174,11 @@ VirtioMmioSetPageSize (
EFI_STATUS
EFIAPI
VirtioMmioSetQueueSel (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT16 Sel
)
{
VIRTIO_MMIO_DEVICE *Device;
VIRTIO_MMIO_DEVICE *Device;
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
@@ -199,36 +199,57 @@ VirtioMmioSetQueueAddress (
IN UINT64 RingBaseShift
)
{
VIRTIO_MMIO_DEVICE *Device;
UINT64 Address;
VIRTIO_MMIO_DEVICE *Device;
UINT64 Address;
ASSERT (RingBaseShift == 0);
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
if (Device->Version == VIRTIO_MMIO_DEVICE_VERSION_0_95) {
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN,
(UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT));
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_QUEUE_PFN,
(UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)
);
} else {
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_NUM, Device->QueueNum);
Address = (UINTN)Ring->Base;
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO,
(UINT32)Address);
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_HI,
(UINT32)RShiftU64(Address, 32));
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO,
(UINT32)Address
);
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_QUEUE_DESC_HI,
(UINT32)RShiftU64 (Address, 32)
);
Address = (UINTN)Ring->Avail.Flags;
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_LO,
(UINT32)Address);
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_HI,
(UINT32)RShiftU64(Address, 32));
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_LO,
(UINT32)Address
);
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_HI,
(UINT32)RShiftU64 (Address, 32)
);
Address = (UINTN)Ring->Used.Flags;
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_LO,
(UINT32)Address);
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_HI,
(UINT32)RShiftU64(Address, 32));
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_QUEUE_USED_LO,
(UINT32)Address
);
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_QUEUE_USED_HI,
(UINT32)RShiftU64 (Address, 32)
);
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_READY, 1);
}
@@ -239,11 +260,11 @@ VirtioMmioSetQueueAddress (
EFI_STATUS
EFIAPI
VirtioMmioSetGuestFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINT64 Features
)
{
VIRTIO_MMIO_DEVICE *Device;
VIRTIO_MMIO_DEVICE *Device;
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
@@ -251,15 +272,25 @@ VirtioMmioSetGuestFeatures (
if (Features > MAX_UINT32) {
return EFI_UNSUPPORTED;
}
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES,
(UINT32)Features);
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_GUEST_FEATURES,
(UINT32)Features
);
} else {
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES_SEL, 0);
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES,
(UINT32)Features);
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_GUEST_FEATURES,
(UINT32)Features
);
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES_SEL, 1);
VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES,
(UINT32)RShiftU64(Features, 32));
VIRTIO_CFG_WRITE (
Device,
VIRTIO_MMIO_OFFSET_GUEST_FEATURES,
(UINT32)RShiftU64 (Features, 32)
);
}
return EFI_SUCCESS;
@@ -268,14 +299,14 @@ VirtioMmioSetGuestFeatures (
EFI_STATUS
EFIAPI
VirtioMmioDeviceWrite (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN FieldOffset,
IN UINTN FieldSize,
IN UINT64 Value
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN FieldOffset,
IN UINTN FieldSize,
IN UINT64 Value
)
{
UINTN DstBaseAddress;
VIRTIO_MMIO_DEVICE *Device;
UINTN DstBaseAddress;
VIRTIO_MMIO_DEVICE *Device;
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
@@ -283,7 +314,8 @@ VirtioMmioDeviceWrite (
// Double-check fieldsize
//
if ((FieldSize != 1) && (FieldSize != 2) &&
(FieldSize != 4) && (FieldSize != 8)) {
(FieldSize != 4) && (FieldSize != 8))
{
return EFI_INVALID_PARAMETER;
}
@@ -291,13 +323,13 @@ VirtioMmioDeviceWrite (
// Compute base address
//
DstBaseAddress = Device->BaseAddress +
VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_MMIO + FieldOffset;
VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_MMIO + FieldOffset;
//
// The device-specific memory area of Virtio-MMIO can only be written in
// byte accesses. This is not currently in the Virtio spec.
//
MmioWriteBuffer8 (DstBaseAddress, FieldSize, (UINT8*)&Value);
MmioWriteBuffer8 (DstBaseAddress, FieldSize, (UINT8 *)&Value);
return EFI_SUCCESS;
}
@@ -305,15 +337,15 @@ VirtioMmioDeviceWrite (
EFI_STATUS
EFIAPI
VirtioMmioDeviceRead (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN FieldOffset,
IN UINTN FieldSize,
IN UINTN BufferSize,
OUT VOID *Buffer
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN FieldOffset,
IN UINTN FieldSize,
IN UINTN BufferSize,
OUT VOID *Buffer
)
{
UINTN SrcBaseAddress;
VIRTIO_MMIO_DEVICE *Device;
UINTN SrcBaseAddress;
VIRTIO_MMIO_DEVICE *Device;
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
@@ -326,7 +358,8 @@ VirtioMmioDeviceRead (
// Double-check fieldsize
//
if ((FieldSize != 1) && (FieldSize != 2) &&
(FieldSize != 4) && (FieldSize != 8)) {
(FieldSize != 4) && (FieldSize != 8))
{
return EFI_INVALID_PARAMETER;
}
@@ -334,7 +367,7 @@ VirtioMmioDeviceRead (
// Compute base address
//
SrcBaseAddress = Device->BaseAddress +
VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_MMIO + FieldOffset;
VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_MMIO + FieldOffset;
//
// The device-specific memory area of Virtio-MMIO can only be read in
@@ -353,7 +386,7 @@ VirtioMmioAllocateSharedPages (
OUT VOID **HostAddress
)
{
VOID *Buffer;
VOID *Buffer;
Buffer = AllocatePages (NumPages);
if (Buffer == NULL) {
@@ -386,8 +419,8 @@ VirtioMmioMapSharedBuffer (
OUT VOID **Mapping
)
{
*DeviceAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;
*Mapping = NULL;
*DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress;
*Mapping = NULL;
return EFI_SUCCESS;
}
@@ -395,8 +428,8 @@ VirtioMmioMapSharedBuffer (
EFI_STATUS
EFIAPI
VirtioMmioUnmapSharedBuffer (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VOID *Mapping
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VOID *Mapping
)
{
return EFI_SUCCESS;

View File

@@ -54,10 +54,10 @@ VmgExitHandleVc (
ASSERT (Msr.GhcbInfo.Function == 0);
ASSERT (Msr.Ghcb != 0);
Ghcb = Msr.Ghcb;
Ghcb = Msr.Ghcb;
GhcbBackup = NULL;
SevEsData = (SEV_ES_PER_CPU_DATA *) (Ghcb + 1);
SevEsData = (SEV_ES_PER_CPU_DATA *)(Ghcb + 1);
SevEsData->VcCount++;
//
@@ -78,7 +78,7 @@ VmgExitHandleVc (
// To access the correct backup page, increment the backup page pointer
// based on the current VcCount.
//
GhcbBackup = (GHCB *) SevEsData->GhcbBackupPages;
GhcbBackup = (GHCB *)SevEsData->GhcbBackupPages;
GhcbBackup += (SevEsData->VcCount - 2);
CopyMem (GhcbBackup, Ghcb, sizeof (*Ghcb));

View File

@@ -54,10 +54,10 @@ VmgExitHandleVc (
ASSERT (Msr.GhcbInfo.Function == 0);
ASSERT (Msr.Ghcb != 0);
Ghcb = Msr.Ghcb;
Ghcb = Msr.Ghcb;
GhcbBackup = NULL;
SevEsData = (SEV_ES_PER_CPU_DATA *) (Ghcb + 1);
SevEsData = (SEV_ES_PER_CPU_DATA *)(Ghcb + 1);
SevEsData->VcCount++;
//
@@ -84,7 +84,7 @@ VmgExitHandleVc (
// To access the correct backup page, increment the backup page pointer
// based on the current VcCount.
//
GhcbBackup = (GHCB *) FixedPcdGet32 (PcdOvmfSecGhcbBackupBase);
GhcbBackup = (GHCB *)FixedPcdGet32 (PcdOvmfSecGhcbBackupBase);
GhcbBackup += (SevEsData->VcCount - 2);
CopyMem (GhcbBackup, Ghcb, sizeof (*Ghcb));

View File

@@ -28,7 +28,7 @@
STATIC
UINT64
VmgExitErrorCheck (
IN GHCB *Ghcb
IN GHCB *Ghcb
)
{
GHCB_EVENT_INJECTION Event;
@@ -36,8 +36,10 @@ VmgExitErrorCheck (
UINT64 Status;
ExitInfo.Uint64 = Ghcb->SaveArea.SwExitInfo1;
ASSERT ((ExitInfo.Elements.Lower32Bits == 0) ||
(ExitInfo.Elements.Lower32Bits == 1));
ASSERT (
(ExitInfo.Elements.Lower32Bits == 0) ||
(ExitInfo.Elements.Lower32Bits == 1)
);
Status = 0;
if (ExitInfo.Elements.Lower32Bits == 0) {
@@ -52,14 +54,15 @@ VmgExitErrorCheck (
//
Event.Uint64 = Ghcb->SaveArea.SwExitInfo2;
if (Event.Elements.Valid &&
Event.Elements.Type == GHCB_EVENT_INJECTION_TYPE_EXCEPTION) {
(Event.Elements.Type == GHCB_EVENT_INJECTION_TYPE_EXCEPTION))
{
switch (Event.Elements.Vector) {
case GP_EXCEPTION:
case UD_EXCEPTION:
//
// Use returned event as return code
//
Status = Event.Uint64;
case GP_EXCEPTION:
case UD_EXCEPTION:
//
// Use returned event as return code
//
Status = Event.Uint64;
}
}
}
@@ -67,7 +70,7 @@ VmgExitErrorCheck (
if (Status == 0) {
GHCB_EVENT_INJECTION GpEvent;
GpEvent.Uint64 = 0;
GpEvent.Uint64 = 0;
GpEvent.Elements.Vector = GP_EXCEPTION;
GpEvent.Elements.Type = GHCB_EVENT_INJECTION_TYPE_EXCEPTION;
GpEvent.Elements.Valid = 1;
@@ -100,13 +103,13 @@ VmgExitErrorCheck (
UINT64
EFIAPI
VmgExit (
IN OUT GHCB *Ghcb,
IN UINT64 ExitCode,
IN UINT64 ExitInfo1,
IN UINT64 ExitInfo2
IN OUT GHCB *Ghcb,
IN UINT64 ExitCode,
IN UINT64 ExitInfo1,
IN UINT64 ExitInfo2
)
{
Ghcb->SaveArea.SwExitCode = ExitCode;
Ghcb->SaveArea.SwExitCode = ExitCode;
Ghcb->SaveArea.SwExitInfo1 = ExitInfo1;
Ghcb->SaveArea.SwExitInfo2 = ExitInfo2;
@@ -140,8 +143,8 @@ VmgExit (
VOID
EFIAPI
VmgInit (
IN OUT GHCB *Ghcb,
IN OUT BOOLEAN *InterruptState
IN OUT GHCB *Ghcb,
IN OUT BOOLEAN *InterruptState
)
{
//
@@ -170,8 +173,8 @@ VmgInit (
VOID
EFIAPI
VmgDone (
IN OUT GHCB *Ghcb,
IN BOOLEAN InterruptState
IN OUT GHCB *Ghcb,
IN BOOLEAN InterruptState
)
{
if (InterruptState) {
@@ -192,8 +195,8 @@ VmgDone (
VOID
EFIAPI
VmgSetOffsetValid (
IN OUT GHCB *Ghcb,
IN GHCB_REGISTER Offset
IN OUT GHCB *Ghcb,
IN GHCB_REGISTER Offset
)
{
UINT32 OffsetIndex;
@@ -221,8 +224,8 @@ VmgSetOffsetValid (
BOOLEAN
EFIAPI
VmgIsOffsetValid (
IN GHCB *Ghcb,
IN GHCB_REGISTER Offset
IN GHCB *Ghcb,
IN GHCB_REGISTER Offset
)
{
UINT32 OffsetIndex;

File diff suppressed because it is too large Load Diff

View File

@@ -27,31 +27,31 @@
#pragma pack (1)
typedef struct {
EFI_DEVICE_PATH_PROTOCOL FilePathHeader;
CHAR16 FilePath[ARRAY_SIZE (L"kernel")];
EFI_DEVICE_PATH_PROTOCOL FilePathHeader;
CHAR16 FilePath[ARRAY_SIZE (L"kernel")];
} KERNEL_FILE_DEVPATH;
typedef struct {
VENDOR_DEVICE_PATH VenMediaNode;
KERNEL_FILE_DEVPATH FileNode;
EFI_DEVICE_PATH_PROTOCOL EndNode;
VENDOR_DEVICE_PATH VenMediaNode;
KERNEL_FILE_DEVPATH FileNode;
EFI_DEVICE_PATH_PROTOCOL EndNode;
} KERNEL_VENMEDIA_FILE_DEVPATH;
#pragma pack ()
STATIC CONST KERNEL_VENMEDIA_FILE_DEVPATH mKernelDevicePath = {
STATIC CONST KERNEL_VENMEDIA_FILE_DEVPATH mKernelDevicePath = {
{
{
MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP,
{ sizeof (VENDOR_DEVICE_PATH) }
{ sizeof (VENDOR_DEVICE_PATH) }
},
QEMU_KERNEL_LOADER_FS_MEDIA_GUID
}, {
}, {
{
MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP,
{ sizeof (KERNEL_FILE_DEVPATH) }
{ sizeof (KERNEL_FILE_DEVPATH) }
},
L"kernel",
}, {
}, {
END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ sizeof (EFI_DEVICE_PATH_PROTOCOL) }
}
@@ -60,37 +60,48 @@ STATIC CONST KERNEL_VENMEDIA_FILE_DEVPATH mKernelDevicePath = {
STATIC
VOID
FreeLegacyImage (
IN OVMF_LOADED_X86_LINUX_KERNEL *LoadedImage
IN OVMF_LOADED_X86_LINUX_KERNEL *LoadedImage
)
{
if (LoadedImage->SetupBuf != NULL) {
FreePages (LoadedImage->SetupBuf,
EFI_SIZE_TO_PAGES (LoadedImage->SetupSize));
FreePages (
LoadedImage->SetupBuf,
EFI_SIZE_TO_PAGES (LoadedImage->SetupSize)
);
}
if (LoadedImage->KernelBuf != NULL) {
FreePages (LoadedImage->KernelBuf,
EFI_SIZE_TO_PAGES (LoadedImage->KernelInitialSize));
FreePages (
LoadedImage->KernelBuf,
EFI_SIZE_TO_PAGES (LoadedImage->KernelInitialSize)
);
}
if (LoadedImage->CommandLine != NULL) {
FreePages (LoadedImage->CommandLine,
EFI_SIZE_TO_PAGES (LoadedImage->CommandLineSize));
FreePages (
LoadedImage->CommandLine,
EFI_SIZE_TO_PAGES (LoadedImage->CommandLineSize)
);
}
if (LoadedImage->InitrdData != NULL) {
FreePages (LoadedImage->InitrdData,
EFI_SIZE_TO_PAGES (LoadedImage->InitrdSize));
FreePages (
LoadedImage->InitrdData,
EFI_SIZE_TO_PAGES (LoadedImage->InitrdSize)
);
}
}
STATIC
EFI_STATUS
QemuLoadLegacyImage (
OUT EFI_HANDLE *ImageHandle
OUT EFI_HANDLE *ImageHandle
)
{
EFI_STATUS Status;
UINTN KernelSize;
UINTN SetupSize;
OVMF_LOADED_X86_LINUX_KERNEL *LoadedImage;
EFI_STATUS Status;
UINTN KernelSize;
UINTN SetupSize;
OVMF_LOADED_X86_LINUX_KERNEL *LoadedImage;
QemuFwCfgSelectItem (QemuFwCfgItemKernelSize);
KernelSize = (UINTN)QemuFwCfgRead32 ();
@@ -98,7 +109,7 @@ QemuLoadLegacyImage (
QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupSize);
SetupSize = (UINTN)QemuFwCfgRead32 ();
if (KernelSize == 0 || SetupSize == 0) {
if ((KernelSize == 0) || (SetupSize == 0)) {
DEBUG ((DEBUG_INFO, "qemu -kernel was not used.\n"));
return EFI_NOT_FOUND;
}
@@ -109,8 +120,9 @@ QemuLoadLegacyImage (
}
LoadedImage->SetupSize = SetupSize;
LoadedImage->SetupBuf = LoadLinuxAllocateKernelSetupPages (
EFI_SIZE_TO_PAGES (LoadedImage->SetupSize));
LoadedImage->SetupBuf = LoadLinuxAllocateKernelSetupPages (
EFI_SIZE_TO_PAGES (LoadedImage->SetupSize)
);
if (LoadedImage->SetupBuf == NULL) {
DEBUG ((DEBUG_ERROR, "Unable to allocate memory for kernel setup!\n"));
Status = EFI_OUT_OF_RESOURCES;
@@ -123,8 +135,10 @@ QemuLoadLegacyImage (
QemuFwCfgReadBytes (LoadedImage->SetupSize, LoadedImage->SetupBuf);
DEBUG ((DEBUG_INFO, " [done]\n"));
Status = LoadLinuxCheckKernelSetup (LoadedImage->SetupBuf,
LoadedImage->SetupSize);
Status = LoadLinuxCheckKernelSetup (
LoadedImage->SetupBuf,
LoadedImage->SetupSize
);
if (EFI_ERROR (Status)) {
goto FreeImage;
}
@@ -135,7 +149,9 @@ QemuLoadLegacyImage (
}
LoadedImage->KernelInitialSize = LoadLinuxGetKernelSize (
LoadedImage->SetupBuf, KernelSize);
LoadedImage->SetupBuf,
KernelSize
);
if (LoadedImage->KernelInitialSize == 0) {
Status = EFI_UNSUPPORTED;
goto FreeImage;
@@ -163,18 +179,23 @@ QemuLoadLegacyImage (
if (LoadedImage->CommandLineSize > 0) {
LoadedImage->CommandLine = LoadLinuxAllocateCommandLinePages (
EFI_SIZE_TO_PAGES (
LoadedImage->CommandLineSize));
LoadedImage->CommandLineSize
)
);
if (LoadedImage->CommandLine == NULL) {
DEBUG ((DEBUG_ERROR, "Unable to allocate memory for kernel command line!\n"));
Status = EFI_OUT_OF_RESOURCES;
goto FreeImage;
}
QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData);
QemuFwCfgReadBytes (LoadedImage->CommandLineSize, LoadedImage->CommandLine);
}
Status = LoadLinuxSetCommandLine (LoadedImage->SetupBuf,
LoadedImage->CommandLine);
Status = LoadLinuxSetCommandLine (
LoadedImage->SetupBuf,
LoadedImage->CommandLine
);
if (EFI_ERROR (Status)) {
goto FreeImage;
}
@@ -185,33 +206,45 @@ QemuLoadLegacyImage (
if (LoadedImage->InitrdSize > 0) {
LoadedImage->InitrdData = LoadLinuxAllocateInitrdPages (
LoadedImage->SetupBuf,
EFI_SIZE_TO_PAGES (LoadedImage->InitrdSize));
EFI_SIZE_TO_PAGES (LoadedImage->InitrdSize)
);
if (LoadedImage->InitrdData == NULL) {
DEBUG ((DEBUG_ERROR, "Unable to allocate memory for initrd!\n"));
Status = EFI_OUT_OF_RESOURCES;
goto FreeImage;
}
DEBUG ((DEBUG_INFO, "Initrd size: 0x%x\n",
(UINT32)LoadedImage->InitrdSize));
DEBUG ((
DEBUG_INFO,
"Initrd size: 0x%x\n",
(UINT32)LoadedImage->InitrdSize
));
DEBUG ((DEBUG_INFO, "Reading initrd image ..."));
QemuFwCfgSelectItem (QemuFwCfgItemInitrdData);
QemuFwCfgReadBytes (LoadedImage->InitrdSize, LoadedImage->InitrdData);
DEBUG ((DEBUG_INFO, " [done]\n"));
}
Status = LoadLinuxSetInitrd (LoadedImage->SetupBuf, LoadedImage->InitrdData,
LoadedImage->InitrdSize);
Status = LoadLinuxSetInitrd (
LoadedImage->SetupBuf,
LoadedImage->InitrdData,
LoadedImage->InitrdSize
);
if (EFI_ERROR (Status)) {
goto FreeImage;
}
*ImageHandle = NULL;
Status = gBS->InstallProtocolInterface (ImageHandle,
&gOvmfLoadedX86LinuxKernelProtocolGuid, EFI_NATIVE_INTERFACE,
LoadedImage);
Status = gBS->InstallProtocolInterface (
ImageHandle,
&gOvmfLoadedX86LinuxKernelProtocolGuid,
EFI_NATIVE_INTERFACE,
LoadedImage
);
if (EFI_ERROR (Status)) {
goto FreeImage;
}
return EFI_SUCCESS;
FreeImage:
@@ -224,7 +257,7 @@ FreeImageDesc:
STATIC
EFI_STATUS
QemuStartLegacyImage (
IN EFI_HANDLE ImageHandle
IN EFI_HANDLE ImageHandle
)
{
EFI_STATUS Status;
@@ -248,7 +281,7 @@ QemuStartLegacyImage (
STATIC
EFI_STATUS
QemuUnloadLegacyImage (
IN EFI_HANDLE ImageHandle
IN EFI_HANDLE ImageHandle
)
{
EFI_STATUS Status;
@@ -266,8 +299,11 @@ QemuUnloadLegacyImage (
return EFI_INVALID_PARAMETER;
}
Status = gBS->UninstallProtocolInterface (ImageHandle,
&gOvmfLoadedX86LinuxKernelProtocolGuid, LoadedImage);
Status = gBS->UninstallProtocolInterface (
ImageHandle,
&gOvmfLoadedX86LinuxKernelProtocolGuid,
LoadedImage
);
ASSERT_EFI_ERROR (Status);
FreeLegacyImage (LoadedImage);
@@ -294,15 +330,15 @@ QemuUnloadLegacyImage (
EFI_STATUS
EFIAPI
QemuLoadKernelImage (
OUT EFI_HANDLE *ImageHandle
OUT EFI_HANDLE *ImageHandle
)
{
EFI_STATUS Status;
EFI_HANDLE KernelImageHandle;
EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage;
UINTN CommandLineSize;
CHAR8 *CommandLine;
UINTN InitrdSize;
EFI_STATUS Status;
EFI_HANDLE KernelImageHandle;
EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage;
UINTN CommandLineSize;
CHAR8 *CommandLine;
UINTN InitrdSize;
//
// Redundant assignment to work around GCC48/GCC49 limitations.
@@ -321,26 +357,26 @@ QemuLoadKernelImage (
&KernelImageHandle
);
switch (Status) {
case EFI_SUCCESS:
break;
case EFI_SUCCESS:
break;
case EFI_NOT_FOUND:
//
// The image does not exist - no -kernel image was supplied via the
// command line so no point in invoking the legacy fallback
//
return EFI_NOT_FOUND;
case EFI_NOT_FOUND:
//
// The image does not exist - no -kernel image was supplied via the
// command line so no point in invoking the legacy fallback
//
return EFI_NOT_FOUND;
case EFI_SECURITY_VIOLATION:
//
// Since the image has been loaded, we need to unload it before proceeding
// to the EFI_ACCESS_DENIED case below.
//
gBS->UnloadImage (KernelImageHandle);
case EFI_SECURITY_VIOLATION:
//
// Since the image has been loaded, we need to unload it before proceeding
// to the EFI_ACCESS_DENIED case below.
//
gBS->UnloadImage (KernelImageHandle);
//
// Fall through
//
case EFI_ACCESS_DENIED:
case EFI_ACCESS_DENIED:
//
// We are running with UEFI secure boot enabled, and the image failed to
// authenticate. For compatibility reasons, we fall back to the legacy
@@ -348,23 +384,28 @@ QemuLoadKernelImage (
//
// Fall through
//
case EFI_UNSUPPORTED:
//
// The image is not natively supported or cross-type supported. Let's try
// loading it using the loader that parses the bzImage metadata directly.
//
Status = QemuLoadLegacyImage (&KernelImageHandle);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: QemuLoadLegacyImage(): %r\n", __FUNCTION__,
Status));
return Status;
}
*ImageHandle = KernelImageHandle;
return EFI_SUCCESS;
case EFI_UNSUPPORTED:
//
// The image is not natively supported or cross-type supported. Let's try
// loading it using the loader that parses the bzImage metadata directly.
//
Status = QemuLoadLegacyImage (&KernelImageHandle);
if (EFI_ERROR (Status)) {
DEBUG ((
DEBUG_ERROR,
"%a: QemuLoadLegacyImage(): %r\n",
__FUNCTION__,
Status
));
return Status;
}
default:
DEBUG ((DEBUG_ERROR, "%a: LoadImage(): %r\n", __FUNCTION__, Status));
return Status;
*ImageHandle = KernelImageHandle;
return EFI_SUCCESS;
default:
DEBUG ((DEBUG_ERROR, "%a: LoadImage(): %r\n", __FUNCTION__, Status));
return Status;
}
//
@@ -399,8 +440,11 @@ QemuLoadKernelImage (
// Verify NUL-termination of the command line.
//
if (CommandLine[CommandLineSize - 1] != '\0') {
DEBUG ((DEBUG_ERROR, "%a: kernel command line is not NUL-terminated\n",
__FUNCTION__));
DEBUG ((
DEBUG_ERROR,
"%a: kernel command line is not NUL-terminated\n",
__FUNCTION__
));
Status = EFI_PROTOCOL_ERROR;
goto FreeCommandLine;
}
@@ -408,7 +452,7 @@ QemuLoadKernelImage (
//
// Drop the terminating NUL, convert to UTF-16.
//
KernelLoadedImage->LoadOptionsSize = (UINT32) ((CommandLineSize - 1) * 2);
KernelLoadedImage->LoadOptionsSize = (UINT32)((CommandLineSize - 1) * 2);
}
QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize);
@@ -430,10 +474,11 @@ QemuLoadKernelImage (
KernelLoadedImage->LoadOptionsSize += 2;
KernelLoadedImage->LoadOptions = AllocatePool (
KernelLoadedImage->LoadOptionsSize);
KernelLoadedImage->LoadOptionsSize
);
if (KernelLoadedImage->LoadOptions == NULL) {
KernelLoadedImage->LoadOptionsSize = 0;
Status = EFI_OUT_OF_RESOURCES;
Status = EFI_OUT_OF_RESOURCES;
goto FreeCommandLine;
}
@@ -444,17 +489,22 @@ QemuLoadKernelImage (
(CommandLineSize == 0) ? "" : CommandLine,
(InitrdSize == 0) ? "" : " initrd=initrd"
);
DEBUG ((DEBUG_INFO, "%a: command line: \"%s\"\n", __FUNCTION__,
(CHAR16 *)KernelLoadedImage->LoadOptions));
DEBUG ((
DEBUG_INFO,
"%a: command line: \"%s\"\n",
__FUNCTION__,
(CHAR16 *)KernelLoadedImage->LoadOptions
));
}
*ImageHandle = KernelImageHandle;
Status = EFI_SUCCESS;
Status = EFI_SUCCESS;
FreeCommandLine:
if (CommandLineSize > 0) {
FreePool (CommandLine);
}
UnloadImage:
if (EFI_ERROR (Status)) {
gBS->UnloadImage (KernelImageHandle);
@@ -481,7 +531,7 @@ UnloadImage:
EFI_STATUS
EFIAPI
QemuStartKernelImage (
IN OUT EFI_HANDLE *ImageHandle
IN OUT EFI_HANDLE *ImageHandle
)
{
EFI_STATUS Status;
@@ -504,9 +554,9 @@ QemuStartKernelImage (
NULL, // ExitDataSize
NULL // ExitData
);
#ifdef MDE_CPU_IA32
#ifdef MDE_CPU_IA32
if (Status == EFI_UNSUPPORTED) {
EFI_HANDLE KernelImageHandle;
EFI_HANDLE KernelImageHandle;
//
// On IA32, EFI_UNSUPPORTED means that the image's machine type is X64 while
@@ -524,6 +574,7 @@ QemuStartKernelImage (
//
return Status;
}
//
// Swap in the legacy-loaded image.
//
@@ -531,7 +582,8 @@ QemuStartKernelImage (
*ImageHandle = KernelImageHandle;
return QemuStartLegacyImage (KernelImageHandle);
}
#endif
#endif
return Status;
}
@@ -551,11 +603,11 @@ QemuStartKernelImage (
EFI_STATUS
EFIAPI
QemuUnloadKernelImage (
IN EFI_HANDLE ImageHandle
IN EFI_HANDLE ImageHandle
)
{
EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage;
EFI_STATUS Status;
EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage;
EFI_STATUS Status;
Status = gBS->OpenProtocol (
ImageHandle,
@@ -588,6 +640,7 @@ QemuUnloadKernelImage (
FreePool (KernelLoadedImage->LoadOptions);
KernelLoadedImage->LoadOptions = NULL;
}
KernelLoadedImage->LoadOptionsSize = 0;
return gBS->UnloadImage (ImageHandle);

View File

@@ -36,8 +36,8 @@
// in general, it is actually fine for the Xen domU (guest) environment that
// this module is intended for, as UEFI always executes from DRAM in that case.
//
STATIC evtchn_send_t mXenConsoleEventChain;
STATIC struct xencons_interface *mXenConsoleInterface;
STATIC evtchn_send_t mXenConsoleEventChain;
STATIC struct xencons_interface *mXenConsoleInterface;
/**
Initialize the serial device hardware.
@@ -56,19 +56,20 @@ SerialPortInitialize (
VOID
)
{
if (! XenHypercallIsAvailable ()) {
if (!XenHypercallIsAvailable ()) {
return RETURN_DEVICE_ERROR;
}
if (!mXenConsoleInterface) {
mXenConsoleEventChain.port = (UINT32)XenHypercallHvmGetParam (HVM_PARAM_CONSOLE_EVTCHN);
mXenConsoleInterface = (struct xencons_interface *)(UINTN)
(XenHypercallHvmGetParam (HVM_PARAM_CONSOLE_PFN) << EFI_PAGE_SHIFT);
mXenConsoleInterface = (struct xencons_interface *)(UINTN)
(XenHypercallHvmGetParam (HVM_PARAM_CONSOLE_PFN) << EFI_PAGE_SHIFT);
//
// No point in ASSERT'ing here as we won't be seeing the output
//
}
return RETURN_SUCCESS;
}
@@ -92,8 +93,8 @@ SerialPortInitialize (
UINTN
EFIAPI
SerialPortWrite (
IN UINT8 *Buffer,
IN UINTN NumberOfBytes
IN UINT8 *Buffer,
IN UINTN NumberOfBytes
)
{
XENCONS_RING_IDX Consumer, Producer;
@@ -116,15 +117,15 @@ SerialPortWrite (
MemoryFence ();
while (Sent < NumberOfBytes && ((Producer - Consumer) < sizeof (mXenConsoleInterface->out)))
mXenConsoleInterface->out[MASK_XENCONS_IDX(Producer++, mXenConsoleInterface->out)] = Buffer[Sent++];
while (Sent < NumberOfBytes && ((Producer - Consumer) < sizeof (mXenConsoleInterface->out))) {
mXenConsoleInterface->out[MASK_XENCONS_IDX (Producer++, mXenConsoleInterface->out)] = Buffer[Sent++];
}
MemoryFence ();
mXenConsoleInterface->out_prod = Producer;
XenHypercallEventChannelOp (EVTCHNOP_send, &mXenConsoleEventChain);
} while (Sent < NumberOfBytes);
return Sent;
@@ -148,9 +149,9 @@ SerialPortWrite (
UINTN
EFIAPI
SerialPortRead (
OUT UINT8 *Buffer,
IN UINTN NumberOfBytes
)
OUT UINT8 *Buffer,
IN UINTN NumberOfBytes
)
{
XENCONS_RING_IDX Consumer, Producer;
UINTN Received;
@@ -171,8 +172,9 @@ SerialPortRead (
MemoryFence ();
Received = 0;
while (Received < NumberOfBytes && Consumer < Producer)
Buffer[Received++] = mXenConsoleInterface->in[MASK_XENCONS_IDX(Consumer++, mXenConsoleInterface->in)];
while (Received < NumberOfBytes && Consumer < Producer) {
Buffer[Received++] = mXenConsoleInterface->in[MASK_XENCONS_IDX (Consumer++, mXenConsoleInterface->in)];
}
MemoryFence ();
@@ -197,7 +199,7 @@ SerialPortPoll (
)
{
return mXenConsoleInterface &&
mXenConsoleInterface->in_cons != mXenConsoleInterface->in_prod;
mXenConsoleInterface->in_cons != mXenConsoleInterface->in_prod;
}
/**
@@ -213,7 +215,7 @@ SerialPortPoll (
RETURN_STATUS
EFIAPI
SerialPortSetControl (
IN UINT32 Control
IN UINT32 Control
)
{
return RETURN_UNSUPPORTED;
@@ -232,7 +234,7 @@ SerialPortSetControl (
RETURN_STATUS
EFIAPI
SerialPortGetControl (
OUT UINT32 *Control
OUT UINT32 *Control
)
{
if (!mXenConsoleInterface) {
@@ -243,6 +245,7 @@ SerialPortGetControl (
if (!SerialPortPoll ()) {
*Control = EFI_SERIAL_INPUT_BUFFER_EMPTY;
}
return RETURN_SUCCESS;
}
@@ -282,14 +285,13 @@ SerialPortGetControl (
RETURN_STATUS
EFIAPI
SerialPortSetAttributes (
IN OUT UINT64 *BaudRate,
IN OUT UINT32 *ReceiveFifoDepth,
IN OUT UINT32 *Timeout,
IN OUT EFI_PARITY_TYPE *Parity,
IN OUT UINT8 *DataBits,
IN OUT EFI_STOP_BITS_TYPE *StopBits
IN OUT UINT64 *BaudRate,
IN OUT UINT32 *ReceiveFifoDepth,
IN OUT UINT32 *Timeout,
IN OUT EFI_PARITY_TYPE *Parity,
IN OUT UINT8 *DataBits,
IN OUT EFI_STOP_BITS_TYPE *StopBits
)
{
return RETURN_UNSUPPORTED;
}

View File

@@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/DebugLib.h>
#include <Guid/XenInfo.h>
STATIC VOID *HyperPage;
STATIC VOID *HyperPage;
/**
Check if the Xen Hypercall library is able to make calls to the Xen
@@ -38,30 +38,30 @@ XenHypercallIsAvailable (
INTN
EFIAPI
__XenHypercall2 (
IN VOID *HypercallAddr,
IN OUT INTN Arg1,
IN OUT INTN Arg2
IN VOID *HypercallAddr,
IN OUT INTN Arg1,
IN OUT INTN Arg2
);
/**
Library constructor: retrieves the Hyperpage address
from the gEfiXenInfoGuid HOB
**/
RETURN_STATUS
EFIAPI
XenHypercallLibInit (
VOID
)
{
EFI_HOB_GUID_TYPE *GuidHob;
EFI_XEN_INFO *XenInfo;
EFI_HOB_GUID_TYPE *GuidHob;
EFI_XEN_INFO *XenInfo;
GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);
if (GuidHob == NULL) {
return RETURN_NOT_FOUND;
}
XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);
XenInfo = (EFI_XEN_INFO *)GET_GUID_HOB_DATA (GuidHob);
HyperPage = XenInfo->HyperPages;
return RETURN_SUCCESS;
}
@@ -86,5 +86,5 @@ XenHypercall2 (
{
ASSERT (HyperPage != NULL);
return __XenHypercall2 ((UINT8*)HyperPage + HypercallID * 32, Arg1, Arg2);
return __XenHypercall2 ((UINT8 *)HyperPage + HypercallID * 32, Arg1, Arg2);
}

View File

@@ -34,43 +34,56 @@ XenHypercallLibConstruct (
UINT64
EFIAPI
XenHypercallHvmGetParam (
IN UINT32 Index
IN UINT32 Index
)
{
xen_hvm_param_t Parameter;
INTN Error;
xen_hvm_param_t Parameter;
INTN Error;
Parameter.domid = DOMID_SELF;
Parameter.index = Index;
Error = XenHypercall2 (__HYPERVISOR_hvm_op,
HVMOP_get_param, (INTN) &Parameter);
Error = XenHypercall2 (
__HYPERVISOR_hvm_op,
HVMOP_get_param,
(INTN)&Parameter
);
if (Error != 0) {
DEBUG ((DEBUG_ERROR,
"XenHypercall: Error %Ld trying to get HVM parameter %d\n",
(INT64)Error, Index));
DEBUG ((
DEBUG_ERROR,
"XenHypercall: Error %Ld trying to get HVM parameter %d\n",
(INT64)Error,
Index
));
return 0;
}
return Parameter.value;
}
INTN
EFIAPI
XenHypercallMemoryOp (
IN UINTN Operation,
IN OUT VOID *Arguments
IN UINTN Operation,
IN OUT VOID *Arguments
)
{
return XenHypercall2 (__HYPERVISOR_memory_op,
Operation, (INTN) Arguments);
return XenHypercall2 (
__HYPERVISOR_memory_op,
Operation,
(INTN)Arguments
);
}
INTN
EFIAPI
XenHypercallEventChannelOp (
IN INTN Operation,
IN OUT VOID *Arguments
IN INTN Operation,
IN OUT VOID *Arguments
)
{
return XenHypercall2 (__HYPERVISOR_event_channel_op,
Operation, (INTN) Arguments);
return XenHypercall2 (
__HYPERVISOR_event_channel_op,
Operation,
(INTN)Arguments
);
}

View File

@@ -21,13 +21,13 @@
#pragma pack (1)
typedef struct {
VENDOR_DEVICE_PATH Vendor;
EFI_PHYSICAL_ADDRESS GrantTableAddress;
EFI_DEVICE_PATH_PROTOCOL End;
VENDOR_DEVICE_PATH Vendor;
EFI_PHYSICAL_ADDRESS GrantTableAddress;
EFI_DEVICE_PATH_PROTOCOL End;
} XENBUS_ROOT_DEVICE_PATH;
#pragma pack ()
STATIC CONST XENBUS_ROOT_DEVICE_PATH mXenBusRootDevicePathTemplate = {
STATIC CONST XENBUS_ROOT_DEVICE_PATH mXenBusRootDevicePathTemplate = {
{
{
HARDWARE_DEVICE_PATH,
@@ -40,7 +40,7 @@ STATIC CONST XENBUS_ROOT_DEVICE_PATH mXenBusRootDevicePathTemplate = {
{
END_DEVICE_PATH_TYPE,
END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
{ sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
}
};
@@ -66,14 +66,14 @@ STATIC CONST XENBUS_ROOT_DEVICE_PATH mXenBusRootDevicePathTemplate = {
**/
EFI_STATUS
XenIoMmioInstall (
IN OUT EFI_HANDLE *Handle,
IN EFI_PHYSICAL_ADDRESS GrantTableAddress
IN OUT EFI_HANDLE *Handle,
IN EFI_PHYSICAL_ADDRESS GrantTableAddress
)
{
EFI_STATUS Status;
XENIO_PROTOCOL *XenIo;
XENBUS_ROOT_DEVICE_PATH *XenBusDevicePath;
EFI_HANDLE OutHandle;
EFI_STATUS Status;
XENIO_PROTOCOL *XenIo;
XENBUS_ROOT_DEVICE_PATH *XenBusDevicePath;
EFI_HANDLE OutHandle;
ASSERT (Handle != NULL);
@@ -83,29 +83,42 @@ XenIoMmioInstall (
if (!XenIo) {
return EFI_OUT_OF_RESOURCES;
}
XenIo->GrantTableAddress = GrantTableAddress;
XenBusDevicePath = AllocateCopyPool (sizeof *XenBusDevicePath,
&mXenBusRootDevicePathTemplate);
XenBusDevicePath = AllocateCopyPool (
sizeof *XenBusDevicePath,
&mXenBusRootDevicePathTemplate
);
if (!XenBusDevicePath) {
DEBUG ((DEBUG_ERROR, "%a: Out of memory\n", __FUNCTION__));
Status = EFI_OUT_OF_RESOURCES;
goto FreeXenIo;
}
XenBusDevicePath->GrantTableAddress = GrantTableAddress;
Status = gBS->InstallMultipleProtocolInterfaces (&OutHandle,
&gEfiDevicePathProtocolGuid, XenBusDevicePath,
&gXenIoProtocolGuid, XenIo,
NULL);
Status = gBS->InstallMultipleProtocolInterfaces (
&OutHandle,
&gEfiDevicePathProtocolGuid,
XenBusDevicePath,
&gXenIoProtocolGuid,
XenIo,
NULL
);
if (!EFI_ERROR (Status)) {
*Handle = OutHandle;
return EFI_SUCCESS;
}
DEBUG ((DEBUG_ERROR, "%a: Failed to install the EFI_DEVICE_PATH and "
DEBUG ((
DEBUG_ERROR,
"%a: Failed to install the EFI_DEVICE_PATH and "
"XENIO_PROTOCOL protocols on handle %p (Status == %r)\n",
__FUNCTION__, OutHandle, Status));
__FUNCTION__,
OutHandle,
Status
));
FreePool (XenBusDevicePath);
@@ -129,25 +142,41 @@ FreeXenIo:
**/
EFI_STATUS
XenIoMmioUninstall (
IN EFI_HANDLE Handle
IN EFI_HANDLE Handle
)
{
EFI_STATUS Status;
VOID *XenIo;
VOID *XenBusDevicePath;
EFI_STATUS Status;
VOID *XenIo;
VOID *XenBusDevicePath;
XenBusDevicePath = NULL;
gBS->OpenProtocol (Handle, &gEfiDevicePathProtocolGuid, &XenBusDevicePath,
NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
gBS->OpenProtocol (
Handle,
&gEfiDevicePathProtocolGuid,
&XenBusDevicePath,
NULL,
NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
XenIo = NULL;
gBS->OpenProtocol (Handle, &gXenIoProtocolGuid, &XenIo,
NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
gBS->OpenProtocol (
Handle,
&gXenIoProtocolGuid,
&XenIo,
NULL,
NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
Status = gBS->UninstallMultipleProtocolInterfaces (Handle,
&gEfiDevicePathProtocolGuid, XenBusDevicePath,
&gXenIoProtocolGuid, XenIo,
NULL);
Status = gBS->UninstallMultipleProtocolInterfaces (
Handle,
&gEfiDevicePathProtocolGuid,
XenBusDevicePath,
&gXenIoProtocolGuid,
XenIo,
NULL
);
if (EFI_ERROR (Status)) {
return Status;

View File

@@ -25,9 +25,9 @@ XenGetInfoHOB (
VOID
)
{
EFI_HOB_GUID_TYPE *GuidHob;
STATIC BOOLEAN Cached = FALSE;
STATIC EFI_XEN_INFO *XenInfo;
EFI_HOB_GUID_TYPE *GuidHob;
STATIC BOOLEAN Cached = FALSE;
STATIC EFI_XEN_INFO *XenInfo;
//
// Return the cached result for the benefit of XenDetected that can be
@@ -41,8 +41,9 @@ XenGetInfoHOB (
if (GuidHob == NULL) {
XenInfo = NULL;
} else {
XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);
XenInfo = (EFI_XEN_INFO *)GET_GUID_HOB_DATA (GuidHob);
}
Cached = TRUE;
return XenInfo;
}
@@ -74,7 +75,7 @@ XenPvhDetected (
VOID
)
{
EFI_XEN_INFO *XenInfo;
EFI_XEN_INFO *XenInfo;
XenInfo = XenGetInfoHOB ();
return (XenInfo != NULL && XenInfo->RsdpPvh != NULL);

View File

@@ -22,22 +22,22 @@ EpochToEfiTime (
OUT EFI_TIME *Time
)
{
UINTN a;
UINTN b;
UINTN c;
UINTN d;
UINTN g;
UINTN j;
UINTN m;
UINTN y;
UINTN da;
UINTN db;
UINTN dc;
UINTN dg;
UINTN hh;
UINTN mm;
UINTN ss;
UINTN J;
UINTN a;
UINTN b;
UINTN c;
UINTN d;
UINTN g;
UINTN j;
UINTN m;
UINTN y;
UINTN da;
UINTN db;
UINTN dc;
UINTN dg;
UINTN hh;
UINTN mm;
UINTN ss;
UINTN J;
J = (EpochSeconds / 86400) + 2440588;
j = J + 32044;
@@ -60,14 +60,13 @@ EpochToEfiTime (
ss = EpochSeconds % 60;
a = (EpochSeconds - ss) / 60;
mm = a % 60;
b = (a - mm) / 60;
b = (a - mm) / 60;
hh = b % 24;
Time->Hour = (UINT8)hh;
Time->Minute = (UINT8)mm;
Time->Second = (UINT8)ss;
Time->Nanosecond = 0;
Time->Hour = (UINT8)hh;
Time->Minute = (UINT8)mm;
Time->Second = (UINT8)ss;
Time->Nanosecond = 0;
}
/**
@@ -97,7 +96,7 @@ LibGetTime (
// as Xen's timekeeping uses a shared info page which cannot be shared
// between UEFI and the OS
//
EpochToEfiTime(1421770011, Time);
EpochToEfiTime (1421770011, Time);
return EFI_SUCCESS;
}
@@ -115,13 +114,12 @@ LibGetTime (
EFI_STATUS
EFIAPI
LibSetTime (
IN EFI_TIME *Time
IN EFI_TIME *Time
)
{
return EFI_DEVICE_ERROR;
}
/**
Returns the current wakeup alarm clock setting.
@@ -138,9 +136,9 @@ LibSetTime (
EFI_STATUS
EFIAPI
LibGetWakeupTime (
OUT BOOLEAN *Enabled,
OUT BOOLEAN *Pending,
OUT EFI_TIME *Time
OUT BOOLEAN *Enabled,
OUT BOOLEAN *Pending,
OUT EFI_TIME *Time
)
{
return EFI_UNSUPPORTED;
@@ -162,8 +160,8 @@ LibGetWakeupTime (
EFI_STATUS
EFIAPI
LibSetWakeupTime (
IN BOOLEAN Enabled,
OUT EFI_TIME *Time
IN BOOLEAN Enabled,
OUT EFI_TIME *Time
)
{
return EFI_UNSUPPORTED;
@@ -182,8 +180,8 @@ LibSetWakeupTime (
EFI_STATUS
EFIAPI
LibRtcInitialize (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
return EFI_SUCCESS;