www.pudn.com > vrtxtst.rar > TASKINIT.C


/************************************************************************* 
 
	Copyright (c) 1999 Mentor Graphics Corporation. 
 
 
IMPORTANT - USE OF THIS SOFTWARE IS SUBJECT TO LICENSE RESTRICTIONS 
CAREFULLY READ THE LICENSE AGREEMENT BEFORE USING THE SOFTWARE 
 
 
*************************************************************************/ 
 
/* %M% - Allocates and initilizes the stack of a new thread */ 
 
#include "task.h" 
#include "kernel.h" 
#include "processor.h" 
 
/*---------------------------------------------------------------------------*/ 
/* 
 * vmc_taskinit - Initializes the stack and start address for the thread. 
 */ 
 
extern	void	vmc_ARMTaskStartup(void); 
 
#define	StackSlop	256 
 
void vmc_taskinit(tcbp, stk, stksize, taskaddr, arg) 
struct tentry  *tcbp; 
char *stk; 
int stksize; 
void (*taskaddr)(void *); 
int arg; 
{ 
	struct vmc_frame *frame; 
 
  tcbp->pregs = ((char *) stack_align(stk+stksize)) - sizeof(struct vmc_frame); 
  		/* Initialize stack pointer */ 
  frame = (struct vmc_frame *) (tcbp->pregs); 
  frame->cpsr = SVCMode;	/* Supervisor32 mode, IRQ & FIQ enable */ 
  frame->r4 = 0; 
  frame->r5 = 0; 
  frame->r6 = 0; 
  frame->r7 = 0; 
  frame->r8 = 0; 
  frame->r9 = 0;				/* sb - stack base */ 
  frame->r10 = (int) (stk + StackSlop);		/* sl - stack limit */ 
  frame->r11 = 0;				/* fp - frame pointer */ 
  frame->startup_pc = vmc_ARMTaskStartup; 
  frame->task_arg = arg; 
  frame->return_pc = vmc_userexit_ptr; 
  frame->task_pc = taskaddr; 
} 
/*---------------------------------------------------------------------------*/