From f2abdc918bc19de53fe612458bf6c26298b65c1c Mon Sep 17 00:00:00 2001 From: yshang1 Date: Thu, 19 Jul 2007 08:36:30 +0000 Subject: Move RuntimeDxe to /Core of MdeModulePkg. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3363 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Core/RuntimeDxe/Crc32.c | 150 +++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 MdeModulePkg/Core/RuntimeDxe/Crc32.c (limited to 'MdeModulePkg/Core/RuntimeDxe/Crc32.c') diff --git a/MdeModulePkg/Core/RuntimeDxe/Crc32.c b/MdeModulePkg/Core/RuntimeDxe/Crc32.c new file mode 100644 index 0000000000..910738eb52 --- /dev/null +++ b/MdeModulePkg/Core/RuntimeDxe/Crc32.c @@ -0,0 +1,150 @@ +/*++ + +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: + + Crc32.c + +Abstract: + + CalculateCrc32 Boot Services as defined in DXE CIS. + + 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. + +Revision History: + +--*/ + +// +// The package level header files this module uses +// +#include + +UINT32 mCrcTable[256]; + +EFI_STATUS +EFIAPI +RuntimeDriverCalculateCrc32 ( + IN VOID *Data, + IN UINTN DataSize, + OUT UINT32 *CrcOut + ) +/*++ + +Routine Description: + + Calculate CRC32 for target data + +Arguments: + + Data - The target data. + DataSize - The target data size. + CrcOut - The CRC32 for target data. + +Returns: + + EFI_SUCCESS - The CRC32 for target data is calculated successfully. + EFI_INVALID_PARAMETER - Some parameter is not valid, so the CRC32 is not + calculated. + +--*/ +{ + 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; +} + +STATIC +UINT32 +ReverseBits ( + UINT32 Value + ) +/*++ + +Routine Description: + + Reverse bits for 32bit data. + +Arguments: + + Value - the data to be reversed. + +Returns: + + UINT32 data reversed. + +--*/ +{ + UINTN Index; + UINT32 NewValue; + + NewValue = 0; + for (Index = 0; Index < 32; Index++) { + if (Value & (1 << Index)) { + NewValue = NewValue | (1 << (31 - Index)); + } + } + + return NewValue; +} + +VOID +RuntimeDriverInitializeCrc32Table ( + VOID + ) +/*++ + +Routine Description: + + Initialize CRC32 table. + +Arguments: + + None. + +Returns: + + None. + +--*/ +{ + 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) { + Value = (Value << 1) ^ 0x04c11db7; + } else { + Value = Value << 1; + } + } + + mCrcTable[TableEntry] = ReverseBits (Value); + } +} -- cgit v1.2.3