SPU_RUN

Section: Linux Programmer's Manual (2)
Updated: 2005-09-28
Index Return to Main Contents

 

NAME

spu_run - execute an spu context

 

SYNOPSIS

#include <sys/spu.h>

int spu_run(int fd, unsigned int *npc, unsigned int *event);  

DESCRIPTION

The spu_run system call is used on PowerPC machines that implement the Cell Broadband Engine Architecture in order to access Synergistic Processor Units (SPUs). It uses the fd that was returned from spu_create(2) to address a specific SPU context. When the context gets scheduled to a physical SPU, it starts execution at the instruction pointer passed in npc.

Execution of SPU code happens synchronously, meaning that spu_run does not return while the SPU is still running. If there is a need to execute SPU code in parallel with other code on either the main CPU or other SPUs, you need to create a new thread of execution first, e.g. using the pthread_create(3) call.

When spu_run returns, the current value of the SPU instruction pointer is written back to npc, so you can call spu_run again without updating the pointers.

event can be a NULL pointer or point to an extended status code that gets filled when spu_run returns. It can be one of the following constants:

SPE_EVENT_DMA_ALIGNMENT
A DMA alignment error
SPE_EVENT_SPE_DATA_SEGMENT
A DMA segmentation error
SPE_EVENT_SPE_DATA_STORAGE
A DMA storage error

If NULL is passed as the event argument, these errors will result in a signal delivered to the calling process.  

RETURN VALUE

spu_run returns the value of the spu_status register or -1 to indicate an error and set errno to one of the error codes listed below. The spu_status register value contains a bit mask of status codes and optionally a 14 bit code returned from the stop-and-signal instruction on the SPU. The bit masks for the status codes are:
0x02
SPU was stopped by stop-and-signal.
0x04
SPU was stopped by halt.
0x08
SPU is waiting for a channel.
0x10
SPU is in single-step mode.
0x20
SPU has tried to execute an invalid instruction.
0x40
SPU has tried to access an invalid channel.
0x3fff0000
The bits masked with this value contain the code returned from stop-and-signal.

There are always one or more of the lower eight bits set or an error code is returned from spu_run.  

ERRORS

EAGAIN or EWOULDBLOCK
fd is in non-blocking mode and spu_run would block.
EBADF
fd is not a valid file descriptor.
EFAULT
npc is not a valid pointer or status is neither NULL nor a valid pointer.
EINTR
A signal occured while spu_run was in progress. The npc value has been updated to the new program counter value if necessary.
EINVAL
fd is not a file descriptor returned from spu_create(2).
ENOMEM
Insufficient memory was available to handle a page fault resulting from an MFC direct memory access.
ENOSYS
the functionality is not provided by the current system, because either the hardware does not provide SPUs or the spufs module is not loaded.

 

NOTES

spu_run is meant to be used from libraries that implement a more abstract interface to SPUs, not to be used from regular applications. See http://www.bsc.es/projects/deepcomputing/linuxoncell/ for the recommended libraries.

 

CONFORMING TO

This call is Linux specific and only implemented by the ppc64 architecture. Programs using this system call are not portable.

 

BUGS

The code does not yet fully implement all features lined out here.

 

AUTHOR

Arnd Bergmann <arndb@de.ibm.com>  

SEE ALSO

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