aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-11-18 13:18:38 -0800
committerNicholas Noll <nbnoll@eml.cc>2021-11-18 13:18:38 -0800
commit4bf477d5ed372fd44697d2f0df245b61b4f3f7b3 (patch)
treee52d8aa00de40b33c4f26cacba6841f299f97bb2
parent8306b655f9d9a291126ed4947c481ea540c9b835 (diff)
filling out system layer
-rw-r--r--include/base.h2
-rw-r--r--include/sys.h30
-rw-r--r--sys/linux/amd64/syscall.h2
-rw-r--r--sys/linux/port/arch/constants.h34
-rw-r--r--sys/linux/port/arch/errno.h268
-rw-r--r--sys/linux/port/arch/types.h35
-rw-r--r--sys/src/brk.c8
-rw-r--r--sys/src/dirents.c8
-rw-r--r--sys/src/madvise.c8
-rw-r--r--sys/src/mlock.c8
-rw-r--r--sys/src/mmap.c16
-rw-r--r--sys/src/mprotect.c14
-rw-r--r--sys/src/mremap.c20
-rw-r--r--sys/src/munlock.c8
-rw-r--r--sys/src/munmap.c8
-rw-r--r--sys/src/read.c2
-rw-r--r--sys/src/sbrk.c6
17 files changed, 333 insertions, 144 deletions
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 <arch/types.h>
+//
#include <assert.h>
#include <stdlib.h>
#include <string.h>
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)
+{
+}