Subject: mips64, _end, tools, and relocations

From: Justin Carlson <[email-masked]>
Date: Tue, 15 May 2001 17:25:13 -0700

Taking a walk on the mips64 side of the world, I'm compiling
with the i386-linux=>mips64-linux cross tools from the rpms
at oss.sgi.com. 

Looking at the build process, we build at kseg0, then objcopy
and relocate to xkphys space as the last step in the build.  I assume
this is to work around the known elf64 compilation issues, and
seems fine in theory.

Unfortunately, it doesn't seem to quite work for me.  Looking
at bootmem_init() in arch/mips64/mm/init.c, __pa(&_end) is
optimized down to a literal load during compilation:

a800000000113a2c:	3c0280aa 	lui	$v0,0x80aa
a800000000113a30:	64427b18 	daddiu	$v0,$v0,31512
a800000000113a34:	0040202d 	move	$a0,$v0
a800000000113a38:	3c035800 	lui	$v1,0x5800
a800000000113a3c:	0003183c 	dsll32	$v1,$v1,0x0
a800000000113a40:	34630fff 	ori	$v1,$v1,0xfff
a800000000113a44:	0043102d 	daddu	$v0,$v0,$v1

This is the result of having &_end be in kseg0, but __pa assuming
that it's in xkphys.  Also, at this point, the relocation is gone.  So
when I objcopy, I'm left with the strange address from hell being
passed in to bootmem_init().

This, of course, makes the kernel very unhappy.  

I could fix this instance any number of ways, but that doesn't seem
to be a solution for the general problem...I'm sure this same kind of thing is
going to bite me in a couple dozen other places.

I assume other people are successfully building mips64 kernels with those
tools; does anyone have any hints as to how to fix this?

Thanks,

-Justin
[email-masked]