/************************************************************** * * 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 + 2; // OpenFileId starts from 2 (0=stdin, 1=stdout reserved) } return -1; } int SysWrite(char *buffer, int size, OpenFileId id) { if (size < 0) // Invalid size return -1; if (id == 1) { // Console output (stdout) for (int i = 0; i < size; i++) kernel->synchConsoleOut->PutChar(buffer[i]); return size; } int idx = id - 2; // Convert to 0-based index (ids 2+ are files) 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) { if (size < 0) // Invalid size return -1; if (id == 0) { // Console input (stdin) for (int i = 0; i < size; i++) buffer[i] = kernel->synchConsoleIn->GetChar(); return size; } int idx = id - 2; // Convert to 0-based index (ids 2+ are files) if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return -1; return kernel->fileSystem->fileDescriptorTable[idx]->Read(buffer, size); } int SysClose(OpenFileId id) { if (id == 0 || id == 1) // Cannot close console return 0; int idx = id - 2; // Convert to 0-based index (ids 2+ are files) 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__ */