10b57cec5SDimitry Andric /*===---- cetintrin.h - CET intrinsic --------------------------------------===
20b57cec5SDimitry Andric *
30b57cec5SDimitry Andric * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric * See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric *
70b57cec5SDimitry Andric *===-----------------------------------------------------------------------===
80b57cec5SDimitry Andric */
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric #ifndef __IMMINTRIN_H
110b57cec5SDimitry Andric #error "Never use <cetintrin.h> directly; include <immintrin.h> instead."
120b57cec5SDimitry Andric #endif
130b57cec5SDimitry Andric
140b57cec5SDimitry Andric #ifndef __CETINTRIN_H
150b57cec5SDimitry Andric #define __CETINTRIN_H
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric /* Define the default attributes for the functions in this file. */
180b57cec5SDimitry Andric #define __DEFAULT_FN_ATTRS \
190b57cec5SDimitry Andric __attribute__((__always_inline__, __nodebug__, __target__("shstk")))
200b57cec5SDimitry Andric
_incsspd(int __a)210b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _incsspd(int __a) {
22*81ad6265SDimitry Andric __builtin_ia32_incsspd((unsigned int)__a);
230b57cec5SDimitry Andric }
240b57cec5SDimitry Andric
250b57cec5SDimitry Andric #ifdef __x86_64__
_incsspq(unsigned long long __a)260b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _incsspq(unsigned long long __a) {
270b57cec5SDimitry Andric __builtin_ia32_incsspq(__a);
280b57cec5SDimitry Andric }
290b57cec5SDimitry Andric #endif /* __x86_64__ */
300b57cec5SDimitry Andric
310b57cec5SDimitry Andric #ifdef __x86_64__
_inc_ssp(unsigned int __a)320b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _inc_ssp(unsigned int __a) {
330b57cec5SDimitry Andric __builtin_ia32_incsspq(__a);
340b57cec5SDimitry Andric }
350b57cec5SDimitry Andric #else /* __x86_64__ */
_inc_ssp(unsigned int __a)360b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _inc_ssp(unsigned int __a) {
37*81ad6265SDimitry Andric __builtin_ia32_incsspd(__a);
380b57cec5SDimitry Andric }
390b57cec5SDimitry Andric #endif /* __x86_64__ */
400b57cec5SDimitry Andric
_rdsspd(unsigned int __a)410b57cec5SDimitry Andric static __inline__ unsigned int __DEFAULT_FN_ATTRS _rdsspd(unsigned int __a) {
420b57cec5SDimitry Andric return __builtin_ia32_rdsspd(__a);
430b57cec5SDimitry Andric }
440b57cec5SDimitry Andric
_rdsspd_i32(void)45*81ad6265SDimitry Andric static __inline__ unsigned int __DEFAULT_FN_ATTRS _rdsspd_i32(void) {
46*81ad6265SDimitry Andric #pragma clang diagnostic push
47*81ad6265SDimitry Andric #pragma clang diagnostic ignored "-Wuninitialized"
4804eeddc0SDimitry Andric unsigned int t;
4904eeddc0SDimitry Andric return __builtin_ia32_rdsspd(t);
50*81ad6265SDimitry Andric #pragma clang diagnostic pop
5104eeddc0SDimitry Andric }
5204eeddc0SDimitry Andric
530b57cec5SDimitry Andric #ifdef __x86_64__
_rdsspq(unsigned long long __a)540b57cec5SDimitry Andric static __inline__ unsigned long long __DEFAULT_FN_ATTRS _rdsspq(unsigned long long __a) {
550b57cec5SDimitry Andric return __builtin_ia32_rdsspq(__a);
560b57cec5SDimitry Andric }
5704eeddc0SDimitry Andric
_rdsspq_i64(void)58*81ad6265SDimitry Andric static __inline__ unsigned long long __DEFAULT_FN_ATTRS _rdsspq_i64(void) {
59*81ad6265SDimitry Andric #pragma clang diagnostic push
60*81ad6265SDimitry Andric #pragma clang diagnostic ignored "-Wuninitialized"
6104eeddc0SDimitry Andric unsigned long long t;
6204eeddc0SDimitry Andric return __builtin_ia32_rdsspq(t);
63*81ad6265SDimitry Andric #pragma clang diagnostic pop
6404eeddc0SDimitry Andric }
650b57cec5SDimitry Andric #endif /* __x86_64__ */
660b57cec5SDimitry Andric
670b57cec5SDimitry Andric #ifdef __x86_64__
_get_ssp(void)680b57cec5SDimitry Andric static __inline__ unsigned long long __DEFAULT_FN_ATTRS _get_ssp(void) {
690b57cec5SDimitry Andric return __builtin_ia32_rdsspq(0);
700b57cec5SDimitry Andric }
710b57cec5SDimitry Andric #else /* __x86_64__ */
_get_ssp(void)720b57cec5SDimitry Andric static __inline__ unsigned int __DEFAULT_FN_ATTRS _get_ssp(void) {
730b57cec5SDimitry Andric return __builtin_ia32_rdsspd(0);
740b57cec5SDimitry Andric }
750b57cec5SDimitry Andric #endif /* __x86_64__ */
760b57cec5SDimitry Andric
_saveprevssp(void)77*81ad6265SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _saveprevssp(void) {
780b57cec5SDimitry Andric __builtin_ia32_saveprevssp();
790b57cec5SDimitry Andric }
800b57cec5SDimitry Andric
_rstorssp(void * __p)810b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _rstorssp(void * __p) {
820b57cec5SDimitry Andric __builtin_ia32_rstorssp(__p);
830b57cec5SDimitry Andric }
840b57cec5SDimitry Andric
_wrssd(unsigned int __a,void * __p)850b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _wrssd(unsigned int __a, void * __p) {
860b57cec5SDimitry Andric __builtin_ia32_wrssd(__a, __p);
870b57cec5SDimitry Andric }
880b57cec5SDimitry Andric
890b57cec5SDimitry Andric #ifdef __x86_64__
_wrssq(unsigned long long __a,void * __p)900b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _wrssq(unsigned long long __a, void * __p) {
910b57cec5SDimitry Andric __builtin_ia32_wrssq(__a, __p);
920b57cec5SDimitry Andric }
930b57cec5SDimitry Andric #endif /* __x86_64__ */
940b57cec5SDimitry Andric
_wrussd(unsigned int __a,void * __p)950b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _wrussd(unsigned int __a, void * __p) {
960b57cec5SDimitry Andric __builtin_ia32_wrussd(__a, __p);
970b57cec5SDimitry Andric }
980b57cec5SDimitry Andric
990b57cec5SDimitry Andric #ifdef __x86_64__
_wrussq(unsigned long long __a,void * __p)1000b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _wrussq(unsigned long long __a, void * __p) {
1010b57cec5SDimitry Andric __builtin_ia32_wrussq(__a, __p);
1020b57cec5SDimitry Andric }
1030b57cec5SDimitry Andric #endif /* __x86_64__ */
1040b57cec5SDimitry Andric
_setssbsy(void)105*81ad6265SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _setssbsy(void) {
1060b57cec5SDimitry Andric __builtin_ia32_setssbsy();
1070b57cec5SDimitry Andric }
1080b57cec5SDimitry Andric
_clrssbsy(void * __p)1090b57cec5SDimitry Andric static __inline__ void __DEFAULT_FN_ATTRS _clrssbsy(void * __p) {
1100b57cec5SDimitry Andric __builtin_ia32_clrssbsy(__p);
1110b57cec5SDimitry Andric }
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andric #undef __DEFAULT_FN_ATTRS
1140b57cec5SDimitry Andric
1150b57cec5SDimitry Andric #endif /* __CETINTRIN_H */
116