Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Jul 2015 13:46:22 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285716 - in head/sys: amd64/cloudabi64 compat/cloudabi
Message-ID:  <201507201346.t6KDkMht077567@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Mon Jul 20 13:46:22 2015
New Revision: 285716
URL: https://svnweb.freebsd.org/changeset/base/285716

Log:
  Make forking of CloudABI processes work.
  
  Just like FreeBSD+Capsicum, CloudABI uses process descriptors. Return
  the file descriptor number to the parent process.
  
  To the child process we both return a special value for the file
  descriptor number (CLOUDABI_PROCESS_CHILD). We also return the thread ID
  of the new thread in the copied process, so the threading library can
  reinitialize itself.
  
  Obtained from:	https://github.com/NuxiNL/freebsd

Modified:
  head/sys/amd64/cloudabi64/cloudabi64_sysvec.c
  head/sys/compat/cloudabi/cloudabi_proc.c

Modified: head/sys/amd64/cloudabi64/cloudabi64_sysvec.c
==============================================================================
--- head/sys/amd64/cloudabi64/cloudabi64_sysvec.c	Mon Jul 20 10:20:04 2015	(r285715)
+++ head/sys/amd64/cloudabi64/cloudabi64_sysvec.c	Mon Jul 20 13:46:22 2015	(r285716)
@@ -169,6 +169,16 @@ cloudabi64_set_syscall_retval(struct thr
 	}
 }
 
+static void
+cloudabi64_schedtail(struct thread *td)
+{
+	struct trapframe *frame = td->td_frame;
+
+	/* Initial register values for processes returning from fork. */
+	frame->tf_rax = CLOUDABI_PROCESS_CHILD;
+	frame->tf_rdx = td->td_tid;
+}
+
 static struct sysentvec cloudabi64_elf_sysvec = {
 	.sv_size		= CLOUDABI64_SYS_MAXSYSCALL,
 	.sv_table		= cloudabi64_sysent,
@@ -185,6 +195,7 @@ static struct sysentvec cloudabi64_elf_s
 	.sv_set_syscall_retval	= cloudabi64_set_syscall_retval,
 	.sv_fetch_syscall_args	= cloudabi64_fetch_syscall_args,
 	.sv_syscallnames	= cloudabi64_syscallnames,
+	.sv_schedtail		= cloudabi64_schedtail,
 };
 
 INIT_SYSENTVEC(elf_sysvec, &cloudabi64_elf_sysvec);

Modified: head/sys/compat/cloudabi/cloudabi_proc.c
==============================================================================
--- head/sys/compat/cloudabi/cloudabi_proc.c	Mon Jul 20 10:20:04 2015	(r285715)
+++ head/sys/compat/cloudabi/cloudabi_proc.c	Mon Jul 20 13:46:22 2015	(r285716)
@@ -33,8 +33,10 @@ __FBSDID("$FreeBSD$");
 #include <sys/proc.h>
 #include <sys/signalvar.h>
 #include <sys/syscallsubr.h>
+#include <sys/unistd.h>
 
 #include <compat/cloudabi/cloudabi_proto.h>
+#include <compat/cloudabi/cloudabi_syscalldefs.h>
 
 int
 cloudabi_sys_proc_exec(struct thread *td,
@@ -65,9 +67,15 @@ int
 cloudabi_sys_proc_fork(struct thread *td,
     struct cloudabi_sys_proc_fork_args *uap)
 {
+	struct proc *p2;
+	int error, fd;
 
-	/* Not implemented. */
-	return (ENOSYS);
+	error = fork1(td, RFFDG | RFPROC | RFPROCDESC, 0, &p2, &fd, 0);
+	if (error != 0)
+		return (error);
+	/* Return the file descriptor to the parent process. */
+	td->td_retval[0] = fd;
+	return (0);
 }
 
 int



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507201346.t6KDkMht077567>