.\" -*- coding: UTF-8 -*- .\" Copyright (c) International Business Machines Corp., 2006 .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\" HISTORY: .\" 2005-09-28, created by Arnd Bergmann .\" 2006-06-16, revised by Eduardo M. Fleury .\" 2007-07-10, some polishing by mtk .\" 2007-09-28, updates for newer kernels, added example .\" by Jeremy Kerr .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH spu_run 2 "8 февраля 2023 г." "Linux man\-pages 6.03" .SH ИМЯ spu_run \- выполняет контекст SPU .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP /* определения констант \fBSPU_*\fP */ \fB#include \fP /* определения констант \fBSYS_*\fP */ \fB#include \fP .PP \fBint syscall(SYS_spu_run, int \fP\fIfd\fP\fB, uint32_t *\fP\fInpc\fP\fB, uint32_t *\fP\fIevent\fP\fB);\fP .fi .PP \fINote\fP: glibc provides no wrapper for \fBspu_run\fP(), necessitating the use of \fBsyscall\fP(2). .SH ОПИСАНИЕ Системный вызов \fBspu_run\fP() используется на машинах PowerPC с архитектурой Cell Broadband Engine для получения доступа к Synergistic Processor Unit (SPU). Аргумент \fIfd\fP представляет собой файловый дескриптор, возвращаемый вызовом \fBspu_create\fP(2) и указывающий на определённый контекст SPU. Когда контекст планируется на физическом SPU, он запускается на выполнение начиная с инструкции, на которую указывает значение \fInpc\fP. .PP Выполнение кода SPU происходит синхронно, то есть \fBspu_run\fP() блокируется на время работы SPU. Если требуется параллельное выполнение кода SPU и кода на основном процессоре или других SPU, то сначала нужно создать новую нить выполнения (например с помощью \fBpthread_create\fP(3)). .PP При завершении работы \fBspu_run\fP() текущее значение программного счётчика SPU записывается в \fInpc\fP, что позволяет использовать тот же указатель \fInpc\fP в последующих вызовах \fBspu_run\fP(). .PP В аргументе \fIevent\fP указывается буфер для расширенного кода состояния. Если контекст SPU создан с флагом \fBSPU_CREATE_EVENTS_ENABLED\fP, то ядро Linux заполняет этот буфер перед возвратом из \fBspu_run\fP(). .PP Код состояния может быть одной (или несколькими) из следующих констант: .TP \fBSPE_EVENT_DMA_ALIGNMENT\fP Произошла ошибка выравнивания DMA. .TP \fBSPE_EVENT_INVALID_DMA\fP .\" SPE_EVENT_SPE_DATA_SEGMENT is defined, but does not seem to be generated .\" at any point (in Linux 5.9 sources). Попытка выполнить неверную команду MFC DMA. .TP \fBSPE_EVENT_SPE_DATA_STORAGE\fP Произошла ошибка хранилища DMA. .TP \fBSPE_EVENT_SPE_ERROR\fP Выполнена недопустимая инструкция. .PP Для аргумента \fIevent\fP допускается значение NULL. В этом случае информация о событиях не будет поступать в вызывающий процесс. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" On success, \fBspu_run\fP() returns the value of the \fIspu_status\fP register. On failure, it returns \-1 and sets \fIerrno\fP is set to indicate the error. .PP Значение регистра \fIspu_status\fP представляет собой битовую маску кодов состояния и необязательный 14\-битный код, возвращаемый при выполнении инструкции \fBstop\-and\-signal\fP SPU. Битовые маски кодов состояний: .TP \fB0x02\fP SPU остановлен инструкцией \fBstop\-and\-signal\fP. .TP \fB0x04\fP SPU остановлен инструкцией \fBhalt\fP. .TP \fB0x08\fP SPU ожидает канала. .TP \fB0x10\fP SPU в пошаговом режиме. .TP \fB0x20\fP SPU пытался выполнить неверную инструкцию. .TP \fB0x40\fP SPU пытался получить доступ к неверному каналу. .TP \fB0x3fff0000\fP При наложении этой маски получается код, возвращаемый инструкцией \fBstop\-and\-signal\fP. Полученные биты корректны только, если установлен бит 0x02. .PP Если \fBspu_run\fP() не вернул ошибку, то один или более младших восьми битов всегда установлены. .SH ОШИБКИ .TP \fBEBADF\fP Значение \fIfd\fP не является правильным файловым дескриптором. .TP \fBEFAULT\fP Задан неправильный указатель в \fInpc\fP или значение \fIevent\fP не равно NULL и является неправильным указателем. .TP \fBEINTR\fP При выполнении \fBspu_run\fP() получен сигнал; см. \fBsignal\fP(7). При необходимости, значение \fInpc\fP обновляется до нового значения программного счётчика. .TP \fBEINVAL\fP Значение \fIfd\fP не является правильным файловым дескриптором, возвращённым \fBspu_create\fP(2). .TP \fBENOMEM\fP Недостаточно памяти для обработки страничного сбоя в результате прямого доступа Memory Flow Controller (MFC). .TP \fBENOSYS\fP Возможность не предоставляется текущей системой, так как или аппаратура не предоставляет SPU, или не загружен модуль spufs. .SH ВЕРСИИ The \fBspu_run\fP() system call was added in Linux 2.6.16. .SH СТАНДАРТЫ Данный вызов существует только в Linux и реализован только для архитектуры PowerPC. Программы, использующие данный вызов, не переносимы. .SH ЗАМЕЧАНИЯ \fBspu_run\fP() is meant to be used from libraries that implement a more abstract interface to SPUs, not to be used from regular applications. See .UR http://www.bsc.es\:/projects\:/deepcomputing\:/linuxoncell/ .UE for the recommended libraries. .SH ПРИМЕРЫ В следующем примере реализована простая программа, состоящая из одной инструкции SPU и системного вызова \fBspu_run\fP(). .PP .\" SRC BEGIN (spu_run.c) .EX #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 \[aq]stop 0x1234\[aq] instruction to the SPU\[aq]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)); /* * присвоить npc адрес начальной инструкции программы * SPU. Так как мы записали инструкцию в начало * файла mem, точка входа будет равна 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\en", spu_status); exit(EXIT_SUCCESS); } .EE .\" SRC END .\" .SH AUTHORS .\" Arnd Bergmann , Jeremy Kerr .SH "СМ. ТАКЖЕ" \fBclose\fP(2), \fBspu_create\fP(2), \fBcapabilities\fP(7), \fBspufs\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .