[Cbe-oss-dev] Call/return from PPE to SPE functions

Arnd Bergmann arnd at arndb.de
Wed May 30 04:56:49 EST 2007


On Tuesday 29 May 2007, Brian Watt wrote:
> OK. I think I understand.

I think you don't ;-)

> > The registers are only accessible in saved state, so in order to
> > change them, the context needs to be suspended and written back
> > into kernel memory.
> 
> That is fine, because I have no need to modify the registers while the 
> context is executing. Instead I would only need to update the registers 
> when the context is in a saved state prior to execution. Then the context 
> would be executed which would execute the SPE program until it returns 
> (though a completion stop and signal, 0x2000) whereby I assume the context 
> is suspended and written back - therefore in a saved state. After this the 
> registers could be read to get the results, and the process would repeat 
> itself for the next call again by setting up the registers. So maybe I'm 
> not understanding what the issue is that you are trying to explain to me, 
> because I think the context is in the correct state as you suggest.

There are four different states that a context can be in:

1. saved and idle
2. saved and trying to run
3. loaded and running
4. loaded and idle

Initially, it is in state 1, where you can easily modify the registers.
When you call spe_context_run, it goes through state 2 in the scheduler
to state 3, where it actually executes code.

When it returns by the means of stop-and-signal, and there is no other
context in state 2, it will be in state 4, waiting to be called again.
This is an important performance optimization. When you call
spe_context_run the next time, it can quickly go from state 4 to state 3
again, without ever having to be saved into memory.

Accessing the registers of a loaded context forces it to be saved into
state 1 or 2, and then loaded again as it tries to run.

	Arnd <><



More information about the cbe-oss-dev mailing list