Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.