manjunath k wrote:
> Hi,
>
> Ive been using kprobes on X86 machine. when a probe is
> put on the sys_gettimeofday with the fault handler and the LTP
> testcase nptl01is executed the system is getting into an infintie
> loop.
I tried to recreate this problem on local system with latest 2.6.23-rc1
kernel, but I failed. May I know which kernel are you using??
=======================================
[root@llm27lp1 bin]# ./nptl01
nptl01 0 INFO : Starting test, please wait.
nptl01 0 INFO : Success thru loop 1 of 100000
nptl01 0 INFO : Success thru loop 2 of 100000
nptl01 0 INFO : Success thru loop 3 of 100000
nptl01 0 INFO : Success thru loop 4 of 100000
nptl01 0 INFO : Success thru loop 5 of 100000
nptl01 0 INFO : Success thru loop 6 of 100000
nptl01 0 INFO : Success thru loop 7 of 100000
nptl01 0 INFO : Success thru loop 8 of 100000
nptl01 0 INFO : Success thru loop 9 of 100000
nptl01 1 PASS : Test completed successfully!
=====================================================
[root@llm27lp1 ~]# cat /sys/kernel/debug/kprobes/list
c00000000002a7dc k .kretprobe_trampoline_holder+0x0
c000000000015740 k .compat_sys_gettimeofday+0x0
c000000000073404 k .sys_gettimeofday+0x0
=====================================================
>
> Please give me some information regarding this problem.
>
>
> -Manjunath
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}
\viewkind4\uc1\pard\f0\fs20 #include <linux/module.h>\par
#include <linux/init.h>\par
#include <linux/kprobes.h>\par
#include <linux/kallsyms.h>\par
#include <linux/utsname.h>\par
#include <asm/uaccess.h>\par
\par
static struct kprobe k_004_kpr;\par
\par
#include <asm/uaccess.h>\par
\par
void show_allregs(struct pt_regs * regs)\par
\{\par
unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L;\par
\par
printk("\\n");\par
printk("Pid: %d, comm: %20s\\n", current->pid, current->comm);\par
printk("EIP: %04x:[<%08lx>] CPU: %d\\n",0xffff & regs->xcs,regs->eip,\par
smp_processor_id());\par
print_symbol("EIP is at %s\\n", regs->eip);\par
\par
if (user_mode(regs))\par
printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp);\par
/*\par
printk(" EFLAGS: %08lx (%s %.*s)\\n",\par
regs->eflags, system_utsname.release,\par
(int)strcspn(system_utsname.version, " "),\par
system_utsname.version);\par
*/\par
\par
printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\\n",\par
regs->eax,regs->ebx,regs->ecx,regs->edx);\par
printk("ESI: %08lx EDI: %08lx EBP: %08lx",\par
regs->esi, regs->edi, regs->ebp);\par
printk(" DS: %04x ES: %04x\\n",\par
0xffff & regs->xds,0xffff & regs->xes);\par
\par
cr0 = read_cr0();\par
cr2 = read_cr2();\par
cr3 = read_cr3();\par
cr4 = read_cr4_safe();\par
printk("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\\n", cr0, cr2, cr3, cr4);\par
\}\par
\par
void k_004_CPY_FROM_USER(struct file *file, char *buf, int len)\par
\{\par
\par
char x = 'a';\par
\par
if (put_user(x, buf)) \{\par
printk("put_user : -EFAULT\\n");\par
\}\par
\par
printk("CPY_FROM_USER\\n");\par
\}\par
\par
static void __exit k_004_exit_probe(void)\par
\{\par
printk("\\nModule exiting from sys_gettimeofday \\n");\par
unregister_kprobe(&k_004_kpr);\par
\}\par
\par
static int k_004_before_hook(struct kprobe *k_004_kpr, struct pt_regs *p)\par
\{\par
int len = 500;\par
struct file *file = NULL;\par
\par
printk("\\nBefore hook in sys_gettimeofday");\par
printk("\\nThis is the Kprobe pre \\n"\par
"handler for instruction at" "%p\\n", k_004_kpr->addr);\par
printk("Stack Dump:\\n");\par
dump_stack();\par
show_allregs(p);\par
printk("The Registers are:\\n");\par
k_004_CPY_FROM_USER(file, NULL, len);\par
return 0;\par
\}\par
\par
static int k_004_after_hook(struct kprobe *k_004_kpr,\par
struct pt_regs *p, unsigned long flags)\par
\{\par
printk("\\nAfter hook in sys_gettimeofday");\par
printk("\\nThis is the Kprobe post \\n"\par
"handler for instruction at" " %p\\n", k_004_kpr->addr);\par
printk("Stack Dump:\\n");\par
dump_stack();\par
show_allregs(p);\par
printk("The Registers are:\\n");\par
return 0;\par
\}\par
\par
int k_004_fault_probe(struct kprobe *p, struct pt_regs *regs, int trapnr)\par
\{\par
printk("\\nThis is the Kprobe fault \\n"\par
"handler for sys_gettimeodday\\n");\par
printk("fault_handler:p->addr=0x%p\\n", p->addr);\par
printk("Stack Dump:\\n");\par
dump_stack();\par
show_allregs(regs);\par
printk("The Registers are:\\n");\par
return 0;\par
\}\par
\par
static int __init k_004_init_probe(void)\par
\{\par
printk("\\nInserting the kprobes for sys_gettimeofday\\n");\par
\par
/* Registering a kprobe */\par
k_004_kpr.pre_handler = (kprobe_pre_handler_t) k_004_before_hook;\par
k_004_kpr.post_handler = (kprobe_post_handler_t) k_004_after_hook;\par
k_004_kpr.fault_handler = (kprobe_fault_handler_t) k_004_fault_probe;\par
#if 0\par
k_004_kpr.addr =\par
(kprobe_opcode_t *) kallsyms_lookup_name("sys_gettimeofday");\par
if (k_004_kpr.addr == NULL) \{\par
printk("kallsyms_lookup_name could not find address "\par
"for the specified symbol name\\n");\par
return 1;\par
\}\par
#endif\par
k_004_kpr.symbol_name = "sys_gettimeofday";\par
if( register_kprobe(&k_004_kpr) <0 ) \{\par
printk("k-004.c: register_kprobe is failed\\n");\par
return -1;\par
\}\par
\par
printk("register_kprobe is successful\\n");\par
printk("\\nAddress where the kprobe is \\n"\par
"going to be inserted - %p\\n", k_004_kpr.addr);\par
register_kprobe(&k_004_kpr);\par
return 0;\par
\}\par
\par
module_init(k_004_init_probe);\par
module_exit(k_004_exit_probe);\par
\par
MODULE_DESCRIPTION("Kprobes test module");\par
MODULE_LICENSE("GPL");\par
}