#include SYSCALLNOS /* Description of (most) MIPS system calls so SPIM can pass the correct arguments to the system when a user program executes a syscall in binary mode. */ typedef struct { int syscall_num; int syscall_type; int args[5]; char *syscall_name; } syscall_desc; enum {BAD_SYSCALL, UNIX_SYSCALL, SPC_SYSCALL}; enum {NO_ARG, INT_ARG, ADDR_ARG, STR_ARG, FD_ARG}; /* Type of argument */ syscall_desc syscall_table[] = { #include SYSCALLHEADER }; #define MAX_SYSCALL asize(syscall_table) #define SYSCALL_ARG(REGOFF, ARG, REG) \ ( (syscall_table[R[REGOFF]].args[ARG] == ADDR_ARG) ? mem_address_nullok(R[REG],C_WRITE) : \ (syscall_table[R[REGOFF]].args[ARG] == STR_ARG) ? mem_address_nullok(R[REG],C_WRITE) : \ ((syscall_table[R[REGOFF]].args[ARG] == FD_ARG) && (R[REG] < MAXFDS)) ? prog_fds[R[REG]] : R[REG])