diff --git a/ChangeLog b/ChangeLog index 0c144fe3..f2e78f49 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Dec 19 15:15:48 2005 Søren Sandmann + + * module/sysprof-module.c (timer_notify): A few formatting + fixes. Hopefully make it work with x86-64. + 2005-11-29 Soeren Sandmann * sysprof.c (on_descendants_row_expanded_or_collapsed): New diff --git a/TODO b/TODO index 9126453c..a277d85c 100644 --- a/TODO +++ b/TODO @@ -18,6 +18,8 @@ Before 1.0.1: Before 1.2: +* Make it compile and work on x86-64 + * Add "sysprof --version" * With kernel module not installed, select Profiler->Start, then dismiss diff --git a/module/sysprof-module.c b/module/sysprof-module.c index 1e911700..3c11b018 100644 --- a/module/sysprof-module.c +++ b/module/sysprof-module.c @@ -62,10 +62,12 @@ DECLARE_WAIT_QUEUE_HEAD (wait_for_exit); # define REG_FRAME_PTR rbp # define REG_INS_PTR rip # define REG_STACK_PTR rsp +# define REG_STACK_PTR0 rsp0 #elif defined(CONFIG_X86) # define REG_FRAME_PTR ebp # define REG_INS_PTR eip # define REG_STACK_PTR esp +# define REG_STACK_PTR0 esp0 #else # error Sysprof only supports the i386 and x86-64 architectures #endif @@ -135,16 +137,17 @@ timer_notify (struct pt_regs *regs) if (!is_user) { trace->addresses[i++] = (void *)0x01; - regs = (void *)current->thread.esp0 - sizeof (struct pt_regs); + /* FIXME: doesn't compile on x86-64 */ + regs = (void *)current->thread.REG_STACK_PTR0 - sizeof (struct pt_regs); } trace->addresses[i++] = (void *)regs->REG_INS_PTR; frame_pointer = (void *)regs->REG_FRAME_PTR; - while (((result = read_frame (frame_pointer, &frame)) == 0) && - i < SYSPROF_MAX_ADDRESSES && - ((unsigned long)frame_pointer) < START_OF_STACK && + while (((result = read_frame (frame_pointer, &frame)) == 0) && + i < SYSPROF_MAX_ADDRESSES && + ((unsigned long)frame_pointer) < START_OF_STACK && (unsigned long)frame_pointer >= regs->REG_STACK_PTR) { trace->addresses[i++] = (void *)frame.return_address;