1. Add AcpiTable & ComponentName2 Protocol definitions. 2. Add HardwareErrorVariable GUID definition. EdkModulePkg: 1. Update DxeCore to let InsatllConfigurationTable() signal the event group whenever a table entry is inserted, modified or deleted. 2. Update ConPlatform to let Simple Text In and Out not share a stop function . git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2625 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			226 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*++
 | 
						|
 | 
						|
Copyright (c) 2006 - 2007, 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:
 | 
						|
 | 
						|
  InstallConfigurationTable.c
 | 
						|
 | 
						|
 | 
						|
Abstract:
 | 
						|
 | 
						|
  Tiano Miscellaneous Services InstallConfigurationTable service
 | 
						|
 | 
						|
--*/
 | 
						|
 | 
						|
#include <DxeMain.h>
 | 
						|
 | 
						|
#define CONFIG_TABLE_SIZE_INCREASED 0x10
 | 
						|
 | 
						|
UINTN mSystemTableAllocateSize = 0;
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CoreGetConfigTable (
 | 
						|
  IN EFI_GUID *Guid,
 | 
						|
  OUT VOID    **Table
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Find a config table by name in system table's ConfigurationTable.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  Guid        - The table name to look for
 | 
						|
  
 | 
						|
  Table       - Pointer of the config table
 | 
						|
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_NOT_FOUND       - Could not find the table in system table's ConfigurationTable.
 | 
						|
  
 | 
						|
  EFI_SUCCESS         - Table successfully found.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  UINTN Index;
 | 
						|
 | 
						|
  for (Index = 0; Index < gDxeCoreST->NumberOfTableEntries; Index++) {
 | 
						|
    if (CompareGuid (Guid, &(gDxeCoreST->ConfigurationTable[Index].VendorGuid))) {
 | 
						|
      *Table = gDxeCoreST->ConfigurationTable[Index].VendorTable;
 | 
						|
      return EFI_SUCCESS;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
CoreInstallConfigurationTable (
 | 
						|
  IN EFI_GUID *Guid,
 | 
						|
  IN VOID     *Table
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Boot Service called to add, modify, or remove a system configuration table from 
 | 
						|
  the EFI System Table.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  Guid     -  Pointer to the GUID for the entry to add, update, or remove
 | 
						|
  Table    -  Pointer to the configuration table for the entry to add, update, or
 | 
						|
              remove, may be NULL.
 | 
						|
 | 
						|
Returns:
 | 
						|
  
 | 
						|
  EFI_SUCCESS               Guid, Table pair added, updated, or removed.
 | 
						|
  EFI_INVALID_PARAMETER     Input GUID not valid.
 | 
						|
  EFI_NOT_FOUND             Attempted to delete non-existant entry
 | 
						|
  EFI_OUT_OF_RESOURCES      Not enough memory available
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  UINTN                   Index;
 | 
						|
  EFI_CONFIGURATION_TABLE *EfiConfigurationTable;
 | 
						|
 | 
						|
  //
 | 
						|
  // If Guid is NULL, then this operation cannot be performed
 | 
						|
  //
 | 
						|
  if (Guid == NULL) {
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  EfiConfigurationTable = gDxeCoreST->ConfigurationTable;
 | 
						|
 | 
						|
  //
 | 
						|
  // Search all the table for an entry that matches Guid
 | 
						|
  //
 | 
						|
  for (Index = 0; Index < gDxeCoreST->NumberOfTableEntries; Index++) {
 | 
						|
    if (CompareGuid (Guid, &(gDxeCoreST->ConfigurationTable[Index].VendorGuid))) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if (Index < gDxeCoreST->NumberOfTableEntries) {
 | 
						|
    //
 | 
						|
    // A match was found, so this is either a modify or a delete operation
 | 
						|
    //
 | 
						|
    if (Table != NULL) {
 | 
						|
      //
 | 
						|
      // If Table is not NULL, then this is a modify operation.
 | 
						|
      // Modify the table enty and return.
 | 
						|
      //
 | 
						|
      gDxeCoreST->ConfigurationTable[Index].VendorTable = Table;
 | 
						|
 | 
						|
      //
 | 
						|
      // Signal Configuration Table change
 | 
						|
      //
 | 
						|
      CoreNotifySignalList (Guid);
 | 
						|
 | 
						|
      return EFI_SUCCESS;
 | 
						|
    }
 | 
						|
 | 
						|
    //
 | 
						|
    // A match was found and Table is NULL, so this is a delete operation.
 | 
						|
    //
 | 
						|
    gDxeCoreST->NumberOfTableEntries--;
 | 
						|
 | 
						|
    //
 | 
						|
    // Copy over deleted entry
 | 
						|
    //
 | 
						|
    CopyMem (
 | 
						|
      &(EfiConfigurationTable[Index]),
 | 
						|
      &(gDxeCoreST->ConfigurationTable[Index + 1]),
 | 
						|
      (gDxeCoreST->NumberOfTableEntries - Index) * sizeof (EFI_CONFIGURATION_TABLE)
 | 
						|
      );
 | 
						|
 | 
						|
  } else {
 | 
						|
 | 
						|
    //
 | 
						|
    // No matching GUIDs were found, so this is an add operation.
 | 
						|
    //
 | 
						|
 | 
						|
    if (Table == NULL) {
 | 
						|
      //
 | 
						|
      // If Table is NULL on an add operation, then return an error.
 | 
						|
      //
 | 
						|
      return EFI_NOT_FOUND;
 | 
						|
    }
 | 
						|
 | 
						|
    //
 | 
						|
    // Assume that Index == gDxeCoreST->NumberOfTableEntries
 | 
						|
    //
 | 
						|
    if ((Index * sizeof (EFI_CONFIGURATION_TABLE)) >= mSystemTableAllocateSize) {
 | 
						|
      //
 | 
						|
      // Allocate a table with one additional entry.
 | 
						|
      //
 | 
						|
      mSystemTableAllocateSize += (CONFIG_TABLE_SIZE_INCREASED * sizeof (EFI_CONFIGURATION_TABLE));
 | 
						|
      EfiConfigurationTable = CoreAllocateRuntimePool (mSystemTableAllocateSize);
 | 
						|
      if (EfiConfigurationTable == NULL) {
 | 
						|
        //
 | 
						|
        // If a new table could not be allocated, then return an error.
 | 
						|
        //
 | 
						|
        return EFI_OUT_OF_RESOURCES;
 | 
						|
      }
 | 
						|
 | 
						|
      if (gDxeCoreST->ConfigurationTable != NULL) {
 | 
						|
        //
 | 
						|
        // Copy the old table to the new table.
 | 
						|
        //
 | 
						|
        CopyMem (
 | 
						|
          EfiConfigurationTable,
 | 
						|
          gDxeCoreST->ConfigurationTable,
 | 
						|
          Index * sizeof (EFI_CONFIGURATION_TABLE)
 | 
						|
          );
 | 
						|
 | 
						|
        //
 | 
						|
        // Free Old Table
 | 
						|
        //
 | 
						|
        CoreFreePool (gDxeCoreST->ConfigurationTable);
 | 
						|
      }
 | 
						|
 | 
						|
      //
 | 
						|
      // Update System Table
 | 
						|
      //
 | 
						|
      gDxeCoreST->ConfigurationTable = EfiConfigurationTable;
 | 
						|
    }
 | 
						|
 | 
						|
    //
 | 
						|
    // Fill in the new entry
 | 
						|
    //
 | 
						|
    CopyMem ((VOID *)&EfiConfigurationTable[Index].VendorGuid, Guid, sizeof (EFI_GUID));
 | 
						|
    EfiConfigurationTable[Index].VendorTable  = Table;
 | 
						|
 | 
						|
    //
 | 
						|
    // This is an add operation, so increment the number of table entries
 | 
						|
    //
 | 
						|
    gDxeCoreST->NumberOfTableEntries++;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Fix up the CRC-32 in the EFI System Table
 | 
						|
  //
 | 
						|
  CalculateEfiHdrCrc (&gDxeCoreST->Hdr);
 | 
						|
 | 
						|
  //
 | 
						|
  // Signal Configuration Table change
 | 
						|
  //
 | 
						|
  CoreNotifySignalList (Guid);
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 |