This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC] [PATCH] To make systemtap work on Peter Anvin's register renaming patch


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 <srinivasa@in.ibm.com>




---
 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<s.macros.size(); i++)
     o << "EXTRA_CFLAGS += -D " << lex_cast_qstring(s.macros[i]) << endl;
Index: src/runtime/autoconf-nameidata.c
===================================================================
--- /dev/null
+++ src/runtime/autoconf-nameidata.c
@@ -0,0 +1,4 @@
+#include <linux/namei.h>
+
+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 <asm/ptrace.h>
+
+#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) &regs->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);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]