diff --git a/.vscode/settings.json b/.vscode/settings.json index ba6819fb151abe4904017b8f9cfea44dca3d92ab..4f6fdb85a7c576adb057f85922bed0a7e532dabb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,6 +4,7 @@ "bwio.h": "c", "kernel.h": "c", "scheduler.h": "c", - "k1.h": "c" + "k1.h": "c", + "buffer.h": "c" } } \ No newline at end of file diff --git a/include/buffer.h b/include/buffer.h new file mode 100644 index 0000000000000000000000000000000000000000..144ee4b35ec56c236d2e8da8e896635c07cc4ed2 --- /dev/null +++ b/include/buffer.h @@ -0,0 +1,14 @@ +#ifndef BUFFER_H +#define BUFFER_H + +// FIFO queue + +Pair* MakePair(int TaskID, char* Msg); + +void PushToBuffer(Buffer B, int TaskID, char* Msg); + +Pair* FrontBuffer(Buffer* B); + +int PopFrontBuffer(Buffer* B); + +#endif \ No newline at end of file diff --git a/include/ipc.h b/include/ipc.h new file mode 100644 index 0000000000000000000000000000000000000000..9c4eeb700eb786e6f3b9b3de775c0658454a1270 --- /dev/null +++ b/include/ipc.h @@ -0,0 +1,10 @@ +#ifndef IPC_H +#define IPC_H + +int doSend(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen, void* Reply, int ReplyLen); + +int doReceive(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen); + +int doReply(KernelStruct* Colonel, int TaskID, void* Reply, int ReplyLen); + +#endif diff --git a/include/syscall.h b/include/syscall.h index d663f11c61903eae63e1e1c2d54c7af0c8f30465..2e740f62ea09f7809b23d2896b4b86ba2d2edc77 100644 --- a/include/syscall.h +++ b/include/syscall.h @@ -20,7 +20,7 @@ void Exit(); int Send (int TaskID, void* Msg, int MsgLen, void* Reply, int ReplyLen) {}; -int Receive (int* TaskID, void* Msg, int MsgLen) {}; +int Receive (int TaskID, void* Msg, int MsgLen) {}; int Reply (int TaskID, void* Reply, int ReplyLen) {}; diff --git a/include/types.h b/include/types.h index af8af1bb088c1652af998c1f85b880181e83906b..4029831e9f42b32c6160846d85358b284d6a8c08 100644 --- a/include/types.h +++ b/include/types.h @@ -1,6 +1,9 @@ #ifndef TYPES_H #define TYPES_H +#define SUCCESS 0 +#define FAILURE -1 + #define MAX_NUM_PRIORITY 8 #define MAX_NUM_TD 60 @@ -10,31 +13,57 @@ #define NULL 0 -#define NAMESERVER_ID 6 +#define NAMESERVER_TID 6 #define NS_MESSAGE_MAX_LENGTH 16 +#define MSG_TRUNCATED -1 +#define TASK_DNE -2 +#define SRR_FAILED -3 +#define TASK_NOT_REPLY_BLOCKED -3 +#define NAMESERVER_TID_INVALID -1 +#define MAX_NUM_BUFFER 20 + + #define NAME_LENGTH_MAX 16 -#define HASH_SIZE +#define HASH_SIZE 257 + + +typedef struct pair { + int TaskID; + char* Msg; + Pair* Next; +} Pair; + +typedef struct buffer { + Pair* Head; + Pair* Tail; + int Num; +} Buffer; typedef enum NameServerMessageType { WhoIs, RegisterAs } NSMsgType; -typedef struct NameServerRequest { +typedef struct NameServerRequest{ + int TaskID; char Msg[NS_MESSAGE_MAX_LENGTH]; NSMsgType MsgType; } NSReq; +typedef struct NameServerMessage { + char Msg[NS_MESSAGE_MAX_LENGTH]; +} NSMsg; + typedef struct ArgumentPack{ void * arg0; void * arg1; void * arg2; void * arg3; + void * arg4; }AP; - typedef enum taskstate { Active, Ready, @@ -85,6 +114,7 @@ typedef struct kernel { TD* Active; TDPQ ArrayPQ[MAX_NUM_PRIORITY]; TD Tasks[MAX_NUM_TD]; + Buffer B; //index is TaskID; value of 1 = alive // a free list of pointers to free TDs. This might take the form of bits set in a couple of words. WHAT? // a structure for keeping the request currently being serviced, including its arguments. diff --git a/lib/buffer.c b/lib/buffer.c new file mode 100644 index 0000000000000000000000000000000000000000..6369d7622e6dc92ec424f697e5d81270ce72a72c --- /dev/null +++ b/lib/buffer.c @@ -0,0 +1,41 @@ +#include <buffer.h> +#include <types.h> + +void BufferInit(Buffer* B) { + B->Num = 0; +} + +Pair* MakePair(int TaskID, char* Msg) { + Pair* P; + P->TaskID = TaskID; + P->Msg = Msg; + P->Next = NULL; + return P; +} + +void PushToBuffer(Buffer* B, int TaskID, char* Msg) { + Pair* New = MakePair(TaskID, Msg); + if (B) { + if (B->Head == NULL) { + B->Head = New; + B->Tail = New; + } + else { + New->Next = B->Head; + B->Head = New; + } + B->Num += 1; + } +} + +Pair* FrontBuffer(Buffer* B) { + if (B && B->Head) return B->Head; + return FAILURE; +} + +int PopFrontBuffer(Buffer* B) { + if (B && B->Head) { + B->Head = B->Head->Next; + B->Num -= 1; + } else return FAILURE; +} diff --git a/lib/ipc.c b/lib/ipc.c new file mode 100644 index 0000000000000000000000000000000000000000..ef3ed0f21e038c2e6400dbb0c047af02b8c32ee0 --- /dev/null +++ b/lib/ipc.c @@ -0,0 +1,16 @@ +#include <ipc.h> +#include <kernel.h> + +int doSend(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen, void* Reply, int ReplyLen) { + +} + +int doReceive(KernelStruct* Colonel, int TaskID, void* Msg, int MsgLen) { + +} + +int doReply(KernelStruct* Colonel, int TaskID, void* Reply, int ReplyLen) { + +} + + diff --git a/lib/nameserver.c b/lib/nameserver.c index 63423d7eea13dab19f14218bb8b2a739bce03ae7..32d0300653e51df6b72707a4d441807dfea7353f 100644 --- a/lib/nameserver.c +++ b/lib/nameserver.c @@ -1,13 +1,48 @@ #include <nameserver.h> #include <tools.h> + +int WhoIs(char* Name) { + NSReqMsg SendMsg, ReplyMsg; + int Status; + AP Args; + register int r0 asm ("r0"); + SendMsg.MsgType = WhoIs; + stringCopy(SendMsg.Msg, Name, NS_MESSAGE_MAX_LENGTH); + + Args.arg0 = SendMsg; + Args.arg1 = sizeof(NSMsg); + Args.arg2 = ReplyMsg; + Args.arg3 = sizeof(NSMsg); + + asm volatile ("swi 5\n\t"); + + Status = r0; + + if (Status == sizeof(NSMsg)) return ReplyMsg.TaskID; // TODO FIXME TODO + else return NAMESERVER_TID_INVALID; +} -int WhoIs (char* Name); int RegisterAs (char* Name) { - NameServerRequest Req; - int Status = 0; - Req.MsgType = RegisterAs; - stringCopy(Req.Msg, Name, NS_MESSAGE_MAX_LENGTH); - Status = Send() \ No newline at end of file + NSReqMsg SendMsg, ReplyMsg; + int Status; + AP Args; + register int r0 asm ("r0"); + + SendMsg.MsgType = RegisterAs; + stringCopy(SendMsg.Msg, Name, NS_MESSAGE_MAX_LENGTH); + + Args.arg0 = SendMsg; + Args.arg1 = sizeof(NSMsg); + Args.arg2 = ReplyMsg; + Args.arg3 = sizeof(NSMsg); + + asm volatile ("swi 5\n\t"); + + Status = r0; + + if (Status == sizeof(NSMsg)) return SUCCESS; + else return NAMESERVER_TID_INVALID; +} \ No newline at end of file diff --git a/lib/syscall-handler.c b/lib/syscall-handler.c index 9ccb891ba86f067f81feba74767b609f0282ff0f..4c95eab75ba32f595addbd81eaa78ddc855516f1 100644 --- a/lib/syscall-handler.c +++ b/lib/syscall-handler.c @@ -5,6 +5,7 @@ #include <types.h> #include <scheduler.h> #include <bwio.h> +#include <buffer.h> void handlerCreate(KernelStruct* Colonel) { // bwprintf(COM2,"handlerCreate: just in\n\r"); @@ -25,19 +26,59 @@ void handlerCreate(KernelStruct* Colonel) { Colonel->Active->RetVal = NewTask->TaskID; } +<<<<<<< HEAD void handlerSend(TD* Task, int TaskID, char* Msg, int MsgLen, char* Reply, int ReplyLen) { int result; +======= + +int handlerSend(KernelStruct* Colonel) { + int Result; +>>>>>>> f845a6b4431f235529ed4297cf336ccd623a7a5f AP* Args = Colonel->Active->Args; - int A0 = (int)Args->arg0; // Msg - int A1 = (int)Args->arg1; // MsgLen - int A2 = (int)Args->arg2; // Reply - int A3 = (int)Args->arg3; // ReplyLen - result = handlerSend() + + 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); + } -void handlerReceive(int* TaskID, void* Msg, int MsgLen) {} +int handlerReply(int TaskID, void* Reply, int ReplyLen) { + AP* Args = Colonel->Active->Args; -void handlerReply(int TaskID, void* Reply, int ReplyLen) {} + 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); + +} @@ -54,6 +95,7 @@ void handlerWhoIS(KernelStruct* Colnel){ void Handle(KernelStruct* Colonel, int n) { // bwprintf(COM2,"Handle: n=%d\n\r",n); +<<<<<<< HEAD switch(n) { case SYS_Create: @@ -97,6 +139,43 @@ void Handle(KernelStruct* Colonel, int n) { 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; + case SYS_Send: + (Colonel->Active)->RetVal = handlerSend(Colonel); + break; + + case SYS_Receive: + (Colonel->Active)->RetVal = handlerReceive(Colonel); + break; + + case SYS_Reply: + (Colonel->Active)->RetVal = handlerReply(Colonel); + break; + } +>>>>>>> f845a6b4431f235529ed4297cf336ccd623a7a5f } void fakeExit(TD* Task){ diff --git a/lib/syscall.c b/lib/syscall.c index c8d39408777e31e387ff3b55ce6f701809e5024e..f0e38bdfd81eb3a59a1d4d77dddc09853df54b90 100644 --- a/lib/syscall.c +++ b/lib/syscall.c @@ -45,6 +45,7 @@ void Exit() { asm volatile ("swi 4\n\t"); } +// tid is that of the one its sending to int Send (int TaskID, void* Msg, int MsgLen, void* Reply, int ReplyLen) { asm volatile ("swi 5\n\t"); register int RetVal asm("r0"); @@ -52,13 +53,18 @@ int Send (int TaskID, void* Msg, int MsgLen, void* Reply, int ReplyLen) { return Return; } -int Receive (int* TaskID, void* Msg, int MsgLen) { + + +int Receive (int TaskID, void* Msg, int MsgLen) { asm volatile ("swi 6\n\t"); register int RetVal asm("r0"); int Return = RetVal; return Return; } +/* +The calling task and the sender return at the same logical time. If they are of the same priority the sender runs first. +*/ int Reply (int TaskID, void* Reply, int ReplyLen) { asm volatile ("swi 7\n\t"); register int RetVal asm("r0");