mirror of https://github.com/acidanthera/audk.git
Pkg-Module: CorebootModulePkg
Reverted the previous check-in since it is at the incorrect directory level. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Maurice Ma <maurice.ma@intel.com> Reviewed-by: Prince Agyeman <prince.agyeman@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17083 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
1139bd7096
commit
14df6e059c
|
@ -1,199 +0,0 @@
|
|||
/** @file
|
||||
This driver will report some MMIO/IO resources to dxe core, extract smbios and acpi
|
||||
tables from coreboot and install.
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
#include "CbSupportDxe.h"
|
||||
|
||||
UINTN mPmCtrlReg = 0;
|
||||
/**
|
||||
Reserve MMIO/IO resource in GCD
|
||||
|
||||
@param IsMMIO Flag of whether it is mmio resource or io resource.
|
||||
@param GcdType Type of the space.
|
||||
@param BaseAddress Base address of the space.
|
||||
@param Length Length of the space.
|
||||
@param Alignment Align with 2^Alignment
|
||||
@param ImageHandle Handle for the image of this driver.
|
||||
|
||||
@retval EFI_SUCCESS Reserve successful
|
||||
**/
|
||||
EFI_STATUS
|
||||
CbReserveResourceInGcd (
|
||||
IN BOOLEAN IsMMIO,
|
||||
IN UINTN GcdType,
|
||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||
IN UINT64 Length,
|
||||
IN UINTN Alignment,
|
||||
IN EFI_HANDLE ImageHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (IsMMIO) {
|
||||
Status = gDS->AddMemorySpace (
|
||||
GcdType,
|
||||
BaseAddress,
|
||||
Length,
|
||||
EFI_MEMORY_UC
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((
|
||||
EFI_D_ERROR,
|
||||
"Failed to add memory space :0x%x 0x%x\n",
|
||||
BaseAddress,
|
||||
Length
|
||||
));
|
||||
}
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
Status = gDS->AllocateMemorySpace (
|
||||
EfiGcdAllocateAddress,
|
||||
GcdType,
|
||||
Alignment,
|
||||
Length,
|
||||
&BaseAddress,
|
||||
ImageHandle,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
} else {
|
||||
Status = gDS->AddIoSpace (
|
||||
GcdType,
|
||||
BaseAddress,
|
||||
Length
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
Status = gDS->AllocateIoSpace (
|
||||
EfiGcdAllocateAddress,
|
||||
GcdType,
|
||||
Alignment,
|
||||
Length,
|
||||
&BaseAddress,
|
||||
ImageHandle,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Notification function of EVT_GROUP_READY_TO_BOOT event group.
|
||||
|
||||
This is a notification function registered on EVT_GROUP_READY_TO_BOOT event group.
|
||||
When the Boot Manager is about to load and execute a boot option, it reclaims variable
|
||||
storage if free size is below the threshold.
|
||||
|
||||
@param Event Event whose notification function is being invoked.
|
||||
@param Context Pointer to the notification function's context.
|
||||
|
||||
**/
|
||||
VOID
|
||||
OnReadyToBoot (
|
||||
EFI_EVENT Event,
|
||||
VOID *Context
|
||||
)
|
||||
{
|
||||
//
|
||||
// Enable SCI
|
||||
//
|
||||
IoOr16 (mPmCtrlReg, BIT0);
|
||||
|
||||
DEBUG ((EFI_D_ERROR, "Enable SCI bit at 0x%x before boot\n", mPmCtrlReg));
|
||||
}
|
||||
|
||||
/**
|
||||
Main entry for the Coreboot Support DXE module.
|
||||
|
||||
@param[in] ImageHandle The firmware allocated handle for the EFI image.
|
||||
@param[in] SystemTable A pointer to the EFI System Table.
|
||||
|
||||
@retval EFI_SUCCESS The entry point is executed successfully.
|
||||
@retval other Some error occurs when executing this entry point.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
CbDxeEntryPoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_EVENT ReadyToBootEvent;
|
||||
EFI_HOB_GUID_TYPE *GuidHob;
|
||||
SYSTEM_TABLE_INFO *pSystemTableInfo;
|
||||
ACPI_BOARD_INFO *pAcpiBoardInfo;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
//
|
||||
// Report MMIO/IO Resources
|
||||
//
|
||||
Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEE00000, SIZE_1MB, 0, SystemTable); // LAPIC
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEC00000, SIZE_4KB, 0, SystemTable); // IOAPIC
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFED00000, SIZE_1KB, 0, SystemTable); // HPET
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Find the system table information guid hob
|
||||
//
|
||||
GuidHob = GetFirstGuidHob (&gUefiSystemTableInfoGuid);
|
||||
ASSERT (GuidHob != NULL);
|
||||
pSystemTableInfo = (SYSTEM_TABLE_INFO *)GET_GUID_HOB_DATA (GuidHob);
|
||||
|
||||
//
|
||||
// Install Acpi Table
|
||||
//
|
||||
if (pSystemTableInfo->AcpiTableBase != 0 && pSystemTableInfo->AcpiTableSize != 0) {
|
||||
DEBUG ((EFI_D_ERROR, "Install Acpi Table at 0x%x, length 0x%x\n", (UINTN)pSystemTableInfo->AcpiTableBase, pSystemTableInfo->AcpiTableSize));
|
||||
Status = gBS->InstallConfigurationTable (&gEfiAcpiTableGuid, (VOID *)(UINTN)pSystemTableInfo->AcpiTableBase);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
//
|
||||
// Install Smbios Table
|
||||
//
|
||||
if (pSystemTableInfo->SmbiosTableBase != 0 && pSystemTableInfo->SmbiosTableSize != 0) {
|
||||
DEBUG ((EFI_D_ERROR, "Install Smbios Table at 0x%x, length 0x%x\n", (UINTN)pSystemTableInfo->SmbiosTableBase, pSystemTableInfo->SmbiosTableSize));
|
||||
Status = gBS->InstallConfigurationTable (&gEfiSmbiosTableGuid, (VOID *)(UINTN)pSystemTableInfo->SmbiosTableBase);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
//
|
||||
// Find the acpi board information guid hob
|
||||
//
|
||||
GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid);
|
||||
ASSERT (GuidHob != NULL);
|
||||
pAcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob);
|
||||
|
||||
mPmCtrlReg = (UINTN)pAcpiBoardInfo->PmCtrlRegBase;
|
||||
DEBUG ((EFI_D_ERROR, "PmCtrlReg at 0x%x\n", mPmCtrlReg));
|
||||
|
||||
//
|
||||
// Register callback on the ready to boot event
|
||||
// in order to enable SCI
|
||||
//
|
||||
ReadyToBootEvent = NULL;
|
||||
Status = EfiCreateEventReadyToBootEx (
|
||||
TPL_CALLBACK,
|
||||
OnReadyToBoot,
|
||||
NULL,
|
||||
&ReadyToBootEvent
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
/** @file
|
||||
The header file of Coreboot Support DXE.
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
#ifndef __DXE_COREBOOT_SUPPORT_H__
|
||||
#define __DXE_COREBOOT_SUPPORT_H__
|
||||
|
||||
#include <PiDxe.h>
|
||||
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/DxeServicesTableLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
|
||||
#include <Guid/Acpi.h>
|
||||
#include <Guid/SmBios.h>
|
||||
#include <Guid/SystemTableInfoGuid.h>
|
||||
#include <Guid/AcpiBoardInfoGuid.h>
|
||||
|
||||
#include <IndustryStandard/Acpi.h>
|
||||
|
||||
#endif
|
|
@ -1,59 +0,0 @@
|
|||
## @file
|
||||
# Coreboot Support DXE Module
|
||||
#
|
||||
# Report some MMIO/IO resources to dxe core, extract smbios and acpi tables from coreboot and install.
|
||||
#
|
||||
# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = CbSupportDxe
|
||||
FILE_GUID = C68DAA4E-7AB5-41e8-A91D-5954421053F3
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
ENTRY_POINT = CbDxeEntryPoint
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
CbSupportDxe.c
|
||||
CbSupportDxe.h
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
|
||||
CorebootModulePkg/CorebootModulePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
UefiDriverEntryPoint
|
||||
UefiBootServicesTableLib
|
||||
DxeServicesTableLib
|
||||
DebugLib
|
||||
BaseMemoryLib
|
||||
UefiLib
|
||||
IoLib
|
||||
HobLib
|
||||
|
||||
[Guids]
|
||||
gEfiAcpiTableGuid
|
||||
gEfiSmbiosTableGuid
|
||||
gUefiSystemTableInfoGuid
|
||||
gUefiAcpiBoardInfoGuid
|
||||
|
||||
[Depex]
|
||||
TRUE
|
|
@ -1,380 +0,0 @@
|
|||
/** @file
|
||||
This PEIM will parse coreboot table in memory and report resource information into pei core.
|
||||
This file contains the main entrypoint of the PEIM.
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
#include "CbSupportPei.h"
|
||||
|
||||
EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
|
||||
{ EfiACPIReclaimMemory, 0x008 },
|
||||
{ EfiACPIMemoryNVS, 0x004 },
|
||||
{ EfiReservedMemoryType, 0x004 },
|
||||
{ EfiRuntimeServicesData, 0x080 },
|
||||
{ EfiRuntimeServicesCode, 0x080 },
|
||||
{ EfiMaxMemoryType, 0 }
|
||||
};
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR mPpiBootMode[] = {
|
||||
{
|
||||
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
|
||||
&gEfiPeiMasterBootModePpiGuid,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
Create memory mapped io resource hob.
|
||||
|
||||
@param MmioBase Base address of the memory mapped io range
|
||||
@param MmioSize Length of the memory mapped io range
|
||||
|
||||
**/
|
||||
VOID
|
||||
BuildMemoryMappedIoRangeHob (
|
||||
EFI_PHYSICAL_ADDRESS MmioBase,
|
||||
UINT64 MmioSize
|
||||
)
|
||||
{
|
||||
BuildResourceDescriptorHob (
|
||||
EFI_RESOURCE_MEMORY_MAPPED_IO,
|
||||
(EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
||||
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
||||
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_TESTED),
|
||||
MmioBase,
|
||||
MmioSize
|
||||
);
|
||||
|
||||
BuildMemoryAllocationHob (
|
||||
MmioBase,
|
||||
MmioSize,
|
||||
EfiMemoryMappedIO
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Check the integrity of firmware volume header
|
||||
|
||||
@param[in] FwVolHeader A pointer to a firmware volume header
|
||||
|
||||
@retval TRUE The firmware volume is consistent
|
||||
@retval FALSE The firmware volume has corrupted.
|
||||
|
||||
**/
|
||||
STATIC
|
||||
BOOLEAN
|
||||
IsFvHeaderValid (
|
||||
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
||||
)
|
||||
{
|
||||
UINT16 Checksum;
|
||||
|
||||
// Skip nv storage fv
|
||||
if (CompareMem (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem2Guid, sizeof(EFI_GUID)) != 0 ) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( (FwVolHeader->Revision != EFI_FVH_REVISION) ||
|
||||
(FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||
|
||||
(FwVolHeader->FvLength == ((UINTN) -1)) ||
|
||||
((FwVolHeader->HeaderLength & 0x01 ) !=0) ) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Checksum = CalculateCheckSum16 ((UINT16 *) FwVolHeader, FwVolHeader->HeaderLength);
|
||||
if (Checksum != 0) {
|
||||
DEBUG (( DEBUG_ERROR,
|
||||
"ERROR - Invalid Firmware Volume Header Checksum, change 0x%04x to 0x%04x\r\n",
|
||||
FwVolHeader->Checksum,
|
||||
(UINT16)( Checksum + FwVolHeader->Checksum )));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
Install FvInfo PPI and create fv hobs for remained fvs
|
||||
|
||||
**/
|
||||
VOID
|
||||
CbPeiReportRemainedFvs (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINT8* TempPtr;
|
||||
UINT8* EndPtr;
|
||||
|
||||
TempPtr = (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase);
|
||||
EndPtr = (UINT8* )(UINTN) (PcdGet32 (PcdPayloadFdMemBase) + PcdGet32 (PcdPayloadFdMemSize));
|
||||
|
||||
for (;TempPtr < EndPtr;) {
|
||||
if (IsFvHeaderValid ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)) {
|
||||
if (TempPtr != (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase)) {
|
||||
// Skip the PEI FV
|
||||
DEBUG((EFI_D_ERROR, "Found one valid fv : 0x%x.\n", TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength));
|
||||
|
||||
PeiServicesInstallFvInfoPpi (
|
||||
NULL,
|
||||
(VOID *) (UINTN) TempPtr,
|
||||
(UINT32) (UINTN) ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
BuildFvHob ((EFI_PHYSICAL_ADDRESS)(UINTN) TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength);
|
||||
}
|
||||
}
|
||||
TempPtr += ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
This is the entrypoint of PEIM
|
||||
|
||||
@param FileHandle Handle of the file being invoked.
|
||||
@param PeiServices Describes the list of possible PEI Services.
|
||||
|
||||
@retval EFI_SUCCESS if it completed successfully.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
CbPeiEntryPoint (
|
||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 LowMemorySize, HighMemorySize;
|
||||
UINT64 PeiMemSize = SIZE_64MB; // 64 MB
|
||||
EFI_PHYSICAL_ADDRESS PeiMemBase = 0;
|
||||
UINT32 RegEax;
|
||||
UINT8 PhysicalAddressBits;
|
||||
VOID* pCbHeader;
|
||||
VOID* pAcpiTable;
|
||||
UINT32 AcpiTableSize;
|
||||
VOID* pSmbiosTable;
|
||||
UINT32 SmbiosTableSize;
|
||||
SYSTEM_TABLE_INFO* pSystemTableInfo;
|
||||
FRAME_BUFFER_INFO FbInfo;
|
||||
FRAME_BUFFER_INFO* pFbInfo;
|
||||
ACPI_BOARD_INFO* pAcpiBoardInfo;
|
||||
UINTN PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;
|
||||
|
||||
LowMemorySize = 0;
|
||||
HighMemorySize = 0;
|
||||
|
||||
Status = CbParseMemoryInfo (&LowMemorySize, &HighMemorySize);
|
||||
if (EFI_ERROR(Status))
|
||||
return Status;
|
||||
|
||||
DEBUG((EFI_D_ERROR, "LowMemorySize: 0x%x.\n", LowMemorySize));
|
||||
DEBUG((EFI_D_ERROR, "HighMemorySize: 0x%x.\n", HighMemorySize));
|
||||
|
||||
ASSERT (LowMemorySize > 0);
|
||||
|
||||
BuildResourceDescriptorHob (
|
||||
EFI_RESOURCE_SYSTEM_MEMORY,
|
||||
(
|
||||
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
||||
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
||||
EFI_RESOURCE_ATTRIBUTE_TESTED |
|
||||
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
|
||||
),
|
||||
(EFI_PHYSICAL_ADDRESS)(0),
|
||||
(UINT64)(0xA0000)
|
||||
);
|
||||
|
||||
|
||||
BuildResourceDescriptorHob (
|
||||
EFI_RESOURCE_MEMORY_RESERVED,
|
||||
(
|
||||
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
||||
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
||||
EFI_RESOURCE_ATTRIBUTE_TESTED |
|
||||
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
|
||||
),
|
||||
(EFI_PHYSICAL_ADDRESS)(0xA0000),
|
||||
(UINT64)(0x60000)
|
||||
);
|
||||
|
||||
BuildResourceDescriptorHob (
|
||||
EFI_RESOURCE_SYSTEM_MEMORY,
|
||||
(
|
||||
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
||||
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
||||
EFI_RESOURCE_ATTRIBUTE_TESTED |
|
||||
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
|
||||
),
|
||||
(EFI_PHYSICAL_ADDRESS)(0x100000),
|
||||
(UINT64) (LowMemorySize - 0x100000)
|
||||
);
|
||||
|
||||
if (HighMemorySize > 0) {
|
||||
BuildResourceDescriptorHob (
|
||||
EFI_RESOURCE_SYSTEM_MEMORY,
|
||||
(
|
||||
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
||||
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
||||
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
||||
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
|
||||
),
|
||||
(EFI_PHYSICAL_ADDRESS)(0x100000000),
|
||||
HighMemorySize
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Should be 64k aligned
|
||||
//
|
||||
PeiMemBase = (LowMemorySize - PeiMemSize) & (~(BASE_64KB - 1));
|
||||
|
||||
DEBUG((EFI_D_ERROR, "PeiMemBase: 0x%x.\n", PeiMemBase));
|
||||
DEBUG((EFI_D_ERROR, "PeiMemSize: 0x%x.\n", PeiMemSize));
|
||||
|
||||
Status = PeiServicesInstallPeiMemory (
|
||||
PeiMemBase,
|
||||
PeiMemSize
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Set cache on the physical memory
|
||||
//
|
||||
MtrrSetMemoryAttribute (BASE_1MB, LowMemorySize - BASE_1MB, CacheWriteBack);
|
||||
MtrrSetMemoryAttribute (0, 0xA0000, CacheWriteBack);
|
||||
|
||||
//
|
||||
// Create Memory Type Information HOB
|
||||
//
|
||||
BuildGuidDataHob (
|
||||
&gEfiMemoryTypeInformationGuid,
|
||||
mDefaultMemoryTypeInformation,
|
||||
sizeof(mDefaultMemoryTypeInformation)
|
||||
);
|
||||
|
||||
//
|
||||
// Create Fv hob
|
||||
//
|
||||
CbPeiReportRemainedFvs ();
|
||||
|
||||
BuildMemoryAllocationHob (
|
||||
PcdGet32 (PcdPayloadFdMemBase),
|
||||
PcdGet32 (PcdPayloadFdMemSize),
|
||||
EfiBootServicesData
|
||||
);
|
||||
|
||||
//
|
||||
// Build CPU memory space and IO space hob
|
||||
//
|
||||
AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);
|
||||
if (RegEax >= 0x80000008) {
|
||||
AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);
|
||||
PhysicalAddressBits = (UINT8) RegEax;
|
||||
} else {
|
||||
PhysicalAddressBits = 36;
|
||||
}
|
||||
//
|
||||
// Create a CPU hand-off information
|
||||
//
|
||||
BuildCpuHob (PhysicalAddressBits, 16);
|
||||
|
||||
//
|
||||
// Report Local APIC range
|
||||
//
|
||||
BuildMemoryMappedIoRangeHob (0xFEC80000, SIZE_512KB);
|
||||
|
||||
//
|
||||
// Boot mode
|
||||
//
|
||||
Status = PeiServicesSetBootMode (BOOT_WITH_FULL_CONFIGURATION);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = PeiServicesInstallPpi (mPpiBootMode);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Set pcd to save the upper coreboot header in case the dxecore will
|
||||
// erase 0~4k memory
|
||||
//
|
||||
pCbHeader = NULL;
|
||||
if ((CbParseGetCbHeader (1, &pCbHeader) == RETURN_SUCCESS)
|
||||
&& ((UINTN)pCbHeader > BASE_4KB)) {
|
||||
DEBUG((EFI_D_ERROR, "Actual Coreboot header: 0x%x.\n", (UINTN)pCbHeader));
|
||||
PcdSet32 (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);
|
||||
}
|
||||
|
||||
//
|
||||
// Create guid hob for system tables like acpi table and smbios table
|
||||
//
|
||||
pAcpiTable = NULL;
|
||||
AcpiTableSize = 0;
|
||||
pSmbiosTable = NULL;
|
||||
SmbiosTableSize = 0;
|
||||
Status = CbParseAcpiTable (&pAcpiTable, &AcpiTableSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
// ACPI table is oblidgible
|
||||
DEBUG ((EFI_D_ERROR, "Failed to find the required acpi table\n"));
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
CbParseSmbiosTable (&pSmbiosTable, &SmbiosTableSize);
|
||||
|
||||
pSystemTableInfo = NULL;
|
||||
pSystemTableInfo = BuildGuidHob (&gUefiSystemTableInfoGuid, sizeof (SYSTEM_TABLE_INFO));
|
||||
ASSERT (pSystemTableInfo != NULL);
|
||||
pSystemTableInfo->AcpiTableBase = (UINT64) (UINTN)pAcpiTable;
|
||||
pSystemTableInfo->AcpiTableSize = AcpiTableSize;
|
||||
pSystemTableInfo->SmbiosTableBase = (UINT64) (UINTN)pSmbiosTable;
|
||||
pSystemTableInfo->SmbiosTableSize = SmbiosTableSize;
|
||||
DEBUG ((EFI_D_ERROR, "Detected Acpi Table at 0x%x, length 0x%x\n", (UINTN)pSystemTableInfo->AcpiTableBase, pSystemTableInfo->AcpiTableSize));
|
||||
DEBUG ((EFI_D_ERROR, "Detected Smbios Table at 0x%x, length 0x%x\n", (UINTN)pSystemTableInfo->SmbiosTableBase, pSystemTableInfo->SmbiosTableSize));
|
||||
DEBUG ((EFI_D_ERROR, "Create system table info guid hob\n"));
|
||||
|
||||
//
|
||||
// Create guid hob for acpi board information
|
||||
//
|
||||
Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
pAcpiBoardInfo = NULL;
|
||||
pAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));
|
||||
ASSERT (pAcpiBoardInfo != NULL);
|
||||
pAcpiBoardInfo->PmCtrlRegBase = (UINT64)PmCtrlRegBase;
|
||||
pAcpiBoardInfo->PmTimerRegBase = (UINT64)PmTimerRegBase;
|
||||
pAcpiBoardInfo->ResetRegAddress = (UINT64)ResetRegAddress;
|
||||
pAcpiBoardInfo->ResetValue = (UINT8)ResetValue;
|
||||
DEBUG ((EFI_D_ERROR, "Create acpi board info guid hob\n"));
|
||||
|
||||
//
|
||||
// Create guid hob for frame buffer information
|
||||
//
|
||||
ZeroMem (&FbInfo, sizeof (FRAME_BUFFER_INFO));
|
||||
Status = CbParseFbInfo (&FbInfo);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
pFbInfo = BuildGuidHob (&gUefiFrameBufferInfoGuid, sizeof (FRAME_BUFFER_INFO));
|
||||
ASSERT (pSystemTableInfo != NULL);
|
||||
CopyMem (pFbInfo, &FbInfo, sizeof (FRAME_BUFFER_INFO));
|
||||
DEBUG ((EFI_D_ERROR, "Create frame buffer info guid hob\n"));
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
/** @file
|
||||
The header file of Coreboot Support PEIM.
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#ifndef __PEI_COREBOOT_SUPPORT_H__
|
||||
#define __PEI_COREBOOT_SUPPORT_H__
|
||||
|
||||
#include <PiPei.h>
|
||||
|
||||
#include <Library/PeimEntryPoint.h>
|
||||
#include <Library/PeiServicesLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/CbParseLib.h>
|
||||
#include <Library/MtrrLib.h>
|
||||
|
||||
#include <Guid/SmramMemoryReserve.h>
|
||||
#include <Guid/MemoryTypeInformation.h>
|
||||
#include <Guid/FirmwareFileSystem2.h>
|
||||
#include <Guid/FrameBufferInfoGuid.h>
|
||||
#include <Guid/SystemTableInfoGuid.h>
|
||||
#include <Guid/AcpiBoardInfoGuid.h>
|
||||
|
||||
#include <Ppi/MasterBootMode.h>
|
||||
|
||||
#endif
|
|
@ -1,72 +0,0 @@
|
|||
## @file
|
||||
# Coreboot Support PEI Module
|
||||
#
|
||||
# Parses coreboot table in memory and report resource information into pei core. It will install
|
||||
# the memory as required.
|
||||
#
|
||||
# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = CbSupportPeim
|
||||
FILE_GUID = 352C6AF8-315B-4bd6-B04F-31D4ED1EBE57
|
||||
MODULE_TYPE = PEIM
|
||||
VERSION_STRING = 1.0
|
||||
ENTRY_POINT = CbPeiEntryPoint
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64
|
||||
#
|
||||
|
||||
[Sources]
|
||||
CbSupportPei.c
|
||||
CbSupportPei.h
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
|
||||
CorebootModulePkg/CorebootModulePkg.dec
|
||||
UefiCpuPkg/UefiCpuPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
PeimEntryPoint
|
||||
PeiServicesLib
|
||||
BaseLib
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
HobLib
|
||||
PcdLib
|
||||
CbParseLib
|
||||
MtrrLib
|
||||
|
||||
[Guids]
|
||||
gEfiSmmPeiSmramMemoryReserveGuid
|
||||
gEfiMemoryTypeInformationGuid
|
||||
gEfiFirmwareFileSystem2Guid
|
||||
gUefiSystemTableInfoGuid
|
||||
gUefiFrameBufferInfoGuid
|
||||
gUefiAcpiBoardInfoGuid
|
||||
|
||||
[Ppis]
|
||||
gEfiPeiMasterBootModePpiGuid
|
||||
|
||||
[Pcd]
|
||||
gUefiCorebootModulePkgTokenSpaceGuid.PcdPayloadFdMemBase
|
||||
gUefiCorebootModulePkgTokenSpaceGuid.PcdPayloadFdMemSize
|
||||
gUefiCorebootModulePkgTokenSpaceGuid.PcdCbHeaderPointer
|
||||
|
||||
[Depex]
|
||||
TRUE
|
|
@ -1,59 +0,0 @@
|
|||
## @file
|
||||
# Coreboot Support Package
|
||||
#
|
||||
# Provides drivers and definitions to support coreboot in EDKII bios.
|
||||
#
|
||||
# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials are licensed and made available under
|
||||
# the terms and conditions of the BSD License that accompanies this distribution.
|
||||
# The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
DEC_SPECIFICATION = 0x00010005
|
||||
PACKAGE_NAME = CorebootModulePkg
|
||||
PACKAGE_GUID = DE1750CE-FEE7-4dd1-8E9C-B7B8BAEBCF4F
|
||||
PACKAGE_VERSION = 0.1
|
||||
|
||||
[Includes]
|
||||
Include
|
||||
|
||||
[LibraryClasses]
|
||||
CbParseLib|Include/Library/CbParseLib.h
|
||||
|
||||
[Guids]
|
||||
#
|
||||
## Defines the token space for the Coreboot Module Package PCDs.
|
||||
#
|
||||
gUefiCorebootModulePkgTokenSpaceGuid = {0xe6ff49a0, 0x15df, 0x48fd, {0x9a, 0xcf, 0xd7, 0xdc, 0x27, 0x1b, 0x39, 0xd5}}
|
||||
gUefiSystemTableInfoGuid = {0x16c8a6d0, 0xfe8a, 0x4082, {0xa2, 0x8, 0xcf, 0x89, 0xc4, 0x29, 0x4, 0x33}}
|
||||
gUefiFrameBufferInfoGuid = {0xdc2cd8bd, 0x402c, 0x4dc4, {0x9b, 0xe0, 0xc, 0x43, 0x2b, 0x7, 0xfa, 0x34}}
|
||||
gUefiAcpiBoardInfoGuid = {0xad3d31b, 0xb3d8, 0x4506, {0xae, 0x71, 0x2e, 0xf1, 0x10, 0x6, 0xd9, 0xf}}
|
||||
|
||||
|
||||
[Ppis]
|
||||
|
||||
[Protocols]
|
||||
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# PCD Declarations section - list of all PCDs Declared by this Package
|
||||
# Only this package should be providing the
|
||||
# declaration, other packages should not.
|
||||
#
|
||||
################################################################################
|
||||
[PcdsFixedAtBuild, PcdsPatchableInModule]
|
||||
## Indicates the base address of the payload binary in memory
|
||||
gUefiCorebootModulePkgTokenSpaceGuid.PcdPayloadFdMemBase|0|UINT32|0x10000001
|
||||
## Provides the size of the payload binary in memory
|
||||
gUefiCorebootModulePkgTokenSpaceGuid.PcdPayloadFdMemSize|0|UINT32|0x10000002
|
||||
|
||||
[PcdsDynamicEx]
|
||||
gUefiCorebootModulePkgTokenSpaceGuid.PcdCbHeaderPointer|0|UINT32|0x10000003
|
||||
|
|
@ -1,219 +0,0 @@
|
|||
/** @file
|
||||
Coreboot PEI module include file.
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
/*
|
||||
* This file is part of the libpayload project.
|
||||
*
|
||||
* Copyright (C) 2008 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _COREBOOT_PEI_H_INCLUDED_
|
||||
#define _COREBOOT_PEI_H_INCLUDED_
|
||||
|
||||
#pragma warning( disable : 4200 )
|
||||
|
||||
#define DYN_CBMEM_ALIGN_SIZE (4096)
|
||||
|
||||
struct cbmem_entry {
|
||||
UINT32 magic;
|
||||
UINT32 start;
|
||||
UINT32 size;
|
||||
UINT32 id;
|
||||
};
|
||||
|
||||
struct cbmem_root {
|
||||
UINT32 max_entries;
|
||||
UINT32 num_entries;
|
||||
UINT32 locked;
|
||||
UINT32 size;
|
||||
struct cbmem_entry entries[0];
|
||||
};
|
||||
|
||||
struct cbuint64 {
|
||||
UINT32 lo;
|
||||
UINT32 hi;
|
||||
};
|
||||
|
||||
#define CB_HEADER_SIGNATURE 0x4F49424C
|
||||
|
||||
struct cb_header {
|
||||
UINT32 signature;
|
||||
UINT32 header_bytes;
|
||||
UINT32 header_checksum;
|
||||
UINT32 table_bytes;
|
||||
UINT32 table_checksum;
|
||||
UINT32 table_entries;
|
||||
};
|
||||
|
||||
struct cb_record {
|
||||
UINT32 tag;
|
||||
UINT32 size;
|
||||
};
|
||||
|
||||
#define CB_TAG_UNUSED 0x0000
|
||||
#define CB_TAG_MEMORY 0x0001
|
||||
|
||||
struct cb_memory_range {
|
||||
struct cbuint64 start;
|
||||
struct cbuint64 size;
|
||||
UINT32 type;
|
||||
};
|
||||
|
||||
#define CB_MEM_RAM 1
|
||||
#define CB_MEM_RESERVED 2
|
||||
#define CB_MEM_ACPI 3
|
||||
#define CB_MEM_NVS 4
|
||||
#define CB_MEM_UNUSABLE 5
|
||||
#define CB_MEM_VENDOR_RSVD 6
|
||||
#define CB_MEM_TABLE 16
|
||||
|
||||
struct cb_memory {
|
||||
UINT32 tag;
|
||||
UINT32 size;
|
||||
struct cb_memory_range map[0];
|
||||
};
|
||||
|
||||
#define CB_TAG_MAINBOARD 0x0003
|
||||
|
||||
struct cb_mainboard {
|
||||
UINT32 tag;
|
||||
UINT32 size;
|
||||
UINT8 vendor_idx;
|
||||
UINT8 part_number_idx;
|
||||
UINT8 strings[0];
|
||||
};
|
||||
#define CB_TAG_VERSION 0x0004
|
||||
#define CB_TAG_EXTRA_VERSION 0x0005
|
||||
#define CB_TAG_BUILD 0x0006
|
||||
#define CB_TAG_COMPILE_TIME 0x0007
|
||||
#define CB_TAG_COMPILE_BY 0x0008
|
||||
#define CB_TAG_COMPILE_HOST 0x0009
|
||||
#define CB_TAG_COMPILE_DOMAIN 0x000a
|
||||
#define CB_TAG_COMPILER 0x000b
|
||||
#define CB_TAG_LINKER 0x000c
|
||||
#define CB_TAG_ASSEMBLER 0x000d
|
||||
|
||||
struct cb_string {
|
||||
UINT32 tag;
|
||||
UINT32 size;
|
||||
UINT8 string[0];
|
||||
};
|
||||
|
||||
#define CB_TAG_SERIAL 0x000f
|
||||
|
||||
struct cb_serial {
|
||||
UINT32 tag;
|
||||
UINT32 size;
|
||||
#define CB_SERIAL_TYPE_IO_MAPPED 1
|
||||
#define CB_SERIAL_TYPE_MEMORY_MAPPED 2
|
||||
UINT32 type;
|
||||
UINT32 baseaddr;
|
||||
UINT32 baud;
|
||||
};
|
||||
|
||||
#define CB_TAG_CONSOLE 0x00010
|
||||
|
||||
struct cb_console {
|
||||
UINT32 tag;
|
||||
UINT32 size;
|
||||
UINT16 type;
|
||||
};
|
||||
|
||||
#define CB_TAG_CONSOLE_SERIAL8250 0
|
||||
#define CB_TAG_CONSOLE_VGA 1 // OBSOLETE
|
||||
#define CB_TAG_CONSOLE_BTEXT 2 // OBSOLETE
|
||||
#define CB_TAG_CONSOLE_LOGBUF 3
|
||||
#define CB_TAG_CONSOLE_SROM 4 // OBSOLETE
|
||||
#define CB_TAG_CONSOLE_EHCI 5
|
||||
|
||||
#define CB_TAG_FORWARD 0x00011
|
||||
|
||||
struct cb_forward {
|
||||
UINT32 tag;
|
||||
UINT32 size;
|
||||
UINT64 forward;
|
||||
};
|
||||
|
||||
#define CB_TAG_FRAMEBUFFER 0x0012
|
||||
struct cb_framebuffer {
|
||||
UINT32 tag;
|
||||
UINT32 size;
|
||||
|
||||
UINT64 physical_address;
|
||||
UINT32 x_resolution;
|
||||
UINT32 y_resolution;
|
||||
UINT32 bytes_per_line;
|
||||
UINT8 bits_per_pixel;
|
||||
UINT8 red_mask_pos;
|
||||
UINT8 red_mask_size;
|
||||
UINT8 green_mask_pos;
|
||||
UINT8 green_mask_size;
|
||||
UINT8 blue_mask_pos;
|
||||
UINT8 blue_mask_size;
|
||||
UINT8 reserved_mask_pos;
|
||||
UINT8 reserved_mask_size;
|
||||
};
|
||||
|
||||
#define CB_TAG_VDAT 0x0015
|
||||
struct cb_vdat {
|
||||
UINT32 tag;
|
||||
UINT32 size; /* size of the entire entry */
|
||||
UINT64 vdat_addr;
|
||||
UINT32 vdat_size;
|
||||
};
|
||||
|
||||
#define CB_TAG_TIMESTAMPS 0x0016
|
||||
#define CB_TAG_CBMEM_CONSOLE 0x0017
|
||||
#define CB_TAG_MRC_CACHE 0x0018
|
||||
struct cb_cbmem_tab {
|
||||
UINT32 tag;
|
||||
UINT32 size;
|
||||
UINT64 cbmem_tab;
|
||||
};
|
||||
|
||||
/* Helpful macros */
|
||||
|
||||
#define MEM_RANGE_COUNT(_rec) \
|
||||
(((_rec)->size - sizeof(*(_rec))) / sizeof((_rec)->map[0]))
|
||||
|
||||
#define MEM_RANGE_PTR(_rec, _idx) \
|
||||
(void *)(((UINT8 *) (_rec)) + sizeof(*(_rec)) \
|
||||
+ (sizeof((_rec)->map[0]) * (_idx)))
|
||||
|
||||
|
||||
#endif // _COREBOOT_PEI_H_INCLUDED_
|
|
@ -1,30 +0,0 @@
|
|||
/** @file
|
||||
This file defines the hob structure for board related information from acpi table
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __ACPI_BOARD_INFO_GUID_H__
|
||||
#define __ACPI_BOARD_INFO_GUID_H__
|
||||
|
||||
///
|
||||
/// Board information GUID
|
||||
///
|
||||
extern EFI_GUID gUefiAcpiBoardInfoGuid;
|
||||
|
||||
typedef struct {
|
||||
UINT64 PmCtrlRegBase;
|
||||
UINT64 PmTimerRegBase;
|
||||
UINT64 ResetRegAddress;
|
||||
UINT8 ResetValue;
|
||||
} ACPI_BOARD_INFO;
|
||||
|
||||
#endif
|
|
@ -1,40 +0,0 @@
|
|||
/** @file
|
||||
This file defines the hob structure for frame buffer device.
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __FRAME_BUFFER_INFO_GUID_H__
|
||||
#define __FRAME_BUFFER_INFO_GUID_H__
|
||||
|
||||
///
|
||||
/// Frame Buffer Information GUID
|
||||
///
|
||||
extern EFI_GUID gUefiFrameBufferInfoGuid;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Position; // Position of the color
|
||||
UINT8 Mask; // The number of bits expressed as a mask
|
||||
} COLOR_PLACEMENT;
|
||||
|
||||
typedef struct {
|
||||
UINT64 LinearFrameBuffer;
|
||||
UINT32 HorizontalResolution;
|
||||
UINT32 VerticalResolution;
|
||||
UINT32 BitsPerPixel;
|
||||
UINT16 BytesPerScanLine;
|
||||
COLOR_PLACEMENT Red;
|
||||
COLOR_PLACEMENT Green;
|
||||
COLOR_PLACEMENT Blue;
|
||||
COLOR_PLACEMENT Reserved;
|
||||
} FRAME_BUFFER_INFO;
|
||||
|
||||
#endif
|
|
@ -1,30 +0,0 @@
|
|||
/** @file
|
||||
This file defines the hob structure for system tables like ACPI, SMBIOS tables.
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php.
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __SYSTEM_TABLE_INFO_GUID_H__
|
||||
#define __SYSTEM_TABLE_INFO_GUID_H__
|
||||
|
||||
///
|
||||
/// System Table Information GUID
|
||||
///
|
||||
extern EFI_GUID gUefiSystemTableInfoGuid;
|
||||
|
||||
typedef struct {
|
||||
UINT64 AcpiTableBase;
|
||||
UINT32 AcpiTableSize;
|
||||
UINT64 SmbiosTableBase;
|
||||
UINT32 SmbiosTableSize;
|
||||
} SYSTEM_TABLE_INFO;
|
||||
|
||||
#endif
|
|
@ -1,154 +0,0 @@
|
|||
/** @file
|
||||
This library will parse the coreboot table in memory and extract those required
|
||||
information.
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
#include <Guid/FrameBufferInfoGuid.h>
|
||||
|
||||
/**
|
||||
Acquire the memory information from the coreboot table in memory.
|
||||
|
||||
@param pLowMemorySize Pointer to the variable of low memory size
|
||||
@param pHighMemorySize Pointer to the variable of high memory size
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out the memory information.
|
||||
@retval RETURN_INVALID_PARAMETER Invalid input parameters.
|
||||
@retval RETURN_NOT_FOUND Failed to find the memory information.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseMemoryInfo (
|
||||
IN UINT64* pLowMemorySize,
|
||||
IN UINT64* pHighMemorySize
|
||||
);
|
||||
|
||||
/**
|
||||
Acquire the coreboot memory table with the given table id
|
||||
|
||||
@param TableId Table id to be searched
|
||||
@param pMemTable Pointer to the base address of the memory table
|
||||
@param pMemTableSize Pointer to the size of the memory table
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out the memory table.
|
||||
@retval RETURN_INVALID_PARAMETER Invalid input parameters.
|
||||
@retval RETURN_NOT_FOUND Failed to find the memory table.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseCbMemTable (
|
||||
IN UINT32 TableId,
|
||||
IN VOID** pMemTable,
|
||||
IN UINT32* pMemTableSize
|
||||
);
|
||||
|
||||
/**
|
||||
Acquire the acpi table from coreboot
|
||||
|
||||
@param pMemTable Pointer to the base address of the memory table
|
||||
@param pMemTableSize Pointer to the size of the memory table
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out the memory table.
|
||||
@retval RETURN_INVALID_PARAMETER Invalid input parameters.
|
||||
@retval RETURN_NOT_FOUND Failed to find the memory table.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseAcpiTable (
|
||||
IN VOID** pMemTable,
|
||||
IN UINT32* pMemTableSize
|
||||
);
|
||||
|
||||
/**
|
||||
Acquire the smbios table from coreboot
|
||||
|
||||
@param pMemTable Pointer to the base address of the memory table
|
||||
@param pMemTableSize Pointer to the size of the memory table
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out the memory table.
|
||||
@retval RETURN_INVALID_PARAMETER Invalid input parameters.
|
||||
@retval RETURN_NOT_FOUND Failed to find the memory table.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseSmbiosTable (
|
||||
IN VOID** pMemTable,
|
||||
IN UINT32* pMemTableSize
|
||||
);
|
||||
|
||||
/**
|
||||
Find the required fadt information
|
||||
|
||||
@param pPmCtrlReg Pointer to the address of power management control register
|
||||
@param pPmTimerReg Pointer to the address of power management timer register
|
||||
@param pResetReg Pointer to the address of system reset register
|
||||
@param pResetValue Pointer to the value to be writen to the system reset register
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out all the required fadt information.
|
||||
@retval RETURN_NOT_FOUND Failed to find the fadt table.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseFadtInfo (
|
||||
IN UINTN* pPmCtrlReg,
|
||||
IN UINTN* pPmTimerReg,
|
||||
IN UINTN* pResetReg,
|
||||
IN UINTN* pResetValue
|
||||
);
|
||||
|
||||
/**
|
||||
Find the serial port information
|
||||
|
||||
@param pRegBase Pointer to the base address of serial port registers
|
||||
@param pRegAccessType Pointer to the access type of serial port registers
|
||||
@param pBaudrate Pointer to the serial port baudrate
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find the serial port information.
|
||||
@retval RETURN_NOT_FOUND Failed to find the serial port information .
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseSerialInfo (
|
||||
IN UINT32* pRegBase,
|
||||
IN UINT32* pRegAccessType,
|
||||
IN UINT32* pBaudrate
|
||||
);
|
||||
|
||||
/**
|
||||
Search for the coreboot table header
|
||||
|
||||
@param Level Level of the search depth
|
||||
@param HeaderPtr Pointer to the pointer of coreboot table header
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find the coreboot table header .
|
||||
@retval RETURN_NOT_FOUND Failed to find the coreboot table header .
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseGetCbHeader (
|
||||
IN UINTN Level,
|
||||
IN VOID** HeaderPtr
|
||||
);
|
||||
|
||||
/**
|
||||
Find the video frame buffer information
|
||||
|
||||
@param pFbInfo Pointer to the FRAME_BUFFER_INFO structure
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find the video frame buffer information.
|
||||
@retval RETURN_NOT_FOUND Failed to find the video frame buffer information .
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseFbInfo (
|
||||
IN FRAME_BUFFER_INFO* pFbInfo
|
||||
);
|
||||
|
|
@ -1,567 +0,0 @@
|
|||
/** @file
|
||||
This library will parse the coreboot table in memory and extract those required
|
||||
information.
|
||||
|
||||
Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <Uefi/UefiBaseType.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/CbParseLib.h>
|
||||
|
||||
#include <IndustryStandard/Acpi.h>
|
||||
|
||||
#include "Coreboot.h"
|
||||
|
||||
/* Helpful inlines */
|
||||
|
||||
static UINT64 cb_unpack64(struct cbuint64 val)
|
||||
{
|
||||
return (((UINT64) val.hi) << 32) | val.lo;
|
||||
}
|
||||
|
||||
static const char *cb_mb_vendor_string(const struct cb_mainboard *cbm)
|
||||
{
|
||||
return (char *)(cbm->strings + cbm->vendor_idx);
|
||||
}
|
||||
|
||||
static const char *cb_mb_part_string(const struct cb_mainboard *cbm)
|
||||
{
|
||||
return (char *)(cbm->strings + cbm->part_number_idx);
|
||||
}
|
||||
|
||||
UINT16
|
||||
CbCheckSum16 (
|
||||
IN UINT16 *Buffer,
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
UINT32 Sum, TmpValue;
|
||||
UINTN Idx;
|
||||
UINT8 *TmpPtr;
|
||||
|
||||
Sum = 0;
|
||||
TmpPtr = (UINT8 *)Buffer;
|
||||
for(Idx = 0; Idx < Length; Idx++) {
|
||||
TmpValue = TmpPtr[Idx];
|
||||
if (Idx % 2 == 1) {
|
||||
TmpValue <<= 8;
|
||||
}
|
||||
|
||||
Sum += TmpValue;
|
||||
|
||||
// Wrap
|
||||
if (Sum >= 0x10000) {
|
||||
Sum = (Sum + (Sum >> 16)) & 0xFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
return (UINT16)((~Sum) & 0xFFFF);
|
||||
}
|
||||
|
||||
VOID *
|
||||
FindCbTag (
|
||||
IN VOID *Start,
|
||||
IN UINT32 Tag
|
||||
)
|
||||
{
|
||||
struct cb_header *Header;
|
||||
struct cb_record *Record;
|
||||
UINT8 *TmpPtr;
|
||||
UINT8 *TagPtr;
|
||||
UINTN Idx;
|
||||
UINT16 CheckSum;
|
||||
|
||||
Header = NULL;
|
||||
TmpPtr = (UINT8 *)Start;
|
||||
for (Idx = 0; Idx < 4096; Idx += 16, TmpPtr += 16) {
|
||||
Header = (struct cb_header *)TmpPtr;
|
||||
if (Header->signature == CB_HEADER_SIGNATURE) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Idx >= 4096)
|
||||
return NULL;
|
||||
|
||||
if (Header == NULL || !Header->table_bytes)
|
||||
return NULL;
|
||||
|
||||
//
|
||||
// Check the checksum of the coreboot table header
|
||||
//
|
||||
CheckSum = CbCheckSum16 ((UINT16 *)Header, sizeof (*Header));
|
||||
if (CheckSum != 0) {
|
||||
DEBUG ((EFI_D_ERROR, "Invalid coreboot table header checksum\n"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CheckSum = CbCheckSum16 ((UINT16 *)(TmpPtr + sizeof (*Header)), Header->table_bytes);
|
||||
if (CheckSum != Header->table_checksum) {
|
||||
DEBUG ((EFI_D_ERROR, "Incorrect checksum of all the coreboot table entries\n"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
TagPtr = NULL;
|
||||
TmpPtr += Header->header_bytes;
|
||||
for (Idx = 0; Idx < Header->table_entries; Idx++) {
|
||||
Record = (struct cb_record *)TmpPtr;
|
||||
if (Record->tag == CB_TAG_FORWARD) {
|
||||
TmpPtr = (VOID *)(UINTN)((struct cb_forward *)(UINTN)Record)->forward;
|
||||
if (Tag == CB_TAG_FORWARD)
|
||||
return TmpPtr;
|
||||
else
|
||||
return FindCbTag (TmpPtr, Tag);
|
||||
}
|
||||
if (Record->tag == Tag) {
|
||||
TagPtr = TmpPtr;
|
||||
break;
|
||||
}
|
||||
TmpPtr += Record->size;
|
||||
}
|
||||
|
||||
return TagPtr;
|
||||
}
|
||||
|
||||
RETURN_STATUS
|
||||
FindCbMemTable (
|
||||
struct cbmem_root *root,
|
||||
IN UINT32 TableId,
|
||||
IN VOID** pMemTable,
|
||||
IN UINT32* pMemTableSize
|
||||
)
|
||||
{
|
||||
UINTN Idx;
|
||||
|
||||
if ((!root) || (!pMemTable))
|
||||
return RETURN_INVALID_PARAMETER;
|
||||
|
||||
for (Idx = 0; Idx < root->num_entries; Idx++) {
|
||||
if (root->entries[Idx].id == TableId) {
|
||||
*pMemTable = (VOID *) (UINTN)root->entries[Idx].start;
|
||||
if (pMemTableSize)
|
||||
*pMemTableSize = root->entries[Idx].size;
|
||||
|
||||
DEBUG ((EFI_D_ERROR, "Find CbMemTable Id 0x%x, base 0x%x, size 0x%x\n", TableId, *pMemTable, *pMemTableSize));
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return RETURN_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Acquire the memory information from the coreboot table in memory.
|
||||
|
||||
@param pLowMemorySize Pointer to the variable of low memory size
|
||||
@param pHighMemorySize Pointer to the variable of high memory size
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out the memory information.
|
||||
@retval RETURN_INVALID_PARAMETER Invalid input parameters.
|
||||
@retval RETURN_NOT_FOUND Failed to find the memory information.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseMemoryInfo (
|
||||
IN UINT64* pLowMemorySize,
|
||||
IN UINT64* pHighMemorySize
|
||||
)
|
||||
{
|
||||
struct cb_memory* rec;
|
||||
struct cb_memory_range* Range;
|
||||
UINT64 Start;
|
||||
UINT64 Size;
|
||||
UINTN Index;
|
||||
|
||||
if ((!pLowMemorySize) || (!pHighMemorySize))
|
||||
return RETURN_INVALID_PARAMETER;
|
||||
|
||||
//
|
||||
// Get the coreboot memory table
|
||||
//
|
||||
rec = (struct cb_memory *)FindCbTag (0, CB_TAG_MEMORY);
|
||||
if (!rec)
|
||||
rec = (struct cb_memory *)FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_MEMORY);
|
||||
|
||||
if (!rec)
|
||||
return RETURN_NOT_FOUND;
|
||||
|
||||
*pLowMemorySize = 0;
|
||||
*pHighMemorySize = 0;
|
||||
|
||||
for (Index = 0; Index < MEM_RANGE_COUNT(rec); Index++) {
|
||||
Range = MEM_RANGE_PTR(rec, Index);
|
||||
Start = cb_unpack64(Range->start);
|
||||
Size = cb_unpack64(Range->size);
|
||||
DEBUG ((EFI_D_ERROR, "%d. %016lx - %016lx [%02x]\n",
|
||||
Index, Start, Start + Size - 1, Range->type));
|
||||
|
||||
if (Range->type != CB_MEM_RAM) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Start + Size < 0x100000000ULL) {
|
||||
*pLowMemorySize = Start + Size;
|
||||
} else {
|
||||
*pHighMemorySize = Start + Size - 0x100000000ULL;
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG ((EFI_D_ERROR, "Low memory 0x%x, High Memory 0x%x\n", *pLowMemorySize, *pHighMemorySize));
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Acquire the coreboot memory table with the given table id
|
||||
|
||||
@param TableId Table id to be searched
|
||||
@param pMemTable Pointer to the base address of the memory table
|
||||
@param pMemTableSize Pointer to the size of the memory table
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out the memory table.
|
||||
@retval RETURN_INVALID_PARAMETER Invalid input parameters.
|
||||
@retval RETURN_NOT_FOUND Failed to find the memory table.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseCbMemTable (
|
||||
IN UINT32 TableId,
|
||||
IN VOID** pMemTable,
|
||||
IN UINT32* pMemTableSize
|
||||
)
|
||||
{
|
||||
struct cb_memory* rec;
|
||||
struct cb_memory_range* Range;
|
||||
UINT64 Start;
|
||||
UINT64 Size;
|
||||
UINTN Index;
|
||||
|
||||
if (!pMemTable)
|
||||
return RETURN_INVALID_PARAMETER;
|
||||
|
||||
*pMemTable = NULL;
|
||||
|
||||
//
|
||||
// Get the coreboot memory table
|
||||
//
|
||||
rec = (struct cb_memory *)FindCbTag (0, CB_TAG_MEMORY);
|
||||
if (!rec)
|
||||
rec = (struct cb_memory *)FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_MEMORY);
|
||||
|
||||
if (!rec)
|
||||
return RETURN_NOT_FOUND;
|
||||
|
||||
for (Index = 0; Index < MEM_RANGE_COUNT(rec); Index++) {
|
||||
Range = MEM_RANGE_PTR(rec, Index);
|
||||
Start = cb_unpack64(Range->start);
|
||||
Size = cb_unpack64(Range->size);
|
||||
|
||||
if ((Range->type == CB_MEM_TABLE) && (Start > 0x1000)) {
|
||||
if (FindCbMemTable ((struct cbmem_root *)(UINTN)(Start + Size - DYN_CBMEM_ALIGN_SIZE), TableId, pMemTable, pMemTableSize) == RETURN_SUCCESS)
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return RETURN_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Acquire the acpi table from coreboot
|
||||
|
||||
@param pMemTable Pointer to the base address of the memory table
|
||||
@param pMemTableSize Pointer to the size of the memory table
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out the memory table.
|
||||
@retval RETURN_INVALID_PARAMETER Invalid input parameters.
|
||||
@retval RETURN_NOT_FOUND Failed to find the memory table.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseAcpiTable (
|
||||
IN VOID** pMemTable,
|
||||
IN UINT32* pMemTableSize
|
||||
)
|
||||
{
|
||||
return CbParseCbMemTable (SIGNATURE_32 ('I', 'P', 'C', 'A'), pMemTable, pMemTableSize);
|
||||
}
|
||||
|
||||
/**
|
||||
Acquire the smbios table from coreboot
|
||||
|
||||
@param pMemTable Pointer to the base address of the memory table
|
||||
@param pMemTableSize Pointer to the size of the memory table
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out the memory table.
|
||||
@retval RETURN_INVALID_PARAMETER Invalid input parameters.
|
||||
@retval RETURN_NOT_FOUND Failed to find the memory table.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseSmbiosTable (
|
||||
IN VOID** pMemTable,
|
||||
IN UINT32* pMemTableSize
|
||||
)
|
||||
{
|
||||
return CbParseCbMemTable (SIGNATURE_32 ('T', 'B', 'M', 'S'), pMemTable, pMemTableSize);
|
||||
}
|
||||
|
||||
/**
|
||||
Find the required fadt information
|
||||
|
||||
@param pPmCtrlReg Pointer to the address of power management control register
|
||||
@param pPmTimerReg Pointer to the address of power management timer register
|
||||
@param pResetReg Pointer to the address of system reset register
|
||||
@param pResetValue Pointer to the value to be writen to the system reset register
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find out all the required fadt information.
|
||||
@retval RETURN_NOT_FOUND Failed to find the fadt table.
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseFadtInfo (
|
||||
IN UINTN* pPmCtrlReg,
|
||||
IN UINTN* pPmTimerReg,
|
||||
IN UINTN* pResetReg,
|
||||
IN UINTN* pResetValue
|
||||
)
|
||||
{
|
||||
EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER* Rsdp;
|
||||
EFI_ACPI_DESCRIPTION_HEADER* Rsdt;
|
||||
UINT32* Entry32;
|
||||
UINTN Entry32Num;
|
||||
EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE* Fadt;
|
||||
EFI_ACPI_DESCRIPTION_HEADER* Xsdt;
|
||||
UINT64* Entry64;
|
||||
UINTN Entry64Num;
|
||||
UINTN Idx;
|
||||
RETURN_STATUS Status;
|
||||
|
||||
Rsdp = NULL;
|
||||
Status = RETURN_SUCCESS;
|
||||
|
||||
Status = CbParseAcpiTable (&Rsdp, NULL);
|
||||
if (RETURN_ERROR(Status))
|
||||
return Status;
|
||||
|
||||
if (!Rsdp)
|
||||
return RETURN_NOT_FOUND;
|
||||
|
||||
DEBUG ((EFI_D_ERROR, "Find Rsdp at 0x%x\n", Rsdp));
|
||||
DEBUG ((EFI_D_ERROR, "Find Rsdt 0x%x, Xsdt 0x%x\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));
|
||||
|
||||
//
|
||||
// Search Rsdt First
|
||||
//
|
||||
Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);
|
||||
if (Rsdt != NULL) {
|
||||
Entry32 = (UINT32 *)(Rsdt + 1);
|
||||
Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;
|
||||
for (Idx = 0; Idx < Entry32Num; Idx++) {
|
||||
if (*(UINT32 *)(UINTN)(Entry32[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {
|
||||
Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry32[Idx]);
|
||||
if (pPmCtrlReg)
|
||||
*pPmCtrlReg = Fadt->Pm1aCntBlk;
|
||||
DEBUG ((EFI_D_ERROR, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));
|
||||
|
||||
if (pPmTimerReg)
|
||||
*pPmTimerReg = Fadt->PmTmrBlk;
|
||||
DEBUG ((EFI_D_ERROR, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));
|
||||
|
||||
if (pResetReg)
|
||||
*pResetReg = (UINTN)Fadt->ResetReg.Address;
|
||||
DEBUG ((EFI_D_ERROR, "Reset Reg 0x%x\n", Fadt->ResetReg.Address));
|
||||
|
||||
if (pResetValue)
|
||||
*pResetValue = Fadt->ResetValue;
|
||||
DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Search Xsdt Second
|
||||
//
|
||||
Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);
|
||||
if (Xsdt != NULL) {
|
||||
Entry64 = (UINT64 *)(Xsdt + 1);
|
||||
Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;
|
||||
for (Idx = 0; Idx < Entry64Num; Idx++) {
|
||||
if (*(UINT32 *)(UINTN)(Entry64[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {
|
||||
Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry64[Idx]);
|
||||
if (pPmCtrlReg)
|
||||
*pPmCtrlReg = Fadt->Pm1aCntBlk;
|
||||
DEBUG ((EFI_D_ERROR, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));
|
||||
|
||||
if (pPmTimerReg)
|
||||
*pPmTimerReg = Fadt->PmTmrBlk;
|
||||
DEBUG ((EFI_D_ERROR, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));
|
||||
|
||||
if (pResetReg)
|
||||
*pResetReg = (UINTN)Fadt->ResetReg.Address;
|
||||
DEBUG ((EFI_D_ERROR, "Reset Reg 0x%x\n", Fadt->ResetReg.Address));
|
||||
|
||||
if (pResetValue)
|
||||
*pResetValue = Fadt->ResetValue;
|
||||
DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return RETURN_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
Find the serial port information
|
||||
|
||||
@param pRegBase Pointer to the base address of serial port registers
|
||||
@param pRegAccessType Pointer to the access type of serial port registers
|
||||
@param pBaudrate Pointer to the serial port baudrate
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find the serial port information.
|
||||
@retval RETURN_NOT_FOUND Failed to find the serial port information .
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseSerialInfo (
|
||||
IN UINT32* pRegBase,
|
||||
IN UINT32* pRegAccessType,
|
||||
IN UINT32* pBaudrate
|
||||
)
|
||||
{
|
||||
struct cb_serial* CbSerial;
|
||||
|
||||
CbSerial = FindCbTag (0, CB_TAG_SERIAL);
|
||||
if (!CbSerial)
|
||||
CbSerial = FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_SERIAL);
|
||||
|
||||
if (!CbSerial)
|
||||
return RETURN_NOT_FOUND;
|
||||
|
||||
if (pRegBase)
|
||||
*pRegBase = CbSerial->baseaddr;
|
||||
|
||||
if (pRegAccessType)
|
||||
*pRegAccessType = CbSerial->type;
|
||||
|
||||
if (pBaudrate)
|
||||
*pBaudrate = CbSerial->baud;
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Search for the coreboot table header
|
||||
|
||||
@param Level Level of the search depth
|
||||
@param HeaderPtr Pointer to the pointer of coreboot table header
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find the coreboot table header .
|
||||
@retval RETURN_NOT_FOUND Failed to find the coreboot table header .
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseGetCbHeader (
|
||||
IN UINTN Level,
|
||||
IN VOID** HeaderPtr
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
VOID* TempPtr;
|
||||
|
||||
if (!HeaderPtr)
|
||||
return RETURN_NOT_FOUND;
|
||||
|
||||
TempPtr = NULL;
|
||||
for (Index = 0; Index < Level; Index++) {
|
||||
TempPtr = FindCbTag (TempPtr, CB_TAG_FORWARD);
|
||||
if (!TempPtr)
|
||||
break;
|
||||
}
|
||||
|
||||
if ((Index >= Level) && (TempPtr != NULL)) {
|
||||
*HeaderPtr = TempPtr;
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
return RETURN_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
Find the video frame buffer information
|
||||
|
||||
@param pFbInfo Pointer to the FRAME_BUFFER_INFO structure
|
||||
|
||||
@retval RETURN_SUCCESS Successfully find the video frame buffer information.
|
||||
@retval RETURN_NOT_FOUND Failed to find the video frame buffer information .
|
||||
|
||||
**/
|
||||
RETURN_STATUS
|
||||
CbParseFbInfo (
|
||||
IN FRAME_BUFFER_INFO* pFbInfo
|
||||
)
|
||||
{
|
||||
struct cb_framebuffer* CbFbRec;
|
||||
|
||||
if (!pFbInfo)
|
||||
return RETURN_INVALID_PARAMETER;
|
||||
|
||||
CbFbRec = FindCbTag (0, CB_TAG_FRAMEBUFFER);
|
||||
if (!CbFbRec)
|
||||
CbFbRec = FindCbTag ((VOID *)(UINTN)PcdGet32 (PcdCbHeaderPointer), CB_TAG_FRAMEBUFFER);
|
||||
|
||||
if (!CbFbRec)
|
||||
return RETURN_NOT_FOUND;
|
||||
|
||||
DEBUG ((EFI_D_ERROR, "Found coreboot video frame buffer information\n"));
|
||||
DEBUG ((EFI_D_ERROR, "physical_address: 0x%x\n", CbFbRec->physical_address));
|
||||
DEBUG ((EFI_D_ERROR, "x_resolution: 0x%x\n", CbFbRec->x_resolution));
|
||||
DEBUG ((EFI_D_ERROR, "y_resolution: 0x%x\n", CbFbRec->y_resolution));
|
||||
DEBUG ((EFI_D_ERROR, "bits_per_pixel: 0x%x\n", CbFbRec->bits_per_pixel));
|
||||
DEBUG ((EFI_D_ERROR, "bytes_per_line: 0x%x\n", CbFbRec->bytes_per_line));
|
||||
|
||||
DEBUG ((EFI_D_ERROR, "red_mask_size: 0x%x\n", CbFbRec->red_mask_size));
|
||||
DEBUG ((EFI_D_ERROR, "red_mask_pos: 0x%x\n", CbFbRec->red_mask_pos));
|
||||
DEBUG ((EFI_D_ERROR, "green_mask_size: 0x%x\n", CbFbRec->green_mask_size));
|
||||
DEBUG ((EFI_D_ERROR, "green_mask_pos: 0x%x\n", CbFbRec->green_mask_pos));
|
||||
DEBUG ((EFI_D_ERROR, "blue_mask_size: 0x%x\n", CbFbRec->blue_mask_size));
|
||||
DEBUG ((EFI_D_ERROR, "blue_mask_pos: 0x%x\n", CbFbRec->blue_mask_pos));
|
||||
DEBUG ((EFI_D_ERROR, "reserved_mask_size: 0x%x\n", CbFbRec->reserved_mask_size));
|
||||
DEBUG ((EFI_D_ERROR, "reserved_mask_pos: 0x%x\n", CbFbRec->reserved_mask_pos));
|
||||
|
||||
pFbInfo->LinearFrameBuffer = CbFbRec->physical_address;
|
||||
pFbInfo->HorizontalResolution = CbFbRec->x_resolution;
|
||||
pFbInfo->VerticalResolution = CbFbRec->y_resolution;
|
||||
pFbInfo->BitsPerPixel = CbFbRec->bits_per_pixel;
|
||||
pFbInfo->BytesPerScanLine = (UINT16)CbFbRec->bytes_per_line;
|
||||
pFbInfo->Red.Mask = (1 << CbFbRec->red_mask_size) - 1;
|
||||
pFbInfo->Red.Position = CbFbRec->red_mask_pos;
|
||||
pFbInfo->Green.Mask = (1 << CbFbRec->green_mask_size) - 1;
|
||||
pFbInfo->Green.Position = CbFbRec->green_mask_pos;
|
||||
pFbInfo->Blue.Mask = (1 << CbFbRec->blue_mask_size) - 1;
|
||||
pFbInfo->Blue.Position = CbFbRec->blue_mask_pos;
|
||||
pFbInfo->Reserved.Mask = (1 << CbFbRec->reserved_mask_size) - 1;
|
||||
pFbInfo->Reserved.Position = CbFbRec->reserved_mask_pos;
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
## @file
|
||||
# Coreboot Table Parse Library.
|
||||
#
|
||||
# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = CbParseLib
|
||||
FILE_GUID = 49EDFC9E-5945-4386-9C0B-C9B60CD45BB1
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = CbParseLib
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64
|
||||
#
|
||||
|
||||
[Sources]
|
||||
CbParseLib.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
CorebootModulePkg/CorebootModulePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
PcdLib
|
||||
|
||||
[Pcd]
|
||||
gUefiCorebootModulePkgTokenSpaceGuid.PcdCbHeaderPointer
|
|
@ -1,199 +0,0 @@
|
|||
/** @file
|
||||
Locate the entry point for the PEI Core
|
||||
|
||||
Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiPei.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/PeCoffGetEntryPointLib.h>
|
||||
|
||||
#include "SecMain.h"
|
||||
|
||||
/**
|
||||
Find core image base.
|
||||
|
||||
@param BootFirmwareVolumePtr Point to the boot firmware volume.
|
||||
@param SecCoreImageBase The base address of the SEC core image.
|
||||
@param PeiCoreImageBase The base address of the PEI core image.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FindImageBase (
|
||||
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
|
||||
OUT EFI_PHYSICAL_ADDRESS *SecCoreImageBase,
|
||||
OUT EFI_PHYSICAL_ADDRESS *PeiCoreImageBase
|
||||
)
|
||||
{
|
||||
EFI_PHYSICAL_ADDRESS CurrentAddress;
|
||||
EFI_PHYSICAL_ADDRESS EndOfFirmwareVolume;
|
||||
EFI_FFS_FILE_HEADER *File;
|
||||
UINT32 Size;
|
||||
EFI_PHYSICAL_ADDRESS EndOfFile;
|
||||
EFI_COMMON_SECTION_HEADER *Section;
|
||||
EFI_PHYSICAL_ADDRESS EndOfSection;
|
||||
|
||||
*SecCoreImageBase = 0;
|
||||
*PeiCoreImageBase = 0;
|
||||
|
||||
CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) BootFirmwareVolumePtr;
|
||||
EndOfFirmwareVolume = CurrentAddress + BootFirmwareVolumePtr->FvLength;
|
||||
|
||||
//
|
||||
// Loop through the FFS files in the Boot Firmware Volume
|
||||
//
|
||||
for (EndOfFile = CurrentAddress + BootFirmwareVolumePtr->HeaderLength; ; ) {
|
||||
|
||||
CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;
|
||||
if (CurrentAddress > EndOfFirmwareVolume) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;
|
||||
if (IS_FFS_FILE2 (File)) {
|
||||
Size = FFS_FILE2_SIZE (File);
|
||||
if (Size <= 0x00FFFFFF) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
} else {
|
||||
Size = FFS_FILE_SIZE (File);
|
||||
if (Size < sizeof (EFI_FFS_FILE_HEADER)) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
|
||||
EndOfFile = CurrentAddress + Size;
|
||||
if (EndOfFile > EndOfFirmwareVolume) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
//
|
||||
// Look for SEC Core / PEI Core files
|
||||
//
|
||||
if (File->Type != EFI_FV_FILETYPE_SECURITY_CORE &&
|
||||
File->Type != EFI_FV_FILETYPE_PEI_CORE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop through the FFS file sections within the FFS file
|
||||
//
|
||||
if (IS_FFS_FILE2 (File)) {
|
||||
EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File + sizeof (EFI_FFS_FILE_HEADER2));
|
||||
} else {
|
||||
EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File + sizeof (EFI_FFS_FILE_HEADER));
|
||||
}
|
||||
for (;;) {
|
||||
CurrentAddress = (EndOfSection + 3) & 0xfffffffffffffffcULL;
|
||||
Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;
|
||||
|
||||
if (IS_SECTION2 (Section)) {
|
||||
Size = SECTION2_SIZE (Section);
|
||||
if (Size <= 0x00FFFFFF) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
} else {
|
||||
Size = SECTION_SIZE (Section);
|
||||
if (Size < sizeof (EFI_COMMON_SECTION_HEADER)) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
|
||||
EndOfSection = CurrentAddress + Size;
|
||||
if (EndOfSection > EndOfFile) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
//
|
||||
// Look for executable sections
|
||||
//
|
||||
if (Section->Type == EFI_SECTION_PE32 || Section->Type == EFI_SECTION_TE) {
|
||||
if (File->Type == EFI_FV_FILETYPE_SECURITY_CORE) {
|
||||
if (IS_SECTION2 (Section)) {
|
||||
*SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));
|
||||
} else {
|
||||
*SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));
|
||||
}
|
||||
} else {
|
||||
if (IS_SECTION2 (Section)) {
|
||||
*PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));
|
||||
} else {
|
||||
*PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Both SEC Core and PEI Core images found
|
||||
//
|
||||
if (*SecCoreImageBase != 0 && *PeiCoreImageBase != 0) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Find and return Pei Core entry point.
|
||||
|
||||
It also find SEC and PEI Core file debug inforamtion. It will report them if
|
||||
remote debug is enabled.
|
||||
|
||||
@param BootFirmwareVolumePtr Point to the boot firmware volume.
|
||||
@param PeiCoreEntryPoint The entry point of the PEI core.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FindAndReportEntryPoints (
|
||||
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
|
||||
OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS SecCoreImageBase;
|
||||
EFI_PHYSICAL_ADDRESS PeiCoreImageBase;
|
||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
||||
|
||||
//
|
||||
// Find SEC Core and PEI Core image base
|
||||
//
|
||||
Status = FindImageBase (BootFirmwareVolumePtr, &SecCoreImageBase, &PeiCoreImageBase);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
ZeroMem ((VOID *) &ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));
|
||||
//
|
||||
// Report SEC Core debug information when remote debug is enabled
|
||||
//
|
||||
ImageContext.ImageAddress = SecCoreImageBase;
|
||||
ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);
|
||||
PeCoffLoaderRelocateImageExtraAction (&ImageContext);
|
||||
|
||||
//
|
||||
// Report PEI Core debug information when remote debug is enabled
|
||||
//
|
||||
ImageContext.ImageAddress = PeiCoreImageBase;
|
||||
ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);
|
||||
PeCoffLoaderRelocateImageExtraAction (&ImageContext);
|
||||
|
||||
//
|
||||
// Find PEI Core entry point
|
||||
//
|
||||
Status = PeCoffLoaderGetEntryPoint ((VOID *) (UINTN) PeiCoreImageBase, (VOID**) PeiCoreEntryPoint);
|
||||
if (EFI_ERROR (Status)) {
|
||||
*PeiCoreEntryPoint = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
# Module Name:
|
||||
#
|
||||
# SecEntry.S
|
||||
#
|
||||
# Abstract:
|
||||
#
|
||||
# This is the code that begins in protected mode.
|
||||
# It will transfer the control to pei core.
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
ASM_GLOBAL ASM_PFX(SecStartup)
|
||||
|
||||
# Pcds
|
||||
ASM_GLOBAL ASM_PFX(PcdGet32 (PcdPayloadFdMemBase))
|
||||
|
||||
#
|
||||
# SecCore Entry Point
|
||||
#
|
||||
# Processor is in flat protected mode
|
||||
#
|
||||
# @param[in] EAX Initial value of the EAX register (BIST: Built-in Self Test)
|
||||
# @param[in] DI 'BP': boot-strap processor, or 'AP': application processor
|
||||
# @param[in] EBP Pointer to the start of the Boot Firmware Volume
|
||||
#
|
||||
# @return None This routine does not return
|
||||
#
|
||||
ASM_GLOBAL ASM_PFX(_ModuleEntryPoint)
|
||||
ASM_PFX(_ModuleEntryPoint):
|
||||
#
|
||||
# Disable all the interrupts
|
||||
#
|
||||
cli
|
||||
|
||||
#
|
||||
# Construct the temporary memory at 0x80000, length 0x10000
|
||||
#
|
||||
movl ($BASE_512KB + $SIZE_64KB), %esp
|
||||
|
||||
#
|
||||
# Pass BFV into the PEI Core
|
||||
#
|
||||
pushl ASM_PFX(PcdGet32 (PcdPayloadFdMemBase))
|
||||
|
||||
#
|
||||
# Pass stack base into the PEI Core
|
||||
#
|
||||
pushl $BASE_512KB
|
||||
|
||||
#
|
||||
# Pass stack size into the PEI Core
|
||||
#
|
||||
pushl $SIZE_64KB
|
||||
|
||||
#
|
||||
# Pass Control into the PEI Core
|
||||
#
|
||||
call SecStartup
|
||||
|
||||
#
|
||||
# Never return to here
|
||||
#
|
||||
jmp .
|
|
@ -1,78 +0,0 @@
|
|||
;------------------------------------------------------------------------------
|
||||
;
|
||||
; Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
; This program and the accompanying materials
|
||||
; are licensed and made available under the terms and conditions of the BSD License
|
||||
; which accompanies this distribution. The full text of the license may be found at
|
||||
; http://opensource.org/licenses/bsd-license.php.
|
||||
;
|
||||
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
;
|
||||
; Module Name:
|
||||
;
|
||||
; SecEntry.asm
|
||||
;
|
||||
; Abstract:
|
||||
;
|
||||
; This is the code that begins in protected mode.
|
||||
; It will transfer the control to pei core.
|
||||
;
|
||||
;------------------------------------------------------------------------------
|
||||
#include <Base.h>
|
||||
|
||||
.686p
|
||||
.xmm
|
||||
.model small, c
|
||||
|
||||
EXTRN SecStartup:NEAR
|
||||
|
||||
; Pcds
|
||||
EXTRN PcdGet32 (PcdPayloadFdMemBase):DWORD
|
||||
|
||||
.code
|
||||
|
||||
;
|
||||
; SecCore Entry Point
|
||||
;
|
||||
; Processor is in flat protected mode
|
||||
;
|
||||
; @param[in] EAX Initial value of the EAX register (BIST: Built-in Self Test)
|
||||
; @param[in] DI 'BP': boot-strap processor, or 'AP': application processor
|
||||
; @param[in] EBP Pointer to the start of the Boot Firmware Volume
|
||||
;
|
||||
; @return None This routine does not return
|
||||
;
|
||||
|
||||
_ModuleEntryPoint PROC PUBLIC
|
||||
;
|
||||
; Disable all the interrupts
|
||||
;
|
||||
cli
|
||||
;
|
||||
; Construct the temporary memory at 0x80000, length 0x10000
|
||||
;
|
||||
mov esp, (BASE_512KB + SIZE_64KB)
|
||||
|
||||
;
|
||||
; Pass BFV into the PEI Core
|
||||
;
|
||||
push PcdGet32 (PcdPayloadFdMemBase)
|
||||
|
||||
;
|
||||
; Pass stack base into the PEI Core
|
||||
;
|
||||
push BASE_512KB
|
||||
|
||||
;
|
||||
; Pass stack size into the PEI Core
|
||||
;
|
||||
push SIZE_64KB
|
||||
|
||||
;
|
||||
; Pass Control into the PEI Core
|
||||
;
|
||||
call SecStartup
|
||||
_ModuleEntryPoint ENDP
|
||||
|
||||
END
|
|
@ -1,78 +0,0 @@
|
|||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
# Abstract:
|
||||
#
|
||||
# Switch the stack from temporary memory to permenent memory.
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EFIAPI
|
||||
# SecSwitchStack (
|
||||
# UINT32 TemporaryMemoryBase,
|
||||
# UINT32 PermenentMemoryBase
|
||||
# )#
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_GLOBAL ASM_PFX (SecSwitchStack)
|
||||
ASM_PFX(SecSwitchStack):
|
||||
#
|
||||
# Save standard registers so they can be used to change stack
|
||||
#
|
||||
pushl %eax
|
||||
pushl %ebx
|
||||
pushl %ecx
|
||||
pushl %edx
|
||||
|
||||
#
|
||||
# !!CAUTION!! this function address's is pushed into stack after
|
||||
# migration of whole temporary memory, so need save it to permenent
|
||||
# memory at first!
|
||||
#
|
||||
movl 20(%esp), %ebx # Save the first parameter
|
||||
movl 24(%esp), %ecx # Save the second parameter
|
||||
|
||||
#
|
||||
# Save this function's return address into permenent memory at first.
|
||||
# Then, Fixup the esp point to permenent memory
|
||||
#
|
||||
movl %esp, %eax
|
||||
subl %ebx, %eax
|
||||
addl %ecx, %eax
|
||||
movl 0(%esp), %edx # copy pushed register's value to permenent memory
|
||||
movl %edx, 0(%eax)
|
||||
movl 4(%esp), %edx
|
||||
movl %edx, 4(%eax)
|
||||
movl 8(%esp), %edx
|
||||
movl %edx, 8(%eax)
|
||||
movl 12(%esp), %edx
|
||||
movl %edx, 12(%eax)
|
||||
movl 16(%esp), %edx # Update this function's return address into permenent memory
|
||||
movl %edx, 16(%eax)
|
||||
movl %eax, %esp # From now, esp is pointed to permenent memory
|
||||
|
||||
#
|
||||
# Fixup the ebp point to permenent memory
|
||||
#
|
||||
movl %ebp, %eax
|
||||
subl %ebx, %eax
|
||||
addl %ecx, %eax
|
||||
movl %eax, %ebp # From now, ebp is pointed to permenent memory
|
||||
|
||||
popl %edx
|
||||
popl %ecx
|
||||
popl %ebx
|
||||
popl %eax
|
||||
ret
|
||||
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
;------------------------------------------------------------------------------
|
||||
;
|
||||
; Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
; This program and the accompanying materials
|
||||
; are licensed and made available under the terms and conditions of the BSD License
|
||||
; which accompanies this distribution. The full text of the license may be found at
|
||||
; http://opensource.org/licenses/bsd-license.php.
|
||||
;
|
||||
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
;
|
||||
; Abstract:
|
||||
;
|
||||
; Switch the stack from temporary memory to permenent memory.
|
||||
;
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
.586p
|
||||
.model flat,C
|
||||
.code
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; VOID
|
||||
; EFIAPI
|
||||
; SecSwitchStack (
|
||||
; UINT32 TemporaryMemoryBase,
|
||||
; UINT32 PermenentMemoryBase
|
||||
; );
|
||||
;------------------------------------------------------------------------------
|
||||
SecSwitchStack PROC
|
||||
;
|
||||
; Save three register: eax, ebx, ecx
|
||||
;
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
;
|
||||
; !!CAUTION!! this function address's is pushed into stack after
|
||||
; migration of whole temporary memory, so need save it to permenent
|
||||
; memory at first!
|
||||
;
|
||||
|
||||
mov ebx, [esp + 20] ; Save the first parameter
|
||||
mov ecx, [esp + 24] ; Save the second parameter
|
||||
|
||||
;
|
||||
; Save this function's return address into permenent memory at first.
|
||||
; Then, Fixup the esp point to permenent memory
|
||||
;
|
||||
mov eax, esp
|
||||
sub eax, ebx
|
||||
add eax, ecx
|
||||
mov edx, dword ptr [esp] ; copy pushed register's value to permenent memory
|
||||
mov dword ptr [eax], edx
|
||||
mov edx, dword ptr [esp + 4]
|
||||
mov dword ptr [eax + 4], edx
|
||||
mov edx, dword ptr [esp + 8]
|
||||
mov dword ptr [eax + 8], edx
|
||||
mov edx, dword ptr [esp + 12]
|
||||
mov dword ptr [eax + 12], edx
|
||||
mov edx, dword ptr [esp + 16] ; Update this function's return address into permenent memory
|
||||
mov dword ptr [eax + 16], edx
|
||||
mov esp, eax ; From now, esp is pointed to permenent memory
|
||||
|
||||
;
|
||||
; Fixup the ebp point to permenent memory
|
||||
;
|
||||
mov eax, ebp
|
||||
sub eax, ebx
|
||||
add eax, ecx
|
||||
mov ebp, eax ; From now, ebp is pointed to permenent memory
|
||||
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
ret
|
||||
SecSwitchStack ENDP
|
||||
|
||||
END
|
|
@ -1,64 +0,0 @@
|
|||
## @file
|
||||
# This is the first module taking control from the coreboot.
|
||||
#
|
||||
# Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php.
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = SecCore
|
||||
FILE_GUID = BA7BE337-6CFB-4dbb-B26C-21EC2FC16073
|
||||
MODULE_TYPE = SEC
|
||||
VERSION_STRING = 1.0
|
||||
|
||||
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
SecMain.c
|
||||
SecMain.h
|
||||
FindPeiCore.c
|
||||
|
||||
[Sources.IA32]
|
||||
Ia32/Stack.asm | MSFT
|
||||
Ia32/Stack.S | GCC
|
||||
Ia32/SecEntry.asm | MSFT
|
||||
Ia32/SecEntry.S | GCC
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
UefiCpuPkg/UefiCpuPkg.dec
|
||||
CorebootModulePkg/CorebootModulePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
BaseLib
|
||||
PcdLib
|
||||
DebugAgentLib
|
||||
UefiCpuLib
|
||||
PeCoffGetEntryPointLib
|
||||
PeCoffExtraActionLib
|
||||
|
||||
[Ppis]
|
||||
gEfiSecPlatformInformationPpiGuid # PPI ALWAYS_PRODUCED
|
||||
gEfiTemporaryRamSupportPpiGuid # PPI ALWAYS_PRODUCED
|
||||
|
||||
[Pcd]
|
||||
gUefiCorebootModulePkgTokenSpaceGuid.PcdPayloadFdMemBase
|
||||
gUefiCorebootModulePkgTokenSpaceGuid.PcdPayloadFdMemSize
|
||||
|
|
@ -1,291 +0,0 @@
|
|||
/** @file
|
||||
C funtions in SEC
|
||||
|
||||
Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include "SecMain.h"
|
||||
|
||||
EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI gSecTemporaryRamSupportPpi = {
|
||||
SecTemporaryRamSupport
|
||||
};
|
||||
|
||||
EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformationPpi[] = {
|
||||
{
|
||||
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||
&gEfiTemporaryRamSupportPpiGuid,
|
||||
&gSecTemporaryRamSupportPpi
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// These are IDT entries pointing to 10:FFFFFFE4h.
|
||||
//
|
||||
UINT64 mIdtEntryTemplate = 0xffff8e000010ffe4ULL;
|
||||
|
||||
/**
|
||||
Caller provided function to be invoked at the end of InitializeDebugAgent().
|
||||
|
||||
Entry point to the C language phase of SEC. After the SEC assembly
|
||||
code has initialized some temporary memory and set up the stack,
|
||||
the control is transferred to this function.
|
||||
|
||||
@param[in] Context The first input parameter of InitializeDebugAgent().
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
SecStartupPhase2(
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Entry point to the C language phase of SEC. After the SEC assembly
|
||||
code has initialized some temporary memory and set up the stack,
|
||||
the control is transferred to this function.
|
||||
|
||||
|
||||
@param SizeOfRam Size of the temporary memory available for use.
|
||||
@param TempRamBase Base address of tempory ram
|
||||
@param BootFirmwareVolume Base address of the Boot Firmware Volume.
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
SecStartup (
|
||||
IN UINT32 SizeOfRam,
|
||||
IN UINT32 TempRamBase,
|
||||
IN VOID *BootFirmwareVolume
|
||||
)
|
||||
{
|
||||
EFI_SEC_PEI_HAND_OFF SecCoreData;
|
||||
IA32_DESCRIPTOR IdtDescriptor;
|
||||
SEC_IDT_TABLE IdtTableInStack;
|
||||
UINT32 Index;
|
||||
UINT32 PeiStackSize;
|
||||
|
||||
PeiStackSize = (SizeOfRam >> 1);
|
||||
|
||||
ASSERT (PeiStackSize < SizeOfRam);
|
||||
|
||||
//
|
||||
// Process all libraries constructor function linked to SecCore.
|
||||
//
|
||||
ProcessLibraryConstructorList ();
|
||||
|
||||
//
|
||||
// Initialize floating point operating environment
|
||||
// to be compliant with UEFI spec.
|
||||
//
|
||||
InitializeFloatingPointUnits ();
|
||||
|
||||
|
||||
// |-------------------|---->
|
||||
// |Idt Table |
|
||||
// |-------------------|
|
||||
// |PeiService Pointer | PeiStackSize
|
||||
// |-------------------|
|
||||
// | |
|
||||
// | Stack |
|
||||
// |-------------------|---->
|
||||
// | |
|
||||
// | |
|
||||
// | Heap | PeiTemporayRamSize
|
||||
// | |
|
||||
// | |
|
||||
// |-------------------|----> TempRamBase
|
||||
|
||||
IdtTableInStack.PeiService = 0;
|
||||
for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) {
|
||||
CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&mIdtEntryTemplate, sizeof (UINT64));
|
||||
}
|
||||
|
||||
IdtDescriptor.Base = (UINTN) &IdtTableInStack.IdtTable;
|
||||
IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1);
|
||||
|
||||
AsmWriteIdtr (&IdtDescriptor);
|
||||
|
||||
//
|
||||
// Update the base address and length of Pei temporary memory
|
||||
//
|
||||
SecCoreData.DataSize = (UINT16) sizeof (EFI_SEC_PEI_HAND_OFF);
|
||||
SecCoreData.BootFirmwareVolumeBase = BootFirmwareVolume;
|
||||
SecCoreData.BootFirmwareVolumeSize = (UINTN)(0x100000000ULL - (UINTN) BootFirmwareVolume);
|
||||
SecCoreData.TemporaryRamBase = (VOID*)(UINTN) TempRamBase;
|
||||
SecCoreData.TemporaryRamSize = SizeOfRam;
|
||||
SecCoreData.PeiTemporaryRamBase = SecCoreData.TemporaryRamBase;
|
||||
SecCoreData.PeiTemporaryRamSize = SizeOfRam - PeiStackSize;
|
||||
SecCoreData.StackBase = (VOID*)(UINTN)(TempRamBase + SecCoreData.PeiTemporaryRamSize);
|
||||
SecCoreData.StackSize = PeiStackSize;
|
||||
|
||||
//
|
||||
// Initialize Debug Agent to support source level debug in SEC/PEI phases before memory ready.
|
||||
//
|
||||
InitializeDebugAgent (DEBUG_AGENT_INIT_PREMEM_SEC, &SecCoreData, SecStartupPhase2);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
Caller provided function to be invoked at the end of InitializeDebugAgent().
|
||||
|
||||
Entry point to the C language phase of SEC. After the SEC assembly
|
||||
code has initialized some temporary memory and set up the stack,
|
||||
the control is transferred to this function.
|
||||
|
||||
@param[in] Context The first input parameter of InitializeDebugAgent().
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
SecStartupPhase2(
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_SEC_PEI_HAND_OFF *SecCoreData;
|
||||
EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint;
|
||||
|
||||
SecCoreData = (EFI_SEC_PEI_HAND_OFF *) Context;
|
||||
//
|
||||
// Find Pei Core entry point. It will report SEC and Pei Core debug information if remote debug
|
||||
// is enabled.
|
||||
//
|
||||
FindAndReportEntryPoints ((EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase, &PeiCoreEntryPoint);
|
||||
if (PeiCoreEntryPoint == NULL)
|
||||
{
|
||||
CpuDeadLoop ();
|
||||
}
|
||||
|
||||
//
|
||||
// Transfer the control to the PEI core
|
||||
//
|
||||
ASSERT (PeiCoreEntryPoint != NULL);
|
||||
(*PeiCoreEntryPoint) (SecCoreData, (EFI_PEI_PPI_DESCRIPTOR *)&mPeiSecPlatformInformationPpi);
|
||||
|
||||
//
|
||||
// Should not come here.
|
||||
//
|
||||
return ;
|
||||
}
|
||||
|
||||
/**
|
||||
This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into
|
||||
permanent memory.
|
||||
|
||||
@param PeiServices Pointer to the PEI Services Table.
|
||||
@param TemporaryMemoryBase Source Address in temporary memory from which the SEC or PEIM will copy the
|
||||
Temporary RAM contents.
|
||||
@param PermanentMemoryBase Destination Address in permanent memory into which the SEC or PEIM will copy the
|
||||
Temporary RAM contents.
|
||||
@param CopySize Amount of memory to migrate from temporary to permanent memory.
|
||||
|
||||
@retval EFI_SUCCESS The data was successfully returned.
|
||||
@retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when
|
||||
TemporaryMemoryBase > PermanentMemoryBase.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecTemporaryRamSupport (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||
IN UINTN CopySize
|
||||
)
|
||||
{
|
||||
IA32_DESCRIPTOR IdtDescriptor;
|
||||
VOID* OldHeap;
|
||||
VOID* NewHeap;
|
||||
VOID* OldStack;
|
||||
VOID* NewStack;
|
||||
DEBUG_AGENT_CONTEXT_POSTMEM_SEC DebugAgentContext;
|
||||
BOOLEAN OldStatus;
|
||||
UINTN PeiStackSize;
|
||||
|
||||
PeiStackSize = (CopySize >> 1);
|
||||
|
||||
ASSERT (PeiStackSize < CopySize);
|
||||
|
||||
//
|
||||
// |-------------------|---->
|
||||
// | Stack | PeiStackSize
|
||||
// |-------------------|---->
|
||||
// | Heap | PeiTemporayRamSize
|
||||
// |-------------------|----> TempRamBase
|
||||
//
|
||||
// |-------------------|---->
|
||||
// | Heap | PeiTemporayRamSize
|
||||
// |-------------------|---->
|
||||
// | Stack | PeiStackSize
|
||||
// |-------------------|----> PermanentMemoryBase
|
||||
//
|
||||
|
||||
OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;
|
||||
NewHeap = (VOID*)((UINTN)PermanentMemoryBase + PeiStackSize);
|
||||
|
||||
OldStack = (VOID*)((UINTN)TemporaryMemoryBase + CopySize - PeiStackSize);
|
||||
NewStack = (VOID*)(UINTN)PermanentMemoryBase;
|
||||
|
||||
DebugAgentContext.HeapMigrateOffset = (UINTN)NewHeap - (UINTN)OldHeap;
|
||||
DebugAgentContext.StackMigrateOffset = (UINTN)NewStack - (UINTN)OldStack;
|
||||
|
||||
OldStatus = SaveAndSetDebugTimerInterrupt (FALSE);
|
||||
//
|
||||
// Initialize Debug Agent to support source level debug in PEI phase after memory ready.
|
||||
// It will build HOB and fix up the pointer in IDT table.
|
||||
//
|
||||
InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, (VOID *) &DebugAgentContext, NULL);
|
||||
|
||||
//
|
||||
// Migrate Heap
|
||||
//
|
||||
CopyMem (NewHeap, OldHeap, CopySize - PeiStackSize);
|
||||
|
||||
//
|
||||
// Migrate Stack
|
||||
//
|
||||
CopyMem (NewStack, OldStack, PeiStackSize);
|
||||
|
||||
|
||||
//
|
||||
// We need *not* fix the return address because currently,
|
||||
// The PeiCore is executed in flash.
|
||||
//
|
||||
|
||||
//
|
||||
// Rebase IDT table in permanent memory
|
||||
//
|
||||
AsmReadIdtr (&IdtDescriptor);
|
||||
IdtDescriptor.Base = IdtDescriptor.Base - (UINTN)OldStack + (UINTN)NewStack;
|
||||
|
||||
AsmWriteIdtr (&IdtDescriptor);
|
||||
|
||||
|
||||
//
|
||||
// Program MTRR
|
||||
//
|
||||
|
||||
//
|
||||
// SecSwitchStack function must be invoked after the memory migration
|
||||
// immediatly, also we need fixup the stack change caused by new call into
|
||||
// permenent memory.
|
||||
//
|
||||
SecSwitchStack (
|
||||
(UINT32) (UINTN) OldStack,
|
||||
(UINT32) (UINTN) NewStack
|
||||
);
|
||||
|
||||
SaveAndSetDebugTimerInterrupt (OldStatus);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
/** @file
|
||||
Master header file for SecCore.
|
||||
|
||||
Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _SEC_CORE_H_
|
||||
#define _SEC_CORE_H_
|
||||
|
||||
|
||||
#include <PiPei.h>
|
||||
|
||||
#include <Ppi/SecPlatformInformation.h>
|
||||
#include <Ppi/TemporaryRamSupport.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/UefiCpuLib.h>
|
||||
#include <Library/PeCoffGetEntryPointLib.h>
|
||||
#include <Library/PeCoffExtraActionLib.h>
|
||||
#include <Library/DebugAgentLib.h>
|
||||
|
||||
|
||||
#define SEC_IDT_ENTRY_COUNT 34
|
||||
|
||||
typedef struct _SEC_IDT_TABLE {
|
||||
//
|
||||
// Reserved 8 bytes preceding IDT to store EFI_PEI_SERVICES**, since IDT base
|
||||
// address should be 8-byte alignment.
|
||||
// Note: For IA32, only the 4 bytes immediately preceding IDT is used to store
|
||||
// EFI_PEI_SERVICES**
|
||||
//
|
||||
UINT64 PeiService;
|
||||
UINT64 IdtTable[SEC_IDT_ENTRY_COUNT];
|
||||
} SEC_IDT_TABLE;
|
||||
|
||||
/**
|
||||
Switch the stack in the temporary memory to the one in the permanent memory.
|
||||
|
||||
This function must be invoked after the memory migration immediately. The relative
|
||||
position of the stack in the temporary and permanent memory is same.
|
||||
|
||||
@param TemporaryMemoryBase Base address of the temporary memory.
|
||||
@param PermenentMemoryBase Base address of the permanent memory.
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
SecSwitchStack (
|
||||
UINT32 TemporaryMemoryBase,
|
||||
UINT32 PermenentMemoryBase
|
||||
);
|
||||
|
||||
/**
|
||||
This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into
|
||||
permanent memory.
|
||||
|
||||
@param PeiServices Pointer to the PEI Services Table.
|
||||
@param TemporaryMemoryBase Source Address in temporary memory from which the SEC or PEIM will copy the
|
||||
Temporary RAM contents.
|
||||
@param PermanentMemoryBase Destination Address in permanent memory into which the SEC or PEIM will copy the
|
||||
Temporary RAM contents.
|
||||
@param CopySize Amount of memory to migrate from temporary to permanent memory.
|
||||
|
||||
@retval EFI_SUCCESS The data was successfully returned.
|
||||
@retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when
|
||||
TemporaryMemoryBase > PermanentMemoryBase.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SecTemporaryRamSupport (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
||||
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
||||
IN UINTN CopySize
|
||||
);
|
||||
|
||||
/**
|
||||
Entry point to the C language phase of SEC. After the SEC assembly
|
||||
code has initialized some temporary memory and set up the stack,
|
||||
the control is transferred to this function.
|
||||
|
||||
@param SizeOfRam Size of the temporary memory available for use.
|
||||
@param TempRamBase Base address of tempory ram
|
||||
@param BootFirmwareVolume Base address of the Boot Firmware Volume.
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
SecStartup (
|
||||
IN UINT32 SizeOfRam,
|
||||
IN UINT32 TempRamBase,
|
||||
IN VOID *BootFirmwareVolume
|
||||
);
|
||||
|
||||
/**
|
||||
Find and return Pei Core entry point.
|
||||
|
||||
It also find SEC and PEI Core file debug inforamtion. It will report them if
|
||||
remote debug is enabled.
|
||||
|
||||
@param BootFirmwareVolumePtr Point to the boot firmware volume.
|
||||
@param PeiCoreEntryPoint Point to the PEI core entry point.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FindAndReportEntryPoints (
|
||||
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
|
||||
OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint
|
||||
);
|
||||
|
||||
/**
|
||||
Autogenerated function that calls the library constructors for all of the module's
|
||||
dependent libraries. This function must be called by the SEC Core once a stack has
|
||||
been established.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
ProcessLibraryConstructorList (
|
||||
VOID
|
||||
);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue