Blame sysdeps/x86/sysdep.h

Packit 6c4009
/* Assembler macros for x86.
Packit 6c4009
   Copyright (C) 2017-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#ifndef _X86_SYSDEP_H
Packit 6c4009
#define _X86_SYSDEP_H 1
Packit 6c4009
Packit 6c4009
#include <sysdeps/generic/sysdep.h>
Packit 6c4009
Packit 6c4009
/* __CET__ is defined by GCC with Control-Flow Protection values:
Packit 6c4009
Packit 6c4009
enum cf_protection_level
Packit 6c4009
{
Packit 6c4009
  CF_NONE = 0,
Packit 6c4009
  CF_BRANCH = 1 << 0,
Packit 6c4009
  CF_RETURN = 1 << 1,
Packit 6c4009
  CF_FULL = CF_BRANCH | CF_RETURN,
Packit 6c4009
  CF_SET = 1 << 2
Packit 6c4009
};
Packit 6c4009
*/
Packit 6c4009
Packit 6c4009
/* Set if CF_BRANCH (IBT) is enabled.  */
Packit 6c4009
#define X86_FEATURE_1_IBT	(1U << 0)
Packit 6c4009
/* Set if CF_RETURN (SHSTK) is enabled.  */
Packit 6c4009
#define X86_FEATURE_1_SHSTK	(1U << 1)
Packit 6c4009
Packit 6c4009
#ifdef __CET__
Packit 6c4009
# define CET_ENABLED	1
Packit 6c4009
# define IBT_ENABLED	(__CET__ & X86_FEATURE_1_IBT)
Packit 6c4009
# define SHSTK_ENABLED	(__CET__ & X86_FEATURE_1_SHSTK)
Packit 6c4009
#else
Packit 6c4009
# define CET_ENABLED	0
Packit 6c4009
# define IBT_ENABLED	0
Packit 6c4009
# define SHSTK_ENABLED	0
Packit 6c4009
#endif
Packit 6c4009
Packit Service 97ff28
/* Offset for fxsave/xsave area used by _dl_runtime_resolve.  Also need
Packit Service 97ff28
   space to preserve RCX, RDX, RSI, RDI, R8, R9 and RAX.  It must be
Packit Service 97ff28
   aligned to 16 bytes for fxsave and 64 bytes for xsave.  */
Packit Service 97ff28
#define STATE_SAVE_OFFSET (8 * 7 + 8)
Packit Service 97ff28
Packit Service 97ff28
/* Save SSE, AVX, AVX512, mask and bound registers.  */
Packit Service 97ff28
#define STATE_SAVE_MASK \
Packit Service 97ff28
  ((1 << 1) | (1 << 2) | (1 << 3) | (1 << 5) | (1 << 6) | (1 << 7))
Packit Service 97ff28
Packit 6c4009
#ifdef	__ASSEMBLER__
Packit 6c4009
Packit 6c4009
/* Syntactic details of assembler.  */
Packit 6c4009
Packit 6c4009
#ifdef _CET_ENDBR
Packit 6c4009
# define _CET_NOTRACK notrack
Packit 6c4009
#else
Packit 6c4009
# define _CET_ENDBR
Packit 6c4009
# define _CET_NOTRACK
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* ELF uses byte-counts for .align, most others use log2 of count of bytes.  */
Packit 6c4009
#define ALIGNARG(log2) 1<
Packit 6c4009
#define ASM_SIZE_DIRECTIVE(name) .size name,.-name;
Packit 6c4009
Packit 6c4009
/* Define an entry point visible from C.  */
Packit 6c4009
#define	ENTRY(name)							      \
Packit 6c4009
  .globl C_SYMBOL_NAME(name);						      \
Packit 6c4009
  .type C_SYMBOL_NAME(name),@function;					      \
Packit 6c4009
  .align ALIGNARG(4);							      \
Packit 6c4009
  C_LABEL(name)								      \
Packit 6c4009
  cfi_startproc;							      \
Packit 6c4009
  _CET_ENDBR;								      \
Packit 6c4009
  CALL_MCOUNT
Packit 6c4009
Packit 6c4009
#undef	END
Packit 6c4009
#define END(name)							      \
Packit 6c4009
  cfi_endproc;								      \
Packit 6c4009
  ASM_SIZE_DIRECTIVE(name)
Packit 6c4009
Packit 6c4009
#define ENTRY_CHK(name) ENTRY (name)
Packit 6c4009
#define END_CHK(name) END (name)
Packit 6c4009
Packit 6c4009
/* Since C identifiers are not normally prefixed with an underscore
Packit 6c4009
   on this system, the asm identifier `syscall_error' intrudes on the
Packit 6c4009
   C name space.  Make sure we use an innocuous name.  */
Packit 6c4009
#define	syscall_error	__syscall_error
Packit 6c4009
#define mcount		_mcount
Packit 6c4009
Packit 6c4009
#undef	PSEUDO_END
Packit 6c4009
#define	PSEUDO_END(name)						      \
Packit 6c4009
  END (name)
Packit 6c4009
Packit 6c4009
/* Local label name for asm code. */
Packit 6c4009
#ifndef L
Packit 6c4009
/* ELF-like local names start with `.L'.  */
Packit 6c4009
# define L(name)	.L##name
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#define atom_text_section .section ".text.atom", "ax"
Packit 6c4009
Packit 6c4009
#endif	/* __ASSEMBLER__ */
Packit 6c4009
Packit 6c4009
#endif	/* _X86_SYSDEP_H */