1*0b57cec5SDimitry Andric//===-- xray_x86_64.inc -----------------------------------------*- C++ -*-===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric// 9*0b57cec5SDimitry Andric// This file is a part of XRay, a dynamic runtime instrumentation system. 10*0b57cec5SDimitry Andric// 11*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric#include <cstdint> 14*0b57cec5SDimitry Andric 15*0b57cec5SDimitry Andric#include "sanitizer_common/sanitizer_internal_defs.h" 16*0b57cec5SDimitry Andric#include "xray_defs.h" 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andricnamespace __xray { 19*0b57cec5SDimitry Andric 20*0b57cec5SDimitry AndricALWAYS_INLINE uint64_t readTSC(uint8_t &CPU) XRAY_NEVER_INSTRUMENT { 21*0b57cec5SDimitry Andric unsigned LongCPU; 22*0b57cec5SDimitry Andric unsigned long Rax, Rdx; 23*0b57cec5SDimitry Andric __asm__ __volatile__("rdtscp\n" : "=a"(Rax), "=d"(Rdx), "=c"(LongCPU) ::); 24*0b57cec5SDimitry Andric CPU = LongCPU; 25*0b57cec5SDimitry Andric return (Rdx << 32) + Rax; 26*0b57cec5SDimitry Andric} 27*0b57cec5SDimitry Andric 28*0b57cec5SDimitry Andricuint64_t getTSCFrequency(); 29*0b57cec5SDimitry Andric 30*0b57cec5SDimitry Andricbool probeRequiredCPUFeatures(); 31*0b57cec5SDimitry Andric 32*0b57cec5SDimitry Andric} // namespace __xray 33