From owner-svn-src-all@freebsd.org Sat Jul 11 19:41:32 2015 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 24DB399983E; Sat, 11 Jul 2015 19:41:32 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 090AE186E; Sat, 11 Jul 2015 19:41:32 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.70]) by repo.freebsd.org (8.14.9/8.14.9) with ESMTP id t6BJfVEG072540; Sat, 11 Jul 2015 19:41:31 GMT (envelope-from ed@FreeBSD.org) Received: (from ed@localhost) by repo.freebsd.org (8.14.9/8.14.9/Submit) id t6BJfV1a072539; Sat, 11 Jul 2015 19:41:31 GMT (envelope-from ed@FreeBSD.org) Message-Id: <201507111941.t6BJfV1a072539@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: ed set sender to ed@FreeBSD.org using -f From: Ed Schouten Date: Sat, 11 Jul 2015 19:41:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r285404 - head/sys/compat/cloudabi X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2015 19:41:32 -0000 Author: ed Date: Sat Jul 11 19:41:31 2015 New Revision: 285404 URL: https://svnweb.freebsd.org/changeset/base/285404 Log: Implement normal and abnormal process termination. CloudABI does not provide an explicit kill() system call, for the reason that there is no access to the global process namespace. Instead, it offers a raise() system call that can at least be used to terminate the process abnormally. CloudABI does not support installing signal handlers. CloudABI's raise() system call should behave as if the default policy is set up. Call into kern_sigaction(SIG_DFL) before calling sys_kill() to force this. Obtained from: https://github.com/NuxiNL/freebsd Modified: head/sys/compat/cloudabi/cloudabi_proc.c Modified: head/sys/compat/cloudabi/cloudabi_proc.c ============================================================================== --- head/sys/compat/cloudabi/cloudabi_proc.c Sat Jul 11 19:14:09 2015 (r285403) +++ head/sys/compat/cloudabi/cloudabi_proc.c Sat Jul 11 19:41:31 2015 (r285404) @@ -26,6 +26,11 @@ #include __FBSDID("$FreeBSD$"); +#include +#include +#include +#include + #include int @@ -42,8 +47,8 @@ cloudabi_sys_proc_exit(struct thread *td struct cloudabi_sys_proc_exit_args *uap) { - /* Not implemented. */ - return (ENOSYS); + exit1(td, W_EXITCODE(uap->rval, 0)); + /* NOTREACHED */ } int @@ -59,7 +64,49 @@ int cloudabi_sys_proc_raise(struct thread *td, struct cloudabi_sys_proc_raise_args *uap) { - - /* Not implemented. */ - return (ENOSYS); + static const int signals[] = { + [CLOUDABI_SIGABRT] = SIGABRT, + [CLOUDABI_SIGALRM] = SIGALRM, + [CLOUDABI_SIGBUS] = SIGBUS, + [CLOUDABI_SIGCHLD] = SIGCHLD, + [CLOUDABI_SIGCONT] = SIGCONT, + [CLOUDABI_SIGFPE] = SIGFPE, + [CLOUDABI_SIGHUP] = SIGHUP, + [CLOUDABI_SIGILL] = SIGILL, + [CLOUDABI_SIGINT] = SIGINT, + [CLOUDABI_SIGKILL] = SIGKILL, + [CLOUDABI_SIGPIPE] = SIGPIPE, + [CLOUDABI_SIGQUIT] = SIGQUIT, + [CLOUDABI_SIGSEGV] = SIGSEGV, + [CLOUDABI_SIGSTOP] = SIGSTOP, + [CLOUDABI_SIGSYS] = SIGSYS, + [CLOUDABI_SIGTERM] = SIGTERM, + [CLOUDABI_SIGTRAP] = SIGTRAP, + [CLOUDABI_SIGTSTP] = SIGTSTP, + [CLOUDABI_SIGTTIN] = SIGTTIN, + [CLOUDABI_SIGTTOU] = SIGTTOU, + [CLOUDABI_SIGURG] = SIGURG, + [CLOUDABI_SIGUSR1] = SIGUSR1, + [CLOUDABI_SIGUSR2] = SIGUSR2, + [CLOUDABI_SIGVTALRM] = SIGVTALRM, + [CLOUDABI_SIGXCPU] = SIGXCPU, + [CLOUDABI_SIGXFSZ] = SIGXFSZ, + }; + static const struct sigaction sigdfl = { + .sa_handler = SIG_DFL, + }; + struct kill_args kill_args = { + .pid = td->td_proc->p_pid, + }; + + if (uap->sig >= nitems(signals) || + (uap->sig != 0 && signals[uap->sig] == 0)) { + /* Invalid signal. */ + return (EINVAL); + } + kill_args.signum = signals[uap->sig]; + + /* Restore to default signal action and send signal. */ + kern_sigaction(td, kill_args.signum, &sigdfl, NULL, 0); + return (sys_kill(td, &kill_args)); }