From: Pavel Machek <pavel@ucw.cz>
To: amitkale@emsyssoft.com, kernel list <linux-kernel@vger.kernel.org>
Subject: FYI: kgdb 2.1.0 interdiff
Date: Fri, 23 Jan 2004 09:18:22 +0100 [thread overview]
Message-ID: <20040123081822.GA3382@elf.ucw.cz> (raw)
Hi!
[I hope these are usefull to someone? They do not contain ppc and
serial].
entry.S change is interesting... and it changes do_IRQ() calling
convention. Perhaps that change should be pushed to Andrew? It is
"interesting" to have different do_IRQ in case of kgdb...
Pavel
@@ -67,8 +67,8 @@
Index: linux/arch/i386/kernel/entry.S
===================================================================
---- linux.orig/arch/i386/kernel/entry.S 2004-01-20 14:28:44.000000000 +0100
-+++ linux/arch/i386/kernel/entry.S 2004-01-20 14:29:19.000000000 +0100
+--- linux.orig/arch/i386/kernel/entry.S 2004-01-23 09:04:23.000000000 +0100
++++ linux/arch/i386/kernel/entry.S 2004-01-23 09:05:16.000000000 +0100
@@ -226,7 +226,7 @@
jz restore_all
movl $PREEMPT_ACTIVE,TI_PRE_COUNT(%ebp)
@@ -87,7 +87,25 @@
cli # make sure we don't miss an interrupt
# setting need_resched or sigpending
# between sampling and the iret
-@@ -606,6 +606,31 @@
+@@ -399,7 +399,17 @@
+ ALIGN
+ common_interrupt:
+ SAVE_ALL
++ movl %esp, %eax
++/* Create a fake function call followed by a fake function prologue to fool
++ * gdb into believing that this is a normal function call. */
++ pushl EIP(%eax)
++
++common_interrupt_1:
++ pushl %ebp
++ movl %esp, %ebp
++ pushl %eax
+ call do_IRQ
++ addl $12, %esp
+ jmp ret_from_intr
+
+ #define BUILD_INTERRUPT(name, nr) \
+@@ -606,6 +616,31 @@
pushl $do_spurious_interrupt_bug
jmp error_code
@@ -581,10 +599,41 @@
+ .remove_break = i386_remove_hw_break,
+ .correct_hw_break = i386_correct_hw_break,
+};
+Index: linux/arch/i386/kernel/irq.c
+===================================================================
+--- linux.orig/arch/i386/kernel/irq.c 2004-01-09 20:26:08.000000000 +0100
++++ linux/arch/i386/kernel/irq.c 2004-01-23 09:05:16.000000000 +0100
+@@ -410,7 +410,7 @@
+ * SMP cross-CPU interrupts have their own specific
+ * handlers).
+ */
+-asmlinkage unsigned int do_IRQ(struct pt_regs regs)
++asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
+ {
+ /*
+ * We ack quickly, we don't want the irq controller
+@@ -422,7 +422,7 @@
+ * 0 return value means that this irq is already being
+ * handled by some other CPU. (or is disabled)
+ */
+- int irq = regs.orig_eax & 0xff; /* high bits used in ret_from_ code */
++ int irq = regs->orig_eax & 0xff; /* high bits used in ret_from_ code */
+ irq_desc_t *desc = irq_desc + irq;
+ struct irqaction * action;
+ unsigned int status;
+@@ -488,7 +488,7 @@
+ irqreturn_t action_ret;
+
+ spin_unlock(&desc->lock);
+- action_ret = handle_IRQ_event(irq, ®s, action);
++ action_ret = handle_IRQ_event(irq, regs, action);
+ spin_lock(&desc->lock);
+ if (!noirqdebug)
+ note_interrupt(irq, desc, action_ret);
Index: linux/arch/i386/kernel/nmi.c
===================================================================
---- linux.orig/arch/i386/kernel/nmi.c 2004-01-20 14:28:44.000000000 +0100
-+++ linux/arch/i386/kernel/nmi.c 2004-01-20 14:29:19.000000000 +0100
+--- linux.orig/arch/i386/kernel/nmi.c 2004-01-23 09:04:23.000000000 +0100
++++ linux/arch/i386/kernel/nmi.c 2004-01-23 09:05:16.000000000 +0100
@@ -25,6 +25,7 @@
#include <linux/module.h>
#include <linux/nmi.h>
@@ -2031,9 +2080,9 @@
obj-$(CONFIG_VORTEX) += 3c59x.o
Index: linux/drivers/net/kgdb_eth.c
===================================================================
---- linux.orig/drivers/net/kgdb_eth.c 2004-01-20 14:29:19.000000000 +0100
-+++ linux/drivers/net/kgdb_eth.c 2004-01-20 14:29:19.000000000 +0100
-@@ -0,0 +1,704 @@
+--- linux.orig/drivers/net/kgdb_eth.c 2004-01-23 09:05:16.000000000 +0100
++++ linux/drivers/net/kgdb_eth.c 2004-01-23 09:05:16.000000000 +0100
+@@ -0,0 +1,702 @@
+/*
+ * Network interface GDB stub
+ *
@@ -2107,7 +2156,7 @@
+struct net_device *kgdb_netdevice = NULL;
+
+/* Indicates dept of recursion for xmitlock hold */
-+static int xlockholdcount = 0;
++static int xlock_hold_count = 0;
+
+/* kgdb ethernet ring buffers. Increase the space if you get panics in
+ * kgdbeth_alloc_skb.
@@ -2122,7 +2171,7 @@
+static struct sk_buff *send_skb;
+static int bufnum;
+
-+static char kgdb_netdevname[16];
++static char kgdb_netdev_name[16];
+
+#ifdef CONFIG_KGDB_CONSOLE
+#error kgdb over ethernet is not yet ready for console messages.
@@ -2181,7 +2230,7 @@
+
+/* Holds xmitlock of the ethernet device
+ * Recursive calls allowed */
-+static void kgdbeth_holdxlock(void)
++static void kgdbeth_lock(void)
+{
+ if (spin_is_locked(&kgdb_netdevice->xmit_lock)) {
+ if (kgdb_netdevice->xmit_lock_owner == smp_processor_id()) {
@@ -2192,14 +2241,14 @@
+ kgdb_netdevice->xmit_lock_owner = smp_processor_id();
+
+gotit:
-+ xlockholdcount++;
++ xlock_hold_count++;
+}
+
+/* releases xmitlock of the ethernet device
+ * Recursive calls allowed */
-+static void kgdbeth_relxlock(void)
++static void kgdbeth_unlock(void)
+{
-+ if (--xlockholdcount) {
++ if (--xlock_hold_count) {
+ kgdb_netdevice->xmit_lock_owner = -1;
+ spin_unlock(&kgdb_netdevice->xmit_lock);
+ }
@@ -2245,7 +2294,7 @@
+ if (!(in_dev->ifa_list)) {
+ panic("No interface address set for interface!\n");
+ }
-+ kgdbeth_holdxlock();
++ kgdbeth_lock();
+
+ udp_len = len + sizeof(struct udphdr);
+ ip_len = eth_len = udp_len + sizeof(struct iphdr);
@@ -2284,10 +2333,8 @@
+ memcpy(eth->h_dest, kgdb_remotemac, kgdb_netdevice->addr_len);
+
+ kgdb_netdevice->hard_start_xmit(skb, kgdb_netdevice);
-+ if (atomic_read(&skb->users) != 1) {
-+ BUG();
-+ }
-+ kgdbeth_relxlock();
++ BUG_ON(atomic_read(&skb->users) != 1);
++ kgdbeth_unlock();
+}
+
+static void kgdbeth_flush(void)
@@ -2317,10 +2364,10 @@
+kgdb_eth_reply_arp(void)
+{
+ if (send_skb) {
-+ kgdbeth_holdxlock();
++ kgdbeth_lock();
+ kgdb_netdevice->hard_start_xmit(send_skb, kgdb_netdevice);
+ send_skb = NULL;
-+ kgdbeth_relxlock();
++ kgdbeth_unlock();
+ }
+}
+
@@ -2391,7 +2438,7 @@
+ }
+ /* reply to the ARP request */
+
-+ kgdbeth_holdxlock();
++ 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
@@ -2401,7 +2448,7 @@
+ send_skb = kgdbeth_alloc_skb(sizeof(struct arphdr) +
+ 2 * (kgdb_netdevice->addr_len + 4) +
+ LL_RESERVED_SPACE(kgdb_netdevice));
-+ kgdbeth_relxlock();
++ kgdbeth_unlock();
+
+ skb_reserve(send_skb, LL_RESERVED_SPACE(kgdb_netdevice));
+ send_skb->nh.raw = send_skb->data;
@@ -2531,18 +2578,18 @@
+ struct irqaction *ia_ptr;
+ int i;
+
-+ sprintf(kgdb_netdevname, "eth%d", kgdb_eth);
++ 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_netdevname, IFNAMSIZ) == 0) {
++ if (strncmp(kgdb_netdevice->name, kgdb_netdev_name, IFNAMSIZ) == 0) {
+ break;
+ }
+ }
+ if (!kgdb_netdevice) {
+ printk("kgdbeth: Unable to find interface %s\n",
-+ kgdb_netdevname);
++ kgdb_netdev_name);
+ return -ENODEV;
+ }
+ if (!(kgdb_netdevice->flags & IFF_UP)) {
@@ -2550,7 +2597,7 @@
+ }
+ ia_ptr = irq_desc[kgdb_netdevice->irq].action;
+ while (ia_ptr) {
-+ if (!strncmp(kgdb_netdevname, ia_ptr->name, IFNAMSIZ)) {
++ if (!strncmp(kgdb_netdev_name, ia_ptr->name, IFNAMSIZ)) {
+ kgdbeth_irqhandler = ia_ptr->handler;
+ break;
+ }
@@ -2558,7 +2605,7 @@
+ }
+ if (!kgdbeth_irqhandler) {
+ printk("kgdbeth: Interface %s doesn't have an interrupt"
-+ " handler cannot use it\n", kgdb_netdevname);
++ " handler cannot use it\n", kgdb_netdev_name);
+ return -EINVAL;
+ }
+ for (i = 0; i < NUM_SENDBUF; i++) {
@@ -2603,7 +2650,7 @@
+ * responded yet.
+ */
+static void kgdbeth_begin_session(void) {
-+ kgdbeth_holdxlock();
++ kgdbeth_lock();
+ disable_irq(kgdb_netdevice->irq);
+ kgdb_eth_reply_arp();
+}
@@ -2611,7 +2658,7 @@
+static void kgdbeth_end_session(void)
+{
+ enable_irq(kgdb_netdevice->irq);
-+ kgdbeth_relxlock();
++ kgdbeth_unlock();
+}
+
+struct kgdb_serial kgdbeth_serial = {
@@ -2661,7 +2708,7 @@
+
+int kgdbeth_event(struct notifier_block * self, unsigned long val, void * data)
+{
-+ if (strcmp(((struct net_device *)data)->name, kgdb_netdevname)) {
++ if (strcmp(((struct net_device *)data)->name, kgdb_netdev_name)) {
+ goto out;
+ }
+ if (val!= NETDEV_UP)
@@ -2740,8 +2787,8 @@
+__setup("kgdbeth=", kgdbeth_opt);
Index: linux/include/asm-i386/kgdb.h
===================================================================
---- linux.orig/include/asm-i386/kgdb.h 2004-01-20 14:29:19.000000000 +0100
-+++ linux/include/asm-i386/kgdb.h 2004-01-20 14:29:19.000000000 +0100
+--- linux.orig/include/asm-i386/kgdb.h 2004-01-23 09:05:16.000000000 +0100
++++ linux/include/asm-i386/kgdb.h 2004-01-23 09:05:17.000000000 +0100
@@ -0,0 +1,49 @@
+#ifndef _ASM_KGDB_H_
+#define _ASM_KGDB_H_
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
next reply other threads:[~2004-01-23 8:18 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-01-23 8:18 Pavel Machek [this message]
2004-01-23 9:08 ` FYI: kgdb 2.1.0 interdiff Amit S. Kale
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=20040123081822.GA3382@elf.ucw.cz \
--to=pavel@ucw.cz \
--cc=amitkale@emsyssoft.com \
--cc=linux-kernel@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.