1arch_prctl(2) System Calls Manual arch_prctl(2)
2
3
4
6 arch_prctl - set architecture-specific thread state
7
9 Standard C library (libc, -lc)
10
12 #include <asm/prctl.h> /* Definition of ARCH_* constants */
13 #include <sys/syscall.h> /* Definition of SYS_* constants */
14 #include <unistd.h>
15
16 int syscall(SYS_arch_prctl, int code, unsigned long addr);
17 int syscall(SYS_arch_prctl, int code, unsigned long *addr);
18
19 Note: glibc provides no wrapper for arch_prctl(), necessitating the use
20 of syscall(2).
21
23 arch_prctl() sets architecture-specific process or thread state. code
24 selects a subfunction and passes argument addr to it; addr is inter‐
25 preted as either an unsigned long for the "set" operations, or as an
26 unsigned long *, for the "get" operations.
27
28 Subfunctions for both x86 and x86-64 are:
29
30 ARCH_SET_CPUID (since Linux 4.12)
31 Enable (addr != 0) or disable (addr == 0) the cpuid instruction
32 for the calling thread. The instruction is enabled by default.
33 If disabled, any execution of a cpuid instruction will instead
34 generate a SIGSEGV signal. This feature can be used to emulate
35 cpuid results that differ from what the underlying hardware
36 would have produced (e.g., in a paravirtualization setting).
37
38 The ARCH_SET_CPUID setting is preserved across fork(2) and
39 clone(2) but reset to the default (i.e., cpuid enabled) on ex‐
40 ecve(2).
41
42 ARCH_GET_CPUID (since Linux 4.12)
43 Return the setting of the flag manipulated by ARCH_SET_CPUID as
44 the result of the system call (1 for enabled, 0 for disabled).
45 addr is ignored.
46
47 Subfunctions for x86-64 only are:
48
49 ARCH_SET_FS
50 Set the 64-bit base for the FS register to addr.
51
52 ARCH_GET_FS
53 Return the 64-bit base value for the FS register of the calling
54 thread in the unsigned long pointed to by addr.
55
56 ARCH_SET_GS
57 Set the 64-bit base for the GS register to addr.
58
59 ARCH_GET_GS
60 Return the 64-bit base value for the GS register of the calling
61 thread in the unsigned long pointed to by addr.
62
64 On success, arch_prctl() returns 0; on error, -1 is returned, and errno
65 is set to indicate the error.
66
68 EFAULT addr points to an unmapped address or is outside the process ad‐
69 dress space.
70
71 EINVAL code is not a valid subcommand.
72
73 ENODEV ARCH_SET_CPUID was requested, but the underlying hardware does
74 not support CPUID faulting.
75
76 EPERM addr is outside the process address space.
77
79 Linux/x86-64.
80
82 arch_prctl() is supported only on Linux/x86-64 for 64-bit programs cur‐
83 rently.
84
85 The 64-bit base changes when a new 32-bit segment selector is loaded.
86
87 ARCH_SET_GS is disabled in some kernels.
88
89 Context switches for 64-bit segment bases are rather expensive. As an
90 optimization, if a 32-bit TLS base address is used, arch_prctl() may
91 use a real TLS entry as if set_thread_area(2) had been called, instead
92 of manipulating the segment base register directly. Memory in the
93 first 2 GB of address space can be allocated by using mmap(2) with the
94 MAP_32BIT flag.
95
96 Because of the aforementioned optimization, using arch_prctl() and
97 set_thread_area(2) in the same thread is dangerous, as they may over‐
98 write each other's TLS entries.
99
100 FS may be already used by the threading library. Programs that use
101 ARCH_SET_FS directly are very likely to crash.
102
104 mmap(2), modify_ldt(2), prctl(2), set_thread_area(2)
105
106 AMD X86-64 Programmer's manual
107
108
109
110Linux man-pages 6.04 2023-03-30 arch_prctl(2)