lkml.org 
[lkml]   [2004]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [RFC] [PATCH] add TRAP_BAD_SYSCALL_EXITS config for i386
> 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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 14:04    [from the cache]
©2003-2011 Jasper Spaans