> Most of this is because IP22 (Indy/Idigo2 R4xx) and IP32 (O2 R5xxx), while
> supporting 64bit kernels (same for cobalt, since it's a mips4-level CPU),
> we had to "trick" them into accepting 64bit code. IP32 at one point ran
> 32bit kernels only, but it was later converted to supporting only 64bit
> kernels, hence the hackery involved. We describe it as wrapping 64bit code
> into a 32bit object, because their proms will only recognize 32bit objects
> (specifically, IP22 will only boot 32bit objects; crash on 64bit; IP32 will
> take both, but likes 32bit better).
> So really, CONFIG_BUILD_ELF64 was probably part of this "magic" to stuff
> 64bit code into a candy-coated 32bit wrapper for the Indy (And later the
> O2) to suck down w/o complaint. Hence, __pa() probably needs to replicate
> this support, or we all need to brainstorm a proper way to get these
> systems to boot.
BUILD_ELF64 + -sym32 + objcopy into a ELF32 file is supposed to be the
full replacement for the old o64-in-o32 hack.
> Octane, Origin, IP28 (Indigo2 R10000). et al, don't complain, and don't
> need this hacker, because their proms boot proper 64bit binaries only (they
> reject all else).
> So probably the following is true (someone correct me if not)
> if (CONFIG_BUILD_ELF64=y and (!CONFIG_SGI_IP22 or !CONFIG_SGI_IP32 or
> !CONFIG_COBALT)) then kernel load address must be in XKPHYS
> else load address must be in CKSEG0
> if CONFIG_BUILD_ELF64=n then kernel load address must be in CKSEG0
The 64/64 configs can do both:
| BUILD_ELF64 | BUILD_ELF32
64bit firmware loader | CKSEG0/XKPHYS | CKSEG0
32bit firmware loader | CKSEG0 | CKSEG0