static struct frame_head *dump_user_backtrace(struct frame_head *head) { /* Also check accessibility of one struct frame_head beyond: */ struct frame_head bufhead[2]; unsigned long bytes; bytes = copy_from_user_nmi(bufhead, head, sizeof(bufhead)); if (bytes != sizeof(bufhead)) return NULL; oprofile_add_trace(bufhead[0].ret); /* frame pointers should strictly progress back up the stack * (towards higher addresses) */ if (head >= bufhead[0].bp) return NULL; return bufhead[0].bp; }
static struct stack_frame *dump_user_backtrace(struct stack_frame *head) { /* */ struct stack_frame bufhead[2]; unsigned long bytes; bytes = copy_from_user_nmi(bufhead, head, sizeof(bufhead)); if (bytes != sizeof(bufhead)) return NULL; oprofile_add_trace(bufhead[0].return_address); /* */ if (head >= bufhead[0].next_frame) return NULL; return bufhead[0].next_frame; }
static struct stack_frame_ia32 * dump_user_backtrace_32(struct stack_frame_ia32 *head) { /* Also check accessibility of one struct frame_head beyond: */ struct stack_frame_ia32 bufhead[2]; struct stack_frame_ia32 *fp; unsigned long bytes; bytes = copy_from_user_nmi(bufhead, head, sizeof(bufhead)); if (bytes != sizeof(bufhead)) return NULL; fp = (struct stack_frame_ia32 *) compat_ptr(bufhead[0].next_frame); oprofile_add_trace(bufhead[0].return_address); /* frame pointers should strictly progress back up the stack * (towards higher addresses) */ if (head >= fp) return NULL; return fp; }
static struct stack_frame_ia32 * dump_user_backtrace_32(struct stack_frame_ia32 *head) { /* */ struct stack_frame_ia32 bufhead[2]; struct stack_frame_ia32 *fp; unsigned long bytes; bytes = copy_from_user_nmi(bufhead, head, sizeof(bufhead)); if (bytes != sizeof(bufhead)) return NULL; fp = (struct stack_frame_ia32 *) compat_ptr(bufhead[0].next_frame); oprofile_add_trace(bufhead[0].return_address); /* */ if (head >= fp) return NULL; return fp; }