Port EdkUnixPkg to UnixPkg. The changes are listed as follows:
1. change *.msa to *.inf, and create platform configuration files .dec&.dsc&.fdf to comply with Edk2 build process 2. using PCD mechanism to replace macro. 3. change Sec code to cowork with PI1.0 Pei Core and produce temparory memory ppi. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5380 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
334
UnixPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
Normal file
334
UnixPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
Normal file
@@ -0,0 +1,334 @@
|
||||
/*++
|
||||
|
||||
Copyright (c) 2006, Intel Corporation
|
||||
All rights reserved. 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:
|
||||
|
||||
MiscSubclassDriverEntryPoint.c
|
||||
|
||||
Abstract:
|
||||
|
||||
This driver parses the mMiscSubclassDataTable structure and reports
|
||||
any generated data to the DataHub.
|
||||
|
||||
--*/
|
||||
|
||||
#include "MiscSubClassDriver.h"
|
||||
|
||||
|
||||
extern UINT8 MiscSubClassStrings[];
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
EFI_STATUS
|
||||
LogRecordDataToDataHub (
|
||||
EFI_DATA_HUB_PROTOCOL *DataHub,
|
||||
UINT32 RecordType,
|
||||
UINT32 RecordLen,
|
||||
VOID *RecordData
|
||||
)
|
||||
/*++
|
||||
Description:
|
||||
|
||||
Parameters:
|
||||
|
||||
DataHub
|
||||
%%TBD
|
||||
|
||||
RecordType
|
||||
%%TBD
|
||||
|
||||
RecordLen
|
||||
%%TBD
|
||||
|
||||
RecordData
|
||||
%%TBD
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_INVALID_PARAMETER
|
||||
|
||||
EFI_SUCCESS
|
||||
|
||||
Other Data Hub errors
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_MISC_SUBCLASS_DRIVER_DATA MiscSubclass;
|
||||
EFI_STATUS EfiStatus;
|
||||
|
||||
//
|
||||
// Do nothing if data parameters are not valid.
|
||||
//
|
||||
if (RecordLen == 0 || RecordData == NULL) {
|
||||
DEBUG (
|
||||
(EFI_D_ERROR,
|
||||
"RecordLen == %d RecordData == %xh\n",
|
||||
RecordLen,
|
||||
RecordData)
|
||||
);
|
||||
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
//
|
||||
// Assemble Data Hub record.
|
||||
//
|
||||
MiscSubclass.Header.Version = EFI_MISC_SUBCLASS_VERSION;
|
||||
MiscSubclass.Header.HeaderSize = sizeof (EFI_SUBCLASS_TYPE1_HEADER);
|
||||
MiscSubclass.Header.Instance = 1;
|
||||
MiscSubclass.Header.SubInstance = 1;
|
||||
MiscSubclass.Header.RecordType = RecordType;
|
||||
|
||||
CopyMem (
|
||||
&MiscSubclass.Record,
|
||||
RecordData,
|
||||
RecordLen
|
||||
);
|
||||
|
||||
//
|
||||
// Log Data Hub record.
|
||||
//
|
||||
EfiStatus = DataHub->LogData (
|
||||
DataHub,
|
||||
&gEfiMiscSubClassGuid,
|
||||
&gEfiMiscSubClassGuid,
|
||||
EFI_DATA_RECORD_CLASS_DATA,
|
||||
&MiscSubclass,
|
||||
sizeof (EFI_SUBCLASS_TYPE1_HEADER) + RecordLen
|
||||
);
|
||||
|
||||
if (EFI_ERROR (EfiStatus)) {
|
||||
DEBUG (
|
||||
(EFI_D_ERROR,
|
||||
"LogData(%d bytes) == %r\n",
|
||||
sizeof (EFI_SUBCLASS_TYPE1_HEADER) + RecordLen,
|
||||
EfiStatus)
|
||||
);
|
||||
}
|
||||
|
||||
return EfiStatus;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MiscSubclassDriverEntryPoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
/*++
|
||||
Description:
|
||||
|
||||
Standard EFI driver point. This driver parses the mMiscSubclassDataTable
|
||||
structure and reports any generated data to the DataHub.
|
||||
|
||||
Arguments:
|
||||
|
||||
ImageHandle
|
||||
Handle for the image of this driver
|
||||
|
||||
SystemTable
|
||||
Pointer to the EFI System Table
|
||||
|
||||
Returns:
|
||||
|
||||
EFI_SUCCESS
|
||||
The data was successfully reported to the Data Hub.
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_MISC_SUBCLASS_DRIVER_DATA RecordData;
|
||||
EFI_DATA_HUB_PROTOCOL *DataHub;
|
||||
EFI_HII_HANDLE HiiHandle;
|
||||
EFI_STATUS EfiStatus;
|
||||
UINTN Index;
|
||||
BOOLEAN LogRecordData;
|
||||
EFI_MEMORY_SUBCLASS_DRIVER_DATA MemorySubClassData;
|
||||
UINT64 TotalMemorySize;
|
||||
CHAR16 *UnixMemString;
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Initialize constant portion of subclass header.
|
||||
//
|
||||
RecordData.Header.Version = EFI_MISC_SUBCLASS_VERSION;
|
||||
RecordData.Header.HeaderSize = sizeof (EFI_SUBCLASS_TYPE1_HEADER);
|
||||
RecordData.Header.Instance = 1;
|
||||
RecordData.Header.SubInstance = 1;
|
||||
|
||||
//
|
||||
// Locate data hub protocol.
|
||||
//
|
||||
EfiStatus = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (VOID**) &DataHub);
|
||||
|
||||
if (EFI_ERROR (EfiStatus)) {
|
||||
DEBUG ((EFI_D_ERROR, "Could not locate DataHub protocol. %r\n", EfiStatus));
|
||||
return EfiStatus;
|
||||
} else if (DataHub == NULL) {
|
||||
DEBUG ((EFI_D_ERROR, "LocateProtocol(DataHub) returned NULL pointer!\n"));
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
//
|
||||
// Add our default strings to the HII database. They will be modified later.
|
||||
//
|
||||
HiiLibAddPackages (1, &gEfiMiscSubClassGuid, NULL, &HiiHandle, MiscSubclassStrings);
|
||||
|
||||
if (EFI_ERROR (EfiStatus)) {
|
||||
DEBUG ((EFI_D_ERROR, "Could not log default strings to Hii. %r\n", EfiStatus));
|
||||
return EfiStatus;
|
||||
}
|
||||
//
|
||||
//
|
||||
//
|
||||
for (Index = 0; Index < mMiscSubclassDataTableEntries; ++Index) {
|
||||
//
|
||||
// Stupidity check! Do nothing if RecordLen is zero.
|
||||
// %%TBD - Should this be an error or a mechanism for ignoring
|
||||
// records in the Data Table?
|
||||
//
|
||||
if (mMiscSubclassDataTable[Index].RecordLen == 0) {
|
||||
DEBUG (
|
||||
(EFI_D_ERROR,
|
||||
"mMiscSubclassDataTable[%d].RecordLen == 0\n",
|
||||
Index)
|
||||
);
|
||||
|
||||
continue;
|
||||
}
|
||||
//
|
||||
// Initialize per-record portion of subclass header and
|
||||
// copy static data into data portion of subclass record.
|
||||
//
|
||||
RecordData.Header.RecordType = mMiscSubclassDataTable[Index].RecordType;
|
||||
|
||||
if (mMiscSubclassDataTable[Index].RecordData == NULL) {
|
||||
ZeroMem (
|
||||
&RecordData.Record,
|
||||
mMiscSubclassDataTable[Index].RecordLen
|
||||
);
|
||||
} else {
|
||||
CopyMem (
|
||||
&RecordData.Record,
|
||||
mMiscSubclassDataTable[Index].RecordData,
|
||||
mMiscSubclassDataTable[Index].RecordLen
|
||||
);
|
||||
}
|
||||
//
|
||||
// If the entry does not have a function pointer, just log the data.
|
||||
//
|
||||
if (mMiscSubclassDataTable[Index].Function == NULL) {
|
||||
//
|
||||
// Log RecordData to Data Hub.
|
||||
//
|
||||
EfiStatus = DataHub->LogData (
|
||||
DataHub,
|
||||
&gEfiMiscSubClassGuid,
|
||||
&gEfiMiscSubClassGuid,
|
||||
EFI_DATA_RECORD_CLASS_DATA,
|
||||
&RecordData,
|
||||
sizeof (EFI_SUBCLASS_TYPE1_HEADER) + mMiscSubclassDataTable[Index].RecordLen
|
||||
);
|
||||
|
||||
if (EFI_ERROR (EfiStatus)) {
|
||||
DEBUG (
|
||||
(EFI_D_ERROR,
|
||||
"LogData(%d bytes) == %r\n",
|
||||
sizeof (EFI_SUBCLASS_TYPE1_HEADER) + mMiscSubclassDataTable[Index].RecordLen,
|
||||
EfiStatus)
|
||||
);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
//
|
||||
// The entry has a valid function pointer.
|
||||
// Keep calling the function and logging data until there
|
||||
// is no more data to log.
|
||||
//
|
||||
for (;;) {
|
||||
EfiStatus = (*mMiscSubclassDataTable[Index].Function)(mMiscSubclassDataTable[Index].RecordType, &mMiscSubclassDataTable[Index].RecordLen, &RecordData.Record, &LogRecordData);
|
||||
|
||||
if (EFI_ERROR (EfiStatus)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!LogRecordData) {
|
||||
break;
|
||||
}
|
||||
//
|
||||
//
|
||||
//
|
||||
EfiStatus = DataHub->LogData (
|
||||
DataHub,
|
||||
&gEfiMiscSubClassGuid,
|
||||
&gEfiMiscSubClassGuid,
|
||||
EFI_DATA_RECORD_CLASS_DATA,
|
||||
&RecordData,
|
||||
sizeof (EFI_SUBCLASS_TYPE1_HEADER) + mMiscSubclassDataTable[Index].RecordLen
|
||||
);
|
||||
|
||||
if (EFI_ERROR (EfiStatus)) {
|
||||
DEBUG (
|
||||
(EFI_D_ERROR,
|
||||
"LogData(%d bytes) == %r\n",
|
||||
sizeof (EFI_SUBCLASS_TYPE1_HEADER) + mMiscSubclassDataTable[Index].RecordLen,
|
||||
EfiStatus)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Log Memory Size info based on PCD setting.
|
||||
//
|
||||
MemorySubClassData.Header.Instance = 1;
|
||||
MemorySubClassData.Header.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;
|
||||
MemorySubClassData.Header.RecordType = EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER;
|
||||
|
||||
//
|
||||
// Process Memory String in form size!size ...
|
||||
// So 64!64 is 128 MB
|
||||
//
|
||||
UnixMemString = PcdGetPtr (PcdUnixMemorySize);
|
||||
for (TotalMemorySize = 0; *UnixMemString != '\0';) {
|
||||
TotalMemorySize += StrDecimalToUint64 (UnixMemString);
|
||||
while (*UnixMemString != '\0') {
|
||||
if (*UnixMemString == '!') {
|
||||
UnixMemString++;
|
||||
break;
|
||||
}
|
||||
UnixMemString++;
|
||||
}
|
||||
}
|
||||
|
||||
MemorySubClassData.Record.ArrayStartAddress.MemoryArrayStartAddress = 0;
|
||||
MemorySubClassData.Record.ArrayStartAddress.MemoryArrayEndAddress = LShiftU64 (TotalMemorySize, 20) - 1;
|
||||
MemorySubClassData.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName = gEfiMemoryProducerGuid;
|
||||
MemorySubClassData.Record.ArrayStartAddress.PhysicalMemoryArrayLink.Instance = 1;
|
||||
MemorySubClassData.Record.ArrayStartAddress.PhysicalMemoryArrayLink.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;
|
||||
MemorySubClassData.Record.ArrayStartAddress.MemoryArrayPartitionWidth = 0;
|
||||
|
||||
//
|
||||
// Store memory size data record to data hub.
|
||||
//
|
||||
EfiStatus = DataHub->LogData (
|
||||
DataHub,
|
||||
&gEfiMemorySubClassGuid,
|
||||
&gEfiMemoryProducerGuid,
|
||||
EFI_DATA_RECORD_CLASS_DATA,
|
||||
&MemorySubClassData,
|
||||
sizeof (EFI_SUBCLASS_TYPE1_HEADER) + sizeof (EFI_MEMORY_ARRAY_START_ADDRESS_DATA)
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
Reference in New Issue
Block a user