diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/loc2c-runtime.h | 32 | ||||
-rw-r--r-- | runtime/procfs.c | 6 | ||||
-rw-r--r-- | runtime/regs.c | 79 | ||||
-rw-r--r-- | runtime/regs.h | 5 | ||||
-rw-r--r-- | runtime/stack-i386.c | 4 |
5 files changed, 122 insertions, 4 deletions
diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h index 8dbff764..4674e399 100644 --- a/runtime/loc2c-runtime.h +++ b/runtime/loc2c-runtime.h @@ -75,7 +75,37 @@ }) -#if defined __i386__ +#if defined (STAPCONF_X86_UNIREGS) && defined (__i386__) + +#define dwarf_register_0(regs) regs->ax +#define dwarf_register_1(regs) regs->cx +#define dwarf_register_2(regs) regs->dx +#define dwarf_register_3(regs) regs->bx +#define dwarf_register_4(regs) ((long) ®s->sp) +#define dwarf_register_5(regs) regs->bp +#define dwarf_register_6(regs) regs->si +#define dwarf_register_7(regs) regs->di + +#elif defined (STAPCONF_X86_UNIREGS) && defined (__x86_64__) + +#define dwarf_register_0(regs) regs->ax +#define dwarf_register_1(regs) regs->dx +#define dwarf_register_2(regs) regs->cx +#define dwarf_register_3(regs) regs->bx +#define dwarf_register_4(regs) regs->si +#define dwarf_register_5(regs) regs->di +#define dwarf_register_6(regs) regs->bp +#define dwarf_register_7(regs) regs->sp +#define dwarf_register_8(regs) regs->r8 +#define dwarf_register_9(regs) regs->r9 +#define dwarf_register_10(regs) regs->r10 +#define dwarf_register_11(regs) regs->r11 +#define dwarf_register_12(regs) regs->r12 +#define dwarf_register_13(regs) regs->r13 +#define dwarf_register_14(regs) regs->r14 +#define dwarf_register_15(regs) regs->r15 + +#elif defined __i386__ /* The stack pointer is unlike other registers. When a trap happens in kernel mode, it is not saved in the trap frame (struct pt_regs). diff --git a/runtime/procfs.c b/runtime/procfs.c index eb0f845c..1b1d5447 100644 --- a/runtime/procfs.c +++ b/runtime/procfs.c @@ -87,8 +87,14 @@ int _stp_mkdir_proc_module(void) goto done; } } else { + #ifdef STAPCONF_NAMEIDATA_CLEANUP + _stp_proc_stap = PDE(nd.path.dentry->d_inode); + path_put (&nd.path); + + #else _stp_proc_stap = PDE(nd.dentry->d_inode); path_release (&nd); + #endif } _stp_proc_root = proc_mkdir(THIS_MODULE->name, _stp_proc_stap); diff --git a/runtime/regs.c b/runtime/regs.c index bc717695..5e08e376 100644 --- a/runtime/regs.c +++ b/runtime/regs.c @@ -33,7 +33,13 @@ unsigned long _stp_ret_addr (struct pt_regs *regs) { -#ifdef __x86_64__ +#if defined (STAPCONF_X86_UNIREGS) && (defined (__x86_64__) || defined (__i386__)) + unsigned long *ra = (unsigned long *)regs->sp; + if (ra) + return *ra; + else + return 0; +#elif defined (__x86_64__) unsigned long *ra = (unsigned long *)regs->rsp; if (ra) return *ra; @@ -77,7 +83,76 @@ unsigned long _stp_ret_addr (struct pt_regs *regs) */ #define _stp_probe_addr_r(ri) (ri->rp->kp.addr) -#ifdef __x86_64__ +#if defined (STAPCONF_X86_UNIREGS) && defined (__x86_64__) + +void _stp_print_regs(struct pt_regs * regs) +{ + unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs; + unsigned int fsindex,gsindex; + unsigned int ds,cs,es; + + _stp_printf("RIP: %016lx\nRSP: %016lx EFLAGS: %08lx\n", regs->ip, regs->sp, regs->flags); + _stp_printf("RAX: %016lx RBX: %016lx RCX: %016lx\n", + regs->ax, regs->bx, regs->cx); + _stp_printf("RDX: %016lx RSI: %016lx RDI: %016lx\n", + regs->dx, regs->si, regs->di); + _stp_printf("RBP: %016lx R08: %016lx R09: %016lx\n", + regs->bp, regs->r8, regs->r9); + _stp_printf("R10: %016lx R11: %016lx R12: %016lx\n", + regs->r10, regs->r11, regs->r12); + _stp_printf("R13: %016lx R14: %016lx R15: %016lx\n", + regs->r13, regs->r14, regs->r15); + + asm("movl %%ds,%0" : "=r" (ds)); + asm("movl %%cs,%0" : "=r" (cs)); + asm("movl %%es,%0" : "=r" (es)); + asm("movl %%fs,%0" : "=r" (fsindex)); + asm("movl %%gs,%0" : "=r" (gsindex)); + + rdmsrl(MSR_FS_BASE, fs); + rdmsrl(MSR_GS_BASE, gs); + rdmsrl(MSR_KERNEL_GS_BASE, shadowgs); + + asm("movq %%cr0, %0": "=r" (cr0)); + asm("movq %%cr2, %0": "=r" (cr2)); + asm("movq %%cr3, %0": "=r" (cr3)); + asm("movq %%cr4, %0": "=r" (cr4)); + + _stp_printf("FS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n", + fs,fsindex,gs,gsindex,shadowgs); + _stp_printf("CS: %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds, es, cr0); + _stp_printf("CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3, cr4); +} + + #elif defined (STAPCONF_X86_UNIREGS) && defined (__i386__) + +void _stp_print_regs(struct pt_regs * regs) +{ + unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L; + + _stp_printf ("EIP: %08lx\n",regs->ip); + _stp_printf ("ESP: %08lx\n",regs->sp); + _stp_printf ("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n", + regs->ax,regs->bx,regs->cx,regs->dx); + _stp_printf ("ESI: %08lx EDI: %08lx EBP: %08lx", + regs->si, regs->di, regs->bp); + _stp_printf (" DS: %04x ES: %04x\n", + 0xffff & regs->ds,0xffff & regs->es); + + __asm__("movl %%cr0, %0": "=r" (cr0)); + __asm__("movl %%cr2, %0": "=r" (cr2)); + __asm__("movl %%cr3, %0": "=r" (cr3)); + /* This could fault if %cr4 does not exist */ + __asm__("1: movl %%cr4, %0 \n" + "2: \n" + ".section __ex_table,\"a\" \n" + ".long 1b,2b \n" + ".previous \n" + : "=r" (cr4): "0" (0)); + _stp_printf ("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n", cr0, cr2, cr3, cr4); +} + +#elif defined (__x86_64__) void _stp_print_regs(struct pt_regs * regs) { unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs; diff --git a/runtime/regs.h b/runtime/regs.h index 0887d628..c1e2344b 100644 --- a/runtime/regs.h +++ b/runtime/regs.h @@ -11,8 +11,11 @@ #ifndef _REGS_H_ /* -*- linux-c -*- */ #define _REGS_H_ +#if defined (STAPCONF_X86_UNIREGS) && (defined (__x86_64__) || defined (__i386__)) +#define REG_IP(regs) regs->ip +#define REG_SP(regs) regs->sp -#ifdef __x86_64__ +#elif defined (__x86_64__) #define REG_IP(regs) regs->rip #define REG_SP(regs) regs->rsp diff --git a/runtime/stack-i386.c b/runtime/stack-i386.c index 3675fc97..d73f4c84 100644 --- a/runtime/stack-i386.c +++ b/runtime/stack-i386.c @@ -21,7 +21,11 @@ static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels) #ifdef CONFIG_FRAME_POINTER { + #ifdef STAPCONF_X86_UNIREGS + unsigned long ebp = regs->bp; + #elif unsigned long ebp = regs->ebp; + #endif while (_stp_valid_stack_ptr(context, (unsigned long)ebp)) { addr = *(unsigned long *)(ebp + 4); |