# arch_prctl

## NAME



           arch_prctl - set architecture-specific thread state
    


## LIBRARY



           Standard C library (_libc_ , _-lc_)
    


## SYNOPSIS



           **#include <asm/prctl.h>        **/* Definition of **ARCH_*** constants */
           **#include <sys/syscall.h>      **/* Definition of **SYS_*** constants */
           **#include <unistd.h>**
    
           **int syscall(SYS_arch_prctl, int** _op_**, unsigned long** _addr_**);**
           **int syscall(SYS_arch_prctl, int** _op_**, unsigned long ***_addr_**);**
    
           _Note_ : glibc provides no wrapper for **arch_prctl**(), necessitating
           the use of syscall(2).
    


## DESCRIPTION



           **arch_prctl**() sets architecture-specific process or thread state.
           _op_ selects an operation and passes argument _addr_ to it; _addr_ is
           interpreted as either an _unsigned long_ for the "set" operations,
           or as an _unsigned long *_ , for the "get" operations.
    
           Subfunctions for both x86 and x86-64 are:
    
           **ARCH_SET_CPUID**(since Linux 4.12)
                  Enable (_addr != 0_) or disable (_addr == 0_) the _cpuid_
                  instruction for the calling thread.  The instruction is
                  enabled by default.  If disabled, any execution of a _cpuid_
                  instruction will instead generate a **SIGSEGV** signal.  This
                  feature can be used to emulate _cpuid_ results that differ
                  from what the underlying hardware would have produced
                  (e.g., in a paravirtualization setting).
    
                  The **ARCH_SET_CPUID** setting is preserved across fork(2) and
                  clone(2) but reset to the default (i.e., _cpuid_ enabled) on
                  execve(2).
    
           **ARCH_GET_CPUID**(since Linux 4.12)
                  Return the setting of the flag manipulated by
                  **ARCH_SET_CPUID** as the result of the system call (1 for
                  enabled, 0 for disabled).  _addr_ is ignored.
    
           Subfunctions for x86-64 only are:
    
           **ARCH_SET_FS**
                  Set the 64-bit base for the _FS_ register to _addr_.
    
           **ARCH_GET_FS**
                  Return the 64-bit base value for the _FS_ register of the
                  calling thread in the _unsigned long_ pointed to by _addr_.
    
           **ARCH_SET_GS**
                  Set the 64-bit base for the _GS_ register to _addr_.
    
           **ARCH_GET_GS**
                  Return the 64-bit base value for the _GS_ register of the
                  calling thread in the _unsigned long_ pointed to by _addr_.
    


## RETURN VALUE



           On success, **arch_prctl**() returns 0; on error, -1 is returned, and
           _errno_ is set to indicate the error.
    


## ERRORS



           **EFAULT** _addr_ points to an unmapped address or is outside the
                  process address space.
    
           **EINVAL** _op_ is not a valid operation.
    
           **ENODEV ARCH_SET_CPUID** was requested, but the underlying hardware
                  does not support CPUID faulting.
    
           **EPERM** _addr_ is outside the process address space.
    


## STANDARDS



           Linux/x86-64.
    


## NOTES



           **arch_prctl**() is supported only on Linux/x86-64 for 64-bit programs
           currently.
    
           The 64-bit base changes when a new 32-bit segment selector is
           loaded.
    
           **ARCH_SET_GS** is disabled in some kernels.
    
           Context switches for 64-bit segment bases are rather expensive.
           As an optimization, if a 32-bit TLS base address is used,
           **arch_prctl**() may use a real TLS entry as if set_thread_area(2) had
           been called, instead of manipulating the segment base register
           directly.  Memory in the first 2 GB of address space can be
           allocated by using mmap(2) with the **MAP_32BIT** flag.
    
           Because of the aforementioned optimization, using **arch_prctl**() and
           set_thread_area(2) in the same thread is dangerous, as they may
           overwrite each other's TLS entries.
    
           _FS_ may be already used by the threading library.  Programs that
           use **ARCH_SET_FS** directly are very likely to crash.
    


* * *