LOGIN   :::   RECOVER PASS   :::   GET ACCOUNT    
Browse
  • Projects
  • Code (CVS)
  • Forums
  • News
  • Articles
  • Polls
  •  
    OpenCores
  • FAQ
  • CVS HowTo
  • Mission
  • Media
  • Tools
  • Advertise
  • Mirrors
  • Logos
  • Contact us
  • Find Resources
  • Job Opportunity
  •  
    Tools
  • Search
      
  • Download Cores (CVSGet)
  •  
    More
  • Wishbone
  • Perlilog
  • EDA tools
  • OpenTech CD
  •  
    Navigation: All forums > Openrisc > Message List > Message Post

    Message

    Reply | Reply all
    Date Prev | Date Next | Thread Prev | Thread Next Date Index | Thread Index

    From: Robert Millan<rmh@a...>
    Date: Wed Jun 29 13:46:46 CEST 2005
    Subject: [openrisc] Oops when booting Linux
    Top

    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

    Follow upAuthor
    [openrisc] Oops when booting LinuxMatjaz Breskvar

     
    Copyright (c) 1999 OPENCORES.ORG. All rights reserved.