types.h 2.02 KiB
#ifndef TYPES_H
#define TYPES_H
#define MAX_NUM_PRIORITY 8
#define MAX_NUM_TD 60
#define KERNEL_STACK (0xFFFFFFFF - 0x200000)
#define STACK_SIZE 0x80000 // 512 KB
#define USER_STACK_TOP (0x1E00000)
#define NULL 0
#define NAMESERVER_ID 6
#define NS_MESSAGE_MAX_LENGTH 16
#define NAME_LENGTH_MAX 16
#define HASH_SIZE
typedef enum NameServerMessageType {
WhoIs,
RegisterAs
} NSMsgType;
typedef struct NameServerRequest {
char Msg[NS_MESSAGE_MAX_LENGTH];
NSMsgType MsgType;
} NSReq;
typedef struct ArgumentPack{
void * arg0;
void * arg1;
void * arg2;
void * arg3;
}AP;
typedef enum taskstate {
Active,
Ready,
Blocked,
Init,
Zombie,
SendBlocked,
ReceiveBlocked,
ReplyBlocked
} State;
typedef enum prioritylvl {
Prio0,
Prio1,
Prio2,
Prio3,
Prio4,
Prio5,
Prio6,
Prio7
} PrioLvl;
struct taskDescriptor {
int* sp; //sp_usr
int* lr; // lr_svc
int spsr; //user's cpsr
int RetVal; // passing kernel's return value to user
AP* Args; //argument that user gives kernel
int TaskID;
int ParentID;
State TaskState;
PrioLvl TaskPriority;
struct taskDescriptor* NextFree;
struct taskDescriptor* NextInPQ;
};
typedef struct taskDescriptor TD;
typedef struct
{
TD* Head;
TD* Tail;
int Length;
} TDPQ;
typedef struct kernel {
TD* Active;
TDPQ ArrayPQ[MAX_NUM_PRIORITY];
TD Tasks[MAX_NUM_TD];
//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.
TD* FirstOfFreeList;
TD* LastOfFreeList;
int NumTDsAvail;
int NameServerID;
} KernelStruct;
typedef enum syscall {
SYS_Create,
SYS_MyTid,
SYS_ParentTid,
SYS_Pass,
SYS_Exit,
SYS_Send,
SYS_Receive,
SYS_Reply,
SYS_RecordNS,
SYS_WHOIS,
SYS_REGAS,
} Syscall;
typedef struct hash_table{
int *TidSequence;
char **NameSequence;
int size;
}HT;
#endif