aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/linux/amd64/arch/constants.h23
-rw-r--r--sys/linux/arm/arch/constants.h20
-rw-r--r--sys/linux/arm64/arch/constants.h22
-rw-r--r--sys/linux/i386/arch/constants.h20
-rw-r--r--sys/linux/port/os/constants.h13
-rw-r--r--sys/linux/riscv64/arch/constants.h20
-rw-r--r--sys/rt/atexit.c49
-rw-r--r--sys/rt/boot.c4
-rw-r--r--sys/rt/dummy.c3
-rw-r--r--sys/rt/exit.c19
-rw-r--r--sys/rules.mk1
11 files changed, 175 insertions, 19 deletions
diff --git a/sys/linux/amd64/arch/constants.h b/sys/linux/amd64/arch/constants.h
new file mode 100644
index 0000000..1949bdf
--- /dev/null
+++ b/sys/linux/amd64/arch/constants.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#define sys·OCreate 0100
+#define sys·OUnique 0200
+#define sys·ONoTTY 0400
+#define sys·OTrunc 01000
+#define sys·OAppend 02000
+#define sys·ONoBlock 04000
+#define sys·ODsync 010000
+#define sys·OSync 04010000
+#define sys·ORsync 04010000
+#define sys·ODirectory 0200000
+#define sys·ONoFollow 0400000
+#define sys·OCloseExec 02000000
+
+#define sys·OAsync 020000
+#define sys·ODirect 040000
+#define sys·OLargeFile 0
+#define sys·ONoATime 01000000
+#define sys·OPath 010000000
+#define sys·OTempFile 020200000
+
+#define SYS·HAVE_FCNTL
diff --git a/sys/linux/arm/arch/constants.h b/sys/linux/arm/arch/constants.h
new file mode 100644
index 0000000..149c2eb
--- /dev/null
+++ b/sys/linux/arm/arch/constants.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#define sys·OCreate 0100
+#define sys·OUnique 0200
+#define sys·ONoTTY 0400
+#define sys·OTrunc 01000
+#define sys·OAppend 02000
+#define sys·ONoBlock 04000
+#define sys·ODsync 010000
+#define sys·OSync 04010000
+#define sys·ORsync 04010000
+#define sys·ODirectory 040000
+#define sys·ONoFollow 0100000
+#define sys·OCloseExec 02000000
+#define sys·OAsync 020000
+#define sys·ODirect 0200000
+#define sys·OLargeFile 0400000
+#define sys·ONoATime 01000000
+#define sys·OPath 010000000
+#define sys·OTempFile 020040000
diff --git a/sys/linux/arm64/arch/constants.h b/sys/linux/arm64/arch/constants.h
new file mode 100644
index 0000000..f3f42e5
--- /dev/null
+++ b/sys/linux/arm64/arch/constants.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#define sys·OCreate 0100
+#define sys·OUnique 0200
+#define sys·ONoTTY 0400
+#define sys·OTrunc 01000
+#define sys·OAppend 02000
+#define sys·ONoBlock 04000
+#define sys·ODsync 010000
+#define sys·OSync 04010000
+#define sys·ORsync 04010000
+#define sys·ODirectory 040000
+#define sys·ONoFollow 0100000
+#define sys·OCloseExec 02000000
+#define sys·OAsync 020000
+#define sys·ODirect 0200000
+#define sys·OLargeFile 0400000
+#define sys·ONoATime 01000000
+#define sys·OPath 010000000
+#define sys·OTempFile 020040000
+
+#define SYS·HAVE_FCNTL
diff --git a/sys/linux/i386/arch/constants.h b/sys/linux/i386/arch/constants.h
new file mode 100644
index 0000000..ff6aa0c
--- /dev/null
+++ b/sys/linux/i386/arch/constants.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#define sys·OCreate 0100
+#define sys·OUnique 0200
+#define sys·ONoTTY 0400
+#define sys·OTrunc 01000
+#define sys·OAppend 02000
+#define sys·ONoBlock 04000
+#define sys·ODsync 010000
+#define sys·OSync 04010000
+#define sys·ORsync 04010000
+#define sys·ODirectory 0200000
+#define sys·ONoFollow 0400000
+#define sys·OCloseExec 02000000
+#define sys·OAsync 020000
+#define sys·ODirect 040000
+#define sys·OLargeFile 0100000
+#define sys·ONoATime 01000000
+#define sys·OPath 010000000
+#define sys·OTempfile 020200000
diff --git a/sys/linux/port/os/constants.h b/sys/linux/port/os/constants.h
index 8fb913f..ffe8610 100644
--- a/sys/linux/port/os/constants.h
+++ b/sys/linux/port/os/constants.h
@@ -1,18 +1,5 @@
#pragma once
-/* open */
-#define sys·OCreate 0x40u
-#define sys·ONoTTY 0x100u
-#define sys·OTrunc 0x200u
-#define sys·OAppend 0x400u
-#define sys·ONoBlock 0x800u
-#define sys·OSync 0x1000u
-#define sys·OAsync 0x2000u
-#define sys·OLargeFile 0x8000u
-#define sys·ODirectory 0x10000u
-#define sys·ONoFollow 0x20000u
-#define sys·OTmpFile 0x410000u
-
/* device modes */
#define sys·ModeFile 0170000
#define sys·ModeDir 0040000
diff --git a/sys/linux/riscv64/arch/constants.h b/sys/linux/riscv64/arch/constants.h
new file mode 100644
index 0000000..ff6aa0c
--- /dev/null
+++ b/sys/linux/riscv64/arch/constants.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#define sys·OCreate 0100
+#define sys·OUnique 0200
+#define sys·ONoTTY 0400
+#define sys·OTrunc 01000
+#define sys·OAppend 02000
+#define sys·ONoBlock 04000
+#define sys·ODsync 010000
+#define sys·OSync 04010000
+#define sys·ORsync 04010000
+#define sys·ODirectory 0200000
+#define sys·ONoFollow 0400000
+#define sys·OCloseExec 02000000
+#define sys·OAsync 020000
+#define sys·ODirect 040000
+#define sys·OLargeFile 0100000
+#define sys·ONoATime 01000000
+#define sys·OPath 010000000
+#define sys·OTempfile 020200000
diff --git a/sys/rt/atexit.c b/sys/rt/atexit.c
new file mode 100644
index 0000000..208cc6e
--- /dev/null
+++ b/sys/rt/atexit.c
@@ -0,0 +1,49 @@
+#include <u.h>
+#include <rt.h>
+
+#define COUNT 32
+
+static struct cleaner
+{
+ struct cleaner *next;
+ void (*clean[COUNT])(void *);
+ void *arg[COUNT];
+} arena, *head;
+static int slot;
+
+void weaklink exit(int code){};
+
+void
+rt·clean(void)
+{
+ void (*clean)(void *), *arg;
+ /*LOCK*/
+ for(; head; head=head->next, slot=COUNT) {
+ while(slot-- > 0){
+ arg = head->arg[slot];
+ clean = head->clean[slot];
+ /* UNLOCK */
+ clean(arg);
+ /* LOCK */
+ }
+ }
+}
+
+int
+rt·atexit(void (*clean)(void *), void *arg)
+{
+ /* LOCK */
+ if(!head)
+ head = &arena;
+
+ /* we need malloc... */
+ if(slot==COUNT)
+ return -1;
+
+ head->arg[slot] = arg;
+ head->clean[slot] = clean;
+ slot++;
+
+ /* UNLOCK */
+ return 0;
+}
diff --git a/sys/rt/boot.c b/sys/rt/boot.c
index 320a596..8c6616d 100644
--- a/sys/rt/boot.c
+++ b/sys/rt/boot.c
@@ -3,7 +3,10 @@
#include <elf.h>
/* tell linker to go find */
+int atexit(void (*)(void));
int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv);
+
+void rt·clean(void);
void rt·guardstack(void);
#define NAUX 38
@@ -30,6 +33,7 @@ rt·boot(int (*main)(), int argc, char **argv, void (*init)(), void (*fini)(), v
rt·init(env, argv[0]);
/* ring libc, anyone home? */
+ atexit(rt·clean);
__libc_start_main(main, argc, argv);
/* no? ok we continue on if there is no libc linked */
diff --git a/sys/rt/dummy.c b/sys/rt/dummy.c
index f123d16..0cef224 100644
--- a/sys/rt/dummy.c
+++ b/sys/rt/dummy.c
@@ -4,3 +4,6 @@
/* provide a dummy implementation if libc is not linked */
static int noop(int (*main)(), int argc, char **argv) { return 0; }
weakalias(noop, __libc_start_main);
+
+static int noop2(void (*func)(void)) { return 0; }
+weakalias(noop, atexit);
diff --git a/sys/rt/exit.c b/sys/rt/exit.c
index e6027b7..386a1bf 100644
--- a/sys/rt/exit.c
+++ b/sys/rt/exit.c
@@ -2,10 +2,13 @@
#include <rt.h>
#include <syscall.h>
-/* XXX:
- * if we are here, we are in charge, call exit syscalls
- * think of better way to encapsulate these syscalls?
- */
+/* tell linker to go find */
+void noreturn exit(int code);
+
+/* if did not call rt·atexit, then don't pull it in */
+static void noop(void){}
+weakalias(noop, rt·clean);
+
static noreturn void
rt·shutdown(int code)
{
@@ -14,14 +17,18 @@ rt·shutdown(int code)
if(rt·context.exit)
rt·context.exit();
+ /* XXX: better way to encapsulate these calls? */
_syscall1(·ExitGroup, code);
for(;;)
_syscall1(·Exit, code);
}
-weakalias(rt·shutdown, exit);
noreturn void
rt·exit(int code)
{
- rt·shutdown(code);
+ /* ring libc, anyone home? */
+ exit(code);
+ /* if we are here, we are in charge, shut it down */
+ rt·clean();
+ rt·shutdown(code);
}
diff --git a/sys/rules.mk b/sys/rules.mk
index 4bba9aa..1cbe50e 100644
--- a/sys/rules.mk
+++ b/sys/rules.mk
@@ -20,6 +20,7 @@ RT1_OBJ := $(patsubst $(SYS_DIR)/rt/%, $(OBJ_DIR)/rt/%, $(RT1_OBJ))
RT3_SRC := \
$(SYS_DIR)/rt/stack.c\
$(SYS_DIR)/rt/dummy.c\
+ $(SYS_DIR)/rt/atexit.c\
$(SYS_DIR)/rt/exit.c
RT3_OBJ := $(filter %.o, $(RT3_SRC:.c=.o))