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
		
			
				
	
	
		
			335 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			335 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| 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;
 | |
| }
 |