[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Proper fix for profile_pc on x86_64.



# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID a12e08eb0209f54b299c17f14ca6aec908d6fae8
# Parent  a3fbce644bcc4247f535b62590d30905c5f9c88e
Proper fix for profile_pc on x86_64.
Also enable CONFIG_FRAME_POINTER for dom0 and domU kernels.

Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>

diff -r a3fbce644bcc -r a12e08eb0209 buildconfigs/linux-defconfig_xen0_x86_32
--- a/buildconfigs/linux-defconfig_xen0_x86_32  Wed Feb  1 13:46:15 2006
+++ b/buildconfigs/linux-defconfig_xen0_x86_32  Wed Feb  1 15:01:04 2006
@@ -1228,7 +1228,7 @@
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
-# CONFIG_FRAME_POINTER is not set
+CONFIG_FRAME_POINTER=y
 CONFIG_EARLY_PRINTK=y
 # CONFIG_DEBUG_STACKOVERFLOW is not set
 # CONFIG_KPROBES is not set
diff -r a3fbce644bcc -r a12e08eb0209 buildconfigs/linux-defconfig_xen0_x86_64
--- a/buildconfigs/linux-defconfig_xen0_x86_64  Wed Feb  1 13:46:15 2006
+++ b/buildconfigs/linux-defconfig_xen0_x86_64  Wed Feb  1 15:01:04 2006
@@ -1173,7 +1173,7 @@
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_FS is not set
-# CONFIG_FRAME_POINTER is not set
+CONFIG_FRAME_POINTER=y
 # CONFIG_CHECKING is not set
 # CONFIG_INIT_DEBUG is not set
 # CONFIG_KPROBES is not set
diff -r a3fbce644bcc -r a12e08eb0209 buildconfigs/linux-defconfig_xenU_x86_32
--- a/buildconfigs/linux-defconfig_xenU_x86_32  Wed Feb  1 13:46:15 2006
+++ b/buildconfigs/linux-defconfig_xenU_x86_32  Wed Feb  1 15:01:04 2006
@@ -518,7 +518,7 @@
 CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
-# CONFIG_FRAME_POINTER is not set
+CONFIG_FRAME_POINTER=y
 CONFIG_EARLY_PRINTK=y
 # CONFIG_DEBUG_STACKOVERFLOW is not set
 # CONFIG_KPROBES is not set
diff -r a3fbce644bcc -r a12e08eb0209 buildconfigs/linux-defconfig_xenU_x86_64
--- a/buildconfigs/linux-defconfig_xenU_x86_64  Wed Feb  1 13:46:15 2006
+++ b/buildconfigs/linux-defconfig_xenU_x86_64  Wed Feb  1 15:01:04 2006
@@ -895,7 +895,7 @@
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_FS is not set
-# CONFIG_FRAME_POINTER is not set
+CONFIG_FRAME_POINTER=y
 # CONFIG_INIT_DEBUG is not set
 # CONFIG_KPROBES is not set
 
diff -r a3fbce644bcc -r a12e08eb0209 
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c  Wed Feb  1 13:46:15 2006
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c  Wed Feb  1 15:01:04 2006
@@ -58,6 +58,7 @@
 #include <asm/uaccess.h>
 #include <asm/processor.h>
 #include <asm/timer.h>
+#include <asm/sections.h>
 
 #include "mach_time.h"
 
@@ -541,22 +542,33 @@
 }
 
 #if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
+unsigned long profile_pc(struct pt_regs *regs)
+{
+       unsigned long pc = instruction_pointer(regs);
+
 #ifdef __x86_64__
-#define REG_BP rbp
+       /* Assume the lock function has either no stack frame or only a single 
word.
+          This checks if the address on the stack looks like a kernel text 
address.
+          There is a small window for false hits, but in that case the tick
+          is just accounted to the spinlock function.
+          Better would be to write these functions in assembler again
+          and check exactly. */
+       if (in_lock_functions(pc)) {
+               char *v = *(char **)regs->rsp;
+               if ((v >= _stext && v <= _etext) ||
+                       (v >= _sinittext && v <= _einittext) ||
+                       (v >= (char *)MODULES_VADDR  && v <= (char 
*)MODULES_END))
+                       return (unsigned long)v;
+               return ((unsigned long *)regs->rsp)[1];
+       }
 #else
-#define REG_BP ebp
-#endif
-unsigned long profile_pc(struct pt_regs *regs)
-{
-       unsigned long pc = instruction_pointer(regs);
-
        if (in_lock_functions(pc))
                return *(unsigned long *)(regs->REG_BP + 4);
+#endif
 
        return pc;
 }
 EXPORT_SYMBOL(profile_pc);
-#undef REG_BP
 #endif
 
 irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.