1*bed243d3SAndroid Build Coastguard Worker /*===--------------- usermsrintrin.h - USERMSR intrinsics -----------------=== 2*bed243d3SAndroid Build Coastguard Worker * 3*bed243d3SAndroid Build Coastguard Worker * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*bed243d3SAndroid Build Coastguard Worker * See https://llvm.org/LICENSE.txt for license information. 5*bed243d3SAndroid Build Coastguard Worker * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*bed243d3SAndroid Build Coastguard Worker * 7*bed243d3SAndroid Build Coastguard Worker *===-----------------------------------------------------------------------=== 8*bed243d3SAndroid Build Coastguard Worker */ 9*bed243d3SAndroid Build Coastguard Worker #ifndef __X86GPRINTRIN_H 10*bed243d3SAndroid Build Coastguard Worker #error "Never use <usermsrintrin.h> directly; include <x86gprintrin.h> instead." 11*bed243d3SAndroid Build Coastguard Worker #endif // __X86GPRINTRIN_H 12*bed243d3SAndroid Build Coastguard Worker 13*bed243d3SAndroid Build Coastguard Worker #ifndef __USERMSRINTRIN_H 14*bed243d3SAndroid Build Coastguard Worker #define __USERMSRINTRIN_H 15*bed243d3SAndroid Build Coastguard Worker #ifdef __x86_64__ 16*bed243d3SAndroid Build Coastguard Worker 17*bed243d3SAndroid Build Coastguard Worker /// Reads the contents of a 64-bit MSR specified in \a __A into \a dst. 18*bed243d3SAndroid Build Coastguard Worker /// 19*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> URDMSR </c> instruction. 20*bed243d3SAndroid Build Coastguard Worker /// \param __A 21*bed243d3SAndroid Build Coastguard Worker /// An unsigned long long. 22*bed243d3SAndroid Build Coastguard Worker /// 23*bed243d3SAndroid Build Coastguard Worker /// \code{.operation} 24*bed243d3SAndroid Build Coastguard Worker /// DEST := MSR[__A] 25*bed243d3SAndroid Build Coastguard Worker /// \endcode 26*bed243d3SAndroid Build Coastguard Worker static __inline__ unsigned long long 27*bed243d3SAndroid Build Coastguard Worker __attribute__((__always_inline__, __nodebug__, __target__("usermsr"))) _urdmsr(unsigned long long __A)28*bed243d3SAndroid Build Coastguard Worker _urdmsr(unsigned long long __A) { 29*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_urdmsr(__A); 30*bed243d3SAndroid Build Coastguard Worker } 31*bed243d3SAndroid Build Coastguard Worker 32*bed243d3SAndroid Build Coastguard Worker /// Writes the contents of \a __B into the 64-bit MSR specified in \a __A. 33*bed243d3SAndroid Build Coastguard Worker /// 34*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the <c> UWRMSR </c> instruction. 35*bed243d3SAndroid Build Coastguard Worker /// 36*bed243d3SAndroid Build Coastguard Worker /// \param __A 37*bed243d3SAndroid Build Coastguard Worker /// An unsigned long long. 38*bed243d3SAndroid Build Coastguard Worker /// \param __B 39*bed243d3SAndroid Build Coastguard Worker /// An unsigned long long. 40*bed243d3SAndroid Build Coastguard Worker /// 41*bed243d3SAndroid Build Coastguard Worker /// \code{.operation} 42*bed243d3SAndroid Build Coastguard Worker /// MSR[__A] := __B 43*bed243d3SAndroid Build Coastguard Worker /// \endcode 44*bed243d3SAndroid Build Coastguard Worker static __inline__ void 45*bed243d3SAndroid Build Coastguard Worker __attribute__((__always_inline__, __nodebug__, __target__("usermsr"))) _uwrmsr(unsigned long long __A,unsigned long long __B)46*bed243d3SAndroid Build Coastguard Worker _uwrmsr(unsigned long long __A, unsigned long long __B) { 47*bed243d3SAndroid Build Coastguard Worker return __builtin_ia32_uwrmsr(__A, __B); 48*bed243d3SAndroid Build Coastguard Worker } 49*bed243d3SAndroid Build Coastguard Worker 50*bed243d3SAndroid Build Coastguard Worker #endif // __x86_64__ 51*bed243d3SAndroid Build Coastguard Worker #endif // __USERMSRINTRIN_H 52