sourCEntral - mobile manpages

pdf

arch_prctl

NOM

arch_prctl - Définir l’état spécifique à l’architecture d’un processus

BIBLIOTHÈQUE

Bibliothèque C standard (libc, -lc)

SYNOPSIS

#include <asm/prctl.h> /* Définition des constantes
ARCH_*
*/
#include <sys/syscall.h>
/* Définition des constantes
SYS_*
*/
#include <unistd.h>

int syscall(SYS_arch_prctl, int code, unsigned long addr);
int syscall(SYS_arch_prctl, int
code, unsigned long *addr);

Note : la glibc ne fournit pas d’enveloppe autour de arch_prctl(), nécessitant l’utilisation de syscall(2).

DESCRIPTION

La fonction arch_prctl() définit l’état spécifique à l’architecture pour le thread ou le processus. code sélectionne une sous-fonction et lui passe l’argument addr ; addr est interprété comme un unsigned long pour les opérations « set », ou comme un unsigned long *, pour les opérations « get ».

Les sous-fonctions pour les architectures x86 et x86-64 sont :
ARCH_SET_CPUID
(depuis Linux 4.12)

Activer (addr != 0) ou désactiver (addr == 0) l’instruction cpuid pour le thread appelant. L’instruction est activée par défaut. Si elle est désactivée, l’exécution de l’instruction cpuid générera un signal SIGSEGV. Cette fonctionnalité peut être utilisée pour émuler des résultats de cpuid qui diffèrent de ceux obtenus normalement sur le matériel sous-jacent (par exemple dans un environnement de paravirtualisation).

Le paramètre ARCH_SET_CPUID est préservé pendant un fork(2) et un clone(2) mais il est réinitialisé à l’état par défaut (donc cpuid activé) en cas de execve(2).

ARCH_GET_CPUID (depuis Linux 4.12)

Renvoyer la position de l’attribut manipulé par ARCH_SET_CPUID sous forme d’un appel système (1 pour activé, 0 pour désactivé). addr est ignoré.

Les sous-fonctions pour l’architecture x86-64 sont :
ARCH_SET_FS

Remplir la base 64 bits pour le registre FS avec addr.

ARCH_GET_FS

Renvoyer la valeur dans la base 64 bits pour le registre FS du thread appelant dans la variable unsigned long pointée par addr.

ARCH_SET_GS

Remplir la base 64 bits pour le registre GS avec addr.

ARCH_GET_GS

Renvoyer la valeur dans la base 64 bits pour le registre GS du thread appelant dans la variable unsigned long pointée par addr.

VALEUR RENVOYÉE

S’il réussit, arch_prctl() renvoie 0. En cas d’erreur, il renvoie -1 et remplit errno avec la valeur d’erreur.

ERREURS

EFAULT

addr pointe vers une adresse non affectée ou est en dehors de l’espace d’adressage.

EINVAL

code n’est pas une sous-commande autorisée.

ENODEV

ARCH_SET_CPUID a été sollicité mais le matériel ne prend pas en charge les erreurs CPUID.

EPERM

addr pointe en dehors de l’espace d’adressage du processus.

STANDARDS

arch_prctl() est une extension Linux/x86-64 et ne doit pas être employée dans un programme portable.

NOTES

arch_prctl() n’est pris en charge sur Linux/x86-64 que pour les programmes 64 bits.

La base 64 bits change lorsqu’un nouveau sélecteur de segment 32 bits est chargé.

ARCH_SET_GS est inactif dans certains noyaux.

Les changements de contexte pour les bases 64 bits sont assez coûteux. Pour les optimiser, si une adresse de base 32 bits TLS est utilisée, arch_prctl() peut utiliser une entrée TLS réelle comme si on avait appelé set_thread_area(2) plutôt que de manipuler directement le registre de la base du segment. La mémoire dans les premiers 2 Go d’adressage peut être allouée en utilisant mmap(2) avec l’attribut MAP_32BIT.

Du fait de l’optimisation précitée, l’utilisation de arch_prctl() et de set_thread_area(2) dans le même thread est dangereuse car elles peuvent écraser les entrées TLS entre elles.

FS peut être déjà utilisé par la bibliothèque de threading. Les programmes qui utilisent directement ARCH_SET_FS vont très probablement planter.

VOIR AUSSI

mmap(2), modify_ldt(2), prctl(2), set_thread_area(2)

Manuel du programmeur AMD X86-64

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan DOT rafin AT laposte DOT net>, Thierry Vignaud <tvignaud AT mandriva DOT com>, François Micaux, Alain Portal <aportal AT univ-montp2 DOT fr>, Jean-Philippe Guérard <fevrier AT tigreraye DOT org>, Jean-Luc Coulon (f5ibh) <jean-luc DOT coulon AT wanadoo DOT fr>, Julien Cristau <jcristau AT debian DOT org>, Thomas Huriaux <thomas DOT huriaux AT gmail DOT com>, Nicolas François <nicolas DOT francois AT centraliens DOT net>, Florentin Duneau <fduneau AT gmail DOT com>, Simon Paillard <simon DOT paillard AT resel DOT enst-bretagne DOT fr>, Denis Barbier <barbier AT debian DOT org>, David Prévot <david AT tilapin DOT org> et Jean-Philippe MENGUAL <jpmengual AT debian DOT org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french.

pdf