|  | // Copyright 2014 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. | 
|  |  | 
|  | #ifndef CRASHPAD_SNAPSHOT_SYSTEM_SNAPSHOT_H_ | 
|  | #define CRASHPAD_SNAPSHOT_SYSTEM_SNAPSHOT_H_ | 
|  |  | 
|  | #include <stdint.h> | 
|  | #include <sys/types.h> | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "snapshot/cpu_architecture.h" | 
|  |  | 
|  | namespace crashpad { | 
|  |  | 
|  | //! \brief An abstract interface to a snapshot representing the state of a | 
|  | //!     system, comprising an operating system, CPU architecture, and various | 
|  | //!     other characteristics. | 
|  | class SystemSnapshot { | 
|  | public: | 
|  | virtual ~SystemSnapshot() {} | 
|  |  | 
|  | //! \brief A system’s operating system family. | 
|  | enum OperatingSystem { | 
|  | //! \brief The snapshot system’s operating system is unknown. | 
|  | kOperatingSystemUnknown = 0, | 
|  |  | 
|  | //! \brief macOS. | 
|  | kOperatingSystemMacOSX, | 
|  |  | 
|  | //! \brief Windows. | 
|  | kOperatingSystemWindows, | 
|  |  | 
|  | //! \brief Linux. | 
|  | kOperatingSystemLinux, | 
|  |  | 
|  | //! \brief Android. | 
|  | kOperatingSystemAndroid, | 
|  |  | 
|  | //! \brief Fuchsia. | 
|  | kOperatingSystemFuchsia, | 
|  |  | 
|  | //! \brief iOS. | 
|  | kOperatingSystemIOS, | 
|  | }; | 
|  |  | 
|  | //! \brief A system’s daylight saving time status. | 
|  | //! | 
|  | //! The daylight saving time status is taken partially from the system’s | 
|  | //! locale configuration. This determines whether daylight saving time is | 
|  | //! ever observed on the system. If it is, the snapshot’s time | 
|  | //! (ProcessSnapshot::SnapshotTime()) is used to determine whether the system | 
|  | //! was observing daylight saving time at the time of the snapshot. | 
|  | enum DaylightSavingTimeStatus { | 
|  | //! \brief Daylight saving time is never observed on the snapshot system. | 
|  | kDoesNotObserveDaylightSavingTime = 0, | 
|  |  | 
|  | //! \brief Daylight saving time is observed on the snapshot system when in | 
|  | //!     effect, but standard time was in effect at the time of the snapshot. | 
|  | kObservingStandardTime, | 
|  |  | 
|  | //! \brief Daylight saving time is observed on the snapshot system when in | 
|  | //!     effect, and daylight saving time was in effect at the time of the | 
|  | //!     snapshot. | 
|  | kObservingDaylightSavingTime, | 
|  | }; | 
|  |  | 
|  | //! \brief Returns the snapshot system’s CPU architecture. | 
|  | //! | 
|  | //! In some cases, a system may be able to run processes of multiple specific | 
|  | //! architecture types. For example, systems based on 64-bit architectures | 
|  | //! such as x86_64 are often able to run 32-bit code of another architecture | 
|  | //! in the same family, such as 32-bit x86. On these systems, this method will | 
|  | //! return the architecture of the process that the snapshot is associated | 
|  | //! with, provided that the SystemSnapshot object was obtained from | 
|  | //! ProcessSnapshot::System(). This renders one aspect of this method’s return | 
|  | //! value a process attribute rather than a system attribute, but it’s defined | 
|  | //! here rather than in ProcessSnapshot because the CPU architecture is a | 
|  | //! better conceptual fit for the system abstraction alongside these other | 
|  | //! related methods. | 
|  | virtual CPUArchitecture GetCPUArchitecture() const = 0; | 
|  |  | 
|  | //! \brief Returns the snapshot system’s CPU revision. | 
|  | //! | 
|  | //! For x86-family CPUs (including x86_64 and 32-bit x86), this is the CPU | 
|  | //! family, model, and stepping ID values from `cpuid 1` `eax`. The family and | 
|  | //! model values are adjusted to take the extended family and model IDs into | 
|  | //! account. These values are encoded in this method’s return value with the | 
|  | //! family in the high high 16 bits, the model in the next 8 bits, and the | 
|  | //! stepping in the low 8 bits. | 
|  | //! | 
|  | //! \return A CPU architecture-specific value identifying the CPU revision. | 
|  | virtual uint32_t CPURevision() const = 0; | 
|  |  | 
|  | //! \brief Returns the total number of CPUs present in the snapshot system. | 
|  | virtual uint8_t CPUCount() const = 0; | 
|  |  | 
|  | //! \brief Returns the vendor of the snapshot system’s CPUs. | 
|  | //! | 
|  | //! For x86-family CPUs (including x86_64 and 32-bit x86), this is the CPU | 
|  | //! vendor identification string as encoded in `cpuid 0` `ebx`, `edx`, and | 
|  | //! `ecx`. | 
|  | //! | 
|  | //! \return A string identifying the vendor of the snapshot system’s CPUs. | 
|  | virtual std::string CPUVendor() const = 0; | 
|  |  | 
|  | //! \brief Returns frequency information about the snapshot system’s CPUs in | 
|  | //!     \a current_hz and \a max_hz. | 
|  | //! | 
|  | //! \param[out] current_hz The snapshot system’s CPU clock frequency in Hz at | 
|  | //!     the time of the snapshot. | 
|  | //! \param[out] max_hz The snapshot system’s maximum possible CPU clock | 
|  | //!     frequency. | 
|  | virtual void CPUFrequency(uint64_t* current_hz, uint64_t* max_hz) const = 0; | 
|  |  | 
|  | //! \brief Returns an x86-family snapshot system’s CPU signature. | 
|  | //! | 
|  | //! This is the family, model, and stepping ID values as encoded in `cpuid 1` | 
|  | //! `eax`. | 
|  | //! | 
|  | //! This method must only be called when GetCPUArchitecture() indicates an | 
|  | //! x86-family CPU architecture (#kCPUArchitectureX86 or | 
|  | //! #kCPUArchitectureX86_64). | 
|  | //! | 
|  | //! \return An x86 family-specific value identifying the CPU signature. | 
|  | virtual uint32_t CPUX86Signature() const = 0; | 
|  |  | 
|  | //! \brief Returns an x86-family snapshot system’s CPU features. | 
|  | //! | 
|  | //! This is the feature information as encoded in `cpuid 1` `edx` and `ecx`. | 
|  | //! `edx` is placed in the low half of the return value, and `ecx` is placed | 
|  | //! in the high half. | 
|  | //! | 
|  | //! This method must only be called when GetCPUArchitecture() indicates an | 
|  | //! x86-family CPU architecture (#kCPUArchitectureX86 or | 
|  | //! #kCPUArchitectureX86_64). | 
|  | //! | 
|  | //! \return An x86 family-specific value identifying CPU features. | 
|  | //! | 
|  | //! \sa CPUX86ExtendedFeatures() | 
|  | //! \sa CPUX86Leaf7Features() | 
|  | virtual uint64_t CPUX86Features() const = 0; | 
|  |  | 
|  | //! \brief Returns an x86-family snapshot system’s extended CPU features. | 
|  | //! | 
|  | //! This is the extended feature information as encoded in `cpuid 0x80000001` | 
|  | //! `edx` and `ecx`. `edx` is placed in the low half of the return value, and | 
|  | //! `ecx` is placed in the high half. | 
|  | //! | 
|  | //! This method must only be called when GetCPUArchitecture() indicates an | 
|  | //! x86-family CPU architecture (#kCPUArchitectureX86 or | 
|  | //! #kCPUArchitectureX86_64). | 
|  | //! | 
|  | //! \return An x86 family-specific value identifying extended CPU features. | 
|  | //! | 
|  | //! \sa CPUX86Features() | 
|  | //! \sa CPUX86Leaf7Features() | 
|  | virtual uint64_t CPUX86ExtendedFeatures() const = 0; | 
|  |  | 
|  | //! \brief Returns an x86-family snapshot system’s “leaf 7” CPU features. | 
|  | //! | 
|  | //! This is the “leaf 7” feature information as encoded in `cpuid 7` `ebx`. If | 
|  | //! `cpuid 7` is not supported by the snapshot CPU, this returns `0`. | 
|  | //! | 
|  | //! This method must only be called when GetCPUArchitecture() indicates an | 
|  | //! x86-family CPU architecture (#kCPUArchitectureX86 or | 
|  | //! #kCPUArchitectureX86_64). | 
|  | //! | 
|  | //! \return An x86 family-specific value identifying “leaf 7” CPU features. | 
|  | //! | 
|  | //! \sa CPUX86Features() | 
|  | //! \sa CPUX86ExtendedFeatures() | 
|  | virtual uint32_t CPUX86Leaf7Features() const = 0; | 
|  |  | 
|  | //! \brief Returns an x86-family snapshot system’s CPU’s support for the SSE | 
|  | //!     DAZ (“denormals are zeros”) mode. | 
|  | //! | 
|  | //! This determines whether the CPU supports DAZ mode at all, not whether this | 
|  | //! mode is enabled for any particular thread. DAZ mode support is detected by | 
|  | //! examining the DAZ bit in the `mxcsr_mask` field of the floating-point | 
|  | //! context saved by `fxsave`. | 
|  | //! | 
|  | //! This method must only be called when GetCPUArchitecture() indicates an | 
|  | //! x86-family CPU architecture (#kCPUArchitectureX86 or | 
|  | //! #kCPUArchitectureX86_64). | 
|  | //! | 
|  | //! \return `true` if the snapshot system’s CPUs support the SSE DAZ mode, | 
|  | //!     `false` if they do not. | 
|  | virtual bool CPUX86SupportsDAZ() const = 0; | 
|  |  | 
|  | //! \brief Returns the snapshot system’s operating system family. | 
|  | virtual OperatingSystem GetOperatingSystem() const = 0; | 
|  |  | 
|  | //! \brief Returns whether the snapshot system runs a server variant of its | 
|  | //!     operating system. | 
|  | virtual bool OSServer() const = 0; | 
|  |  | 
|  | //! \brief Returns the snapshot system’s operating system version information | 
|  | //!     in \a major, \a minor, \a bugfix, and \a build. | 
|  | //! | 
|  | //! \param[out] major The snapshot system’s operating system’s first (major) | 
|  | //!     version number component. This would be `10` for macOS 10.12.1, and | 
|  | //!     `6` for Windows 7 (NT 6.1) SP1 version 6.1.7601. | 
|  | //! \param[out] minor The snapshot system’s operating system’s second (minor) | 
|  | //!     version number component. This would be `12` for macOS 10.12.1, and | 
|  | //!     `1` for Windows 7 (NT 6.1) SP1 version 6.1.7601. | 
|  | //! \param[out] bugfix The snapshot system’s operating system’s third (bugfix) | 
|  | //!     version number component. This would be `1` for macOS 10.12.1, and | 
|  | //!     `7601` for Windows 7 (NT 6.1) SP1 version 6.1.7601. | 
|  | //! \param[out] build A string further identifying an operating system | 
|  | //!     version. For macOS 10.12.1, this would be `"16B2657"`. For Windows, | 
|  | //!     this would be `"Service Pack 1"` if that service pack was installed. | 
|  | //!     On Android, the `ro.build.fingerprint` system property would be | 
|  | //!     appended. For Linux and other Unix-like systems, this would be the | 
|  | //!     kernel version from `uname -srvm`, possibly with additional | 
|  | //!     information appended. | 
|  | virtual void OSVersion(int* major, | 
|  | int* minor, | 
|  | int* bugfix, | 
|  | std::string* build) const = 0; | 
|  |  | 
|  | //! \brief Returns the snapshot system’s full operating system version | 
|  | //!     information in string format. | 
|  | //! | 
|  | //! For macOS, the string contains values from the operating system and | 
|  | //! kernel. A macOS 10.12.1 system snapshot would be identified as `"Mac OS | 
|  | //! X 10.12.1 (16B2657); Darwin 16.1.0 Darwin Kernel Version 16.1.0: Wed Oct | 
|  | //! 19 20:31:56 PDT 2016; root:xnu-3789.21.4~4/RELEASE_X86_64 x86_64"`. | 
|  | virtual std::string OSVersionFull() const = 0; | 
|  |  | 
|  | //! \brief Returns a description of the snapshot system’s hardware in string | 
|  | //!     format. | 
|  | //! | 
|  | //! For macOS, the string contains the Mac model and board ID. A mid-2014 15" | 
|  | //! MacBook Pro would be identified as `"MacBookPro11,3 | 
|  | //! (Mac-2BD1B31983FE1663)"`. | 
|  | virtual std::string MachineDescription() const = 0; | 
|  |  | 
|  | //! \brief Returns the status of the NX (no-execute, or XD, execute-disable) | 
|  | //!     feature on the snapshot system. | 
|  | //! | 
|  | //! This refers to a feature that allows mapped readable pages to be marked | 
|  | //! as non-executable. | 
|  | //! | 
|  | //! \return `true` if the snapshot system supports NX and it is enabled. | 
|  | virtual bool NXEnabled() const = 0; | 
|  |  | 
|  | //! \brief Returns time zone information from the snapshot system, based on | 
|  | //!     its locale configuration and real-time clock. | 
|  | //! | 
|  | //! \param[out] dst_status Whether the location observes daylight saving time, | 
|  | //!     and if so, whether it or standard time is currently being observed. | 
|  | //! \param[out] standard_offset_seconds The number of seconds that the | 
|  | //!     location’s time zone is east (ahead) of UTC during standard time. | 
|  | //! \param[out] daylight_offset_seconds The number of seconds that the | 
|  | //!     location’s time zone is east (ahead) of UTC during daylight saving. | 
|  | //!     time. | 
|  | //! \param[out] standard_name The name of the time zone while standard time is | 
|  | //!     being observed. | 
|  | //! \param[out] daylight_name The name of the time zone while daylight saving | 
|  | //!     time is being observed. | 
|  | virtual void TimeZone(DaylightSavingTimeStatus* dst_status, | 
|  | int* standard_offset_seconds, | 
|  | int* daylight_offset_seconds, | 
|  | std::string* standard_name, | 
|  | std::string* daylight_name) const = 0; | 
|  | }; | 
|  |  | 
|  | }  // namespace crashpad | 
|  |  | 
|  | #endif  // CRASHPAD_SNAPSHOT_SYSTEM_SNAPSHOT_H_ |