forked from luck/tmp_suning_uos_patched
d0aaff9796
There are possible race conditions if probes are placed on routines within the kprobes files and routines used by the kprobes. For example if you put probe on get_kprobe() routines, the system can hang while inserting probes on any routine such as do_fork(). Because while inserting probes on do_fork(), register_kprobes() routine grabs the kprobes spin lock and executes get_kprobe() routine and to handle probe of get_kprobe(), kprobes_handler() gets executed and tries to grab kprobes spin lock, and spins forever. This patch avoids such possible race conditions by preventing probes on routines within the kprobes file and routines used by kprobes. I have modified the patches as per Andi Kleen's suggestion to move kprobes routines and other routines used by kprobes to a seperate section .kprobes.text. Also moved page fault and exception handlers, general protection fault to .kprobes.text section. These patches have been tested on i386, x86_64 and ppc64 architectures, also compiled on ia64 and sparc64 architectures. Signed-off-by: Prasanna S Panchamukhi <prasanna@in.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
55 lines
849 B
C
55 lines
849 B
C
#ifndef _LINUX_LINKAGE_H
|
|
#define _LINUX_LINKAGE_H
|
|
|
|
#include <linux/config.h>
|
|
#include <asm/linkage.h>
|
|
|
|
#ifdef __cplusplus
|
|
#define CPP_ASMLINKAGE extern "C"
|
|
#else
|
|
#define CPP_ASMLINKAGE
|
|
#endif
|
|
|
|
#ifndef asmlinkage
|
|
#define asmlinkage CPP_ASMLINKAGE
|
|
#endif
|
|
|
|
#ifndef prevent_tail_call
|
|
# define prevent_tail_call(ret) do { } while (0)
|
|
#endif
|
|
|
|
#ifndef __ALIGN
|
|
#define __ALIGN .align 4,0x90
|
|
#define __ALIGN_STR ".align 4,0x90"
|
|
#endif
|
|
|
|
#ifdef __ASSEMBLY__
|
|
|
|
#define ALIGN __ALIGN
|
|
#define ALIGN_STR __ALIGN_STR
|
|
|
|
#define ENTRY(name) \
|
|
.globl name; \
|
|
ALIGN; \
|
|
name:
|
|
|
|
#define KPROBE_ENTRY(name) \
|
|
.section .kprobes.text, "ax"; \
|
|
.globl name; \
|
|
ALIGN; \
|
|
name:
|
|
|
|
|
|
#endif
|
|
|
|
#define NORET_TYPE /**/
|
|
#define ATTRIB_NORET __attribute__((noreturn))
|
|
#define NORET_AND noreturn,
|
|
|
|
#ifndef FASTCALL
|
|
#define FASTCALL(x) x
|
|
#define fastcall
|
|
#endif
|
|
|
|
#endif
|