From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4864:20::442; helo=mail-pf1-x442.google.com; envelope-from=ming.huang@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 1CD95211C573F for ; Thu, 31 Jan 2019 22:02:03 -0800 (PST) Received: by mail-pf1-x442.google.com with SMTP id u6so2629045pfh.11 for ; Thu, 31 Jan 2019 22:02:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fOR5Jyr1jNlgqviQQ1X+rSf+tv56Y1WW85sbU7jdIv8=; b=Od3a+pu4+hKHo/xlWP/Sme+RLKTYJHYn+jafDuC661xR83y80VGbzA8gw1oolVgX+M lJy60PzVbj+oewJ7WUTjhzzWHot2qPxmpptAvR2HQjnSjBj4J0zjA3zsUpqW66XBRtlP YVGLjguZ4c0Q/CQviQANTDseJ5sDjg/rqPioM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fOR5Jyr1jNlgqviQQ1X+rSf+tv56Y1WW85sbU7jdIv8=; b=iuT6paBnxlWaJpqGcLsHOJAbEfijvPsr1V7eNlBTLqGeRMGeZ6vXThN2i0n4d6mkKs X0W6JsxwgoDyqsd0JFo2iJBY/pKUJcNRDKtg5DrU8GGfiP+llNYLpy691fTEQsorG2g7 uxAHKEgdUx1kQ5HB/+9FpLkPvrJgYjemGX/hq7tf4H3UdyK2sKPTom/tNvecN4s3eW/9 yca2r1Kn73OpfZU0XK8dc5fxwT1ka22JQA9hR7Ie6mwHwjF/cJToa8nqc87jv3le0bzC RsoPfUrBTNpMzBjM7P3Y4Z3VLas/uRswvtWGnAcohKkDcqeXr6n81QZKTV3hLUjnuzEz BrDg== X-Gm-Message-State: AJcUukfKaxFsi3hyrHuVXyHLlnPaI0tKl9GE60W01r53SdJ1mUcQricB fFsM2HtSK4yV1TiIA6vsLVI9tw== X-Google-Smtp-Source: ALg8bN68FTksqOJ9zDZqno6tdHjcMuU6j2AP6W47hr1shlwz5l3SCT6d9RX/IH1FNJYmi6bN/8sevw== X-Received: by 2002:a62:4549:: with SMTP id s70mr37579191pfa.233.1549000922632; Thu, 31 Jan 2019 22:02:02 -0800 (PST) Received: from localhost.localdomain ([203.160.91.226]) by smtp.gmail.com with ESMTPSA id c13sm8115122pfo.121.2019.01.31.22.01.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 31 Jan 2019 22:02:01 -0800 (PST) From: Ming Huang To: linaro-uefi@lists.linaro.org, edk2-devel@lists.01.org, michael.d.kinney@intel.com, liming.gao@intel.com Cc: leif.lindholm@linaro.org, ard.biesheuvel@linaro.org, star.zeng@intel.com, eric.dong@intel.com, wanghuiqiang@huawei.com, huangming23@huawei.com, zhangjinsong2@huawei.com, huangdaode@hisilicon.com, waip23@126.com, Ming Huang Date: Fri, 1 Feb 2019 14:01:52 +0800 Message-Id: <20190201060152.55724-2-ming.huang@linaro.org> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20190201060152.55724-1-ming.huang@linaro.org> References: <20190201060152.55724-1-ming.huang@linaro.org> Subject: [MdePkg/BaseLib v1 1/1] MdePkg BaseLib: Add new API CalculateCrc16() X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 Feb 2019 06:02:03 -0000 CalculateCrc16() bases on the initialized mCrcTable. When CalculateCrc16() is used, mCrcTable16 will take 512Bytes size in the image. When CalculateCrc16() is not used, mCrcTable16 will not be built in the image, and no size impact. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ming Huang --- MdePkg/Include/Library/BaseLib.h | 20 ++++++ MdePkg/Library/BaseLib/CheckSum.c | 73 ++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index 1eb842384ee2..956b971e5c69 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -4855,6 +4855,26 @@ CalculateCrc32( IN UINTN Length ); +/** + Computes and returns a 16-bit CRC for a data buffer. + CRC16 value bases on CCITT. + + If Buffer is NULL, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param[in] Buffer A pointer to the buffer on which the 16-bit CRC is to be computed. + @param[in] Length The number of bytes in the buffer Data. + + @retval Crc16 The 16-bit CRC was computed for the data buffer. + +**/ +UINT16 +EFIAPI +CalculateCrc16( + IN VOID *Buffer, + IN UINTN Length + ); + // // Base Library CPU Functions // diff --git a/MdePkg/Library/BaseLib/CheckSum.c b/MdePkg/Library/BaseLib/CheckSum.c index 03d49afc5e6c..4e27aebe44bc 100644 --- a/MdePkg/Library/BaseLib/CheckSum.c +++ b/MdePkg/Library/BaseLib/CheckSum.c @@ -630,3 +630,76 @@ CalculateCrc32( return Crc ^ 0xffffffff; } + +GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT16 mCrcTable16[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 +}; + +/** + Computes and returns a 16-bit CRC for a data buffer. + CRC16 value bases on CCITT. + + If Buffer is NULL, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param[in] Buffer A pointer to the buffer on which the 16-bit CRC is to be computed. + @param[in] Length The number of bytes in the buffer Data. + + @retval Crc16 The 16-bit CRC was computed for the data buffer. + +**/ +UINT16 +EFIAPI +CalculateCrc16( + IN VOID *Buffer, + IN UINTN Length + ) +{ + UINT16 Crc; + UINT8 *Ptr; + + ASSERT (Buffer != NULL); + ASSERT (Length <= (MAX_ADDRESS - ((UINTN) Buffer) + 1)); + + Crc = 0; + Ptr = (UINT8 *)Buffer; + while (Length) { + Crc = mCrcTable16[((UINT8)((Crc >> 8) & 0xff)) ^ *(Ptr++)] ^ + ((UINT16)(Crc << 8)); + Length--; + } + + return Crc; +} + -- 2.9.5