#include <buffer.h> #include <bwio.h> #include <context-switch.h> #include <ipc.h> #include <priority-q.h> #include <scheduler.h> #include <syscall-handler.h> #include <td.h> #include <types.h> void handlerCreate(KernelStruct* Colonel) { // 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); pushToScheduler(Colonel, NewTask); Colonel->Active->RetVal = NewTask->TaskID; } int handlerSend(KernelStruct* Colonel) { int result; AP* Args = Colonel->Active->Args; //bwprintf(COM2,"handlerSend: Args->arg1: %d\n\r",Args->arg1); int A0 = (int)Args->arg0; int A2 = (int)Args->arg2; int A4 = (int)Args->arg4; result = doSend(Colonel, A0, Args->arg1, A2, Args->arg3,A4); return result; } int handlerReceive(KernelStruct* Colonel) { AP* Args = Colonel->Active->Args; int A0 = (int)Args->arg0; int A2 = (int)Args->arg2; int Result = doReceive(Colonel, A0, Args->arg1, A2); //bwprintf(COM2,"handlerReceive: doReceive got %d\n\r",Result); return Result; } int handlerReply(KernelStruct* Colonel) { 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; int Result = doReply(Colonel, A0, Reply, ReplyLen); //bwprintf(COM2,"handlerReply: doReply:%d\n\r",Result); return Result; } void handlerRecordNS(KernelStruct* Colonel){ AP* Args = Colonel->Active->Args; int NSTid = (int)Args->arg0; //bwprintf(COM2,"handlerRecordNS: name server tid:%d\n\r",NSTid); Colonel->NameServerID = NSTid; Colonel->Active->RetVal = 0; } void handlerWhoISRegAs(KernelStruct* Colonel){ AP* Args = Colonel->Active->Args; bwprintf(COM2,"handlerWhoIsRegas: Message :%s\n\r",((NSReq *)(Args->arg1))->Msg); //bwprintf(COM2,"handlerWhoIsRegas: MsgType:%d\n\r",((NSReq *)(Args->arg1))->MsgType); int result = doSend(Colonel,Colonel->NameServerID,Args->arg1,(int)Args->arg2,Args->arg3,(int)Args->arg4); //if(result != SUCCESS) bwprintf(COM2,"WhoIs failed!\n\r"); // to be finished, send kernel part function } void handlerGetAllSendQ(KernelStruct* Colonel){ AP* Args = Colonel->Active->Args; Colonel->Active->RetVal = (int)(Colonel->AllSendQ); } void Handle(KernelStruct* Colonel, int n) { // bwprintf(COM2,"Handle: n=%d\n\r",n); int result; 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: //bwprintf(COM2,"Handle: Task %d Passed\n\r",Colonel->Active->TaskID); PushToTDPQ(&((Colonel->ArrayPQ)[MAX_NUM_PRIORITY-1]),Colonel->Active); Colonel->Active = NULL; break; case SYS_Exit: (Colonel->Active)->TaskState = Zombie; Colonel->Active = NULL; break; case SYS_Send: result = handlerSend(Colonel); break; case SYS_Receive: result = handlerReceive(Colonel); break; case SYS_Reply: result = handlerReply(Colonel); break; case SYS_RecordNS: handlerRecordNS(Colonel); break; case SYS_WHOIS: handlerWhoISRegAs(Colonel); break; case SYS_REGAS: handlerWhoISRegAs(Colonel); break; case SYS_SENDQ: handlerGetAllSendQ(Colonel); break; } } void fakeExit(TD* Task){ 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; //bwprintf(COM2,"Fake Exit:r1 %d, lr %d, r2 %d, r0 %d\n\r",one,lr,two,zero); } int Activate(KernelStruct *Colonel,TD* Task) { 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,"Actvate: SWI number %d\n\r",SWI); // bwprintf(COM2,"Back to activate, SWI=%d\n\r", SWI); return SWI; //return r0; }