All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Whitcroft <apw@shadowen.org>
To: akpm@osdl.org, apw@shadowen.org
Cc: linux-kernel@vger.kernel.org
Subject: Re: [RFC] [PATCH] add TRAP_BAD_SYSCALL_EXITS config for i386
Date: Wed, 7 Jul 2004 14:55:13 +0100	[thread overview]
Message-ID: <200407071355.i67DtDF1019243@voidhawk.shadowen.org> (raw)
In-Reply-To: <20040702163219.7ec698e2.akpm@osdl.org>

> The TRAP_BAD_SYSCALL stuff is actually a bloa^Wfeature which was added
> via the kgdb patch, so it is not in -bk.
> 
> I've never used it, dunno what it does.  I'll roll your two patches into the
> kgdb patches in -mm, thanks.

This adds code to the syscall return path to check that we are
not returning with preempt_count() != 0.  I think that this is a
pretty useful diagnostics tool.  I think that this part should be
split off and considered for inclusion separatly from the GBD part.
It seems that they intended to cause a breakpoint when this occurs.
The small assembly stub combined with something like the patch
below would stand alone.  I've used it as a diagnotics tool.

I could put together a patch to separate this functionality off
from the GDB patches.  If you agree its worthwhile I am happy to
talk to the GDB people about it.

-apw

=== 8< ===
When we detect that a system call has returned with preempt still disabled
report this situation, including the system call number, return value and
preempt value, as well a dropping a register dump.  In the spirit of other
oops handling attempt to recover from it and continue.

Revision: $Rev: 371 $

Signed-off-by: Andy Whitcroft <apw@shadowen.org>

---

diff -X /home/apw/brief/lib/vdiff.excl -rupN reference/arch/i386/kernel/entry.S current/arch/i386/kernel/entry.S
--- reference/arch/i386/kernel/entry.S	2004-07-07 14:34:58.000000000 +0100
+++ current/arch/i386/kernel/entry.S	2004-07-07 14:40:19.000000000 +0100
@@ -317,7 +317,13 @@ restore_all:
 	cmpl $0,TI_preempt_count(%ebp)  # non-zero preempt_count ?
 	jz resume_kernelX
 
-        int $3
+        movl %esp, %ebx			# Record the original register dump
+	movl ORIG_EAX(%esp), %eax	# Recover the return value from syscall
+
+	pushl EAX(%esp)			# Recover the original system call #
+	pushl %eax
+	pushl %ebx
+	call do_bad_syscall_exit
 
 resume_kernelX:
 #endif
diff -X /home/apw/brief/lib/vdiff.excl -rupN reference/arch/i386/kernel/traps.c current/arch/i386/kernel/traps.c
--- reference/arch/i386/kernel/traps.c	2004-07-07 14:34:59.000000000 +0100
+++ current/arch/i386/kernel/traps.c	2004-07-07 14:56:37.000000000 +0100
@@ -874,6 +874,20 @@ asmlinkage void do_spurious_interrupt_bu
 #endif
 }
 
+#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
+void do_bad_syscall_exit(struct pt_regs *regs, long syscall, long error_code)
+{
+	/*
+	 * Report the preempt count.  Then fix it so we can kill the
+	 * process and continue.  We _may_ get away with it.
+	 */
+	printk("Bad syscall exit - syscall %ld returned %ld preempt %08x\n",
+		syscall, error_code, preempt_count());
+	preempt_count() = 0;
+	die("Bad syscall exit - preempt non-zero", regs, syscall);
+}
+#endif
+
 /*
  *  'math_state_restore()' saves the current math information in the
  * old math state array, and gets the new ones from the current task

      reply	other threads:[~2004-07-07 13:55 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-07-02 16:28 [RFC] [PATCH] add TRAP_BAD_SYSCALL_EXITS config for i386 Andy Whitcroft
2004-07-02 23:32 ` Andrew Morton
2004-07-07 13:55   ` Andy Whitcroft [this message]

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=200407071355.i67DtDF1019243@voidhawk.shadowen.org \
    --to=apw@shadowen.org \
    --cc=akpm@osdl.org \
    --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.