From db79bcdf6af1a21517d42ad139ff72fa8654951c Mon Sep 17 00:00:00 2001 From: Gerald Britton Date: Tue, 14 Feb 2006 10:19:04 -0500 Subject: [PATCH] --- yaml --- r: 20287 b: refs/heads/master c: 303794400992b907b7cac0d91788603636c7e0fe h: refs/heads/master i: 20285: b2af7b4cdc0b19a0f4c2c010248a1531e16c22d4 20283: 50b6105b2176a5c02fe9fef59d5c82f6f3e5fe60 20279: d39435d4b05659c70aec2cd586660bee5d35be4c 20271: aa80f321b21ac0a1f5fcb5a22619aff70038e3b8 20255: 7a7eda3e5e0350c9ea83373a2e1576f409ade8d0 20223: 69c304238afb1bac00819a7a473bbf52cf7c20c7 v: v3 --- [refs] | 2 +- trunk/arch/i386/oprofile/backtrace.c | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index df434c17dad1..35b9b9e308bb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b739db79a434aec89027a109d85de305e6bdeb93 +refs/heads/master: 303794400992b907b7cac0d91788603636c7e0fe diff --git a/trunk/arch/i386/oprofile/backtrace.c b/trunk/arch/i386/oprofile/backtrace.c index acc18138fb22..c049ce414f01 100644 --- a/trunk/arch/i386/oprofile/backtrace.c +++ b/trunk/arch/i386/oprofile/backtrace.c @@ -20,7 +20,20 @@ struct frame_head { } __attribute__((packed)); static struct frame_head * -dump_backtrace(struct frame_head * head) +dump_kernel_backtrace(struct frame_head * head) +{ + oprofile_add_trace(head->ret); + + /* frame pointers should strictly progress back up the stack + * (towards higher addresses) */ + if (head >= head->ebp) + return NULL; + + return head->ebp; +} + +static struct frame_head * +dump_user_backtrace(struct frame_head * head) { struct frame_head bufhead[2]; @@ -105,10 +118,10 @@ x86_backtrace(struct pt_regs * const regs, unsigned int depth) if (!user_mode_vm(regs)) { while (depth-- && valid_kernel_stack(head, regs)) - head = dump_backtrace(head); + head = dump_kernel_backtrace(head); return; } while (depth-- && head) - head = dump_backtrace(head); + head = dump_user_backtrace(head); }