fork(): flag day time - add flags, pointer argument as _fork and wrap it
authorAlan Cox <alan@linux.intel.com>
Fri, 2 Oct 2015 12:17:08 +0000 (13:17 +0100)
committerAlan Cox <alan@linux.intel.com>
Fri, 2 Oct 2015 12:17:08 +0000 (13:17 +0100)
Ready for doing faster/cleverer forky things

Kernel/include/syscall_name.h
Kernel/syscall_proc.c
Library/include/syscalls.h
Library/libs/Makefile
Library/libs/Makefile.6502
Library/libs/Makefile.6809
Library/libs/fork.c [new file with mode: 0644]
Library/libs/fuzix/Makefile

index 4853f08..ba575c6 100644 (file)
@@ -35,7 +35,7 @@ char *syscall_name[NR_SYSCALL] = {
        "ioctl",
        "brk",
        "sbrk",
-       "fork",
+       "_fork",
        "mount",
        "umount",
        "signal",
@@ -101,7 +101,7 @@ int syscall_args[NR_SYSCALL] = {
        VARARGS, //ioctl
        1, //brk
        1, //sbrk
-       0, //fork
+       2, //_fork
        3, //mount
        1, //umount
        2, //signal
index 19e92b3..e56081e 100644 (file)
@@ -349,8 +349,10 @@ arg_t __exit(void)
 #undef val
 
 /*******************************************
-fork ()                          Function 32
+_fork (flags, addr)              Function 32
 ********************************************/
+#define flags (int16_t)udata.u_argn
+#define addr (uaddr_t)udata.u_argn1
 
 arg_t _fork(void)
 {
@@ -359,6 +361,13 @@ arg_t _fork(void)
        arg_t r;
        irqflags_t irq;
 
+       if (flags) {
+               /* Brief period of grace... */
+//             udata.u_error = EINVAL;
+//             return -1;
+               kputs("warning: rebuild libc\n");
+       }
+
        new_process = ptab_alloc();
        if (!new_process)
                return -1;
@@ -390,6 +399,7 @@ arg_t _fork(void)
        return r;
 }
 
+#undef flags
 
 
 /*******************************************
index 5944a52..04002c9 100644 (file)
@@ -117,7 +117,7 @@ extern int setgid(gid_t gid);
 extern int ioctl(int fd, int request,...);
 extern int brk(void *addr);
 extern void *sbrk(intptr_t increment);
-extern pid_t fork(void);
+extern pid_t _fork(uint16_t flags, void *addr);
 extern int mount(const char *dev, const char *path, int flags);
 extern int umount(const char *dev);
 extern sighandler_t signal(int signum, sighandler_t sighandler);
index 860207f..d5953e9 100644 (file)
@@ -25,8 +25,8 @@ SRC_C += clock_gettime.c clock_getres.c clock_settime.c
 SRC_C += creat.c crypt.c ctime.c difftime.c err.c errno.c error.c
 SRC_C += execl.c execv.c execvp.c exit.c
 SRC_C += fclose.c fflush.c fgetc.c fgetgrent.c fgetpwent.c
-SRC_C += fgetpos.c fgets.c fopen.c fprintf.c fputc.c fputs.c fread.c free.c
-SRC_C += fsetpos.c ftell.c fwrite.c getcwd.c
+SRC_C += fgetpos.c fgets.c fopen.c fork.c fprintf.c fputc.c fputs.c fread.c
+SRC_C += free.c fsetpos.c ftell.c fwrite.c getcwd.c
 SRC_C += getenv.c __getgrent.c getgrgid.c getgrnam.c getloadavg.c getopt.c
 SRC_C += getpw.c __getpwent.c getpwnam.c getpwuid.c gets.c gettimeofday.c
 SRC_C += gmtime.c gmtime_r.c grent.c index.c isatty.c killpg.c
index ad37ab4..3a2ddf0 100644 (file)
@@ -17,8 +17,8 @@ OBJ_ASM = $(SRC_ASM:.s=.o)
 #      Fix me there pmemalign and a couple of other standard funcs we
 #      don't have. Calling these will result in a mess but once we've fixed
 #      our library to cover them it should be fine. There are also some we
-#      have through the cc65 lib but need in other ports (strxfrm, strftime,
-#      snprintf, vsnprintf etc)
+#      have through the cc65 lib but need in other ports (strxfrm, strftime
+#      etc)
 #
 #      FIXME:
 #      Due to ctype differences we can't use the stricmp/strcasecmp and
@@ -36,8 +36,8 @@ SRC_C += clock_gettime.c clock_getres.c clock_settime.c
 SRC_C += creat.c crypt.c ctime.c difftime.c err.c errno.c error.c
 SRC_C += execl.c execv.c execvp.c exit.c
 SRC_C += fclose.c fflush.c fgetc.c fgetgrent.c fgetpwent.c
-SRC_C += fgetpos.c fgets.c fopen.c fprintf.c fputc.c fputs.c fread.c free.c
-SRC_C += fsetpos.c ftell.c fwrite.c getcwd.c
+SRC_C += fgetpos.c fgets.c fopen.c fork.c fprintf.c fputc.c fputs.c fread.c
+SRC_C += free.c fsetpos.c ftell.c fwrite.c getcwd.c
 SRC_C += getenv.c __getgrent.c getgrgid.c getgrnam.c getloadavg.c getopt.c
 SRC_C += getpw.c __getpwent.c getpwnam.c getpwuid.c gets.c gettimeofday.c
 SRC_C += gmtime.c gmtime_r.c grent.c index.c isatty.c killpg.c
index 6f3ab52..0db9760 100644 (file)
@@ -17,8 +17,8 @@ SRC_C += clock_gettime.c clock_getres.c clock_settime.c
 SRC_C += creat.c crypt.c ctime.c difftime.c err.c errno.c error.c
 SRC_C += execl.c execv.c execvp.c exit.c
 SRC_C += fclose.c fflush.c fgetc.c fgetgrent.c fgetpwent.c
-SRC_C += fgetpos.c fgets.c fopen.c fprintf.c fputc.c fputs.c fread.c free.c
-SRC_C += fsetpos.c ftell.c fwrite.c getcwd.c
+SRC_C += fgetpos.c fgets.c fopen.c fork.c fprintf.c fputc.c fputs.c fread.c
+SRC_C += free.c fsetpos.c ftell.c fwrite.c getcwd.c
 SRC_C += getenv.c __getgrent.c getgrgid.c getgrnam.c getloadavg.c getopt.c
 SRC_C += getpw.c __getpwent.c getpwnam.c getpwuid.c gets.c gettimeofday.c
 SRC_C += gmtime.c gmtime_r.c grent.c index.c isatty.c killpg.c
diff --git a/Library/libs/fork.c b/Library/libs/fork.c
new file mode 100644 (file)
index 0000000..9044081
--- /dev/null
@@ -0,0 +1,10 @@
+#include <stdio.h>
+#include <unistd.h>
+
+/*
+ *     Wrap the kernel _fork() call
+ */
+pid_t fork(void)
+{
+  return _fork(0, NULL);
+}
index 79568d8..9935cf5 100644 (file)
@@ -37,7 +37,7 @@ ASRCS += syscall__stime.s
 ASRCS += syscall_ioctl.s
 ASRCS += syscall_brk.s
 ASRCS += syscall_sbrk.s
-ASRCS += syscall_fork.s
+ASRCS += syscall__fork.s
 ASRCS += syscall_mount.s
 ASRCS += syscall_umount.s
 ASRCS += syscall_signal.s