Provided by: manpages-fr-dev_4.21.0-2_all bug

NOM

       spu_run - Exécuter un contexte SPU

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <sys/spu.h>          /* Définition des constantes SPU_* */
       #include <sys/syscall.h>      /* Définition des constantes SYS_* */
       #include <unistd.h>

       int syscall(SYS_spu_run, int fd, uint32_t *npc, uint32_t *event);

       Remarque : la glibc ne fournit pas d'enveloppe pour spu_run(), imposant l'utilisation de syscall(2).

DESCRIPTION

       L'appel système spu_run() est utilisé sur les PowerPC disposant de l'architecture du processeur Cell dans
       le  but  d'accéder  aux  SPUs (Synergistic Processor Units). L'argument fd est un descripteur de fichiers
       renvoyé par spu_create(2) qui se réfère à un contexte SPU spécifique. Lorsque le contexte est livré à  un
       SPU physique, il démarre son exécution au pointeur d'instruction passé à npc.

       L'exécution  du  code SPU se fait de manière synchrone. C'est pourquoi spu_run() est bloquant tant que le
       SPU fonctionne. S'il est nécessaire d'exécuter du code SPU en parallèle avec d'autres codes, que se  soit
       sur le processeur principal ou sur d'autres SPU, un nouveau thread doit d'abord être créé (par exemple en
       utilisant pthread_create(3)).

       Lorsque spu_run() revient, la valeur courante du pointeur d'instruction SPU est écrite à npc, donc il est
       possible d'appeler spu_run() de nouveau avec le même pointeur npc.

       Le  paramètre  event  fournit  un  tampon  pour un code d'état étendu. Si le contexte SPU a été créé avec
       l'attribut SPU_CREATE_EVENTS_ENABLED, ce tampon sera rempli  par  le  noyau  Linux  avant  que  spu_run()
       revienne.

       Le code d'état peut être l'une (ou plus) des constantes suivantes :

       SPE_EVENT_DMA_ALIGNMENT
              Une erreur d'alignement DMA s'est produite.

       SPE_EVENT_INVALID_DMA
              Une commande MFC DMA invalide a été tentée.

       SPE_EVENT_SPE_DATA_STORAGE
              Une erreur de stockage DMA s'est produite.

       SPE_EVENT_SPE_ERROR
              Une instruction illégale a été exécutée.

       NULL  est  une valeur valable pour le paramètre event. Dans ce cas, les événements ne seront pas remontés
       au processus appelant.

VALEUR RENVOYÉE

       En cas de succès, spu_run() renvoie la valeur du registre spu_status. En cas d'échec, l'appel renvoie  -1
       et errno est défini pour indiquer l'erreur.

       La valeur du registre spu_status est un masque de bits de code d'erreurs et en option d'un code de retour
       de  14 bits  provenant  de  l'instruction  stop-and-signal du SPU. Les bits des masques du code de retour
       sont :

       0x02   Le SPU a été stoppé par une instruction stop-and-signal.

       0x04   Le SPU a été arrêté par une instruction halt.

       0x08   Le SPU est en attente d'un canal.

       0x10   Le SPU est en mode single-step.

       0x20   SPU a essayé d'exécuter une instruction non valable.

       0x40   SPU a essayé d'accéder à un canal non valable.

       0x3fff0000
              Les  bits  masqués  avec  cette  valeur  contiennent  le  code   renvoyé   par   une   instruction
              stop-and-signal. Ces bits ne sont valables que si le bit 0x02 est positionné.

       Si spu_run() ne renvoie pas d'erreur, au moins un des huit bits de poids faible est toujours positionné.

ERREURS

       EBADF  fd n'est pas un descripteur de fichier valable.

       EFAULT npc n'est pas un pointeur valable ou event n'est ni NULL ni un pointeur valable.

       EINTR  Un  signal  est  apparu pendant la progression de spu_run() ; consultez signal(7). La valeur npc a
              été mise à jour à la nouvelle valeur du compteur de programme si nécessaire.

       EINVAL fd n'est pas un descripteur de fichier valable renvoyé par spu_create(2).

       ENOMEM Il n'y a pas suffisamment de mémoire disponible pour gérer une faute de page résultant d'un  accès
              direct à la mémoire d'un MFC (« Memory Flow Controller »).

       ENOSYS La  fonctionnalité n'est par fournie par le système actuel parce que le matériel ne fournit pas de
              SPU ou parce que le module spufs n'est pas chargé.

VERSIONS

       L'appel système spu_run() est apparu dans Linux 2.6.16.

STANDARDS

       Cet appel système est spécifique à  Linux  et  implémenté  uniquement  sur  l'architecture  PowerPC.  Les
       programmes qui l'utilisent ne sont pas portables.

NOTES

       spu_run()  est  conçu  pour  être  appelé  depuis  des  bibliothèques qui implémentent une interface plus
       abstraite pour les SPU, pas pour  être  appelé  directement  par  les  applications  normales.  Consultez
       http://www.bsc.es/projects/deepcomputing/linuxoncell/ pour les bibliothèques recommandées.

EXEMPLES

       Vous  trouverez  ci-dessous  un exemple pour lancer un programme simple, d'une instruction SPU, utilisant
       l'appel système spu_run().

       #include <err.h>
       #include <fcntl.h>
       #include <stdint.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/types.h>
       #include <unistd.h>

       int main(void)
       {
           int       context, fd, spu_status;
           uint32_t  instruction, npc;

           context = syscall(SYS_spu_create, "/spu/example-context", 0, 0755);
           if (context == -1)
               err(EXIT_FAILURE, "spu_create");

           /* write a 'stop 0x1234' instruction to the SPU's
            * local store memory
            */
           instruction = 0x00001234;

           fd = open("/spu/example-context/mem", O_RDWR);
           if (fd == -1)
               err(EXIT_FAILURE, "open");
           write(fd, &instruction, sizeof(instruction));

           /*
            * set npc to the starting instruction address of the
            * SPU program. Since we wrote the instruction at the
            * start of the mem file, the entry point will be 0x0.
            */
           npc = 0;

           spu_status = syscall(SYS_spu_run, context, &npc, NULL);
           if (spu_status == -1)
               err(EXIT_FAILURE, "open");

           /*
            * We should see a status code of 0x12340002:
            *   0x00000002 (spu was stopped due to stop-and-signal)
            * | 0x12340000 (the stop-and-signal code)
            */
           printf("SPU Status: %#08x\n", spu_status);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       close(2), spu_create(2), capabilities(7), spufs(7)

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.rafin@laposte.net>,   Thierry   Vignaud
       <tvignaud@mandriva.com>, François Micaux, Alain Portal  <aportal@univ-montp2.fr>,  Jean-Philippe  Guérard
       <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-luc.coulon@wanadoo.fr>,   Julien   Cristau
       <jcristau@debian.org>,     Thomas     Huriaux      <thomas.huriaux@gmail.com>,      Nicolas      François
       <nicolas.francois@centraliens.net>,     Florentin     Duneau    <fduneau@gmail.com>,    Simon    Paillard
       <simon.paillard@resel.enst-bretagne.fr>,    Denis    Barbier    <barbier@debian.org>,    David     Prévot
       <david@tilapin.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

       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@lists.debian.org.

Pages du manuel de Linux 6.03                    8 février 2023                                       spu_run(2)