Hi Joel.

On Tue, Jan 26, 2010 at 03:23:03AM +0530, Joel Fernandes wrote:
> I am having some trouble accessing 'current' to get the currently
> executing task in kgdb (x86_64).
> 
> As current is a macro, I can't expand it in kgdb, so instead I'm
> trying to access the variable per_cpu__current_task inorder to get the
> task_struct for the currently executing task. But the memory address
> of this variable is 0xb000 (which kgdb cannot access) so I'm guessing
> each CPU has an offset stored somewhere to which if I add 0xb000 would
> give me the actual address of per_cpu__current_task for that CPU? Any
> idea where I could find this per-cpu offset?
> 
> I'm thinking of having a function return current and call that from
> gdb but that's extra code and is ugly.
> Is there an easier way to access 'current' from the debugger?

The thread_info structure, which contains a pointer to the 'current'
task_struct, lies at the bottom of the kernel mode stack and can be
accessed by performing some simple math on the kernel mode stack
pointer.

Here's a snippet from arch/x86/include/asm/thread_info.h which you can
use to learn more:

static inline struct thread_info *current_thread_info(void)
{
        return (struct thread_info *)
                (current_stack_pointer & ~(THREAD_SIZE - 1));
}

You can wrap this operation into a GDB script and use that to access current.
The following snippet is for an x86 setup but you should be able to derive
something useful.

define show_current
  set $thread_info = $sp &0xffffe000
  printf "$current=0x%08lX\n", (((struct thread_info *)($current))->task)
end

GDB should allow you to hook this function in a way that it is "refreshed" on
every break which is needed but you'll need to figure that out using the GDB 
manuals.

Cheers,
Robin

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [email protected]
Please read the FAQ at http://kernelnewbies.org/FAQ

Reply via email to