]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Faster crc32c
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 17 May 2017 05:16:31 +0000 (21:16 -0800)
committerKent Overstreet <kent.overstreet@gmail.com>
Sun, 8 Oct 2017 18:20:36 +0000 (10:20 -0800)
Makefile
ccan/crc/LICENSE [deleted file]
ccan/crc/_info [deleted file]
ccan/crc/crc.c [deleted file]
ccan/crc/crc.h [deleted file]
include/linux/crc32c.h
tools-util.c
tools-util.h

index cd338fa06cb78e79aeb29b06216bac85cc074da4..4c6d7a84bd9fe6cefafe45d494ae9d5d652a8cec 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -19,10 +19,6 @@ CC_VERSION=$(shell $(CC) -v 2>&1|grep -E '(gcc|clang) version')
 
 ifneq (,$(findstring gcc,$(CC_VERSION)))
        CFLAGS+=-Wno-unused-but-set-variable
-ifndef D
-       CFLAGS+=-flto
-       LDFLAGS+=-flto
-endif
 endif
 
 ifneq (,$(findstring clang,$(CC_VERSION)))
diff --git a/ccan/crc/LICENSE b/ccan/crc/LICENSE
deleted file mode 100644 (file)
index d511905..0000000
+++ /dev/null
@@ -1,339 +0,0 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                   GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                           NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    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
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/ccan/crc/_info b/ccan/crc/_info
deleted file mode 100644 (file)
index 8a47db9..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "config.h"
-#include <string.h>
-#include <stdio.h>
-
-/**
- * crc - routines for crc of bytes
- *
- * Cyclic Redundancy Check routines.  These are reasonably fast
- * checksum routines, but not suitable for cryptographic use.
- *
- * They are useful for simple error detection, eg. a 32-bit CRC will
- * detect a single error burst of up to 32 bits.
- *
- * Example:
- *     #include <ccan/crc/crc.h>
- *     #include <stdio.h>
- *     #include <stdlib.h>
- *
- *     // Given "IHATEMATH" outputs 0x98a3b8df
- *     int main(int argc, char *argv[])
- *     {
- *             if (argc != 2) {
- *                     fprintf(stderr, "Usage: %s <string>\n"
- *                             "Prints 32 bit CRC of the string\n", argv[0]);
- *                     exit(1);
- *             }
- *             printf("0x%08x\n", crc32c(0, argv[1], strlen(argv[1])));
- *             exit(0);
- *     }
- *
- * License: GPL (v2 or any later version)
- * Author: Gary S. Brown, Clay Haapala
- * Maintainer: Rusty Russell <rusty@rustcorp.com.au>
- */
-int main(int argc, char *argv[])
-{
-       if (argc != 2)
-               return 1;
-
-       if (strcmp(argv[1], "depends") == 0) {
-               printf("ccan/array_size\n");
-               return 0;
-       }
-
-       return 1;
-}
diff --git a/ccan/crc/crc.c b/ccan/crc/crc.c
deleted file mode 100644 (file)
index d2c8c31..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-/* crc32_ieee code:
- *  COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or
- *  code or tables extracted from it, as desired without restriction.
- */
-
-/* crc32c code taken from 2.6.29 Linux kernel crypto/crc32c.c:
- * Copyright (c) 2004 Cisco Systems, Inc.
- * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
- *
- * 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 the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version. */
-
-/* crc64 code taken from Jacksum version 1.7.0 - checksum utility in Java
- * E-mail: jonelo@jonelo.de
- * Copyright (C) 2001-2006 Dipl.-Inf. (FH) Johann Nepomuk Loefflmann,
- * All Rights Reserved, http://www.jonelo.de
- *
- * 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 the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- */
-
-#include "crc.h"
-#include <ccan/array_size/array_size.h>
-#include <stdbool.h>
-#include <stdlib.h>
-
-/*
- * This is the CRC-32C table
- * Generated with:
- * width = 32 bits
- * poly = 0x1EDC6F41
- * reflect input bytes = true
- * reflect output bytes = true
- */
-static const uint32_t crc32c_tab[] = {
-       0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
-       0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
-       0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
-       0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
-       0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
-       0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
-       0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
-       0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
-       0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
-       0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
-       0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
-       0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
-       0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
-       0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
-       0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
-       0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
-       0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
-       0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
-       0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
-       0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
-       0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
-       0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
-       0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
-       0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
-       0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
-       0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
-       0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
-       0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
-       0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
-       0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
-       0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
-       0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
-       0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
-       0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
-       0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
-       0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
-       0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
-       0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
-       0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
-       0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
-       0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
-       0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
-       0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
-       0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
-       0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
-       0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
-       0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
-       0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
-       0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
-       0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
-       0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
-       0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
-       0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
-       0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
-       0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
-       0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
-       0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
-       0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
-       0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
-       0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
-       0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
-       0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
-       0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
-       0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351
-};
-
-/*
- * Steps through buffer one byte at at time, calculates reflected
- * crc using table.
- */
-uint32_t crc32c(uint32_t crc, const void *buf, size_t size)
-{
-       const uint8_t *p = buf;
-
-       while (size--)
-               crc = crc32c_tab[(crc ^ *p++) & 0xFFL] ^ (crc >> 8);
-
-       return crc;
-}
-
-const uint32_t *crc32c_table(void)
-{
-       return crc32c_tab;
-}
-
-static const uint32_t crc32_ieee_tab[] = {
-       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
-};
-
-uint32_t crc32_ieee(uint32_t crc, const void *buf, size_t size)
-{
-       const uint8_t *p;
-
-       p = buf;
-       crc ^= ~0U;
-
-       while (size--)
-               crc = crc32_ieee_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
-
-       return crc ^ ~0U;
-}
-
-const uint32_t *crc32_ieee_table(void)
-{
-       return crc32_ieee_tab;
-}
-
-/* We only keep the upper 16 bits of the table: the lower 48 are always 0 */
-static uint16_t crc64_tab[] = {
-    0x0000, 0x01b0, 0x0360,
-    0x02d0, 0x06c0, 0x0770,
-    0x05a0, 0x0410, 0x0d80,
-    0x0c30, 0x0ee0, 0x0f50,
-    0x0b40, 0x0af0, 0x0820,
-    0x0990, 0x1b00, 0x1ab0,
-    0x1860, 0x19d0, 0x1dc0,
-    0x1c70, 0x1ea0, 0x1f10,
-    0x1680, 0x1730, 0x15e0,
-    0x1450, 0x1040, 0x11f0,
-    0x1320, 0x1290, 0x3600,
-    0x37b0, 0x3560, 0x34d0,
-    0x30c0, 0x3170, 0x33a0,
-    0x3210, 0x3b80, 0x3a30,
-    0x38e0, 0x3950, 0x3d40,
-    0x3cf0, 0x3e20, 0x3f90,
-    0x2d00, 0x2cb0, 0x2e60,
-    0x2fd0, 0x2bc0, 0x2a70,
-    0x28a0, 0x2910, 0x2080,
-    0x2130, 0x23e0, 0x2250,
-    0x2640, 0x27f0, 0x2520,
-    0x2490, 0x6c00, 0x6db0,
-    0x6f60, 0x6ed0, 0x6ac0,
-    0x6b70, 0x69a0, 0x6810,
-    0x6180, 0x6030, 0x62e0,
-    0x6350, 0x6740, 0x66f0,
-    0x6420, 0x6590, 0x7700,
-    0x76b0, 0x7460, 0x75d0,
-    0x71c0, 0x7070, 0x72a0,
-    0x7310, 0x7a80, 0x7b30,
-    0x79e0, 0x7850, 0x7c40,
-    0x7df0, 0x7f20, 0x7e90,
-    0x5a00, 0x5bb0, 0x5960,
-    0x58d0, 0x5cc0, 0x5d70,
-    0x5fa0, 0x5e10, 0x5780,
-    0x5630, 0x54e0, 0x5550,
-    0x5140, 0x50f0, 0x5220,
-    0x5390, 0x4100, 0x40b0,
-    0x4260, 0x43d0, 0x47c0,
-    0x4670, 0x44a0, 0x4510,
-    0x4c80, 0x4d30, 0x4fe0,
-    0x4e50, 0x4a40, 0x4bf0,
-    0x4920, 0x4890, 0xd800,
-    0xd9b0, 0xdb60, 0xdad0,
-    0xdec0, 0xdf70, 0xdda0,
-    0xdc10, 0xd580, 0xd430,
-    0xd6e0, 0xd750, 0xd340,
-    0xd2f0, 0xd020, 0xd190,
-    0xc300, 0xc2b0, 0xc060,
-    0xc1d0, 0xc5c0, 0xc470,
-    0xc6a0, 0xc710, 0xce80,
-    0xcf30, 0xcde0, 0xcc50,
-    0xc840, 0xc9f0, 0xcb20,
-    0xca90, 0xee00, 0xefb0,
-    0xed60, 0xecd0, 0xe8c0,
-    0xe970, 0xeba0, 0xea10,
-    0xe380, 0xe230, 0xe0e0,
-    0xe150, 0xe540, 0xe4f0,
-    0xe620, 0xe790, 0xf500,
-    0xf4b0, 0xf660, 0xf7d0,
-    0xf3c0, 0xf270, 0xf0a0,
-    0xf110, 0xf880, 0xf930,
-    0xfbe0, 0xfa50, 0xfe40,
-    0xfff0, 0xfd20, 0xfc90,
-    0xb400, 0xb5b0, 0xb760,
-    0xb6d0, 0xb2c0, 0xb370,
-    0xb1a0, 0xb010, 0xb980,
-    0xb830, 0xbae0, 0xbb50,
-    0xbf40, 0xbef0, 0xbc20,
-    0xbd90, 0xaf00, 0xaeb0,
-    0xac60, 0xadd0, 0xa9c0,
-    0xa870, 0xaaa0, 0xab10,
-    0xa280, 0xa330, 0xa1e0,
-    0xa050, 0xa440, 0xa5f0,
-    0xa720, 0xa690, 0x8200,
-    0x83b0, 0x8160, 0x80d0,
-    0x84c0, 0x8570, 0x87a0,
-    0x8610, 0x8f80, 0x8e30,
-    0x8ce0, 0x8d50, 0x8940,
-    0x88f0, 0x8a20, 0x8b90,
-    0x9900, 0x98b0, 0x9a60,
-    0x9bd0, 0x9fc0, 0x9e70,
-    0x9ca0, 0x9d10, 0x9480,
-    0x9530, 0x97e0, 0x9650,
-    0x9240, 0x93f0, 0x9120,
-    0x9090
-};
-
-uint64_t crc64_iso(uint64_t crc, const void *buf, size_t size)
-{
-       const uint8_t *p = buf;
-
-       while (size--) {
-               uint64_t tabval = crc64_tab[(crc ^ *p++) & 0xFFL];
-               tabval <<= 48;
-               crc = tabval ^ (crc >> 8);
-       }
-       return crc;
-}
-
-const uint64_t *crc64_iso_table(void)
-{
-       static uint64_t *fulltab = NULL;
-       unsigned int i;
-
-       if (fulltab)
-               return fulltab;
-
-       fulltab = malloc(sizeof(uint64_t)*ARRAY_SIZE(crc64_tab));
-       if (!fulltab)
-               return NULL;
-
-       for (i = 0; i < ARRAY_SIZE(crc64_tab); i++)
-               fulltab[i] = (uint64_t)crc64_tab[i] << 48;
-
-       return fulltab;
-}
diff --git a/ccan/crc/crc.h b/ccan/crc/crc.h
deleted file mode 100644 (file)
index 25789b7..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Licensed under GPLv2+ - see LICENSE file for details */
-#ifndef CCAN_CRC_H
-#define CCAN_CRC_H
-#include <stdint.h>
-#include <stdlib.h>
-
-/**
- * crc32c - Castagnoli 32 bit crc of string of bytes
- * @start_crc: the initial crc (usually 0)
- * @buf: pointer to bytes
- * @size: length of buffer
- *
- * If you don't know what crc32 to use, use this one: it's the best.
- *
- * @Article{castagnoli-crc,
- * author =       { Guy Castagnoli and Stefan Braeuer and Martin Herrman},
- * title =        {{Optimization of Cyclic Redundancy-Check Codes with 24
- *                 and 32 Parity Bits}},
- * journal =      IEEE Transactions on Communication,
- * year =         {1993},
- * volume =       {41},
- * number =       {6},
- * pages =        {},
- * month =        {June},
- *}
- * 32 bit CRC checksum using polynomial
- * X^32+X^28+X^27+X^26+X^25+X^23+X^22+X^20+X^19+X^18+X^14+X^13+X^11+X^10+X^9+X^8+X^6+X^0.
- *
- * You can calculate the CRC of non-contiguous arrays by passing @start_crc
- * as 0 the first time, and the current crc result from then on.
- *
- * Example:
- *     #include <sys/uio.h>
- *     ...
- *     // Check that iovec has the crc we expect (Castagnoli version)
- *     static bool check_crc(uint32_t expected, const struct iovec *iov, int l)
- *     {
- *             uint32_t crc = 0;
- *             while (l >= 0) {
- *                     crc = crc32c(crc, iov->iov_base, iov->iov_len);
- *                     iov++;
- *             }
- *             return crc == expected;
- *     }
- */
-uint32_t crc32c(uint32_t start_crc, const void *buf, size_t size);
-
-/**
- * crc32c_table - Get the Castagnoli CRC table
- *
- * For special effects, you might want direct access to the table; this is
- * the standard 256-entry table for this algorithm.
- *
- * In theory, this might need to malloc(), and thus return NULL.
- *
- * Example:
- *     // This dumb code only handles Castagnoli, so assert that here.
- *     static void check_user_crc_table(const uint32_t *usertab)
- *     {
- *             const uint32_t *ctab = crc32c_table();
- *             if (!ctab || memcmp(ctab, usertab, 1024) != 0)
- *                     abort();
- *     }
- */
-const uint32_t *crc32c_table(void);
-
-/**
- * crc32_ieee - IEEE 802.3 32 bit crc of string of bytes
- * @start_crc: the initial crc (usually 0)
- * @buf: pointer to bytes
- * @size: length of buffer
- *
- * 32 bit CRC checksum using polynomial
- * 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.
- *
- * See crc32c() for details.
- */
-uint32_t crc32_ieee(uint32_t start_crc, const void *buf, size_t size);
-
-/**
- * crc32_ieee_table - Get the IEEE 802.3 CRC table
- *
- * See crc32c_table() for details.
- */
-const uint32_t *crc32_ieee_table(void);
-
-/**
- * crc64_iso - ISO 3309
- * @start_crc: the initial crc (usually 0)
- * @buf: pointer to bytes
- * @size: length of buffer
- *
- * 64 bit CRC checksum using polynomial
- * X^64 + X^4 + X^3 + X^1 + X^0
- *
- * See crc32c() for details.
- */
-uint64_t crc64_iso(uint64_t start_crc, const void *buf, size_t size);
-
-/**
- * crc64_iso_table - Get the ISO 3309 CRC table
- *
- * See crc32c_table() for details.
- */
-const uint64_t *crc64_iso_table(void);
-
-#endif /* CCAN_CRC_H */
index f198ab2cf15e8a6f0ff8fe329329cf0af553938b..1ac74f7de11f79b99613eadec97f81752ba4e4ea 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef _LINUX_CRC32C_H
 #define _LINUX_CRC32C_H
 
-#include "../../ccan/crc/crc.h"
+#include "tools-util.h"
 
 #endif /* _LINUX_CRC32C_H */
index 4b9c7aee935ac07b8c45ec6f207dc7b26d01120a..f89e6e653421a18199f65eeb706b27ee36d2b2b0 100644 (file)
@@ -16,8 +16,6 @@
 #include <blkid.h>
 #include <uuid/uuid.h>
 
-#include "ccan/crc/crc.h"
-
 #include "bcachefs_ioctl.h"
 #include "linux/sort.h"
 #include "tools-util.h"
@@ -416,3 +414,155 @@ unsigned hatoi_validate(const char *s, const char *msg)
 
        return v;
 }
+
+/* crc32c */
+
+static u32 crc32c_default(u32 crc, const void *buf, size_t size)
+{
+       static const u32 crc32c_tab[] = {
+               0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
+               0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
+               0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
+               0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
+               0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
+               0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
+               0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
+               0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
+               0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
+               0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
+               0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
+               0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
+               0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
+               0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
+               0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
+               0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
+               0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
+               0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
+               0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
+               0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
+               0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
+               0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
+               0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
+               0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
+               0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
+               0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
+               0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
+               0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
+               0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
+               0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
+               0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
+               0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
+               0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
+               0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
+               0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
+               0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
+               0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
+               0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
+               0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
+               0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
+               0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
+               0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
+               0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
+               0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
+               0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
+               0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
+               0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
+               0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
+               0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
+               0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
+               0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
+               0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
+               0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
+               0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
+               0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
+               0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
+               0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
+               0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
+               0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
+               0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
+               0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
+               0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
+               0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
+               0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351
+       };
+       const u8 *p = buf;
+
+       while (size--)
+               crc = crc32c_tab[(crc ^ *p++) & 0xFFL] ^ (crc >> 8);
+
+       return crc;
+}
+
+#include <linux/compiler.h>
+
+#ifdef __x86_64__
+
+#ifdef CONFIG_X86_64
+#define REX_PRE "0x48, "
+#else
+#define REX_PRE
+#endif
+
+static u32 crc32c_sse42(u32 crc, const void *buf, size_t size)
+{
+       while (size >= sizeof(long)) {
+               const unsigned long *d = buf;
+
+               __asm__ __volatile__(
+                       ".byte 0xf2, " REX_PRE "0xf, 0x38, 0xf1, 0xf1;"
+                       :"=S"(crc)
+                       :"0"(crc), "c"(*d)
+               );
+               buf     += sizeof(long);
+               size    -= sizeof(long);
+       }
+
+       while (size) {
+               const u8 *d = buf;
+
+               __asm__ __volatile__(
+                       ".byte 0xf2, 0xf, 0x38, 0xf0, 0xf1"
+                       :"=S"(crc)
+                       :"0"(crc), "c"(*d)
+               );
+               buf     += 1;
+               size    -= 1;
+       }
+
+       return crc;
+}
+
+static void *resolve_crc32c(void)
+{
+       __builtin_cpu_init();
+
+#ifdef __x86_64__
+       if (__builtin_cpu_supports("sse4.2"))
+               return crc32c_sse42;
+#endif
+       return crc32c_default;
+}
+
+/*
+ * ifunc is buggy and I don't know what breaks it (LTO?)
+ */
+#ifdef HAVE_WORKING_IFUNC
+
+u32 crc32c(u32, const void *, size_t)
+       __attribute__((ifunc("resolve_crc32c")));
+
+#else
+
+u32 crc32c(u32 crc, const void *buf, size_t size)
+{
+       static u32 (*real_crc32c)(u32, const void *, size_t);
+
+       if (unlikely(!real_crc32c))
+               real_crc32c = resolve_crc32c();
+
+       return real_crc32c(crc, buf, size);
+}
+
+#endif /* HAVE_WORKING_IFUNC */
+
+#endif
index 14ced032f1dd3dcff0c06c7bc7658abafb3dcb5f..c8ece0c8d79078f2c6384d1da768c1c94292c5f4 100644 (file)
@@ -149,4 +149,6 @@ const char *strcmp_prefix(const char *, const char *);
 
 unsigned hatoi_validate(const char *, const char *);
 
+u32 crc32c(u32, const void *, size_t);
+
 #endif /* _TOOLS_UTIL_H */