[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |