From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12473 invoked by alias); 17 Jan 2008 06:56:04 -0000 Received: (qmail 12458 invoked by uid 22791); 17 Jan 2008 06:56:02 -0000 X-Spam-Status: No, hits=-3.4 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_22,J_CHICKENPOX_27,J_CHICKENPOX_83,RCVD_IN_DNSWL_MED,SPF_PASS X-Spam-Check-By: sourceware.org Received: from e28smtp05.in.ibm.com (HELO e28esmtp05.in.ibm.com) (59.145.155.5) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 17 Jan 2008 06:55:32 +0000 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by e28esmtp05.in.ibm.com (8.13.1/8.13.1) with ESMTP id m0H6tMdC010842 for ; Thu, 17 Jan 2008 12:25:22 +0530 Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v8.7) with ESMTP id m0H6tLDg1040470 for ; Thu, 17 Jan 2008 12:25:21 +0530 Received: from d28av04.in.ibm.com (loopback [127.0.0.1]) by d28av04.in.ibm.com (8.13.1/8.13.3) with ESMTP id m0H6tLS9003295 for ; Thu, 17 Jan 2008 06:55:21 GMT Received: from [9.124.35.69] ([9.124.35.69]) by d28av04.in.ibm.com (8.13.1/8.12.11) with ESMTP id m0H6tKSV003290; Thu, 17 Jan 2008 06:55:21 GMT Message-ID: <478EFBEE.7090406@in.ibm.com> Date: Thu, 17 Jan 2008 06:56:00 -0000 From: Srinivasa Ds User-Agent: Thunderbird 2.0.0.6 (X11/20071022) MIME-Version: 1.0 To: Masami Hiramatsu CC: "Frank Ch. Eigler" , SystemTAP Subject: Re: [RFC] [PATCH] To make systemtap work on Peter Anvin's register renaming patch References: <475E5B32.90408@in.ibm.com> <475EADFA.2050400@redhat.com> In-Reply-To: <475EADFA.2050400@redhat.com> Content-Type: multipart/mixed; boundary="------------090604080108090108090703" X-Virus-Checked: Checked by ClamAV on sourceware.org X-IsSubscribed: yes Mailing-List: contact systemtap-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: systemtap-owner@sourceware.org X-SW-Source: 2008-q1/txt/msg00079.txt.bz2 This is a multi-part message in MIME format. --------------090604080108090108090703 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 498 Masami Hiramatsu wrote: > > > That patch is for -mm tree, so we can't use KERNEL_VERSION. > Instead of that, I recommend using autoconf. > The below attached patch makes systemtap to work on Peter Anvin's register renaming patch for x86/x86_64 (which is currently present in -mm tree). The same patch is attached in bug#5549. http://sources.redhat.com/bugzilla/attachment.cgi?id=2182&action=view Please let me know the comments on this. Signed-off-by: Srinivasa DS --------------090604080108090108090703 Content-Type: text/x-patch; name="reg_rename.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="reg_rename.patch" Content-length: 8987 --- buildrun.cxx | 3 + runtime/autoconf-nameidata.c | 4 ++ runtime/autoconf-x86-uniregs.c | 6 +++ runtime/loc2c-runtime.h | 32 ++++++++++++++++ runtime/procfs.c | 6 +++ runtime/regs.c | 79 +++++++++++++++++++++++++++++++++++++++-- runtime/regs.h | 5 ++ runtime/stack-i386.c | 4 ++ 8 files changed, 135 insertions(+), 4 deletions(-) Index: src/buildrun.cxx =================================================================== --- src.orig/buildrun.cxx +++ src/buildrun.cxx @@ -88,6 +88,9 @@ compile_pass (systemtap_session& s) o << module_cflags << " += $(call stap_check_build, $(SYSTEMTAP_RUNTIME)/autoconf-constant-tsc.c, -DSTAPCONF_CONSTANT_TSC,)" << endl; o << module_cflags << " += $(call stap_check_build, $(SYSTEMTAP_RUNTIME)/autoconf-tsc-khz.c, -DSTAPCONF_TSC_KHZ,)" << endl; o << module_cflags << " += $(call stap_check_build, $(SYSTEMTAP_RUNTIME)/autoconf-ktime-get-real.c, -DSTAPCONF_KTIME_GET_REAL,)" << endl; + o << module_cflags << " += $(call stap_check_build, $(SYSTEMTAP_RUNTIME)/autoconf-x86-uniregs.c, -DSTAPCONF_X86_UNIREGS,)" << endl; + + o << module_cflags << " += $(call stap_check_build, $(SYSTEMTAP_RUNTIME)/autoconf-nameidata.c, -DSTAPCONF_NAMEIDATA_CLEANUP,)" << endl; for (unsigned i=0; i + +struct nameidata nd __attribute__ ((unused)) = {.path={(void *)0}}; + Index: src/runtime/autoconf-x86-uniregs.c =================================================================== --- /dev/null +++ src/runtime/autoconf-x86-uniregs.c @@ -0,0 +1,6 @@ +#include + +#if defined (__i386__) || defined (__x86_64__) +struct pt_regs regs = {.ax = 0x0}; +#endif + Index: src/runtime/loc2c-runtime.h =================================================================== --- src.orig/runtime/loc2c-runtime.h +++ src/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). Index: src/runtime/procfs.c =================================================================== --- src.orig/runtime/procfs.c +++ src/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); Index: src/runtime/regs.c =================================================================== --- src.orig/runtime/regs.c +++ src/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_r */ #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; Index: src/runtime/regs.h =================================================================== --- src.orig/runtime/regs.h +++ src/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 Index: src/runtime/stack-i386.c =================================================================== --- src.orig/runtime/stack-i386.c +++ src/runtime/stack-i386.c @@ -21,7 +21,11 @@ static void __stp_stack_print (struct pt #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); --------------090604080108090108090703--