I googled early_initcall and found a patch which basically adds this
line to the /include/init.h file:
#define early_initcall(fn) __define_initcall(".early1",fn)
I built a kernel image with this new line included and now if I try
executing it, the bootloader YAMON gives an exception error before it
can even begin! Here is the dump:
************************* User Exception
**********************************
Exception State 24 Machine check
(((((((((((((((((((( CPU Registers )))))))))))))))))))))))))))))
zr: 00000000 at: 10007c00 v0: 00000003 v1: 00000004
a0: 14000017 a1: 14080017 a2: 50000000 a3: 00000000
t0: 40000000 t1: 01ffe000 t2: 80400000 t3: 80410000
t4: 80400000 t5: fffffffe t6: ffffffff t7: 00000010
s0: 10007c00 s1: 80380000 s2: 80400000 s3: 80401c5c
s4: 80400000 s5: 803affc0 s6: 00000000 s7: 00000000
t8: 00000006 t9: 803afde6 k0: 00000000 k1: 00000000
gp: 803ae000 sp: 803aff10 s8: 800e8380 ra: 803f68c0
{{{{{{{{{{{{{{{{{{{{{ CP0 Registers }}}}}}}}}}}}}}}}}}}}}}}}}}}}}
Index: 00000003 Random: 00000019 EntryLo0: 14000017
EntryLo1: 14080017 Context: 007ffff0 Page Mask: 00000000
Wired NO: 00000004 Reg 7: 00000000 Reg 8: fffffff4
Reg 9: 4d691cb7 Entry Hi: 50000000 Reg 11: 00000000
Reg 12: 10007c02 Reg 13: 00808060 Reg 14: 803f0484
Proc ID: 01030200 ERROREPC: 00000000 Config: 80008083
Config 1: 00000000 WatchLo: 00000000 WatchHi: 80000000
Debug: 00008000 DEPC: 00000000
STATUS: 10007c02
CAUSE: 00808060
EPC: 803f0484
BADVADDR: fffffff4
LO: 04000000
HI: 00000000
A machine check means that an exception is generated due to duplicate
TLB entries. I dont understand why the kernel crashes so early.
Also, what does the ".early1" mean? Is that a definition of a different
segment in the init.h file?
I checked output of the "readelf -a vmlinux" and found that the address
for the early_initcall comes up about 5 times. I m not sure what each
of the fields mean, so I have attached the above part of the readelf in
a file called readelf.
Thank you!
Ashlesha.
On Fri, 2006-09-01 at 17:50 -0700, Kaz Kylheku wrote:
> > Ashlesha Shintre wrote:
> >
> > Hi,
> >
> > I m using the 2.6.14.6 tree and trying to get the kernel
> > running on the
> > Encore M3 board.
> >
> > The kernel crashes during the boot process at the
> > early_initcall.
>
> What is the exact output from the crash?
>
> > This function doesnt seem to be defined anywhere.
>
> It's not a function, but a macro. The macro is used to annotate a
> function as being among the list of functions that are called at startup
> by the "initcall" mechanism: a big loop that sweeps over a symbol table
> of registered initialization functions and calls them. E.g.
>
> #include <linux/init.h>
>
> /* ... */
>
> int __init my_initialization_function(void)
> {
> printk(KERN_INFO "Hello, world\n");
> }
>
> early_initcall(my_initialization_function);
>
> The __init tells the kernel build system that your function is not
> needed after initialization and its memory can be thrown away. The
> early_initcall arranges for the initialization call. Early means that
> it's in the first group of functions.
>
> If you suspect your kernel is dying during the calling of the initcall
> functions, you can turn on initcall debugging. Add these parameters to
> your kernel command line:
>
> debug debug_initcall
>
> Hope this helps.
>
>
readelf.doc
Description: MS-Word document
|