<> <> <> <> <> <> <<>> <> <> <> DIRECTORY ProcessorFace USING [GetProcessorType], UnixSysCalls, UnixTypes ; UnixSysCallsImpl: CEDAR PROGRAM IMPORTS ProcessorFace EXPORTS UnixSysCalls ~ { OPEN UnixTypes; Accept: PUBLIC UNSAFE PROC [s: FD, addr: SockAddrPtr, addrLen: INTPtr] RETURNS [FD] ~ UNCHECKED { accept: UNSAFE PROC [s: FD, addr: SockAddrPtr, addrLen: INTPtr] RETURNS [FD] ~ UNCHECKED MACHINE CODE { "XR_Accept" }; RETURN[ accept[s, addr, addrLen] ]; }; Access: PUBLIC PROC [path: CHARPtr, mode: Mode] RETURNS [RES] ~ TRUSTED { access: PROC [path: CHARPtr, mode: Mode] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_Access" }; RETURN[ access[path, mode] ]; }; <> <> <> <> <> Bind: PUBLIC PROC [s: FD, name: SockAddrPtr, nameLen: INT] RETURNS [RES] ~ { bind: PROC [s: FD, name: SockAddrPtr, nameLen: INT] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_Bind" }; RETURN[ bind[s, name, nameLen] ]; }; <> <> <<>> <> ChMod: PUBLIC PROC [path: CHARPtr, mode: Mode] RETURNS [RES] ~ { chmod: PROC [path: CHARPtr, mode: Mode] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_ChMod" }; RETURN[ chmod[path, mode] ]; }; FChMod: PUBLIC PROC [fd: FD, mode: Mode] RETURNS [RES] ~ { fchmod: PROC [fd: FD, mode: Mode] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_FChMod" }; RETURN[ fchmod[fd, mode] ]; }; <> <> <> Close: PUBLIC PROC [fd: FD] RETURNS [RES] ~ { close: PROC [fd: FD] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_Close" }; RETURN[ close[fd] ]; }; Connect: PUBLIC PROC [s: FD, name: SockAddrPtr, nameLen: INT] RETURNS [RES] ~ { connect: PROC [s: FD, name: SockAddrPtr, nameLen: INT] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_Connect" }; RETURN[ connect[s, name, nameLen] ]; }; <> <> <> <> <> FCntl: PUBLIC PROC [fd: FD, cmd: INT, arg: INT] RETURNS [RES] ~ { fcntl: PROC [fd: FD, cmd: INT, arg: INT] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_FCntl" }; RETURN[ fcntl[fd, cmd, arg] ]; }; FCntl4: PUBLIC PROC [fd: FD, cmd: INT, arg: INT, doInIOP: BOOL] RETURNS [RES] ~ { fcntl4: PROC [fd: FD, cmd: INT, arg: INT, doInIOP: BOOL] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_FCntl4" }; RETURN[ fcntl4[fd, cmd, arg, doInIOP] ]; }; <> <> FSync: PUBLIC PROC [fd: FD] RETURNS [RES] ~ { fsync: PROC [fd: FD] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_FSync" }; RETURN[ fsync[fd] ]; }; <> <> <<>> GetDEnts: PUBLIC UNSAFE PROC [fd: FD, buf: CHARPtr, nBytes: INT] RETURNS [INT] ~ UNCHECKED { getdents: UNSAFE PROC [fd: FD, buf: CHARPtr, nBytes: INT] RETURNS [INT] ~ UNCHECKED MACHINE CODE { "XR_GetDEnts" }; RETURN[ getdents[fd, buf, nBytes] ]; }; <> GetDomainName: PUBLIC UNSAFE PROC [name: CHARPtr, nameLen: INT] RETURNS [RES] ~ UNCHECKED { getdomainname: UNSAFE PROC [name: CHARPtr, nameLen: INT] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_GetDomainName" }; RETURN[ getdomainname[name, nameLen] ]; }; GetDTableSize: PUBLIC PROC RETURNS [INT] ~ { getdtablesize: PROC RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_GetDTableSize" }; RETURN[ getdtablesize[] ]; }; GetGID: PUBLIC PROC RETURNS [GID] ~ { getgid: PROC RETURNS [GID] ~ TRUSTED MACHINE CODE { "XR_GetGID" }; RETURN[ getgid[] ]; }; GetEGID: PUBLIC PROC RETURNS [GID] ~ { getegid: PROC RETURNS [GID] ~ TRUSTED MACHINE CODE { "XR_GetEGID" }; RETURN[ getegid[] ]; }; GetGroups: PUBLIC UNSAFE PROC [gidSetLen: INT, gidSet: GIDsPtr] RETURNS [nGroups: INT] ~ UNCHECKED { getgroups: UNSAFE PROC [gidSetLen: INT, gidSet: GIDsPtr] RETURNS [INT] ~ UNCHECKED MACHINE CODE { "XR_GetGroups" }; RETURN[ getgroups[gidSetLen, gidSet] ]; }; <> GetHostID: PUBLIC PROC RETURNS [INT] ~ { gethostid: PROC RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_GetHostID" }; RETURN[ gethostid[] ]; }; GetHostName: PUBLIC UNSAFE PROC [name: CHARPtr, nameLen: INT] RETURNS [RES] ~ UNCHECKED { gethostname: UNSAFE PROC [name: CHARPtr, nameLen: INT] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_GetHostName" }; RETURN[ gethostname[name, nameLen] ]; }; <> <> <> GetMsg: PUBLIC UNSAFE PROC [fd: FD, ctlPtr, dataPtr: StrBufPtr, flags: POINTER TO RSFlags] RETURNS [GetResult] ~ UNCHECKED { getmsg: UNSAFE PROC [fd: FD, ctlPtr, dataPtr: StrBufPtr, flags: POINTER TO RSFlags] RETURNS [GetResult] ~ UNCHECKED MACHINE CODE { "XR_GetMsg" }; RETURN[ getmsg[fd, ctlPtr, dataPtr, flags] ]; }; GetPageSize: PUBLIC PROC RETURNS [INT] ~ { getpagesize: PROC RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_GetPageSize" }; RETURN[ getpagesize[] ]; }; GetPeerName: PUBLIC UNSAFE PROC [s: FD, name: SockAddrPtr, nameLen: INTPtr] RETURNS [RES] ~ UNCHECKED { getpeername: UNSAFE PROC [s: FD, name: SockAddrPtr, nameLen: INTPtr] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_GetPeerName" }; RETURN[ getpeername[s, name, nameLen] ]; }; GetPID: PUBLIC PROC RETURNS [INT] ~ { getpid: PROC RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_GetPID" }; RETURN[ getpid[] ]; }; GetPPID: PUBLIC PROC RETURNS [INT] ~ { getppid: PROC RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_GetPPID" }; RETURN[ getppid[] ]; }; <> <> <> <> RUsagePtr: TYPE = LONG POINTER TO RUsage; GetRUsage: PUBLIC UNSAFE PROC [who: Who, rusage: RUsagePtr] RETURNS [RES] ~ UNCHECKED { getrusage: UNSAFE PROC [who: Who, rusage: RUsagePtr] RETURNS [RES] ~ MACHINE CODE { "XR_GetRUsage"}; RETURN[ getrusage[who, rusage] ]; }; GetSockName: PUBLIC UNSAFE PROC [s: FD, name: SockAddrPtr, nameLen: INTPtr] RETURNS [RES] ~ UNCHECKED { getsockname: UNSAFE PROC [s: FD, name: SockAddrPtr, nameLen: INTPtr] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_GetSockName" }; RETURN[ getsockname[s, name, nameLen] ]; }; GetSockOpt: PUBLIC UNSAFE PROC [s: FD, level: INT, optName: INT, optVal: CHARPtr, optLen: INTPtr] RETURNS [RES] ~ UNCHECKED { getsockopt: UNSAFE PROC [s: FD, level: INT, optName: INT, optVal: CHARPtr, optLen: INTPtr] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_GetSockOpt" }; RETURN[ getsockopt[s, level, optName, optVal, optLen] ]; }; SetSockOpt: PUBLIC PROC [s: FD, level: INT, optName: INT, optVal: CHARPtr, optLen: INT] RETURNS [RES] ~ { setsockopt: PROC [s: FD, level: INT, optName: INT, optVal: CHARPtr, optLen: INT] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_SetSockOpt" }; RETURN[ setsockopt[s, level, optName, optVal, optLen] ]; }; GetTimeOfDay: PUBLIC UNSAFE PROC [tp: TimeValPtr, tzp: TimeZonePtr] RETURNS [RES] ~ UNCHECKED { gettimeofday: UNSAFE PROC [tp: TimeValPtr, tzp: TimeZonePtr] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_GetTimeOfDay" }; RETURN[ gettimeofday[tp, tzp] ]; }; <> GetUID: PUBLIC PROC RETURNS[UID] ~ { getuid: PROC RETURNS [UID] ~ TRUSTED MACHINE CODE { "XR_GetUID" }; RETURN[ getuid[] ]; }; GetEUID: PUBLIC PROC RETURNS[UID] ~ { geteuid: PROC RETURNS [UID] ~ TRUSTED MACHINE CODE { "XR_GetEUID" }; RETURN[ geteuid[] ]; }; IOCtl: PUBLIC UNSAFE PROC [d: FD, request: INT, argp: CHARPtr] RETURNS [RES] ~ UNCHECKED { <<... only a subset of the full Unix capability. >> ioctl: UNSAFE PROC [d: FD, request: INT, argp: CHARPtr] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_IOCtl" }; RETURN[ ioctl[d, request, argp] ]; }; IOCtl4: PUBLIC UNSAFE PROC [d: FD, request: INT, argp: CHARPtr, doInIOP: BOOL] RETURNS [RES] ~ { ioctl4: PROC [d: FD, request: INT, argp: CHARPtr, doInIOP: BOOL] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_IOCtl4" }; RETURN[ ioctl4[d, request, argp, doInIOP] ]; }; Kill: PUBLIC PROC [pid: PID, sig: Signal] RETURNS [RES] ~ { kill: PROC [pid: PID, sig: Signal] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_Kill" }; RETURN[ kill[pid, sig] ]; }; KillPG: PUBLIC PROC [pgrp: PGRP, sig: Signal] RETURNS [RES] ~ { killpg: PROC [pgrp: PGRP, sig: Signal] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_KillPG" }; RETURN[ killpg[pgrp, sig] ]; }; Link: PUBLIC PROC [name1, name2: CHARPtr] RETURNS [RES] ~ { link: PROC [name1, name2: CHARPtr] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_Link" }; RETURN[ link[name1, name2] ]; }; Listen: PUBLIC PROC [s: FD, backlog: INT] RETURNS [RES] ~ { listen: PROC [s: FD, backlog: INT] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_Listen" }; RETURN[ listen[s, backlog] ]; }; LSeek: PUBLIC PROC [d: FD, offset: INT, whence: Whence] RETURNS [INT] ~ { lseek: PROC [d: FD, offset: INT, whence: Whence] RETURNS [INT] ~ TRUSTED MACHINE CODE { "XR_LSeek" }; RETURN[ lseek[d, offset, whence] ]; }; MInCore: PUBLIC UNSAFE PROC [addr: CHARPtr, len: INT, vec: CHARPtr] RETURNS [RES] ~ UNCHECKED { mincore: UNSAFE PROC [addr: CHARPtr, len: INT, vec: CHARPtr] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_MInCore" }; RETURN[ mincore[addr, len, vec] ]; }; MkDir: PUBLIC PROC [path: CHARPtr, mode: Mode] RETURNS [RES] ~ { mkdir: PROC [path: CHARPtr, mode: Mode] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_MkDir" }; RETURN[ mkdir[path, mode] ]; }; MkNod: PUBLIC PROC [path: CHARPtr, mode: Mode, dev: INT] RETURNS [RES] ~ { mknod: PROC [path: CHARPtr, mode: Mode, dev: INT] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_MkNod" }; RETURN[ mknod[path, mode, dev] ]; }; MMap: PUBLIC UNSAFE PROC [addr: RawVM, nbytes: CARD, prot: Protections, flags: MMapFlags, d: FD, offset: CARD] RETURNS [RES] ~ { <> mmap: PROC [addr: RawVM, nbytes: CARD, prot: Protections, flags: INT, d: FD, offset: CARD] RETURNS [RawVM] ~ TRUSTED MACHINE CODE { ".XR_MMap" -- the proc is really in , but the constants we need are in }; ConstructMMapFlags: PROC [shared, private, fixed: BOOL] RETURNS [INT] ~ TRUSTED MACHINE CODE { "+#define CONSTRUCT_MMAP_FLAGS(shared, private, fixed) ( ((word)(shared))*((word)(MAP_SHARED)) + ((word)(private))*((word)(MAP_PRIVATE)) + ((word)(fixed))*((word)(MAP_FIXED)))\n"; ".CONSTRUCT_MMAP_FLAGS"; }; RETURN[ IF mmap[addr, nbytes, prot, ConstructMMapFlags[shared: flags.shared, private: flags.private, fixed: flags.fixed], d, offset] = addr THEN success ELSE failure ]; }; MUnmap: PUBLIC UNSAFE PROC [addr: RawVM, nbytes: CARD] RETURNS [RES] ~ { munmap: PROC [addr: RawVM, nbytes: CARD] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_MUnmap" }; RETURN[ munmap[addr, nbytes] ]; }; <> <<>> MProtect: PUBLIC UNSAFE PROC [addr: RawVM, nbytes: CARD, prot: Protections] RETURNS [RES] ~ { mprotect: PROC [addr: RawVM, nbytes: CARD, prot: Protections] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_MProtect" }; RETURN[ mprotect[addr, nbytes, prot] ]; }; MSync: PUBLIC UNSAFE PROC [addr: RawVM, nbytes: CARD, flags: MSyncFlags] RETURNS [RES] ~ { msync: PROC [addr: RawVM, nbytes: CARD, flags: MSyncFlags] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_MSync" }; RETURN[ msync[addr, nbytes, flags] ]; }; <> <> <> <> <> Open: PUBLIC PROC [path: CHARPtr, flags: FileFlags, mode: Mode] RETURNS [FD] ~ { open: PROC [path: CHARPtr, flags: FileFlags, mode: Mode] RETURNS [FD] ~ TRUSTED MACHINE CODE { "XR_Open" }; RETURN[ open[path, flags, mode] ]; }; <> Poll: PUBLIC UNSAFE PROC [fds: POINTER TO PollFD, nfds: CARD, timeout: INT] RETURNS [selected: INT] ~ UNCHECKED { poll: UNSAFE PROC [fds: POINTER TO PollFD, nfds: CARD, timeout: INT] RETURNS [INT] ~ UNCHECKED MACHINE CODE { "XR_Poll" }; RETURN[ poll[fds, nfds, timeout] ]; }; <<>> Profil: PUBLIC UNSAFE PROC[buf: CHARPtr, bufSize: INT, offset: INT, scale: INT] RETURNS [RES] ~ UNCHECKED { profil: UNSAFE PROC [buf: CHARPtr, bufSize: INT, offset: INT, scale: INT] RETURNS [RES] ~ UNCHECKED MACHINE CODE { "XR_Profil" }; RETURN[ profil[buf, bufSize, offset, scale] ]; }; <> <<>> PutMsg: PUBLIC PROC [fd: FD, ctlPtr, dataPtr: StrBufPtr, flags: RSFlags] RETURNS [RES] ~ { putmsg: PROC [fd: FD, ctlPtr, dataPtr: StrBufPtr, flags: RSFlags] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_PutMsg" }; RETURN[ putmsg[fd, ctlPtr, dataPtr, flags] ]; }; <<>> <> Read: PUBLIC UNSAFE PROC [d: FD, buf: CHARPtr, nBytes: INT] RETURNS [INT] ~ UNCHECKED { read: UNSAFE PROC [d: FD, buf: CHARPtr, nBytes: INT] RETURNS [INT] ~ UNCHECKED MACHINE CODE { "XR_Read" }; RETURN[ read[d, buf, nBytes] ]; }; ReadV: PUBLIC UNSAFE PROC [d: FD, iov: IOVecPtr, iovCnt: INT] RETURNS [INT] ~ UNCHECKED { readv: UNSAFE PROC [d: FD, iov: IOVecPtr, iovCnt: INT] RETURNS [INT] ~ UNCHECKED MACHINE CODE { "XR_ReadV" }; RETURN[ readv[d, iov, iovCnt] ]; }; ReadLink: PUBLIC UNSAFE PROC [path: CHARPtr, buf: CHARPtr, bufSize: INT] RETURNS [INT] ~ UNCHECKED { readlink: UNSAFE PROC [path: CHARPtr, buf: CHARPtr, bufSize: INT] RETURNS [INT] ~ UNCHECKED MACHINE CODE { "XR_ReadLink" }; RETURN[ readlink[path, buf, bufSize] ]; }; <> Recv: PUBLIC UNSAFE PROC [fd: FD, buf: CHARPtr, len: INT, flags: MsgFlags] RETURNS [INT] ~ UNCHECKED { recv: UNSAFE PROC [fd: FD, buf: CHARPtr, len: INT, flags: MsgFlags] RETURNS [INT] ~ UNCHECKED MACHINE CODE { "XR_Recv" }; RETURN[ recv[fd, buf, len, flags] ]; }; RecvFrom: PUBLIC UNSAFE PROC [fd: FD, buf: CHARPtr, len: INT, flags: MsgFlags, from: SockAddrPtr, fromLen: INTPtr] RETURNS [INT] ~ UNCHECKED { recvfrom: UNSAFE PROC [fd: FD, buf: CHARPtr, len: INT, flags: MsgFlags, from: SockAddrPtr, fromLen: INTPtr] RETURNS [INT] ~ UNCHECKED MACHINE CODE { "XR_RecvFrom" }; RETURN[ recvfrom[fd, buf, len, flags, from, fromLen] ]; }; <> Rename: PUBLIC PROC [from, to: CHARPtr] RETURNS [RES] ~ { rename: PROC [from, to: CHARPtr] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_Rename" }; RETURN[ rename[from, to] ]; }; RmDir: PUBLIC PROC [path: CHARPtr] RETURNS [RES] ~ { rmdir: PROC [path: CHARPtr] RETURNS [RES] ~ TRUSTED MACHINE CODE { "XR_RmDir" }; RETURN[ rmdir[path] ]; }; <