[lkml]   [2004]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    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.


    === 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 <>


    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

    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

    +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);
    * '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
    More majordomo info at
    Please read the FAQ at
     \ /
      Last update: 2005-03-22 14:04    [W:0.045 / U:0.160 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site