Newer
Older
#include <syscall-handler.h>
#include <context-switch.h>
#include <priority-q.h>
// 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;
int handlerSend(KernelStruct* Colonel) {
int Result;
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;
Result = doReceive(Colonel, A0, Msg, MsgLen);
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;
Result = doReply(Colonel, A0, Reply, ReplyLen);
}
void handlerRecordNS(KernelStruct* Colonel){
AP* Args = Colonel->Active->Args;
int NSTid = (int)Ars->arg0;
Colonel->NameServerID = NSTid;
}
void handlerWhoIS(KernelStruct* Colnel){
AP* Args = Colonel->Active->Args;
// to be finished, send kernel part function
}
void Handle(KernelStruct* Colonel, int n) {
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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:
handlerWhoIS(Colonel);
break;
case SYS_REGAS:
handlerRegAs(Colonel);
break;
}
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;
(Colonel->Active)->RetVal = handlerSend(Colonel);
(Colonel->Active)->RetVal = handlerReceive(Colonel);
(Colonel->Active)->RetVal = handlerReply(Colonel);
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);
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;