RE: Linux process ABI broken in 2.6?

From: Joakim Tjernlund <hidden>
Date: 2005-12-11 15:11:33

=20
quoted
On Fri, 2005-12-09 at 00:07 +0100, Tjernlund wrote:
quoted
Seems like ppc32 kernel pass the application entry point address
in r7 and MSR in r8 when starting the application. The=20
source might be
quoted
quoted
ret_from_syscall, in entry.S:=20
	...
	lwz	r7,_NIP(r1)
 	lwz	r8,_MSR(r1)
 	FIX_SRR1(r8, r0)
 	lwz	r2,GPR2(r1)
	lwz	r1,GPR1(r1)
	mtspr	SPRN_SRR0,r7
	mtspr	SPRN_SRR1,r8
	SYNC
	RFI
I am not convinced this is the source, but a non zero r7
breaks static apps in uClibc.
=20
Is this on purpose and why?
=20
Secion 8.4.1 in
=20
http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-PPC32/LSB
-Core-PPC32.html#PROCESSINITIALIZATION
quoted
quoted
=20
says:
"Contrary to what is stated in the Registers part of=20
chapter 3 of the System V Application Binary Interface=20
PowerPC Processor
quoted
quoted
Supplement there are no values set in registers r3, r4,=20
r5, r6 and r7. Instead the values specified to appear in all of those
quoted
quoted
registers except r7 are placed on the stack. The value to=20
be placed into register r7, the termination function pointer=20
is not passed
quoted
quoted
to the process."
=20
How do one not pass a termination function in r7 other=20
than setting
quoted
quoted
r7 to zero?
Just ignore those registers on entry. The semantics of a=20
syscall are to
quoted
clobber all volatile registers and there is no point doing anything
else.

Ben.
=20
[Sorry to break the thread, but I mailed from the wrong=20
account which I can't reach ATM]
=20
Sure, but this syscall is a bit special as it has to prepare=20
the runtime env. for the new process.
Not having any defined value for register at process startup feels ..
=20
An undefined r7 register makes it hard to differ between=20
dynamic and static apps in crt1.
I now understand why glibc has its own non standard=20
__libc_start function and I really don't
want that in uClibc. Is it too much trouble to define r7 to=20
always have a zero
value at process startup?
=20
As far as I can tell 2.4 has all unused registers zeroed.
The only way to pass any info from ld.so to crt is to mess with the
stack, write a NULL word
before argc and set the stack ptr to point to it. Then let crt test for
a null word, if null
then crt will know that this is a dynamic app, if not then it is a
static app with no rtld_fini
function.

I feel the messing with the stack in this way not ideal, so I would like
to see a better
exec ABI where at least one register,r7, will be zero.

The fix is trivial, just swap r7 to r9 in the above assembler code.

Is that feasible?

 Jocke
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help