Subject: Tools miss-compile old kernel

From: Brady Brown <[email-masked]>
Date: Thu, 22 Mar 2001 16:48:13 -0700

I recently upgraded to a newer Cross-compiler tool chain to try to get up to
glibc2.2. I'm now at gcc-2.95.3-14 and binutils-2.10.91-2 (both from Maciej's
site). I have built 2.4.0-test9 with this tool-chain, but is will not boot. It
spews illegal instruction errors when init is launched.

Is this supposed to work, or are the new tools incompatible with older kernels?

I dumped out the disassembly of a newly compiled kernel and found some bad
instructions in many of the routines. First one is from head.S

SNIP>> of bad disassembly
0000000080100280 <except_vec0_r4000>:
except_vec0_r4000():
    80100280:     401a4000      mfc0         $k0,$8
    80100284:     001ad582      srl             $k0,$k0,0x16
    80100288:     3c1b0000      lui             $k1,0x0
    8010028c:     677b0001      0x677b0001
    80100290:     001bdc38      0x1bdc38
    80100294:     677b8023      0x677b8023
    80100298:     001bdc38      0x1bdc38
    8010029c:     8f7bb250      lw                 $k1,-19888($k1)
    801002a0:     001ad080      sll                $k0,$k0,0x2
    801002a4:     037ad821      addu            $k1,$k1,$k0
    801002a8:     401a2000      mfc0           $k0,$4
    801002ac:     8f7b0000      lw                 $k1,0($k1)
    801002b0:     001ad042      srl                $k0,$k0,0x1
    801002b4:     335a0ff8      andi              $k0,$k0,0xff8
    801002b8:     037ad821      addu            $k1,$k1,$k0
    801002bc:     8f7a0000      lw                  $k0,0($k1)
    801002c0:     8f7b0004      lw                  $k1,4($k1)
    801002c4:     001ad182      srl                 $k0,$k0,0x6
    801002c8:     409a1000      mtc0            $k0,$2
    801002cc:     001bd982      srl                 $k1,$k1,0x6
    801002d0:     409b1800      mtc0            $k1,$3
    801002d4:     10000001      b                    ffffffff801002dc
<except_vec0_r4000+0x5c>
    801002d8:     42000006      tlbwr
    801002dc:     00000000      nop
    801002e0:     42000018      c0 0x18
<<SNIP

>>SNIP of good assembly from old tools
0000000080100280 <except_vec0_r4000>:
except_vec0_r4000():
    80100280:     401a4000     mfc0         $k0,$8
    80100284:     001ad582     srl              $k0,$k0,0x16
    80100288:     3c1b8023     lui              $k1,0x8023
    8010028c:     8f7bd210      lw               $k1,-11760($k1)
    80100290:     001ad080     sll               $k0,$k0,0x2
    80100294:     037ad821     addu          $k1,$k1,$k0
    80100298:     401a2000     mfc0         $k0,$4
    8010029c:     8f7b0000      lw                $k1,0($k1)
    801002a0:     001ad042     srl             $k0,$k0,0x1
    801002a4:     335a0ff8      andi           $k0,$k0,0xff8
    801002a8:     037ad821     addu         $k1,$k1,$k0
    801002ac:     8f7a0000      lw             $k0,0($k1)
    801002b0:     8f7b0004      lw             $k1,4($k1)
    801002b4:     001ad182      srl             $k0,$k0,0x6
    801002b8:     409a1000      mtc0         $k0,$2
    801002bc:     001bd982      srl             $k1,$k1,0x6
    801002c0:     409b1800      mtc0         $k1,$3
    801002c4:     10000001      b 801002cc <except_vec0_r4000+4c>
    801002c8:     42000006      tlbwr
    801002cc:     00000000      nop
    801002d0:     42000018      eret
<<SNIP

Looks like here the tools blow the lui/lw combination and also the eret. Any
suggestions?

---

From: Keith M Wesolowski <[email-masked]>
Date: Thu, 22 Mar 2001 16:47:00 -0800

> Is this supposed to work, or are the new tools incompatible with

That particular assembler is incompatible with sanity, older kernels,
newer kernels, and anything you expect to actually function properly.

> Looks like here the tools blow the lui/lw combination and also the eret. Any

Upgrade to CVS binutils.  The one Maciej has on his site is apparently
broken.  If you want a toolchain that is known to work at least in
some cases, you can pull it from
ftp://oss.sgi.com/pub/linux/mips/mips-linux/simple/crossdev/.  That is
the toolchain I use to build kernels -and- userland (yes, I know,
everyone says it can't be done, but...) and thus it Works For Me (TM).

-- 
Keith M Wesolowski <[email-masked]> http://foobazco.org/~wesolows
------(( Project Foobazco Coordinator and Network Administrator ))------
"I should have crushed his marketing-addled skull with a fucking bat."

---

From: "Maciej W. Rozycki" <[email-masked]>
Date: Wed, 28 Mar 2001 18:09:37 +0200 (MET DST)

> everyone says it can't be done, but...) and thus it Works For Me (TM).

 Weird, I've always used tools I packaged for both kernel and userland
builds and I had no troubles.  The latest 2.10.91 version available at my
site should be fine.  I've only tested it with an R3k, though.

 I'm actually going to upgrade it to 2.11 ASAP, but I won't do it until I
track down a weird kernel bug which is reproducibly triggered by a native
mipsel-linux build -- the kernel crashes completely and silently after sed
is invoked in a specific place upon running the libtool script in the ld
directory.  I suspect a corruption bug as the crash disappears if the
script is modified a bit (e.g. some white space is added), so I'm actually
glad I got bitten by the bug.

-- 
+  Maciej W. Rozycki, Technical University of Gdansk, Poland   +
+--------------------------------------------------------------+
+        e-mail: [email-masked], PGP key available        +