mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-28 15:50:26 +08:00
50ed179e9a
Use BUILDFLAG(IS_*) instead of defined(OS_*). This was generated mostly mechnically by performing the following steps: - sed -i '' -E -e 's/defined\(OS_/BUILDFLAG(IS_/g' \ -e 's%([ !])OS_([A-Z]+)%\1BUILDFLAG(IS_\2)%g' \ $(git grep -l 'OS_' '**/*.c' '**/*.cc' '**/*.h' '**/*.m' '**/*.mm') - sed -i '' -e 's/#ifdef BUILDFLAG(/#if BUILDFLAG(/' \ $(git grep -l '#ifdef BUILDFLAG(' '**/*.c' '**/*.cc' '**/*.h' '**/*.m' '**/*.mm') - gsed -i -z -E -e \ 's%(.*)#include "%\1#include "build/buildflag.h"\n#include "%' \ $(git grep -l 'BUILDFLAG(IS_' '**/*.c' '**/*.cc' '**/*.h' '**/*.m' '**/*.mm') - Spot checks to move #include "build/buildflag.h" to the correct parts of files. - sed -i '' -E -e \ 's%^(#include "build/buildflag.h")$%#include "build/build_config.h"\n\1%' \ $(grep -L '^#include "build/build_config.h"$' $(git grep -l 'BUILDFLAG(IS_' '**/*.c' '**/*.cc' '**/*.h' '**/*.m' '**/*.mm')) - Add “clang-format off” around tool usage messages. - git cl format - Update mini_chromium to 85ba51f98278 (intermediate step). TESTING ONLY). - for f in $(git grep -l '^#include "build/buildflag.h"$' '**/*.c' '**/*.cc' '**/*.h' '**/*.m' '**/*.mm'); do \ grep -v '^#include "build/buildflag.h"$' "${f}" > /tmp/z; \ cp /tmp/z "${f}"; done - git cl format - Update mini_chromium to 735143774c5f (intermediate step). - Update mini_chromium to f41420eb45fa (as checked in). - Update mini_chromium to 6e2f204b4ae1 (as checked in). For ease of review and inspection, each of these steps is uploaded as a new patch set in a review series. This includes an update of mini_chromium to 6e2f204b4ae1: f41420eb45fa Use BUILDFLAG for OS checking 6e2f204b4ae1 Include what you use: string_util.h uses build_config.h Bug: chromium:1234043 Change-Id: Ieef86186f094c64e59b853729737e36982f8cf69 Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/3400258 Reviewed-by: Joshua Peraza <jperaza@chromium.org> Commit-Queue: Mark Mentovai <mark@chromium.org>
139 lines
4.1 KiB
C++
139 lines
4.1 KiB
C++
// Copyright 2017 The Crashpad Authors. All rights reserved.
|
||
//
|
||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
// you may not use this file except in compliance with the License.
|
||
// You may obtain a copy of the License at
|
||
//
|
||
// http://www.apache.org/licenses/LICENSE-2.0
|
||
//
|
||
// Unless required by applicable law or agreed to in writing, software
|
||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
// See the License for the specific language governing permissions and
|
||
// limitations under the License.
|
||
|
||
#include "snapshot/x86/cpuid_reader.h"
|
||
|
||
#include <stddef.h>
|
||
|
||
#include "build/build_config.h"
|
||
#include "snapshot/cpu_context.h"
|
||
|
||
#if BUILDFLAG(IS_WIN)
|
||
#include <immintrin.h>
|
||
#include <intrin.h>
|
||
#endif // BUILDFLAG(IS_WIN)
|
||
|
||
#if defined(ARCH_CPU_X86_FAMILY)
|
||
|
||
namespace crashpad {
|
||
namespace internal {
|
||
|
||
CpuidReader::CpuidReader()
|
||
: features_(0),
|
||
extended_features_(0),
|
||
vendor_(),
|
||
max_leaf_(0),
|
||
signature_(0) {
|
||
uint32_t cpuinfo[4];
|
||
Cpuid(cpuinfo, 0);
|
||
max_leaf_ = cpuinfo[0];
|
||
vendor_.append(reinterpret_cast<char*>(&cpuinfo[1]), 4);
|
||
vendor_.append(reinterpret_cast<char*>(&cpuinfo[3]), 4);
|
||
vendor_.append(reinterpret_cast<char*>(&cpuinfo[2]), 4);
|
||
|
||
Cpuid(cpuinfo, 1);
|
||
signature_ = cpuinfo[0];
|
||
features_ = (static_cast<uint64_t>(cpuinfo[2]) << 32) |
|
||
static_cast<uint64_t>(cpuinfo[3]);
|
||
|
||
Cpuid(cpuinfo, 0x80000001);
|
||
extended_features_ = (static_cast<uint64_t>(cpuinfo[2]) << 32) |
|
||
static_cast<uint64_t>(cpuinfo[3]);
|
||
}
|
||
|
||
CpuidReader::~CpuidReader() {}
|
||
|
||
uint32_t CpuidReader::Revision() const {
|
||
uint8_t stepping = signature_ & 0xf;
|
||
uint8_t model = (signature_ & 0xf0) >> 4;
|
||
uint8_t family = (signature_ & 0xf00) >> 8;
|
||
uint8_t extended_model = static_cast<uint8_t>((signature_ & 0xf0000) >> 16);
|
||
uint16_t extended_family = (signature_ & 0xff00000) >> 20;
|
||
|
||
// For families before 15, extended_family are simply reserved bits.
|
||
if (family < 15)
|
||
extended_family = 0;
|
||
// extended_model is only used for families 6 and 15.
|
||
if (family != 6 && family != 15)
|
||
extended_model = 0;
|
||
|
||
uint16_t adjusted_family = family + extended_family;
|
||
uint8_t adjusted_model = model + (extended_model << 4);
|
||
return (adjusted_family << 16) | (adjusted_model << 8) | stepping;
|
||
}
|
||
|
||
uint32_t CpuidReader::Leaf7Features() const {
|
||
if (max_leaf_ < 7) {
|
||
return 0;
|
||
}
|
||
uint32_t cpuinfo[4];
|
||
Cpuid(cpuinfo, 7);
|
||
return cpuinfo[1];
|
||
}
|
||
|
||
bool CpuidReader::SupportsDAZ() const {
|
||
// The correct way to check for denormals-as-zeros (DAZ) support is to examine
|
||
// mxcsr mask, which can be done with fxsave. See Intel Software Developer’s
|
||
// Manual, Volume 1: Basic Architecture (253665-051), 11.6.3 “Checking for the
|
||
// DAZ Flag in the MXCSR Register”. Note that since this function tests for
|
||
// DAZ support in the CPU, it checks the mxcsr mask. Testing mxcsr would
|
||
// indicate whether DAZ is actually enabled, which is a per-thread context
|
||
// concern.
|
||
|
||
// Test for fxsave support.
|
||
if (!(features_ & (UINT64_C(1) << 24))) {
|
||
return false;
|
||
}
|
||
|
||
#if defined(ARCH_CPU_X86)
|
||
using Fxsave = CPUContextX86::Fxsave;
|
||
#elif defined(ARCH_CPU_X86_64)
|
||
using Fxsave = CPUContextX86_64::Fxsave;
|
||
#endif
|
||
|
||
#if BUILDFLAG(IS_WIN)
|
||
__declspec(align(16)) Fxsave fxsave = {};
|
||
#else
|
||
Fxsave fxsave __attribute__((aligned(16))) = {};
|
||
#endif
|
||
|
||
static_assert(sizeof(fxsave) == 512, "fxsave size");
|
||
static_assert(offsetof(decltype(fxsave), mxcsr_mask) == 28,
|
||
"mxcsr_mask offset");
|
||
|
||
#if BUILDFLAG(IS_WIN)
|
||
_fxsave(&fxsave);
|
||
#else
|
||
asm("fxsave %0" : "=m"(fxsave));
|
||
#endif
|
||
|
||
// Test the DAZ bit.
|
||
return (fxsave.mxcsr_mask & (1 << 6)) != 0;
|
||
}
|
||
|
||
void CpuidReader::Cpuid(uint32_t cpuinfo[4], uint32_t leaf) const {
|
||
#if BUILDFLAG(IS_WIN)
|
||
__cpuid(reinterpret_cast<int*>(cpuinfo), leaf);
|
||
#else
|
||
asm("cpuid"
|
||
: "=a"(cpuinfo[0]), "=b"(cpuinfo[1]), "=c"(cpuinfo[2]), "=d"(cpuinfo[3])
|
||
: "a"(leaf), "b"(0), "c"(0), "d"(0));
|
||
#endif // BUILDFLAG(IS_WIN)
|
||
}
|
||
|
||
} // namespace internal
|
||
} // namespace crashpad
|
||
|
||
#endif // ARCH_CPU_X86_FAMILY
|