Skip to content
Snippets Groups Projects
syscall-handler.c 4.02 KiB
Newer Older
#include <syscall-handler.h>
#include <context-switch.h>
#include <priority-q.h>
Tom Feng's avatar
Tom Feng committed
#include <td.h>
#include <types.h>
#include <scheduler.h>
#include <bwio.h>
#include <buffer.h>
void handlerCreate(KernelStruct* Colonel) {
aht2nguy's avatar
aht2nguy committed
//	bwprintf(COM2,"handlerCreate: just in\n\r");

	//bwprintf(COM2,"SP in handel %d\n\r", SP_Usr);
	//asm volatile("ldmfd r3!,{r0-r2,r4}\n\t");
	AP *Args = Colonel->Active->Args;
	int A0 = (int)Args->arg0;
	int A1 = (int)Args->arg1;
	int A2 = (int)Args->arg2;
	int A3 = (int)Args->arg3;
	//bwprintf(COM2,"%d\n\r",arg0);
	//bwprintf(COM2,"%d %d\n\r",SP_Usr,(1+SP_Usr+3));
	//bwprintf(COM2,"%d %d %d %d \n\r",A0,A1,A2,A3);
	PrioLvl P = (PrioLvl) (A0);
	TD* NewTask = CreateTask(Colonel,P,(void *)A1);
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	
aht2nguy's avatar
aht2nguy committed
	pushToScheduler(Colonel, NewTask);
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	
aht2nguy's avatar
aht2nguy committed
	Colonel->Active->RetVal = NewTask->TaskID;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
}

antnh6@gmail.com's avatar
antnh6@gmail.com committed
void handlerSend(TD* Task, int TaskID, char* Msg, int MsgLen, char* Reply, int ReplyLen) {
	int result;
	AP* Args = Colonel->Active->Args;

	int A0 = (int)Args->arg0; 
	int A1 = (int)Args->arg1;  
	int A2 = (int)Args->arg2;  
	int A3 = (int)Args->arg3;  
	int A4 = (int)Args->arg4

	char* Msg = (char*)A1;
	int MsgLen = (int)A2;
	char* Reply = (char*)A3;
	int ReplyLen = (int)A4;

	Result = doSend(Colonel, A0, Msg, MsgLen, Reply, ReplyLen);
	
	Colonel->Active->RetVal = Colonel->Active->TaskID;
}
int handlerReceive(int TaskID, void* Msg, int MsgLen) {
	AP* Args = Colonel->Active->Args;

	int A0 = (int)Args->arg0; 
	int A1 = (int)Args->arg1; 
	int A2 = (int)Args->arg2;

	void* Msg = (void*)A1;
	int MsgLen = (int)A2;

antnh6@gmail.com's avatar
antnh6@gmail.com committed
	int Result = doReceive(Colonel, A0, Msg, MsgLen);
	return Result;
int handlerReply(int TaskID, void* Reply, int ReplyLen) {
	AP* Args = Colonel->Active->Args;
	int A0 = (int)Args->arg0; 
	int A1 = (int)Args->arg1; 
	int A2 = (int)Args->arg2;
	void* Reply = (void*)A1;
	int ReplyLen = (int)A2;

antnh6@gmail.com's avatar
antnh6@gmail.com committed
	int Result = doReply(Colonel, A0, Reply, ReplyLen);
	return Result;
Tom Feng's avatar
Tom Feng committed

void handlerRecordNS(KernelStruct* Colonel){
  AP* Args = Colonel->Active->Args;
  int NSTid = (int)Ars->arg0;
  Colonel->NameServerID = NSTid;
}

Tom Feng's avatar
Tom Feng committed
void handlerWhoIsRegAs(KernelStruct* Colonel){
Tom Feng's avatar
Tom Feng committed
  AP* Args = Colonel->Active->Args;
Tom Feng's avatar
Tom Feng committed
  doSend(Colonel,Colonel->NameServerID,Args->arg0,Args->arg1,Args->arg2,Args->arg3);
Tom Feng's avatar
Tom Feng committed
  // to be finished, send kernel part function
}

void Handle(KernelStruct* Colonel, int n) {
aht2nguy's avatar
aht2nguy committed
//	bwprintf(COM2,"Handle: n=%d\n\r",n);
Tom Feng's avatar
Tom Feng committed
  switch(n) {
  case SYS_Create:
    //bwprintf(COM2,"before, Args = %d\n\r",Args);
    handlerCreate(Colonel); 
    break;
  case SYS_MyTid:
    (Colonel->Active)->RetVal = (Colonel->Active)->TaskID;
    pushToScheduler(Colonel,Colonel->Active);
    Colonel->Active = NULL;
    break;
  case SYS_ParentTid:
    (Colonel->Active)->RetVal = (Colonel->Active)->ParentID;
    pushToScheduler(Colonel,Colonel->Active);
    Colonel->Active = NULL;
    break;
  case SYS_Pass:
    pushToScheduler(Colonel,Colonel->Active);
    Colonel->Active = NULL;
    break;
  case SYS_Exit:
    (Colonel->Active)->TaskState = Zombie;
    Colonel->Active = NULL;
    break;
  case SYS_Send:
    break;
    
  case SYS_Receive:
    break;
    
  case SYS_Reply:
    break;
aht2nguy's avatar
aht2nguy committed

Tom Feng's avatar
Tom Feng committed
  case SYS_RecordNS:
    handlerRecordNS(Colonel);
    break;
  case SYS_WHOIS:
Tom Feng's avatar
Tom Feng committed
    handlerWhoISRegAs(Colonel);
Tom Feng's avatar
Tom Feng committed
    break;
  case SYS_REGAS:
Tom Feng's avatar
Tom Feng committed
    handlerWhoIsRegAs(Colonel);
Tom Feng's avatar
Tom Feng committed
    break;
  }
Tom Feng's avatar
Tom Feng committed
void fakeExit(TD* Task){
aht2nguy's avatar
aht2nguy committed
	asm volatile("ldmfd r0, {r0-r3}\n\t");
	register int r1 asm("r0");
	int one = r1;
	register int r2 asm("r1");
	int lr = r2;
	register int r3 asm("r2");
	int two = r3;
	register int r4 asm("r3");
	int zero = r4;
Tom Feng's avatar
Tom Feng committed

aht2nguy's avatar
aht2nguy committed
	bwprintf(COM2,"Fake Exit:r1 %d, lr %d, r2 %d, r0 %d\n\r",one,lr,two,zero);
Tom Feng's avatar
Tom Feng committed
}

int Activate(KernelStruct *Colonel,TD* Task) {
aht2nguy's avatar
aht2nguy committed
	if(Colonel->Active == NULL) Colonel->Active = Task;
	//fakeExit(Task);
//	bwprintf(COM2, "Activate: about to kerxit\n\r");
	//  bwprintf(COM2,"Activate: sp %d, lr %d\n\r",Task->sp, Task->lr);
	kerxit(Task);
	//register int r1 asm("r1");
	//((Colonel->Active)->Arg) =(AP *)(r1);
	register int r0 asm("r0");
	int SWI = r0;
	//bwprintf(COM2,"Argument: %d\n\r",TaskSP);
//	bwprintf(COM2,"Back to activate, SWI=%d\n\r", SWI);
	return SWI;
	//return r0;