/************************************************************** * * userprog/ksyscall.h * * Kernel interface for systemcalls * * by Marcus Voelp (c) Universitaet Karlsruhe * **************************************************************/ #ifndef __USERPROG_KSYSCALL_H__ #define __USERPROG_KSYSCALL_H__ #define INT_BUF_LENGTH 13 #include "kernel.h" #include "synchconsole.h" void SysHalt() { kernel->interrupt->Halt(); } int SysAdd(int op1, int op2) { return op1 + op2; } int SysCreate(char *filename) { // return value // 1: success // 0: failed return kernel->interrupt->CreateFile(filename); } void SysPrintInt(int value) { kernel->interrupt->PrintInt(value); } OpenFileId SysOpen(char *name) { for (int i = 0; i < 20; i++) if (kernel->fileSystem->fileDescriptorTable[i] == NULL) { kernel->fileSystem->fileDescriptorTable[i] = kernel->fileSystem->Open(name); if (kernel->fileSystem->fileDescriptorTable[i] == NULL) return -1; return i + 1; // OpenFileId starts from 1 } return -1; } int SysWrite(char *buffer, int size, OpenFileId id) { int idx = id - 1; // Convert 1-based id to 0-based index if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return -1; return kernel->fileSystem->fileDescriptorTable[idx]->Write(buffer, size); } int SysRead(char *buffer, int size, OpenFileId id) { int idx = id - 1; // Convert 1-based id to 0-based index if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return -1; return kernel->fileSystem->fileDescriptorTable[idx]->Read(buffer, size); } int SysClose(OpenFileId id) { int idx = id - 1; // Convert 1-based id to 0-based index if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return 0; delete kernel->fileSystem->fileDescriptorTable[idx]; kernel->fileSystem->fileDescriptorTable[idx] = NULL; return 1; } #endif /* ! __USERPROG_KSYSCALL_H__ */