public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Pavel Machek <pavel@suse.cz>
To: Tom Rini <trini@kernel.crashing.org>
Cc: akpm@osdl.org, george@mvista.com, amitkale@emsyssoft.com,
	Andi Kleen <ak@suse.de>,
	jim.houston@comcast.net,
	Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: BitKeeper repo for KGDB
Date: Wed, 28 Jan 2004 17:51:05 +0100	[thread overview]
Message-ID: <20040128165104.GC1200@elf.ucw.cz> (raw)
In-Reply-To: <20040127184029.GI32525@stop.crashing.org>

Hi!

> Hello everybody.  Since I've been talking with George off-list about
> trying to merge the various versions of KGDB around, and I just read the
> thread between Andy and Jim about conflicting on KGDB work, I've put up
> a BitKeeper repository[1] to try and coordinate things.
> 
> What's in there right now is Amit's kgdb 2.1.0, without the ethernet
> patch.   There's also all of the changes for PPC and for generic stuffs
> that I've been doing of late.
> 
> What I'll be doing shortly (this afternoon even) is to change from a
> struct of function pointers, for the arch specific functions, into a set
> of provided, weak, variants and then allow arches to override as needed.
> 
> What I'd like is for someone to move the ethernet bits from the -mm tree
> into here, and for people to merge the fixes / enhancements that're in
> their per-arch stubs in the -mm tree into the split design that Amit's
> version has.
> 
> Comments? Screams? Patches? :)

This one. It compiles. It needs -netpoll. It probably does not work.

									Pavel

--- tmp/linux/drivers/net/kgdb_eth.c	2004-01-26 10:18:45.000000000 +0100
+++ linux/drivers/net/kgdb_eth.c	2004-01-24 19:02:28.000000000 +0100
@@ -14,6 +14,9 @@
  * Reveral changes to make it free of device driver changes.
  * Added internal buffers for this interface.
  * 	by Amit S. Kale <amitkale@emsyssoft.com>
+ *
+ * Refactored for netpoll API by Matt Mackall <mpm@selenic.com>
+ *
  * Some cleanups by Pavel Machek <pavel@suse.cz>
  */
 
@@ -37,6 +40,8 @@
 #include <linux/irq.h>
 #include <linux/inet.h>
 #include <linux/notifier.h>
+#include <linux/netpoll.h>
+
 #include <net/tcp.h>
 #include <net/udp.h>
 
@@ -47,656 +52,121 @@
 #include <asm/system.h>
 #include <asm/atomic.h>
 
-#define	GDB_BUF_SIZE	512		/* power of 2, please */
-
-#define CHUNKSIZE 30
-#define MAXINCHUNK (CHUNKSIZE + 8)
-
-static char	kgdb_buf[GDB_BUF_SIZE];
-static int	kgdb_buf_in_inx;
-static atomic_t	kgdb_buf_in_cnt;
-static int	kgdb_buf_out_inx;
-
-static unsigned int	kgdb_remoteip = 0;
-static unsigned short	kgdb_listenport = 6443;
-static unsigned short	kgdb_sendport= 6442;
-static int		kgdb_eth = -1; /* Default tty mode */
-static unsigned char	kgdb_remotemac[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
-static unsigned char	kgdb_localmac[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
-
-static char		kgdbeth_sendbuf[MAXINCHUNK];
-static int		kgdbeth_sendbufchars;
-static irqreturn_t	(*kgdbeth_irqhandler)(int, void *, struct pt_regs *) = NULL;
-
-struct net_device *kgdb_netdevice = NULL;
-
-/* Indicates dept of recursion for xmitlock hold */
-static int xlock_hold_count = 0;
-
-/* kgdb ethernet ring buffers. Increase the space if you get panics in
- * kgdbeth_alloc_skb.
- * Status of send_skbs can be known from the field users.
- * If it's 1 the buffer is free.
- * If the count 2 or more, the buffer is in use.
- * Keeping 1 as the initial count prevents kfree_skb from freeing it. */
-#define SEND_BUFLEN 1024
-#define NUM_SENDBUF 128
-static char *send_bufs[NUM_SENDBUF];
-static struct sk_buff *send_skbs[NUM_SENDBUF];
-static struct sk_buff *send_skb;
-static int bufnum;
-
-static char kgdb_netdev_name[16];
-
-#ifdef CONFIG_KGDB_CONSOLE
-#error kgdb over ethernet is not yet ready for console messages.
-#endif
-
-/*
- * Returns next skb from kgdb skbs.
- * Initializes users field of the skb to 2 so that kfree_skb doesn't attempt
- * freeing it.
- * Always call after holding xmitlock of the ethernet device.
- */
-
-struct sk_buff *kgdbeth_alloc_skb(int size)
-{
-	struct sk_buff *skb;
-	u8		*data;
-	int i;
-
-	i = bufnum;
-
-	do {
-		skb = send_skbs[i];
-
-		if (atomic_read(&skb->users) == 1) {
-			bufnum = i;
-			i = -1;
-			break;
-		}
-		i = (i + 1) % NUM_SENDBUF;
-	} while (i != bufnum);
-	if (i == bufnum) {
-		panic("kgdb ethernet buffer overflow\n");
-	}
-	data = (u8 *)(send_bufs[bufnum]);
-
-	size = SKB_DATA_ALIGN(size);
-	if (size + sizeof(struct skb_shared_info) > SEND_BUFLEN)
-		panic("kgdb ethernet buffer too short for this request");
-
-	memset(skb, 0, offsetof(struct sk_buff, truesize));
-	skb->truesize = size + sizeof(struct sk_buff);
-	atomic_set(&skb->users, 2);
-	skb->head = data;
-	skb->data = data;
-	skb->tail = data;
-	skb->end  = data + size;
-
-	atomic_set(&(skb_shinfo(skb)->dataref), 1);
-	skb_shinfo(skb)->nr_frags  = 0;
-	skb_shinfo(skb)->tso_size = 0;
-	skb_shinfo(skb)->tso_segs = 0;
-	skb_shinfo(skb)->frag_list = NULL;
-
-	return skb;
-}
-
-/* Holds xmitlock of the ethernet device 
- * Recursive calls allowed */
-static void kgdbeth_lock(void)
-{
-	if (spin_is_locked(&kgdb_netdevice->xmit_lock)) {
-		if (kgdb_netdevice->xmit_lock_owner == smp_processor_id()) {
-			goto gotit;
-		}
-	}
-	spin_lock(&kgdb_netdevice->xmit_lock);
-	kgdb_netdevice->xmit_lock_owner = smp_processor_id();
-
-gotit:
-	xlock_hold_count++;
-}
+#define IN_BUF_SIZE 512 /* power of 2, please */
+#define OUT_BUF_SIZE 256
 
-/* releases xmitlock of the ethernet device 
- * Recursive calls allowed */
-static void kgdbeth_unlock(void)
-{
-	if (--xlock_hold_count) {
-		kgdb_netdevice->xmit_lock_owner = -1;
-		spin_unlock(&kgdb_netdevice->xmit_lock);
-	}
-}
-
-/*
- * Get a char if available, return -1 if nothing available.
- * Empty the receive buffer first, then look at the interface hardware.
- */
-static int
-read_char(void)
-{
-	/* intr routine has queued chars */
-	if (atomic_read(&kgdb_buf_in_cnt) != 0) {
-		int chr;
-
-		chr = kgdb_buf[kgdb_buf_out_inx++];
-		kgdb_buf_out_inx &= (GDB_BUF_SIZE - 1);
-		atomic_dec(&kgdb_buf_in_cnt);
-		return chr;
-	}
-
-	return -1; /* no data */
-}
+static char in_buf[IN_BUF_SIZE], out_buf[OUT_BUF_SIZE];
+static int in_head, in_tail, out_count;
+static atomic_t in_count;
+int kgdboe = 0; /* Default to tty mode */
+
+extern void set_debug_traps(void);
+extern void breakpoint(void);
+static void rx_hook(struct netpoll *np, int port, char *msg, int len);
+
+static struct netpoll np = {
+	.name = "kgdboe",
+	.dev_name = "eth0",
+	.rx_hook = rx_hook,
+	.local_port = 6443,
+	.remote_port = 6442,
+	.remote_mac = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+};
 
-/*
- * Wait until the interface can accept a char, then write it.
- */
-static void
-write_buffer(char *buf, int len)
+int eth_getDebugChar(void)
 {
-	int			total_len, eth_len, ip_len, udp_len;
-	struct in_device	*in_dev;
-	struct sk_buff		*skb;
-	struct udphdr		*udph;
-	struct iphdr		*iph;
-	struct ethhdr		*eth;
-
-	if (!(in_dev = (struct in_device *) kgdb_netdevice->ip_ptr)) {
-		panic("No in_device available for interface!\n");
-	}
-
-	if (!(in_dev->ifa_list)) {
-		panic("No interface address set for interface!\n");
-	}
-	kgdbeth_lock();
+	int chr;
 
-	udp_len = len + sizeof(struct udphdr);
-	ip_len = eth_len = udp_len + sizeof(struct iphdr);
-	total_len = eth_len + ETH_HLEN;
-
-	skb = kgdbeth_alloc_skb(total_len);
-
-	skb_reserve(skb, total_len - 1);
-
-	memcpy(skb->data, (unsigned char *) buf, len);
-	skb->len += len;
-
-	udph = (struct udphdr *) skb_push(skb, sizeof(*udph));
-	udph->source = htons(kgdb_listenport);
-	udph->dest   = htons(kgdb_sendport);
-	udph->len    = htons(udp_len);
-	udph->check  = 0;
-
-	iph = (struct iphdr *)skb_push(skb, sizeof(*iph));
-	iph->version  = 4;
-	iph->ihl      = 5;
-	iph->tos      = 0;
-	iph->tot_len  = htons(ip_len);
-	iph->id       = 0;
-	iph->frag_off = 0;
-	iph->ttl      = 64;
-	iph->protocol = IPPROTO_UDP;
-	iph->check    = 0;
-	iph->saddr    = in_dev->ifa_list->ifa_address;
-	iph->daddr    = kgdb_remoteip;
-	iph->check    = ip_fast_csum((unsigned char *)iph, iph->ihl);
-
-	eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
-	eth->h_proto = htons(ETH_P_IP);
-	memcpy(eth->h_source, kgdb_localmac, kgdb_netdevice->addr_len);
-	memcpy(eth->h_dest, kgdb_remotemac, kgdb_netdevice->addr_len);
-
-	kgdb_netdevice->hard_start_xmit(skb, kgdb_netdevice);
-	BUG_ON(atomic_read(&skb->users) != 1);
-	kgdbeth_unlock();
-}
-
-static void kgdbeth_flush(void)
-{
-	if (!kgdbeth_sendbufchars) {
-		return;
-	}
-	write_buffer(kgdbeth_sendbuf, kgdbeth_sendbufchars);
-	kgdbeth_sendbufchars = 0;
-}
+	while (atomic_read(&in_count) == 0)
+		netpoll_poll(&np);
 
-static void kgdbeth_write_char(int chr)
-{
-	if (kgdbeth_sendbufchars == MAXINCHUNK) {
-		kgdbeth_flush();
-	}
-	kgdbeth_sendbuf[kgdbeth_sendbufchars++] = chr;
+	chr = in_buf[in_tail++];
+	in_tail &= (IN_BUF_SIZE - 1);
+	atomic_dec(&in_count);
+	return chr;
 }
 
-
-/*
- * In the interrupt state the target machine will not respond to any
- * arp requests, so handle them here.
- */
-
-static void
-kgdb_eth_reply_arp(void)
+void eth_flushDebugChar(void)
 {
-	if (send_skb) {
-		kgdbeth_lock();
-	    	kgdb_netdevice->hard_start_xmit(send_skb, kgdb_netdevice);
-		send_skb = NULL;
-		kgdbeth_unlock();
+	if(out_count && np.dev) {
+		netpoll_send_udp(&np, out_buf, out_count);
+		out_count = 0;
 	}
 }
 
-static int
-make_arp_request(struct sk_buff *skb)
+void eth_putDebugChar(int chr)
 {
-	struct arphdr *arp;
-	unsigned char *arp_ptr;
-	int type = ARPOP_REPLY;
-	int ptype = ETH_P_ARP;
-	u32 sip, tip;
-	unsigned char *sha, *tha;
-	struct in_device *in_dev = (struct in_device *) kgdb_netdevice->ip_ptr;
-
-	/* No arp on this interface */
-
-	if (kgdb_netdevice->flags & IFF_NOARP) {
-		return 0;
-	}
-
-	if (!pskb_may_pull(skb, (sizeof(struct arphdr) +
-				 (2 * kgdb_netdevice->addr_len) +
-				 (2 * sizeof(u32))))) {
-		return 0;
-	}
-
-	skb->h.raw = skb->nh.raw = skb->data;
-	arp = skb->nh.arph;
-
-	if ((arp->ar_hrd != htons(ARPHRD_ETHER) &&
-	     arp->ar_hrd != htons(ARPHRD_IEEE802)) ||
-	    arp->ar_pro != htons(ETH_P_IP)) {
-		return 0;
-	}
-
-	/* Understand only these message types */
-
-	if (arp->ar_op != htons(ARPOP_REQUEST)) {
-		return 0;
-	}
-
-	/* Extract fields */
-
-	arp_ptr= (unsigned char *)(arp+1);
-	sha = arp_ptr;
-	arp_ptr += kgdb_netdevice->addr_len;
-	memcpy(&sip, arp_ptr, 4);
-	arp_ptr += 4;
-	tha = arp_ptr;
-	arp_ptr += kgdb_netdevice->addr_len;
-	memcpy(&tip, arp_ptr, 4);
-
-	if (tip != in_dev->ifa_list->ifa_address) {
-		return 0;
-	}
-
-	if (kgdb_remoteip != sip) {
-		return 0;
-	}
-
-	/*
-	 * Check for bad requests for 127.x.x.x and requests for multicast
-	 * addresses.  If this is one such, delete it.
-	 */
-
-	if (LOOPBACK(tip) || MULTICAST(tip)) {
-		return 0;
-	}
-	/* reply to the ARP request */
-
-	kgdbeth_lock();
-	if (send_skb) {
-		/* Get rid of any previous replies to ARP request. We hope
-		 * that regular reply to ARP by network layers would have gone
-		 * out by now. */
-		kfree_skb(send_skb);
-	}
-	send_skb = kgdbeth_alloc_skb(sizeof(struct arphdr) +
-			2 * (kgdb_netdevice->addr_len + 4) +
-			LL_RESERVED_SPACE(kgdb_netdevice));
-	kgdbeth_unlock();
-
-	skb_reserve(send_skb, LL_RESERVED_SPACE(kgdb_netdevice));
-	send_skb->nh.raw = send_skb->data;
-	arp = (struct arphdr *) skb_put(send_skb, sizeof(struct arphdr) + 2 * (kgdb_netdevice->addr_len + 4));
-	send_skb->dev = kgdb_netdevice;
-	send_skb->protocol = htons(ETH_P_ARP);
-
-	/* Fill the device header for the ARP frame */
-
-	if (kgdb_netdevice->hard_header &&
-	    kgdb_netdevice->hard_header(send_skb, kgdb_netdevice, ptype,
-				       kgdb_remotemac, kgdb_localmac,
-				       send_skb->len) < 0) {
-		kfree_skb(send_skb);
-		return 0;
-	}
-
-	/*
-	 * Fill out the arp protocol part.
-	 *
-	 * we only support ethernet device type,
-	 * which (according to RFC 1390) should always equal 1 (Ethernet).
-	 */
-
-	arp->ar_hrd = htons(kgdb_netdevice->type);
-	arp->ar_pro = htons(ETH_P_IP);
-
-	arp->ar_hln = kgdb_netdevice->addr_len;
-	arp->ar_pln = 4;
-	arp->ar_op = htons(type);
-
-	arp_ptr=(unsigned char *)(arp + 1);
-
-	memcpy(arp_ptr, kgdb_netdevice->dev_addr, kgdb_netdevice->addr_len);
-	arp_ptr += kgdb_netdevice->addr_len;
-	memcpy(arp_ptr, &tip, 4);
-	arp_ptr += 4;
-	memcpy(arp_ptr, kgdb_localmac, kgdb_netdevice->addr_len);
-	arp_ptr += kgdb_netdevice->addr_len;
-	memcpy(arp_ptr, &sip, 4);
-	return 0;
+	out_buf[out_count++] = chr;
+	if(out_count == OUT_BUF_SIZE)
+		eth_flushDebugChar();
 }
 
-
-/*
- * Accept an skbuff from net_device layer and add the payload onto
- * kgdb buffer
- *
- * When the kgdb stub routine read_char() is called it draws characters
- * out of the buffer until it is empty and then polls the hardware.
- *
- * Return value of NET_RX_DROP means skb was used by this function.
- * NET_RX_SUCCESS indicates this function didn't use it.
-
- * Be prepared to respond to ARP requests. Let the caller also handle
- * them if debugger is not active. We'll respond to the ARP request when
- * a debugging session begins. It's necessary to respond to the request as the
- * debugging session may begin even before kernel has a chance finish the
- * response.
- */
-int
-kgdb_net_interrupt(struct sk_buff *skb)
+static void rx_hook(struct netpoll *np, int port, char *msg, int len)
 {
-	unsigned char	chr;
-	struct iphdr	*iph = (struct iphdr*)skb->data;
-	struct udphdr	*udph= (struct udphdr*)(skb->data+(iph->ihl<<2));
-	unsigned char	*data = (unsigned char *) udph + sizeof(struct udphdr);
-	int		len;
-	int		i;
-
-	if (!kgdb_initialized || !kgdb_netdevice) {
-		goto out;
-	}
-	if (skb->protocol == __constant_htons(ETH_P_ARP) && !send_skb) {
-		make_arp_request(skb);
-		goto out;
-	}
-	if (iph->protocol != IPPROTO_UDP ||
-		be16_to_cpu(udph->dest) != kgdb_listenport) 
-		goto out;
+	int i;
 
-	kgdb_sendport = be16_to_cpu(udph->source);
+	np->remote_port = port;
 
-	len = (be16_to_cpu(iph->tot_len) -
-	       (sizeof(struct udphdr) + sizeof(struct iphdr)));
+	/* Is this gdb trying to attach? */
+	if (!netpoll_trap() && len == 8 && !strncmp(msg, "$Hc-1#09", 8))
+		printk(KERN_CRIT "Someone is trying to attach\n");
+//		kgdb_schedule_breakpoint();
 
 	for (i = 0; i < len; i++) {
-		chr = *data++;
-		if (chr == 3)
-		{
-			if (!atomic_read(&debugger_active)) {
-				breakpoint();
-			}
-			continue;
-		}
-		if (atomic_read(&kgdb_buf_in_cnt) >= GDB_BUF_SIZE) {
-			/* buffer overflow, clear it */
-			kgdb_buf_in_inx = 0;
-			atomic_set(&kgdb_buf_in_cnt, 0);
-			kgdb_buf_out_inx = 0;
-			break;
-		}
-		kgdb_buf[kgdb_buf_in_inx++] = chr;
-		kgdb_buf_in_inx &= (GDB_BUF_SIZE - 1);
-		atomic_inc(&kgdb_buf_in_cnt) ;
-	}
-	return NET_RX_DROP;
-
-out:
-	if (atomic_read(&debugger_active))
-		return NET_RX_DROP;
-	return NET_RX_SUCCESS;
-}
+		if (msg[i] == 3)	/* Check for ^C? */
+			printk(KERN_CRIT "Someone is trying to ^C?\n");
+//			kgdb_schedule_breakpoint();
 
-/*
- * Initializes ethernet interface to kgdb.
- * Searches the device list and finds the device specified on kernel command
- * line.
- * Finds the irq handler for the device and saves its reference.
- * Initializes kgdbeth data structures.
- */
-
-int
-kgdbeth_hook(void)
-{
-	extern void kgdb_respond_ok(void);
-	struct irqaction *ia_ptr;
-	int i;
-
-	sprintf(kgdb_netdev_name, "eth%d", kgdb_eth);
-
-	for (kgdb_netdevice = dev_base;
-		kgdb_netdevice != NULL;
-		kgdb_netdevice = kgdb_netdevice->next) {
-		if (strncmp(kgdb_netdevice->name, kgdb_netdev_name, IFNAMSIZ) == 0) {
-			break;
-		}
-	}
-	if (!kgdb_netdevice) {
-		printk("kgdbeth: Unable to find interface %s\n",
-				kgdb_netdev_name);
-		return -ENODEV;
-	}
-	if (!(kgdb_netdevice->flags & IFF_UP)) {
-		return -EINVAL;
-	}
-	ia_ptr = irq_desc[kgdb_netdevice->irq].action;
-	while (ia_ptr) {
-		if (!strncmp(kgdb_netdev_name, ia_ptr->name, IFNAMSIZ)) {
-			kgdbeth_irqhandler = ia_ptr->handler;
+		if (atomic_read(&in_count) >= IN_BUF_SIZE) {
+			/* buffer overflow, clear it */
+			in_head = in_tail = 0;
+			atomic_set(&in_count, 0);
 			break;
 		}
-		ia_ptr = ia_ptr->next;
-	}
-	if (!kgdbeth_irqhandler) {
-		printk("kgdbeth: Interface %s doesn't have an interrupt"
-			" handler cannot use it\n", kgdb_netdev_name);
-		return -EINVAL;
-	}
-	for (i = 0; i < NUM_SENDBUF; i++) {
-		send_skbs[i] = kmalloc(sizeof (struct sk_buff), GFP_KERNEL);
-		send_bufs[i] = kmalloc(SEND_BUFLEN, GFP_KERNEL);
-		if (!send_skbs[i] || !send_bufs[i]) {
-			printk("kgdbeth: not enough memory\n");
-			return -ENOMEM;
-		}
-		atomic_set(&(send_skbs[i]->users), 1);
+		in_buf[in_head++] = msg[i];
+		in_head &= (IN_BUF_SIZE - 1);
+		atomic_inc(&in_count);
 	}
-
-
-	return 0;
 }
 
-/*
- * kgdbeth_read_char
- *
- * This is a GDB stub routine.  It waits for a character from the
- * ethernet interface and then returns it.
- */
-static int
-kgdbeth_read_char(void)
+static int option_setup(char *opt)
 {
-	int	chr;
-
-	while ((chr = read_char()) < 0) {
-		if (send_skb) {
-			kgdb_eth_reply_arp();
-		}
-		(*kgdbeth_irqhandler)(kgdb_netdevice->irq,
-				      (void *)kgdb_netdevice, 0);
-	}
-	return chr;
+	return netpoll_parse_options(&np, opt);
 }
 
-/*
- * Hold onto the xmitlock and keep holding till the session ends.
- * Disable device irq and keep it disabled till this session ends.
- * Respond to last arp request we have received. It may not not have be
- * responded yet.
- */
-static void kgdbeth_begin_session(void) {
-	kgdbeth_lock();
-	disable_irq(kgdb_netdevice->irq);
-	kgdb_eth_reply_arp();
-}
+__setup("kgdboe=", option_setup);
 
-static void kgdbeth_end_session(void)
+static int init_kgdboe(void)
 {
-	enable_irq(kgdb_netdevice->irq);
-	kgdbeth_unlock();
-}
-
-struct kgdb_serial kgdbeth_serial = {
-	.chunksize = CHUNKSIZE,
-	.read_char = kgdbeth_read_char,
-	.write_char = kgdbeth_write_char,
-	.hook = kgdbeth_hook,
-	.flush = kgdbeth_flush,
-	.begin_session = kgdbeth_begin_session,
-	.end_session = kgdbeth_end_session,
-};
+#ifdef CONFIG_SMP
+	if (num_online_cpus() > CONFIG_NO_KGDB_CPUS) {
+		printk("kgdb: too manu cpus. Cannot enable debugger with more than %d cpus\n", CONFIG_NO_KGDB_CPUS);
+		return -1;
+	}
+#endif
+//	set_debug_traps();
 
-static int __init parse_hw_addr(char **ptr, unsigned char *addr,
-		unsigned char delimiter)
-{
-	int  i = 0;
+	if(!np.remote_ip || netpoll_setup(&np))
+		return 1;
 
-	while(**ptr != delimiter)
-	{
-		unsigned int c;
+	kgdboe = 1;
+	printk(KERN_INFO "kgdb: debugging over ethernet enabled\n");
 
-		if (sscanf(*ptr, "%x", &c) != 1) {
-			return 1;
-		}
-		addr[i++] = c;
-		do
-			(*ptr)++;
-		while((**ptr != delimiter) && (*(*ptr -1) != ':'));
-		if (i > 6)
-			return -EINVAL;
-	}
-	if (i != 6)
-		return -EINVAL;
 	return 0;
 }
 
-int kgdbeth_thread(void *data)
-{
-	struct net_device *ndev = (struct net_device *)data;
-	daemonize("kgdbeth");
-	while (!ndev->ip_ptr) {
-		schedule();
-	}
-	debugger_entry();
-	return 0;
-}
+static int hook(void) { printk("Hook called\n"); return 0; }
+static int begin(void) { printk("Begin called\n"); return 0; }
+static int end(void) { printk("End called\n"); return 0; }
 
-int kgdbeth_event(struct notifier_block * self, unsigned long val, void * data)
-{
-	if (strcmp(((struct net_device *)data)->name, kgdb_netdev_name)) {
-		goto out;
-	}
-	if (val!= NETDEV_UP)
-		goto out;
-	kernel_thread(kgdbeth_thread, data, CLONE_KERNEL);
+module_init(init_kgdboe);
 
-out:
-	return NOTIFY_DONE;
-}
-static struct notifier_block nb = {
-       .notifier_call = kgdbeth_event,
+struct kgdb_serial kgdbeth_serial = {
+	.chunksize = 1,
+	.read_char = eth_getDebugChar,
+	.write_char = eth_putDebugChar,
+	.hook = hook,
+	.flush = eth_flushDebugChar,
+	.begin_session = begin,
+	.end_session = end,
 };
-
-/*
- * Syntax for this cmdline option is
- * kgdbeth=interfacenum,localmac,listenport,remoteip,remotemac
- */
-
-static int __init kgdbeth_opt(char *str)
-{
-	char ipaddrstr[16];
-	char *ipaddrptr = ipaddrstr;
-	extern int register_netdevice_notifier(struct notifier_block *nb);
-
-
-	if (register_netdevice_notifier(&nb)) {
-		printk("KGDB_ETH: couldn't register notifier\n");
-		return 0;
-	}
-
-	/* interfacenum */
-	if (*str < '0' || *str > '9')
-		goto errout;
-	kgdb_eth = *str - '0';
-	str++;
-	if (*str != ',')
-		goto errout;
-	str++;
-
-	/* localmac */
-	if (parse_hw_addr(&str, kgdb_localmac, ','))
-		goto errout;
-	str++;
-
-	/* port */
-	kgdb_listenport = simple_strtoul(str, &str, 10);
-
-	if (*str != ',')
-		goto errout;
-	str++;
-
-	/* remoteip */
-	while (*str != ',') {
-		if (!*str)
-			goto errout;
-		*ipaddrptr = *str;
-		str++;
-		ipaddrptr++;
-	}
-	str++;
-	*ipaddrptr = '\0';
-	kgdb_remoteip = in_aton(ipaddrstr);
-
-	/* remotemac */
-	if (parse_hw_addr(&str, kgdb_remotemac, '\0'))
-		goto errout;
-
-	kgdb_serial = &kgdbeth_serial;
-	return 1;
-
-errout:
-	printk("Invalid syntax for option kgdbeth=\n");
-	return 0;
-}
-
-__setup("kgdbeth=", kgdbeth_opt);
--- tmp/linux/net/core/dev.c	2004-01-26 10:18:51.000000000 +0100
+++ linux/net/core/dev.c	2004-01-24 18:53:56.000000000 +0100
@@ -1428,15 +1428,6 @@
 	int this_cpu;
 	struct softnet_data *queue;
 	unsigned long flags;
-	int ret;
-	int kgdb_net_interrupt(struct sk_buff *skb);
-
-#ifdef CONFIG_KGDB_ETH
-	/* See if kgdb_eth wants this packet */
-	if ((ret = kgdb_net_interrupt(skb)) == NET_RX_DROP) {
-		return ret;
-	}
-#endif
 
 #ifdef CONFIG_NETPOLL_RX
 	if (skb->dev->netpoll_rx && netpoll_rx(skb)) {
--- tmp/linux/net/core/skbuff.c	2004-01-26 10:18:45.000000000 +0100
+++ linux/net/core/skbuff.c	2004-01-24 18:58:44.000000000 +0100
@@ -127,11 +127,6 @@
 {
 	struct sk_buff *skb;
 	u8 *data;
-	struct sk_buff *kgdbeth_alloc_skb(int size);
-
-	if (atomic_read(&debugger_active)) {
-		return kgdbeth_alloc_skb(size);
-	}
 
 	/* Get the HEAD */
 	skb = kmem_cache_alloc(skbuff_head_cache,


-- 
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]

  parent reply	other threads:[~2004-01-28 16:53 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-01-27 18:40 BitKeeper repo for KGDB Tom Rini
2004-01-27 19:31 ` Sam Ravnborg
2004-01-27 19:46   ` Dave Jones
2004-01-27 20:07 ` Chris Wright
2004-01-27 21:02   ` Tom Rini
2004-01-28  9:50     ` Dave Jones
2004-01-28 16:51 ` Pavel Machek [this message]
2004-01-28 17:05   ` Tom Rini
2004-01-28 17:44     ` Pavel Machek
2004-01-28 17:56       ` Tom Rini
2004-01-28 18:04         ` Pavel Machek
2004-02-06 22:35         ` Tom Rini
2004-02-06 22:55           ` Pavel Machek
2004-02-06 23:02             ` Tom Rini
2004-02-09  1:29               ` Matt Mackall
2004-02-09 15:50                 ` Tom Rini
2004-02-09 17:38                   ` Matt Mackall
2004-02-10  7:57                     ` Amit S. Kale
2004-02-10  8:27                       ` Amit S. Kale
2004-02-10 19:26                         ` Tom Rini
2004-02-11 14:35                           ` Amit S. Kale
2004-02-10  8:46                       ` Dave Jones
2004-02-10 19:22                         ` Tom Rini
2004-02-10 19:23                           ` Dave Jones
2004-01-30 18:18 ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040128165104.GC1200@elf.ucw.cz \
    --to=pavel@suse.cz \
    --cc=ak@suse.de \
    --cc=akpm@osdl.org \
    --cc=amitkale@emsyssoft.com \
    --cc=george@mvista.com \
    --cc=jim.houston@comcast.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=trini@kernel.crashing.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox