Date: Thu, 26 Sep 2002 21:57:56 -0400 (EDT) From: Andrew Gallatin <gallatin@cs.duke.edu> To: freebsd-hackers@freebsd.org Subject: how are sysctls in klds relocated? Message-ID: <15763.47908.220830.364584@grasshopper.cs.duke.edu>
next in thread | raw e-mail | index | archive | help
Can somebody explain to me how sysctls from klds are relocated?
For background, after the binutils upgrade in -stable, I'm unable to
load linux.ko on my desktop. The faulting address is always
0x9010102464c457f (oidp->oid_parent) and the pc is in
sysctl_find_oid_name().
The crash looks like this:
acd0: CDROM <CD-ROM CDU4011> at ata1-slave PIO4
Mounting root from ufs:/dev/ad2a
linker_load_file: trying to load osf1 as elf64
linker_make_file: new file, filename=osf1.ko
linker_file_register_sysctls: registering SYSCTLs for osf1.ko
linker_file_register_sysctls: SYSCTLs 0
linker_file_sysinit: calling SYSINITs for osf1.ko
linker_file_sysinit: SYSINITs 0xfffffe00020799a0
linker_load_file: trying to load linux as elf64
linker_make_file: new file, filename=linux.ko
linker_file_register_sysctls: registering SYSCTLs for linux.ko
linker_file_register_sysctls: SYSCTLs 0xfffffe00020a6d08
fatal kernel trap:
trap entry = 0x2 (memory management fault)
a0 = 0x9010102464c457f
a1 = 0x1
a2 = 0x0
pc = 0xfffffc00003f42dc
ra = 0xfffffc00003f436c
curproc = 0xfffffe001557e980
pid = 15, comm = kldload
#0 0xfffffc00003ed460 in dumpsys () at ../../kern/kern_shutdown.c:486
#1 0xfffffc00003ecfa8 in boot (howto=256) at
../../kern/kern_shutdown.c:316
#2 0xfffffc00003ed870 in panic (fmt=0xfffffc000061da1c "trap")
at ../../kern/kern_shutdown.c:595
#3 0xfffffc00005ad4c0 in trap (a0=0x9010102464c457f,
a1=0xfffffe0019c49e30, a2=0, entry=2, framep=0xfffffe0019c49c20)
at ../../alpha/alpha/trap.c:551
#4 0xfffffc000059f31c in XentMM ()
#5 0xfffffc00003f3f2c in sysctl_register_oid
(oidp=0xfffffe00020cc000)
at ../../kern/kern_sysctl.c:102
<the rest from ddb, which actually works to get a stack trace..>
sysctl_find_oid_name()
sysctl_register_iod()
sysctl_register_set()
linker_file_register_sysctls()
linker_load_file()
kldload()
syscall()
(gdb) p *(struct linker_set *) 0xfffffe00020a6d08
$6 = {
ls_length = 4,
ls_items = {0xfffffe0002080000}
}
(gdb) p/x *(struct sysctl_oid *)0xfffffe0002080000
$5 = {
oid_parent = 0x9010102464c457f,
oid_link = {
sle_next = 0x0
},
oid_number = 0x90260003,
oid_kind = 0x1,
oid_arg1 = 0x8d40,
oid_arg2 = 0x40,
oid_name = 0x18140,
oid_handler = 0x38004000000000,
oid_fmt = 0x1a001d00400003,
oid_refcnt = 0x1
From this, it appears that the contents of this linkerset are not
getting relocated. How is that supposed to happen?
Interestingly enough, the value of oid_parent looks a hell of a lot
like offset 0 of the kld file, and the rest of the values seem to
match further offsets in the file:
% hd /modules/linux.ko
00000000 7f 45 4c 46 02 01 01 09 00 00 00 00 00 00 00 00 |.ELF............|
00000010 03 00 26 90 01 00 00 00 00 8b 00 00 00 00 00 00 |..&.............|
00000020 40 00 00 00 00 00 00 00 d8 a1 12 00 00 00 00 00 |@...............|
00000030 00 00 00 00 40 00 38 00 03 00 40 00 1f 00 1c 00 |....@.8...@.....|
00000040 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 |................|
<...>
Does anybody have any idea WTF is happening here? I'd like to figure
this out before 4.7-release..
Whats *really* odd (and annoying) is that I cannot reprduce this on my
crashbox. The same binaries work fine on it ... this only happens on
my desktop.
Thanks,
Drew
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?15763.47908.220830.364584>
