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);
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;
}
doSend(Colonel,Colonel->NameServerID,Args->arg0,Args->arg1,Args->arg2,Args->arg3);
void Handle(KernelStruct* Colonel, int n) {
97
98
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
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:
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;