[Stackless] cross compile stackless from x86 to mipsel
Luca Dionisi
luca.dionisi at gmail.com
Tue Feb 8 10:27:59 CET 2011
On Tue, Feb 8, 2011 at 2:15 AM, Richard Tew <richard.m.tew at gmail.com> wrote:
> On Tue, Feb 8, 2011 at 5:10 AM, Luca Dionisi <luca.dionisi at gmail.com> wrote:
>>
>> I am trying, without success at the moment, to cross compile stackless
>> (version 2.6.2) from a x86 host (linux) to a mips architecture.
>> I gathered some info on various sites:
>> http://www.cloudinto.com:8080/showItem/showDetail/7962913.html
>> http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html
>> http://www.ailis.de/~k/archives/19-ARM-cross-compiling-howto.html#python
>>
>> I am using a OpenWRT buildroot as cross-compiler tools.
>> What I get is a MIPS executable (and libs) that runs on my router (a
>> Omnima ADM5120) but when I execute stackless.run() with some tasklet
>> then it immediately does a segmentation fault.
>> What could possibly have gone wrong?
>>
>
> Hi Luca,
> I could only speculate about what went wrong. Most likely it has to do with
> the custom assembler used on each platform to do the stack switching.
> Perhaps it compiled in the wrong one (like the x86 assembler routine rather
> than the ARM one), although I expect that to be unlikely. More likely might
> be that the custom assembler is not compatible with your compiler or target
> environment.
My router has a mipsel architecture, I think that it is compatible
with the custom assembler that is on the code.
But I have difficulties with finding the code that is indeed going
into the executables.
I am not so keen on debugging with linux tools, even more with
assembly. So I tried to use preprocessor directives to find out
(#warning 'blah blah')
I found that __GNUC__, __linux__ and __mips__ are defined.
But, *if* I use correctly the #warning directives, they seem to tell
that the assembly code is not being used.
E.g. I find in the file Stackless/core/slp_transfer.c the code:
/* This define is no longer needed now? */
#define SLP_EVAL
#include "platf/slp_platformselect.h"
and the comment is not clear.
Is the file platf/slp_platformselect.h being included and is the
variable SLP_EVAL being tested?
Also, in this mail from the mailing list
http://www.stackless.com/pipermail/stackless/2008-April/003426.html
I found that makefiles were patched with flags like these:
CC= @CC@ -pthread
BASECFLAGS= -fno-strict-aliasing @BASECFLAGS@
LDFLAGS= # @LDFLAGS@
LIBS= -lpthread -ldl -lutil # @LIBS@
Do you have an idea why this has been advised? Are they useful for
cross compilation purposes?
By the way, is Wilhelm Shen still listening?
> Keep in mind that when assembler is used to context switch, the state of
> registers which need to be preserved are saved before the switch is made and
> that state is restored when whatever is being switched from is switched back
> to. If I were you, what I would do is to work out what routine is being
> used when you cross-compile and what registers need to be saved. You can do
> this in a variety of ways, from reading source code of other switching
> systems (like thread switching) to debugging the code on the target host and
> seeing what bad register value it actually chokes on.
> I have successfully cross-compiled Stackless for ARM before, although I had
> to write my own switching routine. But it was not with OpenWRT.
ARM? Interesting. By reading this file:
http://svn.python.org/projects/stackless/trunk/Stackless/stackless.h
I thought that ARM was not supported yet. There is no line with 'arm'.
I conclude that I am not looking at the right files.
Where do I look to understand which platforms are supported?
--Luca
More information about the Stackless
mailing list