spu_run(2) System Calls Manual spu_run(2) NOM spu_run - Executer un contexte SPU BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include /* Definition des constantes SPU_* */ #include /* Definition des constantes SYS_* */ #include 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 systeme spu_run() est utilise sur les PowerPC disposant de l'architecture du processeur Cell dans le but d'acceder aux SPUs (Synergistic Processor Units). L'argument fd est un descripteur de fichiers renvoye par spu_create(2) qui se refere a un contexte SPU specifique. Lorsque le contexte est livre a un SPU physique, il demarre son execution au pointeur d'instruction passe a npc. L'execution du code SPU se fait de maniere synchrone. C'est pourquoi spu_run() est bloquant tant que le SPU fonctionne. S'il est necessaire d'executer du code SPU en parallele avec d'autres codes, que se soit sur le processeur principal ou sur d'autres SPU, un nouveau thread doit d'abord etre cree (par exemple en utilisant pthread_create(3)). Lorsque spu_run() revient, la valeur courante du pointeur d'instruction SPU est ecrite a npc, donc il est possible d'appeler spu_run() de nouveau avec le meme pointeur npc. Le parametre event fournit un tampon pour un code d'etat etendu. Si le contexte SPU a ete cree avec l'attribut SPU_CREATE_EVENTS_ENABLED, ce tampon sera rempli par le noyau Linux avant que spu_run() revienne. Le code d'etat peut etre 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 ete tentee. SPE_EVENT_SPE_DATA_STORAGE Une erreur de stockage DMA s'est produite. SPE_EVENT_SPE_ERROR Une instruction illegale a ete executee. NULL est une valeur valable pour le parametre event. Dans ce cas, les evenements ne seront pas remontes au processus appelant. VALEUR RENVOYEE En cas de succes, spu_run() renvoie la valeur du registre spu_status. En cas d'echec, l'appel renvoie -1 et errno est defini 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 ete stoppe par une instruction stop-and-signal. 0x04 Le SPU a ete arrete par une instruction halt. 0x08 Le SPU est en attente d'un canal. 0x10 Le SPU est en mode single-step. 0x20 SPU a essaye d'executer une instruction non valable. 0x40 SPU a essaye d'acceder a un canal non valable. 0x3fff0000 Les bits masques avec cette valeur contiennent le code renvoye par une instruction stop-and-signal. Ces bits ne sont valables que si le bit 0x02 est positionne. Si spu_run() ne renvoie pas d'erreur, au moins un des huit bits de poids faible est toujours positionne. 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 ete mise a jour a la nouvelle valeur du compteur de programme si necessaire. EINVAL fd n'est pas un descripteur de fichier valable renvoye par spu_create(2). ENOMEM Il n'y a pas suffisamment de memoire disponible pour gerer une faute de page resultant d'un acces direct a la memoire d'un MFC (<< Memory Flow Controller >>). ENOSYS La fonctionnalite n'est par fournie par le systeme actuel parce que le materiel ne fournit pas de SPU ou parce que le module spufs n'est pas charge. STANDARDS Linux sur PowerPC. HISTORIQUE Linux 2.6.16. NOTES spu_run() est concu pour etre appele depuis des bibliotheques qui implementent une interface plus abstraite pour les SPU, pas pour etre appele directement par les applications normales. Consultez pour les bibliotheques recommandees. EXEMPLES Vous trouverez ci-dessous un exemple pour lancer un programme simple, d'une instruction SPU, utilisant l'appel systeme spu_run(). #include #include #include #include #include #include #include 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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 spu_run(2)