Kernel built with new GCC panics immediately
bde at zeta.org.au
Fri Jul 11 14:37:32 PDT 2003
On Fri, 11 Jul 2003, Don Lewis wrote:
> On 11 Jul, Shizuka Kudo wrote:
> > --- Lukas Ertl <l.ertl at univie.ac.at> wrote:
> >> Hi there,
> >> just wanted to report that a kernel built with the new gcc panics
> >> immediately when booting. I've seen this on two machines. Panic and reboot
> >> happens fast that I couldn't get the panic message.
> > Same here for an AMD Athlon & a Pentium III. The panic message for AMD is:
[Trailing whitespace removed]
> > Copyright (c) 1992-2003 The FreeBSD Project.
> > Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
> > The Regents of the University of California. All rights reserved.
> > FreeBSD 5.1-CURRENT #20030712: Sat Jul 12 01:35:44 HKT 2003
> > root at shizuka.gundumv.com:/usr/obj/usr/src/sys/SHIZUKA
> > Preloaded elf kernel "/boot/kernel/kernel" at 0xc058a000.
> > Preloaded elf module "/boot/kernel/acpi.ko" at 0xc058a1f4.
> > Timecounter "i8254" frequency 1193182 Hz
> > CPU: AMD Unknown (286-class CPU)
> That's quite a downgrade ;-)
> This smells like a problem in either printcpuinfo(), lowcore.s, or the
> interface between them.
> > Origin = "AuthenticAMD" Stepping = 0
> > panic: CPU class not configured
> > Debugger("panic")
Try compiling with cc -no-zero-initialized-in-bss.
gcc now puts zero-initialized variables in the bss by default, so an old
bug in locore.s probably just became fatal. From locore.s:
% call identify_cpu
This sets some variables (in particular, `cpu') which are now mostly in
% /* clear bss */
% * XXX this should be done a little earlier.
% * XXX we don't check that there is memory for our bss and page tables
% * before using it.
% * XXX the boot program somewhat bogusly clears the bss. We still have
% * to do it in case we were unzipped by kzipboot. Then the boot program
% * only clears kzipboot's bss.
% * XXX the gdt and idt are still somewhere in the boot program. We
% * depend on the convention that the boot program is below 1MB and we
% * are above 1MB to keep the gdt and idt away from the bss and page
% * tables.
% movl $R(end),%ecx
% movl $R(edata),%edi
% subl %edi,%ecx
% xorl %eax,%eax
This clobbers any bss variables set by identify_cpu.
More information about the freebsd-current