From: Matt_Domsch@Dell.com
To: linux-ia64@vger.kernel.org
Subject: [Linux-ia64] [PATCH] EFI GPT CRC32 function fix - take 2
Date: Thu, 30 Nov 2000 21:40:08 +0000 [thread overview]
Message-ID: <marc-linux-ia64-105590678205780@msgid-missing> (raw)
In-Reply-To: <marc-linux-ia64-105590678205779@msgid-missing>
My previous submission had an ugly comment inserted when the crc code was
put into OpenSSH, which said "All rights reserved". Rather than trust that
no one would get upset over a one-line copyrighted function prototype,
here's a pass that should guarantee license compliance. This applies
against the last 2.4.0-test10-ia64 patch.
Thanks,
Matt
diff -burN kernel24-2.4.0-test10/linux/fs/partitions/Makefile
kernel24-2.4.0-test10-crcfix/linux/fs/partitions/Makefile
--- kernel24-2.4.0-test10/linux/fs/partitions/Makefile Thu Nov 30 15:47:31
2000
+++ kernel24-2.4.0-test10-crcfix/linux/fs/partitions/Makefile Thu Nov 30
15:44:05 2000
@@ -8,7 +8,7 @@
# Note 2! The CFLAGS definitions are now in the main makefile...
O_TARGET := partitions.o
-OX_OBJS := check.o
+OX_OBJS := check.o efi_crc32.o
obj-$(CONFIG_ACORN_PARTITION) += acorn.o
obj-$(CONFIG_AMIGA_PARTITION) += amiga.o
diff -burN kernel24-2.4.0-test10/linux/fs/partitions/efi.c
kernel24-2.4.0-test10-crcfix/linux/fs/partitions/efi.c
--- kernel24-2.4.0-test10/linux/fs/partitions/efi.c Thu Nov 30 15:47:31
2000
+++ kernel24-2.4.0-test10-crcfix/linux/fs/partitions/efi.c Thu Nov 30
15:49:54 2000
@@ -4,8 +4,14 @@
* http://developer.intel.com/technology/efi/efi.htm
* efi.[ch] by Matt Domsch <Matt_Domsch@dell.com>
* Copyright 2000 Dell Computer Corporation
- * CRC routines taken from the EFI Sample Implementation,
- * 1999.12.31, lib/crc.c
+ *
+ * Note, the EFI Specification, v0.99, has a reference to
+ * Dr. Dobbs Journal, May 1994 (actually it's in May 1992)
+ * but that isn't the CRC function being used by EFI. Intel's
+ * EFI Sample Implementation shows that they use the same function
+ * as was COPYRIGHT (C) 1986 Gary S. Brown. See the files efi_crc32.[ch]
+ * for further information.
+ *
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -25,6 +31,10 @@
* TODO:
*
* Changelog:
+ * Thu Nov 30 2000 Matt Domsch <Matt_Domsch@dell.com>
+ * - Replaced Intel's CRC32 function with an equivalent
+ * non-license-restricted version.
+ *
* Wed Oct 25 2000 Matt Domsch <Matt_Domsch@dell.com>
* - Fixed the LastLBA() call to return the proper last block
*
@@ -46,6 +56,7 @@
#include <asm/efi.h>
#include "check.h"
+#include "efi_crc32.h"
#include "efi.h"
#if CONFIG_BLK_DEV_MD && CONFIG_AUTODETECT_RAID
@@ -61,76 +72,7 @@
#define debug_printk(...)
#endif
-/* CRC routines taken from the EFI Sample Implementation,
- * 1999.12.31, lib/crc.c
- *
- * Note, the EFI Specification, v0.99, has a reference to
- * Dr. Dobbs Journal, May 1994 (actually it's in May 1992)
- * but that isn't the CRC function being used by EFI.
- */
-
-static u32 CRCTable[256] = {
- 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419,
0x706AF48F,
- 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E,
0x97D2D988,
- 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064,
0x6AB020F2,
- 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551,
0x83D385C7,
- 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F,
0x63066CD9,
- 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4,
0xA2677172,
- 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA,
0x42B2986C,
- 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF,
0xABD13D59,
- 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5,
0x56B3C423,
- 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2,
0xB10BE924,
- 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190,
0x01DB7106,
- 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5,
0xE8B8D433,
- 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB,
0x086D3D2D,
- 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8,
0xF262004E,
- 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6,
0x12B7E950,
- 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3,
0xFBD44C65,
- 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541,
0x3DD895D7,
- 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846,
0xDA60B8D0,
- 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C,
0x270241AA,
- 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409,
0xCE61E49F,
- 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17,
0x2EB40D81,
- 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C,
0x74B1D29A,
- 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12,
0x94643B84,
- 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27,
0x7D079EB1,
- 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D,
0x806567CB,
- 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A,
0x67DD4ACC,
- 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8,
0xA1D1937E,
- 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD,
0x48B2364B,
- 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3,
0xA867DF55,
- 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0,
0x5268E236,
- 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE,
0xB2BD0B28,
- 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B,
0x5BDEAE1D,
- 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9,
0xEB0E363F,
- 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE,
0x0CB61B38,
- 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4,
0xF1D4E242,
- 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1,
0x18B74777,
- 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF,
0xF862AE69,
- 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354,
0x3903B3C2,
- 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A,
0xD9D65ADC,
- 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F,
0x30B5FFE9,
- 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605,
0xCDD70693,
- 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02,
0x2A6F2B94,
- 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
-};
-
-static u32
-CalculateCrc (void *_pt, u32 Size)
-{
- u8 *pt = (u8 *)_pt;
- register u32 Crc;
- /* compute crc */
- Crc = 0xffffffff;
- while (Size) {
- Crc = (Crc >> 8) ^ CRCTable[(__u8) Crc ^ *pt];
- pt += 1;
- Size -= 1;
- }
- Crc = Crc ^ 0xffffffff;
- return Crc;
-}
@@ -387,7 +329,7 @@
/* Check the GUID Partition Table CRC */
origcrc = (*gpt)->HeaderCRC32;
(*gpt)->HeaderCRC32 = 0;
- crc = CalculateCrc(*gpt, (*gpt)->HeaderSize);
+ crc = efi_crc32((const unsigned char *)(*gpt), (*gpt)->HeaderSize);
if (crc != origcrc) {
@@ -415,7 +357,8 @@
}
/* Check the GUID Partition Entry Array CRC */
- crc = CalculateCrc(*ptes, (*gpt)->NumberOfPartitionEntries *
+ crc = efi_crc32((const unsigned char *)(*ptes),
+ (*gpt)->NumberOfPartitionEntries *
(*gpt)->SizeOfPartitionEntry);
if (crc != (*gpt)->PartitionEntryArrayCRC32) {
diff -burN kernel24-2.4.0-test10/linux/fs/partitions/efi_crc32.c
kernel24-2.4.0-test10-crcfix/linux/fs/partitions/efi_crc32.c
--- kernel24-2.4.0-test10/linux/fs/partitions/efi_crc32.c Wed Dec 31
18:00:00 1969
+++ kernel24-2.4.0-test10-crcfix/linux/fs/partitions/efi_crc32.c Thu
Nov 30 15:43:38 2000
@@ -0,0 +1,127 @@
+/*
+ * Nov 30, 2000 Matt Domsch <Matt_Domsch@dell.com>
+ * - Copied crc32.c from the linux/drivers/net/cipe directory,
+ * now named efi_crc32.[ch]
+ * - Modified it by seeding the crc with ~0 instead of 0, and
+ * xor'ing the final value with ~0, per Intel EFI algorithm.
+ * - changed unsigned long to u32, added #include<linux/types.h>
+ * - changed len to be an unsigned long
+ * - changed crc32val to be a register
+ * - named the function efi_crc32() to be clear that it's different
+ * - License remains unchanged! It's still GPL-compatable!
+ */
+
+ /* =============================== */
+ /* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
*/
+ /* code or tables extracted from it, as desired without restriction.
*/
+ /*
*/
+ /* First, the polynomial itself and its table of feedback terms. The
*/
+ /* polynomial is
*/
+ /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
*/
+ /*
*/
+ /* Note that we take it "backwards" and put the highest-order term in
*/
+ /* the lowest-order bit. The X^32 term is "implied"; the LSB is the
*/
+ /* X^31 term, etc. The X^0 term (usually shown as "+1") results in
*/
+ /* the MSB being 1.
*/
+ /*
*/
+ /* Note that the usual hardware shift register implementation, which
*/
+ /* is what we're using (we're merely optimizing it by doing eight-bit
*/
+ /* chunks at a time) shifts bits into the lowest-order term. In our
*/
+ /* implementation, that means shifting towards the right. Why do we
*/
+ /* do it this way? Because the calculated CRC must be transmitted in
*/
+ /* order from highest-order term to lowest-order term. UARTs transmit
*/
+ /* characters in order from LSB to MSB. By storing the CRC this way,
*/
+ /* we hand it to the UART in the order low-byte to high-byte; the UART
*/
+ /* sends each low-bit to hight-bit; and the result is transmission bit
*/
+ /* by bit from highest- to lowest-order term without requiring any bit
*/
+ /* shuffling on our part. Reception works similarly.
*/
+ /*
*/
+ /* The feedback terms table consists of 256, 32-bit entries. Notes:
*/
+ /*
*/
+ /* The table can be generated at runtime if desired; code to do so
*/
+ /* is shown later. It might not be obvious, but the feedback
*/
+ /* terms simply represent the results of eight shift/xor opera-
*/
+ /* tions for all combinations of data and CRC register values.
*/
+ /*
*/
+ /* The values must be right-shifted by eight bits by the "updcrc"
*/
+ /* logic; the shift must be unsigned (bring in zeroes). On some
*/
+ /* hardware you could probably optimize the shift in assembler by
*/
+ /* using byte-swap instructions.
*/
+ /* polynomial $edb88320
*/
+ /*
*/
+ /* --------------------------------------------------------------------
*/
+
+#include "efi_crc32.h"
+
+static u32 efi_crc32_tab[] = {
+ 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
+ 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
+ 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
+ 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
+ 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
+ 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
+ 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
+ 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
+ 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
+ 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
+ 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
+ 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
+ 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
+ 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
+ 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
+ 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
+ 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
+ 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
+ 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
+ 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
+ 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
+ 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
+ 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
+ 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
+ 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
+ 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
+ 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
+ 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
+ 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
+ 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
+ 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
+ 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
+ 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
+ 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
+ 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
+ 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
+ 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
+ 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
+ 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
+ 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
+ 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
+ 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
+ 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
+ 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
+ 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
+ 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
+ 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
+ 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
+ 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
+ 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
+ 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
+ 0x2d02ef8dL
+ };
+
+/* Return a 32-bit CRC of the contents of the buffer. */
+
+u32 efi_crc32(const unsigned char *s, unsigned long len)
+{
+ unsigned long i;
+ register u32 crc32val;
+
+ crc32val = ~0;
+ for (i = 0; i < len; i ++)
+ {
+ crc32val + efi_crc32_tab[(crc32val ^ s[i]) & 0xff] ^
+ (crc32val >> 8);
+ }
+ crc32val ^= ~0;
+ return crc32val;
+}
diff -burN kernel24-2.4.0-test10/linux/fs/partitions/efi_crc32.h
kernel24-2.4.0-test10-crcfix/linux/fs/partitions/efi_crc32.h
--- kernel24-2.4.0-test10/linux/fs/partitions/efi_crc32.h Wed Dec 31
18:00:00 1969
+++ kernel24-2.4.0-test10-crcfix/linux/fs/partitions/efi_crc32.h Thu
Nov 30 15:42:16 2000
@@ -0,0 +1,17 @@
+/*
+ * efi_crc32.h
+ * See efi_crc32.c for license and changes
+ */
+#ifndef EFI_CRC32_H
+#define EFI_CRC32_H
+
+#include <linux/types.h>
+
+/*
+ * This computes a 32 bit CRC of the data in the buffer, and returns the
CRC.
+ * The polynomial used is 0xedb88320.
+ */
+
+u32 efi_crc32(const unsigned char *buf, unsigned long len);
+
+#endif /* EFI_CRC32_H */
prev parent reply other threads:[~2000-11-30 21:40 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2000-11-30 16:33 [Linux-ia64] [PATCH] EFI GPT CRC32 function fix Matt_Domsch
2000-11-30 21:40 ` Matt_Domsch [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=marc-linux-ia64-105590678205780@msgid-missing \
--to=matt_domsch@dell.com \
--cc=linux-ia64@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.