git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7105 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			116 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   This file implements CalculateCrc32 Boot Services as defined in
 | |
|   Platform Initialization specification 1.0 VOLUME 2 DXE Core Interface.
 | |
| 
 | |
|   This Boot Services is in the Runtime Driver because this service is
 | |
|   also required by SetVirtualAddressMap() when the EFI System Table and
 | |
|   EFI Runtime Services Table are converted from physical address to
 | |
|   virtual addresses.  This requires that the 32-bit CRC be recomputed.
 | |
| 
 | |
| Copyright (c) 2006 - 2008, Intel Corporation. <BR>
 | |
| 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.
 | |
| 
 | |
| **/
 | |
| 
 | |
| 
 | |
| #include <Uefi.h>
 | |
| 
 | |
| UINT32  mCrcTable[256];
 | |
| 
 | |
| /**
 | |
|   Calculate CRC32 for target data.
 | |
| 
 | |
|   @param  Data                  The target data.
 | |
|   @param  DataSize              The target data size.
 | |
|   @param  CrcOut                The CRC32 for target data.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The CRC32 for target data is calculated successfully.
 | |
|   @retval EFI_INVALID_PARAMETER Some parameter is not valid, so the CRC32 is not
 | |
|                                 calculated.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| RuntimeDriverCalculateCrc32 (
 | |
|   IN  VOID    *Data,
 | |
|   IN  UINTN   DataSize,
 | |
|   OUT UINT32  *CrcOut
 | |
|   )
 | |
| {
 | |
|   UINT32  Crc;
 | |
|   UINTN   Index;
 | |
|   UINT8   *Ptr;
 | |
| 
 | |
|   if (Data == NULL || DataSize == 0 || CrcOut == NULL) {
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   Crc = 0xffffffff;
 | |
|   for (Index = 0, Ptr = Data; Index < DataSize; Index++, Ptr++) {
 | |
|     Crc = (Crc >> 8) ^ mCrcTable[(UINT8) Crc ^ *Ptr];
 | |
|   }
 | |
| 
 | |
|   *CrcOut = Crc ^ 0xffffffff;
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|   This internal function reverses bits for 32bit data.
 | |
| 
 | |
|   @param  Value                 The data to be reversed.
 | |
| 
 | |
|   @return                       Data reversed.
 | |
| 
 | |
| **/
 | |
| UINT32
 | |
| ReverseBits (
 | |
|   UINT32  Value
 | |
|   )
 | |
| {
 | |
|   UINTN   Index;
 | |
|   UINT32  NewValue;
 | |
| 
 | |
|   NewValue = 0;
 | |
|   for (Index = 0; Index < 32; Index++) {
 | |
|     if ((Value & (1 << Index)) != 0) {
 | |
|       NewValue = NewValue | (1 << (31 - Index));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return NewValue;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Initialize CRC32 table.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| RuntimeDriverInitializeCrc32Table (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   UINTN   TableEntry;
 | |
|   UINTN   Index;
 | |
|   UINT32  Value;
 | |
| 
 | |
|   for (TableEntry = 0; TableEntry < 256; TableEntry++) {
 | |
|     Value = ReverseBits ((UINT32) TableEntry);
 | |
|     for (Index = 0; Index < 8; Index++) {
 | |
|       if ((Value & 0x80000000) != 0) {
 | |
|         Value = (Value << 1) ^ 0x04c11db7;
 | |
|       } else {
 | |
|         Value = Value << 1;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     mCrcTable[TableEntry] = ReverseBits (Value);
 | |
|   }
 | |
| }
 |