Instruction
RDFSBASE
Reads the FS base, where x86-64 Linux keeps a thread's TLS pointer, into a register; 64-bit mode, when the kernel set CR4.FSGSBASE.
- Extensions
- Forms
- 1 (1 Legacy)
- Data
- Intel XED v2026.08.23
RDFSBASE copies the base address of the FS segment into a general register. In 64-bit mode FS and GS are the two segments whose base still counts, and on x86-64 Linux FS holds the thread pointer, the address of the running thread’s thread-local storage. With REX.W the whole 64-bit base is read; without it, the low 32 bits, with bits 63:32 of the destination cleared, as Zen 5 recorded. It changes no flag. RDGSBASE reads GS the same way.
When it works
FSGSBASE has its own CPUID bit (leaf 7, EBX bit 0), but support alone
is not enough: the kernel must also set CR4.FSGSBASE, or all four
instructions raise #UD, at every privilege level. Linux’s documentation
tells programs to check HWCAP2_FSGSBASE in the auxiliary vector
before using them, as a CPU that has them may run a kernel that has not
enabled them. Without them, arch_prctl(ARCH_GET_FS, ...), a system
call, returns the same value. They exist only in 64-bit mode.
From C
GCC 14 and Clang 23 provide _readfsbase_u64() and _readfsbase_u32()
only with -mfsgsbase or an -march that includes it, such as
ivybridge or znver1; none of the x86-64 levels does. At -O2 each call
becomes rdfsbase rax (or eax), and two calls stay two
instructions: the compilers never merge them, since the base can change
in between.
They do not need it for the thread pointer. On Linux the thread’s
control block starts with its own address, as the
TLS page explains, so
__builtin_thread_pointer() compiles to mov rax, qword ptr fs:0 with
both compilers, with or without -mfsgsbase, and thread-local
variables are reached through FS-relative addresses directly. RDFSBASE
is for code that needs the base itself, such as a runtime that saves
the old base before it installs another with
WRFSBASE.
The instruction table of AMD’s Zen 5 guide lists RDFSBASE as
microcoded; a load through fs:0 is an ordinary MOV.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
RDFSBASE r32/64 64-bit mode only
RDFSBASE_GPRy | F3 0F AE /0 | FSGSBASE |
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
dest.write(fsbase) # r32: bits 63:32 of the register
# cleared
Run on AMD Zen 5 (EPYC 9645): 3 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
RDFSBASE r32/64 64-bit mode only | ||
r32/64 | explicit | write |
FS base | implicit | read |
Flags
None: XED records no flag that the forms test or change.
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to RDFSBASE, each with the form it compiles to and the Clang options it needs. The forms come from compiling every intrinsic and decoding the result with Intel XED; all intrinsics A–Z explains the method.
| Intrinsic | Compiles to |
|---|---|
_readfsbase_u32
unsigned int _readfsbase_u32(void) |
|
_readfsbase_u64
unsigned long long _readfsbase_u64(void) |
|
CPUID and processors
Each form belongs to an XED ISA set. A form can be used when the processor reports every CPUID bit of one of its ISA set's alternatives.
| ISA set | CPUID | Processors |
|---|---|---|
RDWRFSGS | FSGSBASE | Ivy Bridge, Haswell, Broadwell, Skylake, Comet Lake, Cannon Lake, Ice Lake (client), Tiger Lake, Alder Lake, Arrow Lake, Panther Lake, Nova Lake, Skylake-SP, Cascade Lake, Cooper Lake, Ice Lake (server), Sapphire Rapids, Emerald Rapids, Granite Rapids, Diamond Rapids, Goldmont, Goldmont Plus, Tremont, Snow Ridge, Lakefield, Sierra Forest, Clearwater Forest, Knights Landing, Knights Mill, Bulldozer, Piledriver, Zen, Zen+, Zen 2, Zen 3, Zen 4, Zen 5, Zen 6 |
More FSGSBASE instructions
Sources
- Intel XED v2026.08.23 (commit
0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model. - The CPU data of x86-64.net: Zen 3 to Zen 6, from GCC’s
-marchfeature sets and AMD’s Processor Programming References, which the page of each processor cites. - Clang's x86 intrinsic headers, LLVM 23.1.2 (commit
85ac56026243): the intrinsics, their signatures and doc comments, and the Clang of that release, which compiled each of them. - Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2B, page 4-542 (RDFSBASE/
RDGSBASE) - Linux kernel documentation: Using FS and GS segments in user space applications
- AMD64 Architecture Programmer's Manual, Volume 3: General-Purpose and System Instructions (24594, rev. 3.36, March 2024), Wayback Machine copy of AMD's PDF
- Software Optimization Guide for the AMD Zen5 Microarchitecture (58455, rev. 1.00, August 2024), Wayback Machine copy of AMD's ZIP
The tables are derived from Intel XED, Copyright Intel Corporation, licensed under the Apache License 2.0; x86-64.net converted and reformatted them. The intrinsics and their signatures come from Clang, part of the LLVM Project, licensed under the Apache License 2.0 with LLVM Exceptions. The text is our own.