1 .\" Copyright (c) International Business Machines Corp., 2006
3 .\" %%%LICENSE_START(GPLv2+_SW_3_PARA)
4 .\" This program is free software; you can redistribute it and/or
5 .\" modify it under the terms of the GNU General Public License as
6 .\" published by the Free Software Foundation; either version 2 of
7 .\" the License, or (at your option) any later version.
9 .\" This program is distributed in the hope that it will be useful,
10 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
11 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
12 .\" the GNU General Public License for more details.
14 .\" You should have received a copy of the GNU General Public
15 .\" License along with this manual; if not, see
16 .\" <http://www.gnu.org/licenses/>.
20 .\" 2005-09-28, created by Arnd Bergmann <arndb@de.ibm.com>
21 .\" 2006-06-16, revised by Eduardo M. Fleury <efleury@br.ibm.com>
22 .\" 2007-07-10, some polishing by mtk
23 .\" 2007-09-28, updates for newer kernels, added example
24 .\" by Jeremy Kerr <jk@ozlabs.org>
26 .TH SPU_RUN 2 2021-03-22 Linux "Linux Programmer's Manual"
28 spu_run \- execute an SPU context
31 .BR "#include <sys/spu.h>" " /* Definition of " SPU_* " constants */"
32 .BR "#include <sys/syscall.h>" " /* Definition of " SYS_* " constants */"
33 .B #include <unistd.h>
35 .BI "int spu_run(int " fd ", uint32_t *" npc ", uint32_t *" event );
39 glibc provides no wrapper for
41 necessitating the use of
46 system call is used on PowerPC machines that implement the
47 Cell Broadband Engine Architecture in order to access Synergistic
48 Processor Units (SPUs).
51 argument is a file descriptor returned by
53 that refers to a specific SPU context.
54 When the context gets scheduled to a physical SPU,
55 it starts execution at the instruction pointer passed in
58 Execution of SPU code happens synchronously, meaning that
60 blocks while the SPU is still running.
62 to execute SPU code in parallel with other code on either the
63 main CPU or other SPUs, a new thread of execution must be created
65 .BR pthread_create (3)).
69 returns, the current value of the SPU program counter is written to
71 so successive calls to
79 argument provides a buffer for an extended status code.
81 context was created with the
82 .B SPU_CREATE_EVENTS_ENABLED
83 flag, then this buffer is populated by the Linux kernel before
87 The status code may be one (or more) of the following constants:
89 .B SPE_EVENT_DMA_ALIGNMENT
90 A DMA alignment error occurred.
92 .B SPE_EVENT_INVALID_DMA
93 An invalid MFC DMA command was attempted.
94 .\" SPE_EVENT_SPE_DATA_SEGMENT is defined, but does not seem to be generated
95 .\" at any point (in Linux 5.9 sources).
97 .B SPE_EVENT_SPE_DATA_STORAGE
98 A DMA storage error occurred.
100 .B SPE_EVENT_SPE_ERROR
101 An illegal instruction was executed.
104 is a valid value for the
107 In this case, the events will not be reported to the calling process.
111 returns the value of the
114 On failure, it returns \-1 and sets
116 is set to indicate the error.
120 register value is a bit mask of status codes and
121 optionally a 14-bit code returned from the
123 instruction on the SPU.
124 The bit masks for the status codes
138 SPU is waiting for a channel.
141 SPU is in single-step mode.
144 SPU has tried to execute an invalid instruction.
147 SPU has tried to access an invalid channel.
150 The bits masked with this value contain the code returned from a
153 These bits are valid only if the 0x02 bit is set.
157 has not returned an error, one or more bits among the lower eight
163 is not a valid file descriptor.
167 is not a valid pointer, or
169 is non-NULL and an invalid pointer.
172 A signal occurred while
178 value has been updated to the new program counter value if
183 is not a valid file descriptor returned from
187 There was not enough memory available to handle a page fault
188 resulting from a Memory Flow Controller (MFC) direct memory access.
191 The functionality is not provided by the current system, because
192 either the hardware does not provide SPUs or the spufs module is not
197 system call was added to Linux in kernel 2.6.16.
199 This call is Linux-specific and implemented only by the PowerPC
201 Programs using this system call are not portable.
204 is meant to be used from libraries that implement a more abstract
205 interface to SPUs, not to be used from regular applications.
207 .UR http://www.bsc.es\:/projects\:/deepcomputing\:/linuxoncell/
209 for the recommended libraries.
211 The following is an example of running a simple, one-instruction SPU
221 #include <sys/types.h>
224 #define handle_error(msg) \e
225 do { perror(msg); exit(EXIT_FAILURE); } while (0)
229 int context, fd, spu_status;
230 uint32_t instruction, npc;
232 context = spu_create("/spu/example\-context", 0, 0755);
234 handle_error("spu_create");
237 * Write a \(aqstop 0x1234\(aq instruction to the SPU\(aqs
238 * local store memory.
240 instruction = 0x00001234;
242 fd = open("/spu/example\-context/mem", O_RDWR);
244 handle_error("open");
245 write(fd, &instruction, sizeof(instruction));
248 * set npc to the starting instruction address of the
249 * SPU program. Since we wrote the instruction at the
250 * start of the mem file, the entry point will be 0x0.
254 spu_status = spu_run(context, &npc, NULL);
255 if (spu_status == \-1)
256 handle_error("open");
259 * We should see a status code of 0x1234002:
260 * 0x00000002 (spu was stopped due to stop\-and\-signal)
261 * | 0x12340000 (the stop\-and\-signal code)
263 printf("SPU Status: %#08x\en", spu_status);
269 .\" Arnd Bergmann <arndb@de.ibm.com>, Jeremy Kerr <jk@ozlabs.org>
273 .BR capabilities (7),