|
Message
From: Matjaz Breskvar<phoenix@o...>
Date: Wed Jun 29 13:55:06 CEST 2005
Subject: [openrisc] Oops when booting Linux
Hi Robert,i'm already aware of this problem when building linux 2.4 with gcc-3.4.2. at the time i was looking at it i traced it to be related to gcc. kernel and compiler should be of approx. the same version. i suggest you use gcc-3.2.3 with linux-2.4 (you shouldn't have any problems with it).
best regards, p.
* Robert Millan (rmh@a...) wrote: > Hi! > > I got an Oops when booting Linux in or1ksim. I was using linux-2.4 from CVS, > compiled with gcc 3.4.2, running on or1ksim from HEAD branch. > > Boot log in uart0.tx attached, simulator log (run with verbose = 1 and > debug = 1) attached too. I haven't used a higher debug level because lots of > errors were printed already and most of them didn't look critical. > > Linux boot log lists 0xc000b898 as the PC value when exception happens. Here's > a dasm output of this address: > > /usr/src/or1k/linux/linux-2.4/include/linux/list.h:83 > c000b898: d4 04 18 00 l.sw 0x0(r4),r3 > > Corresponding C code in list.h: > > static inline void __list_del(struct list_head *prev, struct list_head *next) > { > next->prev = prev; > prev->next = next; /* line 83 */ > } > > Linux boot log lists 0xc000b63c as a "Call Trace" address. Since this address > is in the stack trace, I guess it means this is the function that called > __list_del (please correct me if i'm confused). The info for 0xc000b63c is: > > /usr/src/or1k/linux/linux-2.4/kernel/sched.c:578 > c000b63c: 84 61 00 2c l.lwz r3,0x2c(r1) > c000b640: 84 83 00 28 l.lwz r4,0x28(r3) > c000b644: bc 24 00 02 l.sfnei r4,0x2 > c000b648: 0c 00 00 c1 l.bnf c000b94c <_schedule+0x390> > c000b64c: 15 00 00 00 l.nop 0x0 > > Corresponding C code in kernel/sched.c: > > /* move an exhausted RR process to be last.. */ > if (unlikely(prev->policy == SCHED_RR)) /* line 578 */ > if (!prev->counter) { > prev->counter = NICE_TO_TICKS(prev->nice); > move_last_runqueue(prev); > } > > Which once preprocessed reads: > > if (__builtin_expect ((prev->policy == 2), 0)) > if (!prev->counter) { > prev->counter = (((20 - (prev->nice)) >> 2) + 1); > move_last_runqueue (prev); > } > > (and I don't quite understand this, since both "unlikely" and > "__builtin_expect" seem to be macros: > > ./include/linux/compiler.h:#define __builtin_expect(x, expected_value) (x) > ./include/linux/compiler.h:#define likely(x) __builtin_expect((x),1) > ./include/linux/compiler.h:#define unlikely(x) __builtin_expect((x),0) > ) > > Please let me know if you need more info. I can send you a log with higher > debug value, or even the vmlinux file. > > -- > Robert Millan > _______________________________________________ > http://www.opencores.org/mailman/listinfo/openrisc
|
 |