/* syscalls.h * Nachos system call interface. These are Nachos kernel operations * that can be invoked from user programs, by trapping to the kernel * via the "syscall" instruction. * * This file is included by user programs and by the Nachos kernel. * * Copyright (c) 1992-1993 The Regents of the University of California. * All rights reserved. See copyright.h for copyright notice and limitation * of liability and disclaimer of warranty provisions. */ #ifndef SYSCALLS_H #define SYSCALLS_H /* system call codes -- used by the stubs to tell the kernel which system call * is being asked for */ #define SC_Halt 0 #define SC_Exit 1 #define SC_Exec 2 #define SC_Join 3 #define SC_Create 4 #define SC_Open 5 #define SC_Read 6 #define SC_Write 7 #define SC_Close 8 #define SC_Fork 9 #define SC_Yield 10 #define SC_Remove 11 #ifndef IN_ASM /* The system call interface. These are the operations the Nachos * kernel needs to support, to be able to run user programs. * * Each of these is invoked by a user program by simply calling the * procedure; an assembly language stub stuffs the system call code * into a register, and traps to the kernel. The kernel procedures * are then invoked in the Nachos kernel, after appropriate error checking, * from the system call entry point in exception.cc. */ /* Stop Nachos, and print out performance stats */ void Halt(); /* Address space control operations: Exit, Exec, and Join */ /* This user program is done (status = 0 means exited normally). */ void Exit(int status); /* A unique identifier for an executing user program (address space) */ typedef int SpaceId; /* Run the executable, stored in the Nachos file "name", and return the * address space identifier */ SpaceId Exec(char *name); /* Only return once the the user program "id" has finished. * Return the exit status. */ int Join(SpaceId id); /* File system operations: Create, Open, Read, Write, Close * These functions are patterned after UNIX -- files represent * both files *and* hardware I/O devices. * * If this assignment is done before doing the file system assignment, * note that the Nachos file system has a stub implementation, which * will work for the purposes of testing out these routines. */ /* A unique identifier for an open Nachos file. */ typedef int OpenFileId; /* when an address space starts up, it has two open files, representing * keyboard input and display output (in UNIX terms, stdin and stdout). * Read and Write can be used directly on these, without first opening * the console device. */ #define ConsoleInput 0 #define ConsoleOutput 1 /* Create a Nachos file, with "name" */ void Create(char *name); /* Open the Nachos file "name", and return an "OpenFileId" that can * be used to read and write to the file. */ OpenFileId Open(char *name); /* Write "size" bytes from "buffer" to the open file. */ void Write(char *buffer, int size, OpenFileId id); /* Read "size" bytes from the open file into "buffer". * Return the number of bytes actually read -- if the open file isn't * long enough, or if it is an I/O device, and there aren't enough * characters to read, return whatever is available (for I/O devices, * you should always wait until you can return at least one character). */ int Read(char *buffer, int size, OpenFileId id); /* Close the file, we're done reading and writing to it. */ void Close(OpenFileId id); /* User-level thread operations: Fork and Yield. To allow multiple * threads to run within a user program. */ /* Fork a thread to run a procedure ("func") in the *same* address space * as the current thread. */ void Fork(void (*func)()); /* Yield the CPU to another runnable thread, whether in this address space * or not. */ void Yield(); #endif /* IN_ASM */ #endif /* SYSCALL_H */