Famille arch — syscalls spécifiques à l’architecture
Couche 0 — crate air-sys-syscall, module arch. Ajoutée par ADR-051 (re-sceau couche-0-v1.7).
Vue d’ensemble
Cette famille expose les syscalls dont la sémantique dépend de l’architecture.
À ce jour : arch_prctl(2), présent uniquement sur x86_64, pour programmer la
base du registre de segment %fs (registre TLS du thread).
L’objet ThreadLocalStorage (couche 1) — brique du runtime AirRuntime
(ADR-049, placement corrigé par
ADR-052) — s’en sert pour ancrer le
TCB du thread principal au registre TLS. (C’est cet objet couche 1 qui appelle
set_fs, pas le runtime en direct : seule la couche 1 consomme la couche 0 — ADR-052.)
Sur aarch64, le registre TLS (tpidr_el0) est inscriptible directement en EL0 par
une instruction msr (asm encapsulé dans l’objet ThreadLocalStorage couche 1,
pas un syscall) — d’où l’absence d’équivalent arch côté aarch64. Les threads
spawnés (toutes arches) reçoivent leur registre TLS du kernel via CLONE_SETTLS
(clone_thread, famille process).
set_fs / get_fs (x86_64 uniquement)
#![allow(unused)]
fn main() {
#[cfg(target_arch = "x86_64")]
pub unsafe fn set_fs(base: usize) -> Result<(), Errno>;
#[cfg(target_arch = "x86_64")]
pub fn get_fs() -> Result<usize, Errno>;
}
Syscall sous-jacent. arch_prctl (x86_64 n°158) avec ARCH_SET_FS (0x1002)
ou ARCH_GET_FS (0x1003). Pas d’équivalent aarch64 (cf. ci-dessus). Conforme à
ADR-021 §3 : fonctions dédiées par opération, pas de wrapper arch_prctl(op, …)
multiplexé.
Sémantique. set_fs fixe la base de %fs ; après l’appel, tout accès
thread_local du thread résout via cette base. get_fs lit la base courante.
Sûreté. set_fs est unsafe : une base erronée corrompt tout l’état
par-thread (le contrat exige une image TLS valide). get_fs est sûr (lecture).
Erreurs. EINVAL/EPERM si la base est rejetée (p. ex. adresse non
canonique) — le kernel ne modifie alors pas %fs.
Tests. get_fs non nul (TLS libc présent) ; set_fs(get_fs()) (réécriture
no-op de la base courante → chemin succès sans casser le TLS) ; set_fs(non canonique) → erreur sans changer %fs. Le bras d’erreur de get_fs est
inatteignable par construction (buffer de pile valide) — exception STRUCTURAL,
cf. COVERAGE-EXCEPTIONS.md.