On Mon, 5 Sep 2005, Thiemo Seufer wrote:
[...]
> > Anyway, that problem above is fixed by changing the inline asm for the
> > jump instructions CLN uses to order static object initialization from
> > __asm__ __volatile__ ("%*j %0" : : "d" ((void*)(addr)))
> > to
> > __asm__ __volatile__ ("b " #addr)
> > Just out of curiousity: there was an ABI change or why did I have to
> > modify that?
>
> Are you sure this is a fix?
Yes, I'm sure this is a fix, provided the definition is "it works".
> "%*j" is no valid mips instruction, which
> poses the question why it ever appeared to work. "b" is, but is it a
> branch with a code offset limit of +- 128k. I think what's really
> wanted in that place for mips is
>
> __asm__ __volatile__ ("jr %0" : : "r" ((void*)(addr)))
>
> for a jump to an arbitrary address.
That doesn't work. First: what do you mean with a code offset limit of
+-128k? Does this mean I cannot jump further? (What is this limit?
Wordsize * 16 Bit address?) There is one boundary condition I should've
mentiond: that branch in practice *always* jumps within one object file
from the beginning to the end, so that boundary condition is no problem,
provided I didn't misunderstand you.
I've attached a small testcase package. Go to the modules.h file where
the CL_JUMP_TO macro is defined in the __mips__ case. I define two
static objects, one prints an 'A' at construction, one a 'B', main()
prints a newline. The effect of the code is that the output should always
be "AB\n", never "BA\n":
$ g++ -O -c moda.cc
$ g++ -O -c modb.cc
$ g++ -O main.cc moda.o modb.o && ./a.out
AB
$ g++ -O main.cc modb.o moda.o && ./a.out
AB
Regardless of which one of the three definitions of CL_JUMP_TO I use, the
program works with woody. With sarge, only the __asm__ __volatile__("br "
#addr) version works, all others segfault (or cause an illegal insn).
Regards
-richy.
--
.''`. Richard B. Kreckel
: :' : <kreckel@debian.org>
`. `' <kreckel@ginac.de>
`- <http://www.ginac.de/~kreckel/>
Attachment:
module.tgz
Description: module.tgz