> The function thread_saved_pc() is a mystery to me. It is declared with
> a return type of unsigned long, and yet return this:
>
> ((unsigned long *)tsk->thread->esp)[3]
>
> This is confusing to me in many ways:
> - the "thread" member of task struct is not a pointer
> - esp is of type unsigned long, so I don't understand the cast, and
> I certainly don't understand the [3] here.
>
> Can anyone explain this code to me?
The problem is an interdependency between processor.h and sched.h.
The old code was the same, except it did
t->esp
where t was a thread_struct, instead of what we do now
t->thread->esp
where t is a task_struct. And thus whereby before we passed
p->thread
as the argument, now you pass just `p'. I.e., its the same net-affect.
The error is because the function needs access to both task_struct (in
sched.h) and thread_struct (in processor.h) but the two are interrelated
so we can't include them in each other.
The contents of esp is a memory address, so typecasting it to (unsigned
long *) is OK.
As for the [3], p[3] is the same as
*(p+3)
ie,
*(p+sizeof(p))
so that is legal.
So the fix, aside from reverting this change and the kernel/sched.c
change and the sparc64 changes ... would be to solve the dependency
issue.
Robert Love
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/