I've been trying for a couple of days now to build a MIPS kernel with
CONFIG_CPU_NEVADA, and I can't get it to work. r4k_switch.S produces a
pile of "opcode not supported by processor" errors.
First, I figured out where the problem is coming from:
r4k_switch.S is included for all processors but the r3000 and r3912.
Is that really correct? Then, it references FPU_SAVE_DOUBLE, which
cfc1 tmp, fcr31; \
sdc1 $f0, (THREAD_FPU + 0x000)(thread); \
sdc1 $f2, (THREAD_FPU + 0x010)(thread); \
The sdc1 instruction in binutils is flagged like this:
if (mips_cpu == CPU_R4650)
as_bad (_("opcode not supported on this processor"));
And the IVR sets CONFIG_CPU_NEVADA, which produces
GCCFLAGS += -mcpu=r8000 -mips2 -Wa,--trap -mmad
and -mmad becomes -m4650 to the assembler.
Something is fishy here. Anyone know what? I have a suspicion that we
need to change the way we invoke binutils. Making -mmad imply -m4650
just seems lame, since -m4650 also implies -msingle-float, and I don't
think that's right for the r8000.
I worked back in time in gcc, binutils, and kernel sources and I
couldn't figure out what's changed - I'm sure this worked at some
Daniel Jacobowitz Debian GNU/Linux Developer
Monta Vista Software Debian Security Team
"I am croutons!"