Date: Mon, 08 Apr 2002 15:59:11 -0700 From: Maksim Yevmenkin <myevmenk@digisle.net> To: freebsd-current@freebsd.org Subject: Fatal double fault on -current Message-ID: <3CB220BF.A98DCB82@digisle.net>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------F53DCFF46B83320730353000
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Hackers,
for the last couple of days i was able to crash my -current
laptop with "Fatal double fault" panic whenever i wanted.
i have created a small "spherical cow" :) to demonstrate
the problem (see attached). this is pretty much what my code
does. just compile and load the "cow" and then try
# ngctl msg cow: moo
i'm suspecting m_split() and have attached tiny path that
fixes problem for me.
of course it might be just my fault :) and i'm missing some
small thing.
"... if you think you found the bug - you don't... "
thanks,
max
--------------F53DCFF46B83320730353000
Content-Type: text/plain; charset=us-ascii;
name="ng_cow.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="ng_cow.c"
/*
* ng_cow.c
*
* Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <netgraph/ng_message.h>
#include <netgraph/netgraph.h>
#include <netgraph/ng_parse.h>
#define NG_COW_NODE_TYPE "cow"
#define NGM_COW_COOKIE 1018303300
#define NGM_COW_MOO 1
/* MALLOC define */
#ifdef NG_SEPARATE_MALLOC
MALLOC_DEFINE(M_NETGRAPH_COW, "cow", "Netgraph spherical cow");
#else
#define M_NETGRAPH_COW M_NETGRAPH
#endif /* NG_SEPARATE_MALLOC */
/* Netgraph node methods */
static ng_constructor_t ng_cow_constructor;
static ng_rcvmsg_t ng_cow_rcvmsg;
static ng_shutdown_t ng_cow_shutdown;
static ng_newhook_t ng_cow_newhook;
static ng_connect_t ng_cow_connect;
static ng_rcvdata_t ng_cow_rcvdata;
static ng_disconnect_t ng_cow_disconnect;
static int ng_cow_modevent __P((module_t, int, void *));
/* Netgraph node command list */
static const struct ng_cmdlist ng_cow_cmdlist[] = {
{
NGM_COW_COOKIE,
NGM_COW_MOO,
"moo",
NULL,
NULL
},
{ 0, }
};
/* Netgraph type descriptor */
static struct ng_type typestruct = {
NG_ABI_VERSION,
NG_COW_NODE_TYPE, /* typename */
ng_cow_modevent, /* modevent */
ng_cow_constructor, /* constructor */
ng_cow_rcvmsg, /* control message */
ng_cow_shutdown, /* destructor */
ng_cow_newhook, /* new hook */
NULL, /* find hook */
ng_cow_connect, /* connect hook */
ng_cow_rcvdata, /* data */
ng_cow_disconnect, /* disconnect hook */
ng_cow_cmdlist /* node command list */
};
NETGRAPH_INIT(cow, &typestruct);
MODULE_VERSION(ng_cow, 1);
static int ng_cow_moo __P((void));
static struct mbuf * ng_cow_prepend __P((struct mbuf *, int));
/*****************************************************************************
*****************************************************************************
** Netgraph node interface
*****************************************************************************
*****************************************************************************/
static node_p the_node = NULL;
/*
* Handle loading and unloading for this node type
*/
static int
ng_cow_modevent(mod, event, data)
module_t mod;
int event;
void *data;
{
int error = 0;
switch (event) {
case MOD_LOAD:
error = ng_make_node_common(&typestruct, &the_node);
if (error != 0)
break;
error = ng_name_node(the_node, NG_COW_NODE_TYPE);
if (error != 0) {
NG_NODE_UNREF(the_node);
the_node = NULL;
break;
}
break;
case MOD_UNLOAD:
error = EBUSY;
break;
default:
error = EOPNOTSUPP;
break;
}
return (error);
} /* ng_cow_modevent */
/*
* Only one node is allowed and it is created when module is loaded
*/
static int
ng_cow_constructor(node)
node_p node;
{
return (EINVAL);
} /* ng_cow_constructor */
/*
* We do not allow any hook to be connected to the node.
*/
static int
ng_cow_newhook(node, hook, name)
node_p node;
hook_p hook;
char const *name;
{
return (EINVAL);
} /* ng_cow_newhook */
/*
* Just say NO!
*/
static int
ng_cow_connect(hook)
hook_p hook;
{
return (EINVAL);
} /* ng_cow_connect */
/*
* Hook disconnection
*/
static int
ng_cow_disconnect(hook)
hook_p hook;
{
return (0);
} /* ng_cow_disconnect */
/*
* Do local shutdown processing
*/
static int
ng_cow_shutdown(node)
node_p node;
{
if (ng_make_node_common(&typestruct, &the_node) != 0) {
the_node = NULL;
goto out;
}
if (ng_name_node(the_node, NG_COW_NODE_TYPE) != 0) {
NG_NODE_UNREF(the_node);
the_node = NULL;
}
out:
return (0);
} /* ng_cow_shutdown */
/*
* Process incoming messages
*/
static int
ng_cow_rcvmsg(node, item, hook)
node_p node;
item_p item;
hook_p hook;
{
struct ng_mesg *msg = NULL;
int error = 0;
/* Detach message */
NGI_GET_MSG(item, msg);
/* Process message */
switch (msg->header.typecookie) {
case NGM_COW_COOKIE:
switch (msg->header.cmd) {
case NGM_COW_MOO:
error = ng_cow_moo();
break;
default:
error = EINVAL;
break;
}
break;
default:
error = EINVAL;
break;
}
NG_FREE_MSG(msg);
return (error);
} /* ng_cow_rcvmsg */
/*
* Receive data on a hook
*/
static int
ng_cow_rcvdata(hook, item)
hook_p hook;
item_p item;
{
NG_FREE_ITEM(item);
return (0);
} /* ng_cow_rcvdata */
/*
* MOO
*/
static int
ng_cow_moo(void)
{
#define DATA_SIZE 4100
#define CHUNK_SIZE 128
struct mbuf *m0 = NULL, *m = NULL, *first = NULL, *last = NULL;
char data[DATA_SIZE];
int error = 0;
bzero(data, sizeof(data));
MGETHDR(m0, M_DONTWAIT, MT_DATA);
if (m0 == NULL)
return (ENOBUFS);
/* Copy data into mbuf starting at +4 bytes */
m0->m_pkthdr.len = m0->m_len = 4;
m_copyback(m0, m0->m_len, sizeof(data), data);
/* Prepend mbuf with 4 bytes */
m0 = ng_cow_prepend(m0, 4);
if (m0 == NULL)
return (ENOBUFS);
/* Split result mbuf into chunks and link then via m_nextpkt */
while (m0 != NULL) {
int len = m0->m_pkthdr.len;
if (len > CHUNK_SIZE) {
m = m_split(m0, CHUNK_SIZE, M_DONTWAIT);
if (m == NULL) {
error = ENOBUFS;
break;
}
}
/* Prepend chunk with another 4 bytes */
m0 = ng_cow_prepend(m0, 4);
if (m0 == NULL) {
error = ENOBUFS;
break;
}
/* Add chunk to the list */
m0->m_nextpkt = NULL;
if (last == NULL)
first = last = m0;
else {
last->m_nextpkt = m0;
last = m0;
}
m0 = m;
m = NULL;
}
NG_FREE_M(m0);
NG_FREE_M(m);
while (first != NULL) {
m = first->m_nextpkt;
m_freem(first);
first = m;
}
return (error);
} /* ng_cow_moo */
/*
* prepend mbuf with size bytes
*/
static struct mbuf *
ng_cow_prepend(m, size)
struct mbuf *m;
int size;
{
M_PREPEND(m, size, M_DONTWAIT);
if (m == NULL || (m->m_len < size && (m = m_pullup(m, size)) == NULL))
return (NULL);
return (m);
} /* ng_cow_prepend */
--------------F53DCFF46B83320730353000
Content-Type: text/plain; charset=us-ascii;
name="Makefile"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="Makefile"
CFLAGS+= -g
KMOD= ng_cow
SRCS= ng_cow.c
NOMAN=
.include <bsd.kmod.mk>
--------------F53DCFF46B83320730353000
Content-Type: text/plain; charset=us-ascii;
name="uipc_mbuf.c.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="uipc_mbuf.c.diff"
--- uipc_mbuf.c.orig Mon Apr 8 14:40:23 2002
+++ uipc_mbuf.c Mon Apr 8 14:40:43 2002
@@ -584,6 +584,7 @@
if (remain > MHLEN) {
/* m can't be the lead packet */
MH_ALIGN(n, 0);
+ n->m_len = 0;
n->m_next = m_split(m, len, wait);
if (n->m_next == NULL) {
(void) m_free(n);
--------------F53DCFF46B83320730353000
Content-Type: text/plain; charset=us-ascii;
name="info.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="info.txt"
FreeBSD beetle 5.0-CURRENT FreeBSD 5.0-CURRENT #20: Mon Apr 8 14:45:30 PDT 2002 max@beetle:/usr/src/sys/i386/compile/BEETLE i386
Fatal double fault:
eip = 0xc01bb5b4
esp = 0xc9ffc000
ebp = 0xc9ffc00c
panic: double fault
Copyright (c) 1992-2002 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.0-CURRENT #20: Mon Apr 8 14:45:30 PDT 2002
max@beetle:/usr/src/sys/i386/compile/BEETLE
Preloaded elf kernel "/boot/kernel/kernel" at 0xc03ba000.
Preloaded elf module "/boot/kernel/nmdm.ko" at 0xc03ba0a8.
Timecounter "i8254" frequency 1193182 Hz
Timecounter "TSC" frequency 597789434 Hz
CPU: Pentium III/Pentium III Xeon/Celeron (597.79-MHz 686-class CPU)
Origin = "GenuineIntel" Id = 0x681 Stepping = 1
Features=0x383f9ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE>
real memory = 134086656 (130944K bytes)
avail memory = 126636032 (123668K bytes)
Pentium Pro MTRR support enabled
Using $PIR table, 10 entries at 0xc00f0130
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Intel 82443BX (440 BX) host to PCI bridge> at pcibus 0 on motherboard
pci0: <PCI bus> on pcib0
pcib1: <PCI-PCI bridge> at device 1.0 on pci0
pci1: <PCI bus> on pcib1
pci1: <display, VGA> at device 0.0 (no driver attached)
isab0: <PCI-ISA bridge> at device 3.0 on pci0
isa0: <ISA bus> on isab0
isab1: <PCI-ISA bridge> at device 5.0 on pci0
atapci0: <Intel PIIX4 ATA33 controller> port 0xfff0-0xffff at device 5.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
uhci0: <Intel 82371AB/EB (PIIX4) USB controller> port 0xff80-0xff9f irq 11 at device 5.2 on pci0
usb0: <Intel 82371AB/EB (PIIX4) USB controller> on uhci0
usb0: USB revision 1.0
uhub0: Intel UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
uhub1: Texas Instruments UT-USB41 hub, class 9/0, rev 1.00/1.00, addr 2
uhub1: 4 ports with 4 removable, self powered
pci0: <bridge, PCI-unknown> at device 5.3 (no driver attached)
pci0: <unknown> at device 9.0 (no driver attached)
pcm0: <Yamaha DS-1E (YMF744)> port 0xfefc-0xfeff,0xff00-0xff3f mem 0xefff8000-0xefffffff irq 11 at device 12.0 on pci0
pcm0: ac97 codec invalid or not present (id == 0)
xl0: <3Com 3c905C-TX Fast Etherlink XL> port 0xfd80-0xfdff mem 0xefff7f80-0xefff7fff irq 11 at device 15.0 on pci0
xl0: Ethernet address: 00:00:39:8c:1e:26
miibus0: <MII bus> on xl0
xlphy0: <3c905C 10/100 internal PHY> on miibus0
xlphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
orm0: <Option ROM> at iomem 0xc0000-0xcbfff on isa0
atkbdc0: <Keyboard controller (i8042)> at port 0x64,0x60 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: model MouseMan+, device ID 0
fdc0: <enhanced floppy controller (i82077, NE72065 or clone)> at port 0x3f7,0x3f0-0x3f5 irq 6 drq 2 on isa0
pcic0: <Intel i82365SL-A/B> at port 0x3e0 iomem 0xd0000 on isa0
pcic0: Polling mode
pccard0: <PC Card bus (classic)> on pcic0
pccard1: <PC Card bus (classic)> on pcic0
pmtimer0 on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
unknown: <PNP0303> can't assign resources (port)
unknown: <PNP0f13> can't assign resources (irq)
unknown: <PNP0700> can't assign resources (port)
unknown: <PNP0501> can't assign resources (port)
IP packet filtering initialized, divert enabled, rule-based forwarding disabled, default to deny, logging limited to 100 packets/entry by default
pccard: card inserted, slot 0
pccard: card inserted, slot 1
ata1-slave: timeout waiting for interrupt
ata1-slave: ATAPI identify failed
ad0: 11513MB <IBM-DARA-212000> [23392/16/63] at ata0-master UDMA33
acd0: DVD-ROM <TOSHIBA DVD-ROM SD-C2302> at ata1-master PIO4
Mounting root from ufs:/dev/ad0s2a
WARNING: / was not properly dismounted
pccard: card removed, slot 0
pccard: card removed, slot 1
/dev/vmmon: Module vmmon: registered with major=200 minor=0 tag=$Name: build-570 $
/dev/vmmon: Module vmmon: initialized
WARNING: driver ptc should register devices with make_dev() (dev_t = "#ptc/0")
--------------F53DCFF46B83320730353000--
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3CB220BF.A98DCB82>
