Hi,
> > Today I have done a quick hack, and compiled the cross compiler
> > with #define HOST_WIDE_INT int (which is 32bit wide). Now the
> > code looks much better, but there are still minor differences.
>
> Update: I found the reason for the minor differences. I only
> rebuilt cc1 and not cpp. So the test for (~0UL) == 0xffffffff
> in asm-mips/types.h fails and I ended up with a u64 which was
> only 32bit wide:-(
Ok, I'll remove that thing. This test is historic and no longer worth
a Penny.
> Next thing which hit me, is a bug in gas. On a 64bit machine it
> translates dli 0x100000000 to nothing. I first wondered why nobody
> else had this problem before, but I realized that on a 32bit
> platform bignums are used for numbers wider than 32bit.
Interesting; acutally GAS doesn't know dli yet at all and should complain.
One of a couple of bugs that prevent us from really going 64bit.
> LEAF(csum)
> jal sys_cacheflush
> move t8,ra # delay slot
> li t0,KSEG1
> la t1,final
> li t2,KSEG1
>
> on my 386 this will result in:
>
> 00000000 <csum> jal 00000000 <csum>
> ...
> 00000008 <csum+8> move $t8,$ra
> 0000000c <csum+c> lui $t0,40960
> 00000010 <csum+10> lui $t1,0
> 00000014 <csum+14> daddiu $t1,$t1,0
> 00000018 <csum+18> lui $t2,40960
>
> as you can see t0 is not loaded with 0xa0000000 but with 0xffffffffa0000000.
> The alpha mipsel-linux-as generates following code:
>
> 0000000000000000 <csum> jal 0000000000000000 <csum>
> ...
> 0000000000000008 <csum+8> move $t8,$ra
> 000000000000000c <csum+c> li $t0,40960
> 0000000000000010 <csum+10> dsll $t0,$t0,0x10
> 0000000000000014 <csum+14> lui $t1,0
> 0000000000000018 <csum+18> daddiu $t1,$t1,0
> 000000000000001c <csum+1c> li $t2,40960
> 0000000000000020 <csum+20> dsll $t2,$t2,0x10
>
> To get the wanted result I had to modify csum.S a little bit:
>
> #include <asm/asm.h>
> #include <asm/regdef.h>
> #include <asm/segment.h>
>
> /*
> * Compute kernel code checksum to check kernel code against corruption
> */
> LEAF(csum)
> jal sys_cacheflush
> move t8,ra # delay slot
> li t0,(KSEG1 | 0xffffffff00000000)
> la t1,final
> li t2,(KSEG1 | 0xffffffff00000000)
>
>
> There are serveral places in arch/mips where the same problem occurs.
>
> For me it looks like a assembler bug and a problem with some kernel
> pointer in Linux/Mips.
This is indeed a bug in the assembler.
> But now the good news:
>
> Console: colour MIPS-G364 128x48, 1 virtual console (max 63)
> Calibrating delay loop.. ok - 49.87 BogoMIPS
> VDMA: R4030 DMA pagetables initialized.
> Memory: 31384k/32764k available (608k kernel code, 772k data)
> Swansea University Computer Society NET3.034 for Linux 1.3.77
> NET3: Unix domain sockets 0.12 for Linux NET3.033.
> Swansea University Computer Society TCP/IP for NET3.034
> IP Protocols: ICMP, UDP, TCP
> Checking for 'wait' instruction... unavailable.
> Linux version 1.3.91 (root@alpha.franken.de) (gcc version 2.7.2) #38 Wed May
> 8 18:06:09 MET DST 1996
> Floppy drive(s): fd0 is 1.44M
> Started kswapd v 1.4.2.2
> FDC 0 is a post-1991 82077
> ne.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)
> NE*000 ethercard probe at 0x300: 00 80 28 80 2b 70
> eth0: NE2000 found at 0x300, using IRQ 10.
> Sending BOOTP requests..... OK
> Root-NFS: Got BOOTP answer from 193.175.24.66, my address is 193.175.24.69
> Root-NFS: Got file handle for /tftpboot/193.175.24.69 via RPC
> VFS: Mounted root (nfs filesystem).
Next satisfied customer :-)
Ralf
|