MIPS N32 firefox 3.5 beta4

It is working too. The xulrunner's ebuild is already in loongson overlay. For the mozilla-firefox ebuild, just use the one from mozilla overlay.

If you experienced segfault, try to re-emerge sqlite with no optimization. Using the bundled sqlite surely is not an optimal solution, ;)

One more thing: Xorg's siliconmotion driver is now working on yeeloong notebook:

MIPS N32 firefox in acid3 test

My quest for MIPS N32 firefox could finally come to an end, since I just got it scores the same as X86 firefox.

Remember I said it would encounter bus error on a few websites in my last related post. But I didn't plan to look into this issue before dealing with cache aliasing problem.

However, since Rayson Ho helped me to locate the exact cause of this issue, I decided to finish it first.

The problem is caused by unaligned access of ldc1/sdc1 instruction. These two instructions' operand must be 8 bytes aligned. But when crashing, the operand is only 4 bytes aligned.

After some discussion and experimenting, I found a workaround for crashing problem. Yeah, a padding pointer sounds scary and fragile, but it did work. Before posting any comment to this, please make sure you have read all the emails in that thread.

Then Fai Wong reported to me that it still crash in acid3 test. So I took another look. This time the problem happened in a different location, and it is harder t…

Ftrace is working now on my loongson box

So I confirmed that this MIPS ftrace support is really working. Thanks to Wu Zhangjin (吴章金). However, I have no interest in finding out what kind of difference between my loongson2f patch and wu's caused wu's ftrace patch does not work on top of my loongson 2f patch. What I would like to see now is to get loongson2f patch merged into mainline.

Plus, I wish I could make loongson linux to be able to use 4k page(Now, loongson could only use 16k page in order to avoid d-cache aliasing). I have already started working on it now. Even if it turns out that I can't, I could tell others what I have done in order to achieve this goal. And by that time, I would've got a much deeper understanding of Linux's memory management subsystem.

Two more kernel patches

This one is MIPS related, already accepted:
MIPS: Fix TIF_32BIT undefined problem when seccomp is disabled

This one is proc filesystem related:
[PATCH] filp->f_pos not correctly updated in proc_task_readdir

The later one is also MIPS related actually, in a peculiar way:
MIPS N32 does not have getdents64 system call. And because of readdir's implementation in glibc, this bug will be triggered when trying to run pstree or simply 'ls /proc/xxxx/task', where xxxx is the pid of a multithread process.

Firefox for MIPS N32 ABI

Finally, I could announce that it is working (tm).
I just submitted the patches (together with O32 ABI patch) to upstream.

This is a big step forward for MIPS N32 GNU/Linux desktop.

One thing to note though: It (the N32 one) would encounter bus error on a few websites, e.g. I will try to find out why later when I have time.

For those who are into long stories, please read on:

I finally sorted out the font size problem, independently. It turned out that the problem is caused by strict aliasing issue in NSPR (NetScape Portable Runtime). Specifically, when parsing css file, in order to get the font size, PR_strtod() will be used to convert string to floating point value. But because of the strict aliasing issue, certain code in PR_strtod will be optimized out if -fstrict-aliasing is turned on, which is just the case if -O2 is used. And as a result, the floating point value would be wrong, e.g. "1.5" will be converte…

mips64el-unknown-linux-gnu cross toolchain building

NOTE: I just updated the command at the bottom, again. No big change. Now all should be good to go, including building on PS3, which is big endian.

Crossdev is a great tool. Thanks to vapier.
However, it may not work in all circumstances, although the problems may not lie in crossdev itself. For example, when creating mips64el-unknown-linux-gnu cross toolchain.
The problems happen when building glibc headers. Because at that time, we don't have cross gcc yet. So some gcc options only cross gcc supports or some macros only cross gcc defines can't be used.
Also happen when building gcc on big endian machines. Because of the erroneous LD_LIBRARY_PATH setting, cc1 generated in stage 1 will try to load generated in stage 1, which is little endian.
So I made some work-arounds. These are the three patches needed:
one patch to src_compile.eblit
a second patch to src_install.eblit
a third patch to gcc ebuild
These are all small changes, but took me a lot of time to investigate.

To …

MIPS N32 patch for xulrunner(firefox)

Finally, I have produced some results. I have watched 6 seasons of 24 and 2 seasons of Friends since late last month. So this is delayed. :P
The patch is here.
I think it still need some tweaks, you can always get the latest patch in my loongson overlay on

The produced xulrunner could run a little example:
(untar the tarball, cd myapp && xulrunner-1.9 application.ini)

However, I haven't got a fully functioning firefox yet.
Some font size is extremely large. And sometimes bus error.

I have noticed that I have used -O3 to compile it.
I will try -O2/-O1 later and see if it still bus error.

glibc doesn't build with linux-header-2.6.28 on loongson

Update: It is said that this problem has already been fixed. I will test it later.

Actually I intended to send this to LKML, but just before I was about to send I found there was already some discussions about this . So instead I decided to just post it here.

To make long story short, please take a look at these two files first:

The first file, which will become part of /usr/include/endian.h. This file defines both __LITTLE_ENDIAN and __BIG_ENDIAN. And this file will be included by the second file.

The second file, which will be /usr/include/linux/byteorder.h

Obviously, this test in the second file will fail:
#if defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
# error Fix asm/byteorder.h to define one endianness
#endif It seems that there is an inconsistency between Linux and glibc on handling __LITTLE_ENDIAN and __BIG_ENDIAN. Linux treats them like a flag, while glibc treats them like a value. glibc uses __BYTE_ORDER to determine the endianness.

This problem must be solved, or any us…

Works I have done related to Loongson in recent months

I got a donation of a Lemote Loongson 2F box somewhere around July this year and have been working on it in my spare time since I got it.

The other day I made a summary about what I have done so far and posted it on Lemote's bbs. The links is
My work involves toolchain, kernel, xorg-server MIPS or Loongson support and userland library/application gcc 4.4 patch.

The most prominent achievement so far is an N32 ABI stage3 (well, actually just a tarball, not made using catalyst) optimized for Loongson 2F with MIPS PLT support. It is actually not that easy as you would've imagined, N32 has many problems as you can see from the above posted link. I posted it on Lemote's bbs along with some instructions of how to use it:

According to some testers, performance of some applications in this system has an up to 30% increase comparing with the performance of the same apps in system Using …

EAPI 2: SRC_URI Arrows implementation in portage


Today I found arrows in SRC_URI is not working in my box, so I took a look at the code, found something, and sent this:

However, as Zac pointed out, the better solution is not to define your own fetch and resume command but rely on the default one.

The default ones are defined in /etc/make.globals:
FETCHCOMMAND="/usr/bin/wget -t 5 -T 60 --passive-ftp -O \"\${DISTDIR}/\${FILE}\" \"\${URI}\""
RESUMECOMMAND="/usr/bin/wget -c -t 5 -T 60 --passive-ftp -O \"\${DISTDIR}/\${FILE}\" \"\${URI}\""The rules of thumb is to make sure you save the file at ${DISTDIR}/${FILE}, since FILE is just the file name, doesn't include path.

Previously I have fetch and resume command defined in make.conf, and have used "-P ${DISTDIR}" instead of "-O ${DISTDIR}/${FILE}". Maybe portag…

A problem in Loongson 2F specific integer operation instruction patch

I have reported on gcc mailing list.

Also I found the solution:

Now I have built gcc-4.4 with my modified patch with "-march=mips3", and am building itself again using "-march=loongson2f".

Note that enabling -O2 in later stages is not working yet. Please check this bug report for more information if you are interested:

just heard from Kumba, this flag used together with -O1 will trigger this bug:
Optimize sibling and tail recursive calls.

Enabled at levels -O2, -O3, -Os.

The modified gcc 4.4 ebuild is here and some relevant libraries here.

Gcc 4.4 Loongson 2F specific integer multiply/divide instruction patch
I have put it in my loongson overlay.
BTW, the gcc svn ebuild is from dirtyepic's overlay. Thanks, ;)

zhangle@2f ~ $ cat hello.c
int mul(){
unsigned long a = 0xffffffff;
unsigned long b = 0xf;
return a * b;
zhangle@2f ~ $ gcc -march=loongson2f hello.c -S
zhangle@2f ~ $ gcc -march=mips3 hello.c -S -o hello-mips3.s
zhangle@2f ~ $ diff -u hello.s hello-mips3.s
--- hello.s 2008-11-08 18:16:52.000000000 +0800
+++ hello-mips3.s 2008-11-08 18:16:55.000000000 +0800
@@ -25,7 +25,8 @@
sw $2,8($fp)
lw $3,12($fp)
lw $2,8($fp)
- multu.g $2,$3,$2
+ mult $3,$2
+ mflo $2
move $sp,$fp
lw $fp,20($sp)
addiu $sp,$sp,24

improvements (Gentoo specific) to distcc zeroconf support

distcc's got zeroconf support
That is cool!However, there are problems (althouth not everyone got these problems).
One of them is that if you have multiple version of gcc's or even
cross compilers, distcc clients can't discover them, since distccd will
only register your current active gcc.
And if you want to change your native compiler's version, you must
restart distccd in order to let it take effect.Having multiple gcc's may not be common in other distribution, but
this is common in gentoo.
This is what I have on my x86 notebook:
gcc-config -l
[1] i686-pc-linux-gnu-4.3.1 *
[2] mipsel-unknown-linux-gnu-4.3.0-alpha20080731
[3] mipsel-unknown-linux-gnu-4.3.1
[4] mipsel-unknown-linux-gnu-4.4.0-alpha20080718 *
[5] mipsel-unknown-linux-gnu-4.4.0-alpha20080801
[6] powerpc-unknown-linux-gnu-4.2.3 *So I made a little patch: there will be a distcc-2.18.3-r14 or distcc-3.0_rc4 in tree soon, ;)