From patchwork Fri Feb 1 06:01:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ming Huang X-Patchwork-Id: 157184 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp558jaa; Thu, 31 Jan 2019 22:02:42 -0800 (PST) X-Google-Smtp-Source: ALg8bN715f4TI4qXzVvr3clPpO7l215tFpP3hpaFw6t8zWOLkSnmtPdVPFfcJ1Au4gh9NniNgXwV X-Received: by 2002:aed:2dc5:: with SMTP id i63mr38425083qtd.173.1549000953230; Thu, 31 Jan 2019 22:02:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549000953; cv=none; d=google.com; s=arc-20160816; b=TGME3wo46vhHz77k95DVAOvNyMfY0n8yLiq7/o3VeHU5yakwUwWg/idhEBDnhjsDWu R7PTX97S/VnxXjNxPIKKbKPy62tBHDf9ZtVhzU8nLK5XM6bc9fuiyHKMRj/HNfN9liVO gTwZqp3Yz6fla0v6fgOo2gvtAPuSkvfHM7a1G6HoxrM0FJVpNVFO+N7XMiCWSTcJ6dX7 or28/rE8aa4OSjiVL6dEoanv4P+KwOh8B7OU0UMTiKtNJ/djNWNQIGU8S/K9nNLA7KYI 1Nsr9ZX9AC5LciMj7vP9UPQkbNDkUkn2tGQBY64l6OM25Lz5lgj8LpjPSE1rrmGuqRvl /fDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:cc:references:in-reply-to:message-id :date:to:from:delivered-to; bh=t9StOAQSnFOp5sAyAaLhcoQYjQAHzUws9haNsu3YEvI=; b=jTtxHRh0UvPzdwx2eY6PEBiz+tBRAprueDYyaKNEQM776S8cs+t8wcF05hPNusQctE Ba1fVtfgkrU87g4CQQFag+gfd/WgzaP8k8j9qX3KcKQAgsXf0WmhnFSxJ2y5S6fGcAoj OZne4GxbJpPmJbyN5An3RNVeVTcf/bpBNjTnTZdrQIhWy8eZphmle9bJzs1wzIPohUVh 9+EwhFPmw6RPejKHnm4ZoCwNZgaR2BpOlrovxM27EKf3doJ2nNFG+t8+MVL6DJEYOEtL 20Sxl0sIOKqcZCTqGm9qKBpqpTdXeVGDvYgNhiwONBUSvjbNDf7Y74kwlhQDpOqPH9Kn rF1A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linaro-uefi-bounces@lists.linaro.org designates 54.158.76.221 as permitted sender) smtp.mailfrom=linaro-uefi-bounces@lists.linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.linaro.org (ec2-54-158-76-221.compute-1.amazonaws.com. [54.158.76.221]) by mx.google.com with ESMTPS id v127si3238279qkc.159.2019.01.31.22.02.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 31 Jan 2019 22:02:33 -0800 (PST) Received-SPF: pass (google.com: domain of linaro-uefi-bounces@lists.linaro.org designates 54.158.76.221 as permitted sender) client-ip=54.158.76.221; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linaro-uefi-bounces@lists.linaro.org designates 54.158.76.221 as permitted sender) smtp.mailfrom=linaro-uefi-bounces@lists.linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id D0BC761995; Fri, 1 Feb 2019 06:02:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on ip-10-150-125-211.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL autolearn=disabled version=3.4.2 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 0BBF561999; Fri, 1 Feb 2019 06:02:13 +0000 (UTC) X-Original-To: linaro-uefi@lists.linaro.org Delivered-To: linaro-uefi@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 0C0F66197D; Fri, 1 Feb 2019 06:02:05 +0000 (UTC) Received: from mail-pf1-f194.google.com (mail-pf1-f194.google.com [209.85.210.194]) by lists.linaro.org (Postfix) with ESMTPS id BB19A61957 for ; Fri, 1 Feb 2019 06:02:03 +0000 (UTC) Received: by mail-pf1-f194.google.com with SMTP id c73so2618205pfe.13 for ; Thu, 31 Jan 2019 22:02:03 -0800 (PST) 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=fLgTa2VAiCfTuWj6qO/6PHPeuzeE8lgLVGtHyPe+ZwHoZiObFrZWfX5ZpaI1Vo2Yf3 ob2ucwf3xlsiYkiyPy8AlWIHYGomI2bG3tbLa5yUTcvLMnMhSIT0OLCV8RiladrRib0Z 11kHifBa7tbHAAP+EK/kUdsuW2m/NsCbXMXYe4H7f63IWRvEjpET+ZuAC3XvsEiPWsaB O+t5H/T9eeNO+iE8Ew0/narLTTUz2DRhB/3drzK1FOHLv4uztLj63wHA90YvoFC6WVNa MDiSICENaGSzxk/IWsHqqYuNpfXQHBms8gR/s3mogjALWRzGOYX56OLHJ/wSYKQl/T1w Q9TQ== X-Gm-Message-State: AJcUukdbzuvSTOFx+bW7jWT8PyHFmBeAbQu65PfGaU6WKJB7D7VNhVS1 PBlUO8a2ShUP363iVzqbFN1SnYWrMUOQww== 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 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> Cc: huangming23@huawei.com, eric.dong@intel.com, zhangjinsong2@huawei.com, star.zeng@intel.com, waip23@126.com, wanghuiqiang@huawei.com, huangdaode@hisilicon.com Subject: [Linaro-uefi] [MdePkg/BaseLib v1 1/1] MdePkg BaseLib: Add new API CalculateCrc16() X-BeenThere: linaro-uefi@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "For discussions about Linaro-related UEFI development. Not a substitute for edk2-devel." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linaro-uefi-bounces@lists.linaro.org Sender: "Linaro-uefi" 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; +} +