#include <syscall-handler.h> #include <context-switch.h> #include <priority-q.h> #include <td.h> #include <types.h> #include <scheduler.h> #include <bwio.h> #include <buffer.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; } 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; 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; int Result = doReply(Colonel, A0, Reply, ReplyLen); return Result; } void handlerRecordNS(KernelStruct* Colonel){ AP* Args = Colonel->Active->Args; int NSTid = (int)Ars->arg0; Colonel->NameServerID = NSTid; } void handlerWhoIsRegAs(KernelStruct* Colonel){ AP* Args = Colonel->Active->Args; doSend(Colonel,Colonel->NameServerID,Args->arg0,Args->arg1,Args->arg2,Args->arg3); // to be finished, send kernel part function } } void Handle(KernelStruct* Colonel, int n) { // bwprintf(COM2,"Handle: n=%d\n\r",n); 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; case SYS_RecordNS: handlerRecordNS(Colonel); break; case SYS_WHOIS: handlerWhoISRegAs(Colonel); break; case SYS_REGAS: handlerWhoIsRegAs(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,"Argument: %d\n\r",TaskSP); // bwprintf(COM2,"Back to activate, SWI=%d\n\r", SWI); return SWI; //return r0; }