2019-08-01 22:36:38 +08:00
|
|
|
//===-- checksum.cpp --------------------------------------------*- C++ -*-===//
|
[scudo][standalone] Implement checksumming functions
Summary:
This CL implements the checksumming functions. This departs from the
current Scudo code in one aspect: the software version is no longer
CRC32 but a BSD checksum. This is because the software CRC32 was too
impactful in terms of performances, the BSD checksum has no array
lookup which is better (and saves 1KB of data).
As with the current version, we only flip the CRC compiler flag for
a single compilation unit by default, to allow for a library compiled
with HW CRC32 to work on a system without HW CRC32.
There is some platform & hardware specific code in those files, but
since departs from a mere platform split, it felt right to me to have
it that way.
Reviewers: morehouse, eugenis, vitalybuka, hctim, mcgrathr
Reviewed By: morehouse
Subscribers: mgorny, delcypher, jfb, jdoerfert, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D59116
llvm-svn: 355923
2019-03-12 22:46:31 +08:00
|
|
|
//
|
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "checksum.h"
|
|
|
|
#include "atomic_helpers.h"
|
2022-03-29 12:49:46 +08:00
|
|
|
#include "chunk.h"
|
[scudo][standalone] Implement checksumming functions
Summary:
This CL implements the checksumming functions. This departs from the
current Scudo code in one aspect: the software version is no longer
CRC32 but a BSD checksum. This is because the software CRC32 was too
impactful in terms of performances, the BSD checksum has no array
lookup which is better (and saves 1KB of data).
As with the current version, we only flip the CRC compiler flag for
a single compilation unit by default, to allow for a library compiled
with HW CRC32 to work on a system without HW CRC32.
There is some platform & hardware specific code in those files, but
since departs from a mere platform split, it felt right to me to have
it that way.
Reviewers: morehouse, eugenis, vitalybuka, hctim, mcgrathr
Reviewed By: morehouse
Subscribers: mgorny, delcypher, jfb, jdoerfert, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D59116
llvm-svn: 355923
2019-03-12 22:46:31 +08:00
|
|
|
|
|
|
|
#if defined(__x86_64__) || defined(__i386__)
|
|
|
|
#include <cpuid.h>
|
|
|
|
#elif defined(__arm__) || defined(__aarch64__)
|
|
|
|
#if SCUDO_FUCHSIA
|
|
|
|
#include <zircon/features.h>
|
|
|
|
#include <zircon/syscalls.h>
|
|
|
|
#else
|
|
|
|
#include <sys/auxv.h>
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
namespace scudo {
|
|
|
|
|
2019-05-09 05:54:02 +08:00
|
|
|
Checksum HashAlgorithm = {Checksum::BSD};
|
[scudo][standalone] Implement checksumming functions
Summary:
This CL implements the checksumming functions. This departs from the
current Scudo code in one aspect: the software version is no longer
CRC32 but a BSD checksum. This is because the software CRC32 was too
impactful in terms of performances, the BSD checksum has no array
lookup which is better (and saves 1KB of data).
As with the current version, we only flip the CRC compiler flag for
a single compilation unit by default, to allow for a library compiled
with HW CRC32 to work on a system without HW CRC32.
There is some platform & hardware specific code in those files, but
since departs from a mere platform split, it felt right to me to have
it that way.
Reviewers: morehouse, eugenis, vitalybuka, hctim, mcgrathr
Reviewed By: morehouse
Subscribers: mgorny, delcypher, jfb, jdoerfert, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D59116
llvm-svn: 355923
2019-03-12 22:46:31 +08:00
|
|
|
|
|
|
|
#if defined(__x86_64__) || defined(__i386__)
|
|
|
|
// i386 and x86_64 specific code to detect CRC32 hardware support via CPUID.
|
|
|
|
// CRC32 requires the SSE 4.2 instruction set.
|
|
|
|
#ifndef bit_SSE4_2
|
|
|
|
#define bit_SSE4_2 bit_SSE42 // clang and gcc have different defines.
|
|
|
|
#endif
|
|
|
|
|
2020-05-12 00:16:54 +08:00
|
|
|
#ifndef signature_HYGON_ebx // They are not defined in gcc.
|
|
|
|
// HYGON: "HygonGenuine".
|
|
|
|
#define signature_HYGON_ebx 0x6f677948
|
|
|
|
#define signature_HYGON_edx 0x6e65476e
|
|
|
|
#define signature_HYGON_ecx 0x656e6975
|
|
|
|
#endif
|
|
|
|
|
[scudo][standalone] Implement checksumming functions
Summary:
This CL implements the checksumming functions. This departs from the
current Scudo code in one aspect: the software version is no longer
CRC32 but a BSD checksum. This is because the software CRC32 was too
impactful in terms of performances, the BSD checksum has no array
lookup which is better (and saves 1KB of data).
As with the current version, we only flip the CRC compiler flag for
a single compilation unit by default, to allow for a library compiled
with HW CRC32 to work on a system without HW CRC32.
There is some platform & hardware specific code in those files, but
since departs from a mere platform split, it felt right to me to have
it that way.
Reviewers: morehouse, eugenis, vitalybuka, hctim, mcgrathr
Reviewed By: morehouse
Subscribers: mgorny, delcypher, jfb, jdoerfert, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D59116
llvm-svn: 355923
2019-03-12 22:46:31 +08:00
|
|
|
bool hasHardwareCRC32() {
|
|
|
|
u32 Eax, Ebx = 0, Ecx = 0, Edx = 0;
|
|
|
|
__get_cpuid(0, &Eax, &Ebx, &Ecx, &Edx);
|
|
|
|
const bool IsIntel = (Ebx == signature_INTEL_ebx) &&
|
|
|
|
(Edx == signature_INTEL_edx) &&
|
|
|
|
(Ecx == signature_INTEL_ecx);
|
|
|
|
const bool IsAMD = (Ebx == signature_AMD_ebx) && (Edx == signature_AMD_edx) &&
|
|
|
|
(Ecx == signature_AMD_ecx);
|
2020-05-12 00:16:54 +08:00
|
|
|
const bool IsHygon = (Ebx == signature_HYGON_ebx) &&
|
|
|
|
(Edx == signature_HYGON_edx) &&
|
|
|
|
(Ecx == signature_HYGON_ecx);
|
|
|
|
if (!IsIntel && !IsAMD && !IsHygon)
|
[scudo][standalone] Implement checksumming functions
Summary:
This CL implements the checksumming functions. This departs from the
current Scudo code in one aspect: the software version is no longer
CRC32 but a BSD checksum. This is because the software CRC32 was too
impactful in terms of performances, the BSD checksum has no array
lookup which is better (and saves 1KB of data).
As with the current version, we only flip the CRC compiler flag for
a single compilation unit by default, to allow for a library compiled
with HW CRC32 to work on a system without HW CRC32.
There is some platform & hardware specific code in those files, but
since departs from a mere platform split, it felt right to me to have
it that way.
Reviewers: morehouse, eugenis, vitalybuka, hctim, mcgrathr
Reviewed By: morehouse
Subscribers: mgorny, delcypher, jfb, jdoerfert, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D59116
llvm-svn: 355923
2019-03-12 22:46:31 +08:00
|
|
|
return false;
|
|
|
|
__get_cpuid(1, &Eax, &Ebx, &Ecx, &Edx);
|
|
|
|
return !!(Ecx & bit_SSE4_2);
|
|
|
|
}
|
|
|
|
#elif defined(__arm__) || defined(__aarch64__)
|
|
|
|
#ifndef AT_HWCAP
|
|
|
|
#define AT_HWCAP 16
|
|
|
|
#endif
|
|
|
|
#ifndef HWCAP_CRC32
|
|
|
|
#define HWCAP_CRC32 (1U << 7) // HWCAP_CRC32 is missing on older platforms.
|
|
|
|
#endif
|
|
|
|
|
|
|
|
bool hasHardwareCRC32() {
|
|
|
|
#if SCUDO_FUCHSIA
|
|
|
|
u32 HWCap;
|
|
|
|
const zx_status_t Status =
|
|
|
|
zx_system_get_features(ZX_FEATURE_KIND_CPU, &HWCap);
|
|
|
|
if (Status != ZX_OK)
|
|
|
|
return false;
|
|
|
|
return !!(HWCap & ZX_ARM64_FEATURE_ISA_CRC32);
|
|
|
|
#else
|
|
|
|
return !!(getauxval(AT_HWCAP) & HWCAP_CRC32);
|
|
|
|
#endif // SCUDO_FUCHSIA
|
|
|
|
}
|
2019-12-10 05:06:34 +08:00
|
|
|
#else
|
|
|
|
// No hardware CRC32 implemented in Scudo for other architectures.
|
|
|
|
bool hasHardwareCRC32() { return false; }
|
[scudo][standalone] Implement checksumming functions
Summary:
This CL implements the checksumming functions. This departs from the
current Scudo code in one aspect: the software version is no longer
CRC32 but a BSD checksum. This is because the software CRC32 was too
impactful in terms of performances, the BSD checksum has no array
lookup which is better (and saves 1KB of data).
As with the current version, we only flip the CRC compiler flag for
a single compilation unit by default, to allow for a library compiled
with HW CRC32 to work on a system without HW CRC32.
There is some platform & hardware specific code in those files, but
since departs from a mere platform split, it felt right to me to have
it that way.
Reviewers: morehouse, eugenis, vitalybuka, hctim, mcgrathr
Reviewed By: morehouse
Subscribers: mgorny, delcypher, jfb, jdoerfert, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D59116
llvm-svn: 355923
2019-03-12 22:46:31 +08:00
|
|
|
#endif // defined(__x86_64__) || defined(__i386__)
|
|
|
|
|
|
|
|
} // namespace scudo
|