[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/