linux-mips
[Top] [All Lists]

Re: 3 questions about linux-2.4.18 and R3000

To: Alexandr Andreev <andreev@niisi.msk.ru>
Subject: Re: 3 questions about linux-2.4.18 and R3000
From: Jun Sun <jsun@mvista.com>
Date: Fri, 24 May 2002 14:10:55 -0700
Cc: linux-mips@oss.sgi.com
References: <3CEEBBA9.5070809@niisi.msk.ru>
Sender: owner-linux-mips@oss.sgi.com
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.2.1) Gecko/20010901
Alexandr Andreev wrote:

Hi, list.
I have three little questions with linux-2.4.18 on my machine.

My configuration is:
MIPS R3000, linux-2.4.18 kernel from CVS,
egcs-mips-linux-1.1.2-4 (egcs-2.91.66) and binutils-mips-linux-2.8.1-2

1. When i use MIPS specific arch_get_unmapped_area() function, my kernel
 hangs. It looks like this:
 ...
 Freeing unused kernel memory: 108k freed
do_page_fault() #2: sending SIGSEGV to init for illegal read access from 0fb65330 (epc == 0fb65330, ra == 0fb851dc)
 ... and so on. Last message is printed infinitely.

 So, i have to give up HAVE_ARCH_UNMAPPED_AREA feature, and to use
 common arch_get_unmapped_area() routine.



I took a look of the arch_get_unmapped_area(),  and it looks fine to me.

Can you try the following changes and let me know what happens?

1) change COLOUR_ALIGN
#define COLOUR_ALIGN(addr,pgoff)        addr

2) I don't understand why we need color alignment if file is not NULL. (Can someone explain?). So you can try to remove that condition:

diff -Nru ./arch/mips/kernel/syscall.c.orig ./arch/mips/kernel/syscall.c
--- ./arch/mips/kernel/syscall.c.orig   Sat May 11 00:05:34 2002
+++ ./arch/mips/kernel/syscall.c        Fri May 24 13:54:47 2002
@@ -77,7 +77,7 @@
        if (len > TASK_SIZE)
                return -ENOMEM;
        do_color_align = 0;
-       if (filp || (flags & MAP_SHARED))
+       if (flags & MAP_SHARED)
                do_color_align = 1;
        if (addr) {
                if (do_color_align)



2. There is a strange code in the local_flush_tlb_page() function
 (tlb-r3k.c and tlb-r4k.c):
    ...
        if (!vma || vma->vm_mm->context != 0) {
              unsigned long flags;
              int oldpid, newpid, idx;
 #ifdef DEBUG_TLB
              printk("[tlbpage<%lu,0x%08lx>]", vma->vm_mm->context, page);
 #endif
              newpid = (vma->vm_mm->context & 0xfc0);
                        ^^^^^
 Hmm... the kernel will crash if vma ==0. I guess that this code must look
 like this:

        if (vma && vma->vm_mm->context !=0) {

 Is any patches required?



I think you just found a bug.  The fix looks good to me.


3. I have some problems, when i try to compile latest kernels with my egcs
and binutils, such as problems with "__INIT" and "__FINI" assembler macroses:

 # mips-linux-gcc -D__ASSEMBLY__ -D__KERNEL__ -I include -G 0
  -mno-abicalls -fno-pic -mcpu=r3000 -mips1 -pipe -c entry.S -o entry.o
 entry.S: Assembler messages:
 entry.S:179: Error: .previous without corresponding .section; ignored

 ... and ".macro" assembler command usage:

# mips-linux-gcc -D__ASSEMBLY__ -D__KERNEL__ -I include -G 0 -mno-abicalls -fno-pic -mcpu=r3000 -mips1 -pipe -c head.S -o head.o
 head.S: Assembler messages:
 head.S:224: Error: .size expression too complicated to fix up
 head.S:224: Error: .size expression too complicated to fix up
 head.S:224: Error: .size expression too complicated to fix up
 head.S:224: Error: .size expression too complicated to fix up
 make[1]: *** [head.o] Error 1

 I know that my binutils are obsolete and so, I tried to use some newer
binutils (2.9.5-1, 2.9.5-3), but my kernel crashed :(. Please, can you answer
  me, what egcs & binutils are suitable for linux-2.4.18 and MIPS R3000
  compliant?



We have been using gcc 2.9.5 and binutils 2.10.x for R3000 CPUs for quite a while with no problems. It seems newer gcc and binutiles are fine too.

Jun


<Prev in Thread] Current Thread [Next in Thread>