[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[microblaze-uclinux] ### kernel thread function
Hi
In studying the 2.4 kernel, the function below
int kernel_thread (int (*fn)(void *), void *arg, unsigned long flags)
{
register mm_segment_t fs = get_fs ();
register unsigned long arg0;
register unsigned long ret;
/* Somewhere to save syscall return value */
unsigned long ret_sav;
/* Clone this thread. */
arg0 = flags | CLONE_VM;
asm volatile ( "addik r12, r0, %1 \n\t"
"addk r5, r0, %2 \n\t"
"brki r14, 0x8; \n\t"
"addk %0, r3, r0 \n\t"
: "=r" (ret)
: "i" (__NR_clone), "r" (arg0)
: "r3", "r4", "r5", "r12", "r14", "cc");
if (ret == 0) {
/* In child thread, call FN and exit. */
arg0 = (*fn) (arg);
asm volatile ( "addik r12, r0, %1 \n\t"
"addk r5, r0, %2 \n\t"
"brki r14, 0x8 \n\t"
"addk %0, r3, r0 \n\t"
: "=r" (ret)
: "i" (__NR_exit), "r" (arg0)
: "r3", "r4", "r5", "r12", "r14", "cc");
}
I have a few questions.
Mostly,
asm volatile ( "addik r12, r0, %1 \n\t"
"addk r5, r0, %2 \n\t"
"brki r14, 0x8; \n\t"
"addk %0, r3, r0 \n\t"
: "=r" (ret)
: "i" (__NR_clone), "r" (arg0)
: "r3", "r4", "r5", "r12", "r14", "cc");
It looks like this routine is saving the current PC into R14 and then
branching to 0x0000:0008. Isn't this the user interrupt vector? What is
supposed to be loaded here? Something to support context switching?
Thanks for any help
Steve Spano
___________________________
microblaze-uclinux mailing list
microblaze-uclinux@xxxxxxxxxxxxxx
Project Home Page : http://www.itee.uq.edu.au/~jwilliams/mblaze-uclinux
Mailing List Archive : http://www.itee.uq.edu.au/~listarch/microblaze-uclinux/