From 4bf477d5ed372fd44697d2f0df245b61b4f3f7b3 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Thu, 18 Nov 2021 13:18:38 -0800 Subject: filling out system layer --- include/base.h | 2 + include/sys.h | 30 ++++- sys/linux/amd64/syscall.h | 2 - sys/linux/port/arch/constants.h | 34 ++++- sys/linux/port/arch/errno.h | 268 ++++++++++++++++++++-------------------- sys/linux/port/arch/types.h | 35 ++++++ sys/src/brk.c | 8 ++ sys/src/dirents.c | 8 ++ sys/src/madvise.c | 8 ++ sys/src/mlock.c | 8 ++ sys/src/mmap.c | 16 +++ sys/src/mprotect.c | 14 +++ sys/src/mremap.c | 20 +++ sys/src/munlock.c | 8 ++ sys/src/munmap.c | 8 ++ sys/src/read.c | 2 +- sys/src/sbrk.c | 6 + 17 files changed, 333 insertions(+), 144 deletions(-) create mode 100644 sys/linux/port/arch/types.h create mode 100644 sys/src/brk.c create mode 100644 sys/src/dirents.c create mode 100644 sys/src/madvise.c create mode 100644 sys/src/mlock.c create mode 100644 sys/src/mprotect.c create mode 100644 sys/src/mremap.c create mode 100644 sys/src/munlock.c create mode 100644 sys/src/munmap.c create mode 100644 sys/src/sbrk.c diff --git a/include/base.h b/include/base.h index 3e544e5..7077731 100644 --- a/include/base.h +++ b/include/base.h @@ -3,6 +3,8 @@ // ------------------------------------------------------------------------ // standard library +//#include +// #include #include #include diff --git a/include/sys.h b/include/sys.h index 15fba2a..e7573bf 100644 --- a/include/sys.h +++ b/include/sys.h @@ -19,15 +19,33 @@ // ----------------------------------------------------------------------- // functions -/* - * system calls with errno-free interface - */ -int sys·call(int num, ...); +char *sys·errormsg(int num); /* file operations */ int sys·open(char *path, int flag, int mode, int *fd); int sys·close(int fd); -int sys·write(int fd, intptr len, void *buf, intptr *nw); -int sys·read(int fd, intptr len, void *buf, intptr *nr); +int sys·write(int fd, uintptr len, void *buf, intptr *nw); +int sys·read(int fd, uintptr len, void *buf, intptr *nr); int sys·seek(int fd, intptr offset, int from, intptr *pos); int sys·dup(int from, int to); + +/* directory operations */ +int sys·chdirfd(int fd); +int sys·chdir(char *path); +int sys·direntry(int fd, int len, void *buffer, uintptr *size); + +/* process operations */ +int sys·fork(void); +int sys·exec(char *program, char *argv[], char *env[]); + +/* memory operations */ +int sys·brk(void *addr); +int sys·sbrk(intptr delta, void **ret); + +int sys·mmap(void *addr, uintptr len, int prot, int flags, int fd, intptr off, void **ret); +int sys·mremap(void *old, uintptr from, uintptr to, int flags, void **new); +int sys·munmap(void *addr, uintptr len); +int sys·madvise(void *addr, uintptr len, int advice); +int sys·mprotect(void *addr, uintptr len, int prot); +int sys·mlock(void *addr, uintptr len); +int sys·munlock(void *addr, uintptr len); diff --git a/sys/linux/amd64/syscall.h b/sys/linux/amd64/syscall.h index f571b81..cba66be 100644 --- a/sys/linux/amd64/syscall.h +++ b/sys/linux/amd64/syscall.h @@ -419,5 +419,3 @@ long _syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6) "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory"); return ret; } - - diff --git a/sys/linux/port/arch/constants.h b/sys/linux/port/arch/constants.h index 2b26899..b8d3878 100644 --- a/sys/linux/port/arch/constants.h +++ b/sys/linux/port/arch/constants.h @@ -1,7 +1,8 @@ #pragma once +/* open */ #define sys·OCreate 0x40u -#define sys·ONotty 0x100u +#define sys·ONoTTY 0x100u #define sys·OTrunc 0x200u #define sys·OAppend 0x400u #define sys·ONoBlock 0x800u @@ -11,3 +12,34 @@ #define sys·ODirectory 0x10000u #define sys·ONoFollow 0x20000u #define sys·OTmpFile 0x410000u + +/* mmap */ +#define sys·ProtNone 0 +#define sys·ProtRead 1 +#define sys·ProtWrite 2 +#define sys·ProtExec 4 +#define sys·ProtGrowsDown 0x01000000 +#define sys·ProtGrowsUp 0x02000000 + +#define sys·MapFile 0 +#define sys·MapShared 0x01 +#define sys·MapPrivate 0x02 +#define sys·MapSharedValidate 0x03 +#define sys·MapType 0x0f +#define sys·MapFixed 0x10 +#define sys·MapAnon 0x20 +#define sys·MapNoReserve 0x4000 +#define sys·MapGrowsDown 0x0100 +#define sys·MapDenyWrite 0x0800 +#define sys·MapExecutable 0x1000 +#define sys·MapLocked 0x2000 +#define sys·MapPopulate 0x8000 +#define sys·MapNonBlock 0x10000 +#define sys·MapStack 0x20000 +#define sys·MapHugetlb 0x40000 +#define sys·MapSync 0x80000 +#define sys·MapFixedNoReplace 0x100000 + +#define sys·RemapCanMove 1 +#define sys·RemapFixed 2 +#define sys·RemapNoUnmap 4 diff --git a/sys/linux/port/arch/errno.h b/sys/linux/port/arch/errno.h index dcd4bcc..9d7e66e 100644 --- a/sys/linux/port/arch/errno.h +++ b/sys/linux/port/arch/errno.h @@ -1,134 +1,134 @@ -#define sys·ErrorNotPermit 1 -#define sys·ErrorNoEntry 2 -#define sys·ErrorNoProc 3 -#define sys·ErrorInterrupt 4 -#define sys·ErrorIO 5 -#define sys·ErrorNoDevAddr 6 -#define sys·ErrorArgLen 7 -#define sys·ErrorExecFmt 8 -#define sys·ErrorBadFd 9 -#define sys·ErrorNoChild 10 -#define sys·ErrorAgain 11 -#define sys·ErrorNoMemory 12 -#define sys·ErrorAccess 13 -#define sys·ErrorBadAddr 14 -#define sys·ErrorNotBlk 15 -#define sys·ErrorBusy 16 -#define sys·ErrorExists 17 -#define sys·ErrorExDevice 18 -#define sys·ErrorNoDevice 19 -#define sys·ErrorNotDir 20 -#define sys·ErrorIsDir 21 -#define sys·ErrorBadArg 22 -#define sys·ErrorNoFiles 23 -#define sys·ErrorNoFd 24 -#define sys·ErrorNotTTY 25 -#define sys·ErrorTxtBusy 26 -#define sys·ErrorBigFile 27 -#define sys·ErrorNoSpace 28 -#define sys·ErrorNoSeek 29 -#define sys·ErrorReadOnly 30 -#define sys·ErrorNoLink 31 -#define sys·ErrorBadPipe 32 -#define sys·ErrorBadDomain 33 -#define sys·ErrorBadResult 34 -#define sys·ErrorDeadlock 35 -#define sys·ErrorNameLen 36 -#define sys·ErrorNoLock 37 -#define sys·ErrorNoSyscall 38 -#define sys·ErrorNotEmptyDir 39 -#define sys·ErrorLinkLoop 40 -#define sys·ErrorBlocks sys·ErrorAgain -#define sys·ErrorNoMsg 42 -#define sys·ErrorNoIdent 43 -#define sys·ErrorBadChannel 44 -#define sys·ErrorLvl2NoSync 45 -#define sys·ErrorLvl3Halt 46 -#define sys·ErrorLvl3Reset 47 -#define sys·ErrorLongChannel 48 -#define sys·ErrorNoDriver 49 -#define sys·ErrorNoCSI 50 -#define sys·ErrorLvl2Halt 51 -#define sys·ErrorBadExchange 52 -#define sys·ErrorBadRequest 53 -#define sys·ErrorFullExchange 54 -#define sys·ErrorNoAnode 55 -#define sys·ErrorBadRequestCode 56 -#define sys·ErrorBadSlot 57 -#define sys·ErrorDeadlock2 sys·ErrorDeadlock -#define sys·ErrorBadFont 59 -#define sys·ErrorNoStr 60 -#define sys·ErrorNoData 61 -#define sys·ErrorTimeout 62 -#define sys·ErrorNoStream 63 -#define sys·ErrorNoNet 64 -#define sys·ErrorNoPkg 65 -#define sys·ErrorIsRemote 66 -#define sys·ErrorDeadLink 67 -#define sys·ErrorAdv 68 -#define sys·ErrorSrmnt 69 -#define sys·ErrorCommunicate 70 -#define sys·ErrorProtocol 71 -#define sys·ErrorMultihop 72 -#define sys·ErrorDotDot 73 -#define sys·ErrorBadMsg 74 -#define sys·ErrorOverflow 75 -#define sys·ErrorNotUnique 76 -#define sys·ErrorBadFdState 77 -#define sys·ErrorNewAddress 78 -#define sys·ErrorShlibAccess 79 -#define sys·ErrorBadShlib 80 -#define sys·ErrorBadLibCode 81 -#define sys·ErrorShlibLen 82 -#define sys·ErrorSlibExec 83 -#define sys·ErrorBadWideChar 84 -#define sys·ErrorRestart 85 -#define sys·ErrorStreamPipe 86 -#define sys·ErrorUserLen 87 -#define sys·ErrorNotSocket 88 -#define sys·ErrorNeedDstAddr 89 -#define sys·ErrorMsgLen 90 -#define sys·ErrorBadProtocol 91 -#define sys·ErrorNoProtocol 92 -#define sys·ErrorNoProtocolSupport 93 -#define sys·ErrorNoSocketSupport 94 -#define sys·ErrorProtocolSupport 95 -#define sys·ErrorNoSupport sys·ErrorProtocolSupport -#define sys·ErrorNoPFSupport 96 -#define sys·ErrorNoAFSupport 97 -#define sys·ErrorAddrInUse 98 -#define sys·ErrorAddrNotAvail 99 -#define sys·ErrorNetDown 100 -#define sys·ErrorNetHang 101 -#define sys·ErrorNetReset 102 -#define sys·ErrorAbortConnect 103 -#define sys·ErrorResetConnect 104 -#define sys·ErrorNoBuffer 105 -#define sys·ErrorIsConnect 106 -#define sys·ErrorNotConnect 107 -#define sys·ErrorShutdown 108 -#define sys·ErrorRefsLen 109 -#define sys·ErrorTimedOut 110 -#define sys·ErrorRefuseConnect 111 -#define sys·ErrorHostDown 112 -#define sys·ErrorHostHang 113 -#define sys·ErrorAlreadyConnect 114 -#define sys·ErrorInProgress 115 -#define sys·ErrorStale 116 -#define sys·ErrorNeedClean 117 -#define sys·ErrorNotNamed 118 -#define sys·ErrorNotAvail 119 -#define sys·ErrorIsNamed 120 -#define sys·ErrorRemoteIO 121 -#define sys·ErrorDiskQuota 122 -#define sys·ErrorNoMedium 123 -#define sys·ErrorBadMedium 124 -#define sys·ErrorCancel 125 -#define sys·ErrorNoKey 126 -#define sys·ErrorExpireKey 127 -#define sys·ErrorRevokeKey 128 -#define sys·ErrorRejectKey 129 -#define sys·ErrorOwnerDie 130 -#define sys·ErrorNoRecover 131 -#define sys·ErrorRFKill 132 -#define sys·ErrorHWPoison 133 +#define sys·ErrorNotPermit 1 +#define sys·ErrorNoEntry 2 +#define sys·ErrorNoProc 3 +#define sys·ErrorInterrupt 4 +#define sys·ErrorIO 5 +#define sys·ErrorNoDevAddr 6 +#define sys·ErrorArgLen 7 +#define sys·ErrorExecFmt 8 +#define sys·ErrorBadFd 9 +#define sys·ErrorNoChild 10 +#define sys·ErrorAgain 11 +#define sys·ErrorNoMemory 12 +#define sys·ErrorAccess 13 +#define sys·ErrorBadAddr 14 +#define sys·ErrorNotBlk 15 +#define sys·ErrorBusy 16 +#define sys·ErrorExists 17 +#define sys·ErrorExDevice 18 +#define sys·ErrorNoDevice 19 +#define sys·ErrorNotDir 20 +#define sys·ErrorIsDir 21 +#define sys·ErrorBadArg 22 +#define sys·ErrorNoFiles 23 +#define sys·ErrorNoFd 24 +#define sys·ErrorNotTTY 25 +#define sys·ErrorTxtBusy 26 +#define sys·ErrorBigFile 27 +#define sys·ErrorNoSpace 28 +#define sys·ErrorNoSeek 29 +#define sys·ErrorReadOnly 30 +#define sys·ErrorNoLink 31 +#define sys·ErrorBadPipe 32 +#define sys·ErrorBadDomain 33 +#define sys·ErrorBadResult 34 +#define sys·ErrorDeadlock 35 +#define sys·ErrorNameLen 36 +#define sys·ErrorNoLock 37 +#define sys·ErrorNoSyscall 38 +#define sys·ErrorNotEmptyDir 39 +#define sys·ErrorLinkLoop 40 +#define sys·ErrorBlocks sys·ErrorAgain +#define sys·ErrorNoMsg 42 +#define sys·ErrorNoIdent 43 +#define sys·ErrorBadChannel 44 +#define sys·ErrorLvl2NoSync 45 +#define sys·ErrorLvl3Halt 46 +#define sys·ErrorLvl3Reset 47 +#define sys·ErrorLongChannel 48 +#define sys·ErrorNoDriver 49 +#define sys·ErrorNoCSI 50 +#define sys·ErrorLvl2Halt 51 +#define sys·ErrorBadExchange 52 +#define sys·ErrorBadRequest 53 +#define sys·ErrorFullExchange 54 +#define sys·ErrorNoAnode 55 +#define sys·ErrorBadRequestCode 56 +#define sys·ErrorBadSlot 57 +#define sys·ErrorDeadlock2 sys·ErrorDeadlock +#define sys·ErrorBadFont 59 +#define sys·ErrorNoStr 60 +#define sys·ErrorNoData 61 +#define sys·ErrorTimeout 62 +#define sys·ErrorNoStream 63 +#define sys·ErrorNoNet 64 +#define sys·ErrorNoPkg 65 +#define sys·ErrorIsRemote 66 +#define sys·ErrorDeadLink 67 +#define sys·ErrorAdv 68 +#define sys·ErrorSrmnt 69 +#define sys·ErrorCommunicate 70 +#define sys·ErrorProtocol 71 +#define sys·ErrorMultihop 72 +#define sys·ErrorDotDot 73 +#define sys·ErrorBadMsg 74 +#define sys·ErrorOverflow 75 +#define sys·ErrorNotUnique 76 +#define sys·ErrorBadFdState 77 +#define sys·ErrorNewAddress 78 +#define sys·ErrorShlibAccess 79 +#define sys·ErrorBadShlib 80 +#define sys·ErrorBadLibCode 81 +#define sys·ErrorShlibLen 82 +#define sys·ErrorSlibExec 83 +#define sys·ErrorBadWideChar 84 +#define sys·ErrorRestart 85 +#define sys·ErrorStreamPipe 86 +#define sys·ErrorUserLen 87 +#define sys·ErrorNotSocket 88 +#define sys·ErrorNeedDstAddr 89 +#define sys·ErrorMsgLen 90 +#define sys·ErrorBadProtocol 91 +#define sys·ErrorNoProtocol 92 +#define sys·ErrorNoProtocolSupport 93 +#define sys·ErrorNoSocketSupport 94 +#define sys·ErrorProtocolSupport 95 +#define sys·ErrorNoSupport sys·ErrorProtocolSupport +#define sys·ErrorNoPFSupport 96 +#define sys·ErrorNoAFSupport 97 +#define sys·ErrorAddrInUse 98 +#define sys·ErrorAddrNotAvail 99 +#define sys·ErrorNetDown 100 +#define sys·ErrorNetHang 101 +#define sys·ErrorNetReset 102 +#define sys·ErrorAbortConnect 103 +#define sys·ErrorResetConnect 104 +#define sys·ErrorNoBuffer 105 +#define sys·ErrorIsConnect 106 +#define sys·ErrorNotConnect 107 +#define sys·ErrorShutdown 108 +#define sys·ErrorRefsLen 109 +#define sys·ErrorTimedOut 110 +#define sys·ErrorRefuseConnect 111 +#define sys·ErrorHostDown 112 +#define sys·ErrorHostHang 113 +#define sys·ErrorAlreadyConnect 114 +#define sys·ErrorInProgress 115 +#define sys·ErrorStale 116 +#define sys·ErrorNeedClean 117 +#define sys·ErrorNotNamed 118 +#define sys·ErrorNotAvail 119 +#define sys·ErrorIsNamed 120 +#define sys·ErrorRemoteIO 121 +#define sys·ErrorDiskQuota 122 +#define sys·ErrorNoMedium 123 +#define sys·ErrorBadMedium 124 +#define sys·ErrorCancel 125 +#define sys·ErrorNoKey 126 +#define sys·ErrorExpireKey 127 +#define sys·ErrorRevokeKey 128 +#define sys·ErrorRejectKey 129 +#define sys·ErrorOwnerDie 130 +#define sys·ErrorNoRecover 131 +#define sys·ErrorRFKill 132 +#define sys·ErrorHWPoison 133 diff --git a/sys/linux/port/arch/types.h b/sys/linux/port/arch/types.h new file mode 100644 index 0000000..014e4cb --- /dev/null +++ b/sys/linux/port/arch/types.h @@ -0,0 +1,35 @@ +#pragma once + +// XXX: os vs sys prefix... + +typedef struct os·Directory os·Directory; +typedef struct os·DirEntry os·DirEntry; + +struct os·Directory +{ + intptr off; + int fd; + int pad; + int pos, end; + /* buf needs fall on (off_t) 8 byte alignment */ + char buf[2048]; +}; + +struct os·DirEntry +{ + ulong ino; /* inode number */ + ulong off; /* offset to next entry (from start of directory */ + ushort len; /* length of entry (in bytes) */ + uchar type; /* filetype */ + char name[]; /* filename */ +}; + +/* types of DirEntry (last byte) */ +#define os·EntryUnknown 0 +#define os·EntryFifo 1 +#define os·EntryChar 2 +#define os·EntryDir 4 +#define os·EntryBlock 6 +#define os·EntryFile 8 +#define os·EntryLink 10 +#define os·EntrySocket 12 diff --git a/sys/src/brk.c b/sys/src/brk.c new file mode 100644 index 0000000..85dd30c --- /dev/null +++ b/sys/src/brk.c @@ -0,0 +1,8 @@ +#include "internal.h" + +int +sys·brk(void *addr) +{ + long ret = syscall(·Brk, addr); + return error(ret); +} diff --git a/sys/src/dirents.c b/sys/src/dirents.c new file mode 100644 index 0000000..c00ce15 --- /dev/null +++ b/sys/src/dirents.c @@ -0,0 +1,8 @@ +#include "internal.h" + +int +sys·dirents(int fd, int len, void *buffer, int *size) +{ + long ret = *size = syscall(·GetDents, fd, buffer, len); + return error(ret); +} diff --git a/sys/src/madvise.c b/sys/src/madvise.c new file mode 100644 index 0000000..49e512e --- /dev/null +++ b/sys/src/madvise.c @@ -0,0 +1,8 @@ +#include "internal.h" + +int +sys·madvise(void *addr, uintptr len, int advice) +{ + long ret = syscall(·MAdvise, addr, len, advice); + return error(ret); +} diff --git a/sys/src/mlock.c b/sys/src/mlock.c new file mode 100644 index 0000000..0de348f --- /dev/null +++ b/sys/src/mlock.c @@ -0,0 +1,8 @@ +#include "internal.h" + +int +sys·mlock(void *addr, uintptr len) +{ + long ret = syscall(·MLock, addr, len); + return error(ret); +} diff --git a/sys/src/mmap.c b/sys/src/mmap.c index fb5c5f4..21d927b 100644 --- a/sys/src/mmap.c +++ b/sys/src/mmap.c @@ -1 +1,17 @@ #include "internal.h" + +int +sys·mmap(void *start, uintptr len, int protect, int flags, int fd, intptr off, void **buf) +{ + long ret; + if(len >= PTRDIFF_MAX) + return sys·ErrorNoMemory; + + ret = syscall(·MMap, start, len, protect, flags, fd, off); + if(ret < 0){ + *buf = nil; + return -ret; + } + *buf = (void*)ret; + return 0; +} diff --git a/sys/src/mprotect.c b/sys/src/mprotect.c new file mode 100644 index 0000000..6d20dc1 --- /dev/null +++ b/sys/src/mprotect.c @@ -0,0 +1,14 @@ +#include "internal.h" + +int +sys·mprotect(void *addr, uintptr len, int prot) +{ + long ret; + uintptr beg, end; + + beg = (uintptr)addr & -PAGESIZE; + end = (uintptr)(addr + len + PAGESIZE-1) & -PAGESIZE; + + ret = syscall(·MProtect, beg, end-beg, prot); + return error(ret); +} diff --git a/sys/src/mremap.c b/sys/src/mremap.c new file mode 100644 index 0000000..dda05ce --- /dev/null +++ b/sys/src/mremap.c @@ -0,0 +1,20 @@ +#include "internal.h" + +int +sys·mremap(void *addr, uintptr from, uintptr to, int flags, void **ret) +{ + long r; + void *new; + + if(to >= PTRDIFF_MAX) + return sys·ErrorNoMemory; + + new = (flags & sys·RemapFixed) ? *ret : nil; + r = syscall(·MRemap, addr, from, to, flags, new); + if(r > 0){ + *ret = (void*)r; + return 0; + } + + return error(r); +} diff --git a/sys/src/munlock.c b/sys/src/munlock.c new file mode 100644 index 0000000..1986306 --- /dev/null +++ b/sys/src/munlock.c @@ -0,0 +1,8 @@ +#include "internal.h" + +int +sys·munlock(void *addr, uintptr len) +{ + long ret = syscall(·MUnlock, addr, len); + return error(ret); +} diff --git a/sys/src/munmap.c b/sys/src/munmap.c new file mode 100644 index 0000000..2eee00c --- /dev/null +++ b/sys/src/munmap.c @@ -0,0 +1,8 @@ +#include "internal.h" + +int +sys·munmap(void *addr, uintptr len) +{ + long ret = syscall(·MUnmap, addr, len); + return error(ret); +} diff --git a/sys/src/read.c b/sys/src/read.c index 8d308ba..db9cabf 100644 --- a/sys/src/read.c +++ b/sys/src/read.c @@ -1,7 +1,7 @@ #include "internal.h" int -sys·read(int fd, intptr len, void *buf, intptr *n) +sys·read(int fd, uintptr len, void *buf, intptr *n) { intptr ret = *n = syscall(·Read, fd, buf, len); return error(ret); diff --git a/sys/src/sbrk.c b/sys/src/sbrk.c new file mode 100644 index 0000000..31af79b --- /dev/null +++ b/sys/src/sbrk.c @@ -0,0 +1,6 @@ +#include "internal.h" + +int +sys·sbrk(intptr inc, void *ret) +{ +} -- cgit v1.2.1