summaryrefslogtreecommitdiff
path: root/sys/i386/linux/linux_misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i386/linux/linux_misc.c')
-rw-r--r--sys/i386/linux/linux_misc.c271
1 files changed, 9 insertions, 262 deletions
diff --git a/sys/i386/linux/linux_misc.c b/sys/i386/linux/linux_misc.c
index 02f9785fa8a36..9fdd923276749 100644
--- a/sys/i386/linux/linux_misc.c
+++ b/sys/i386/linux/linux_misc.c
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: linux_misc.c,v 1.50 1998/12/30 21:01:33 sos Exp $
+ * $Id: linux_misc.c,v 1.44 1998/09/24 13:25:43 jkh Exp $
*/
#include <sys/param.h>
@@ -41,9 +41,6 @@
#include <sys/resourcevar.h>
#include <sys/stat.h>
#include <sys/sysctl.h>
-#ifdef COMPAT_LINUX_THREADS
-#include <sys/unistd.h>
-#endif /* COMPAT_LINUX_THREADS */
#include <sys/vnode.h>
#include <sys/wait.h>
#include <sys/time.h>
@@ -563,79 +560,6 @@ linux_fork(struct proc *p, struct linux_fork_args *args)
return 0;
}
-#ifndef COMPAT_LINUX_THREADS
-int
-linux_clone(struct proc *p, struct linux_clone_args *args)
-{
- printf("linux_clone(%d): Not enabled\n", p->p_pid);
- return (EOPNOTSUPP);
-}
-
-#else
-#define CLONE_VM 0x100
-#define CLONE_FS 0x200
-#define CLONE_FILES 0x400
-#define CLONE_SIGHAND 0x800
-#define CLONE_PID 0x1000
-
-int
-linux_clone(struct proc *p, struct linux_clone_args *args)
-{
- int error, ff = RFPROC;
- struct proc *p2;
- int exit_signal;
- vm_offset_t start;
- struct rfork_args rf_args;
-
-#ifdef SMP
- printf("linux_clone(%d): does not work with SMP yet\n", p->p_pid);
- return (EOPNOTSUPP);
-#endif
-#ifdef DEBUG
- if (args->flags & CLONE_PID)
- printf("linux_clone(%d): CLONE_PID not yet supported\n", p->p_pid);
- printf ("linux_clone(%d): invoked with flags %x and stack %x\n", p->p_pid,
- (unsigned int)args->flags, (unsigned int)args->stack);
-#endif
-
- if (!args->stack)
- return (EINVAL);
- exit_signal = args->flags & 0x000000ff;
- if (exit_signal >= LINUX_NSIG)
- return EINVAL;
- exit_signal = linux_to_bsd_signal[exit_signal];
-
- /* RFTHREAD probably not necessary here, but it shouldn't hurt either */
- ff |= RFTHREAD;
-
- if (args->flags & CLONE_VM)
- ff |= RFMEM;
- if (args->flags & CLONE_SIGHAND)
- ff |= RFSIGSHARE;
- if (!(args->flags & CLONE_FILES))
- ff |= RFFDG;
-
- error = 0;
- start = 0;
-
- rf_args.flags = ff;
- if (error = rfork(p, &rf_args))
- return error;
-
- p2 = pfind(p->p_retval[0]);
- if (p2 == 0)
- return ESRCH;
-
- p2->p_sigparent = exit_signal;
- p2->p_md.md_regs->tf_esp = (unsigned int)args->stack;
-
-#ifdef DEBUG
- printf ("linux_clone(%d): successful rfork to %d\n", p->p_pid, p2->p_pid);
-#endif
- return 0;
-}
-
-#endif /* COMPAT_LINUX_THREADS */
/* XXX move */
struct linux_mmap_argv {
linux_caddr_t addr;
@@ -646,11 +570,6 @@ struct linux_mmap_argv {
int pos;
};
-#ifdef COMPAT_LINUX_THREADS
-#define STACK_SIZE (2 * 1024 * 1024)
-#define GUARD_SIZE (4 * PAGE_SIZE)
-
-#endif /* COMPAT_LINUX_THREADS */
int
linux_mmap(struct proc *p, struct linux_mmap_args *args)
{
@@ -683,69 +602,8 @@ linux_mmap(struct proc *p, struct linux_mmap_args *args)
bsd_args.flags |= MAP_FIXED;
if (linux_args.flags & LINUX_MAP_ANON)
bsd_args.flags |= MAP_ANON;
-#ifndef COMPAT_LINUX_THREADS
bsd_args.addr = linux_args.addr;
bsd_args.len = linux_args.len;
-#else
-
-#ifndef VM_STACK
- /* Linux Threads will map into the proc stack space, unless
- * we prevent it. This causes problems if we're not using
- * our VM_STACK options.
- */
- if ((unsigned int)linux_args.addr + linux_args.len > (USRSTACK - MAXSSIZ))
- return (EINVAL);
-#endif
-
- if (linux_args.flags & LINUX_MAP_GROWSDOWN) {
-
-#ifdef VM_STACK
- bsd_args.flags |= MAP_STACK;
-#endif
-
- /* The linux MAP_GROWSDOWN option does not limit auto
- * growth of the region. Linux mmap with this option
- * takes as addr the inital BOS, and as len, the initial
- * region size. It can then grow down from addr without
- * limit. However, linux threads has an implicit internal
- * limit to stack size of STACK_SIZE. Its just not
- * enforced explicitly in linux. But, here we impose
- * a limit of (STACK_SIZE - GUARD_SIZE) on the stack
- * region, since we can do this with our mmap.
- *
- * Our mmap with MAP_STACK takes addr as the maximum
- * downsize limit on BOS, and as len the max size of
- * the region. It them maps the top SGROWSIZ bytes,
- * and autgrows the region down, up to the limit
- * in addr.
- *
- * If we don't use the MAP_STACK option, the effect
- * of this code is to allocate a stack region of a
- * fixed size of (STACK_SIZE - GUARD_SIZE).
- */
-
- /* This gives us TOS */
- bsd_args.addr = linux_args.addr + linux_args.len;
-
- /* This gives us our maximum stack size */
- if (linux_args.len > STACK_SIZE - GUARD_SIZE)
- bsd_args.len = linux_args.len;
- else
- bsd_args.len = STACK_SIZE - GUARD_SIZE;
-
- /* This gives us a new BOS. If we're using VM_STACK, then
- * mmap will just map the top SGROWSIZ bytes, and let
- * the stack grow down to the limit at BOS. If we're
- * not using VM_STACK we map the full stack, since we
- * don't have a way to autogrow it.
- */
- bsd_args.addr -= bsd_args.len;
-
- } else {
- bsd_args.addr = linux_args.addr;
- bsd_args.len = linux_args.len;
- }
-#endif /* COMPAT_LINUX_THREADS */
bsd_args.prot = linux_args.prot | PROT_READ; /* always required */
bsd_args.fd = linux_args.fd;
bsd_args.pos = linux_args.pos;
@@ -801,23 +659,14 @@ int
linux_pipe(struct proc *p, struct linux_pipe_args *args)
{
int error;
- int reg_edx;
#ifdef DEBUG
printf("Linux-emul(%d): pipe(*)\n", p->p_pid);
#endif
- reg_edx = p->p_retval[1];
- if (error = pipe(p, 0)) {
- p->p_retval[1] = reg_edx;
+ if (error = pipe(p, 0))
return error;
- }
-
- if (error = copyout(p->p_retval, args->pipefds, 2*sizeof(int))) {
- p->p_retval[1] = reg_edx;
+ if (error = copyout(p->p_retval, args->pipefds, 2*sizeof(int)))
return error;
- }
-
- p->p_retval[1] = reg_edx;
p->p_retval[0] = 0;
return 0;
}
@@ -897,18 +746,12 @@ linux_newuname(struct proc *p, struct linux_newuname_args *args)
printf("Linux-emul(%d): newuname(*)\n", p->p_pid);
#endif
bzero(&linux_newuname, sizeof(struct linux_newuname_t));
- strncpy(linux_newuname.sysname, ostype,
- sizeof(linux_newuname.sysname) - 1);
- strncpy(linux_newuname.nodename, hostname,
- sizeof(linux_newuname.nodename) - 1);
- strncpy(linux_newuname.release, osrelease,
- sizeof(linux_newuname.release) - 1);
- strncpy(linux_newuname.version, version,
- sizeof(linux_newuname.version) - 1);
- strncpy(linux_newuname.machine, machine,
- sizeof(linux_newuname.machine) - 1);
- strncpy(linux_newuname.domainname, domainname,
- sizeof(linux_newuname.domainname) - 1);
+ strncpy(linux_newuname.sysname, ostype, 64);
+ strncpy(linux_newuname.nodename, hostname, 64);
+ strncpy(linux_newuname.release, osrelease, 64);
+ strncpy(linux_newuname.version, version, 64);
+ strncpy(linux_newuname.machine, machine, 64);
+ strncpy(linux_newuname.domainname, domainname, 64);
return (copyout((caddr_t)&linux_newuname, (caddr_t)args->buf,
sizeof(struct linux_newuname_t)));
}
@@ -972,25 +815,11 @@ linux_waitpid(struct proc *p, struct linux_waitpid_args *args)
#endif
tmp.pid = args->pid;
tmp.status = args->status;
-#ifndef COMPAT_LINUX_THREADS
tmp.options = args->options;
-#else
- /* This filters out the linux option _WCLONE. I don't
- * think we need it, but I could be wrong. If we need
- * it, we need to fix wait4, since it will give us an
- * error return of EINVAL if we pass in _WCLONE, and
- * of course, it won't do anything with it.
- */
- tmp.options = (args->options & (WNOHANG | WUNTRACED));
-#endif /* COMPAT_LINUX_THREADS */
tmp.rusage = NULL;
if (error = wait4(p, &tmp))
-#ifndef COMPAT_LINUX_THREADS
- return error;
-#else
return error;
-#endif /* COMPAT_LINUX_THREADS */
if (args->status) {
if (error = copyin(args->status, &tmpstat, sizeof(int)))
return error;
@@ -1023,17 +852,7 @@ linux_wait4(struct proc *p, struct linux_wait4_args *args)
#endif
tmp.pid = args->pid;
tmp.status = args->status;
-#ifndef COMPAT_LINUX_THREADS
tmp.options = args->options;
-#else
- /* This filters out the linux option _WCLONE. I don't
- * think we need it, but I could be wrong. If we need
- * it, we need to fix wait4, since it will give us an
- * error return of EINVAL if we pass in _WCLONE, and
- * of course, it won't do anything with it.
- */
- tmp.options = (args->options & (WNOHANG | WUNTRACED));
-#endif /* COMPAT_LINUX_THREADS */
tmp.rusage = args->rusage;
if (error = wait4(p, &tmp))
@@ -1170,75 +989,3 @@ linux_nice(struct proc *p, struct linux_nice_args *args)
return setpriority(p, &bsd_args);
}
-int
-linux_setgroups(p, uap)
- struct proc *p;
- struct linux_setgroups_args *uap;
-{
- struct pcred *pc = p->p_cred;
- linux_gid_t linux_gidset[NGROUPS];
- gid_t *bsd_gidset;
- int ngrp, error;
-
- if ((error = suser(pc->pc_ucred, &p->p_acflag)))
- return error;
-
- if (uap->gidsetsize > NGROUPS)
- return EINVAL;
-
- ngrp = uap->gidsetsize;
- pc->pc_ucred = crcopy(pc->pc_ucred);
- if (ngrp >= 1) {
- if ((error = copyin((caddr_t)uap->gidset,
- (caddr_t)linux_gidset,
- ngrp * sizeof(linux_gid_t))))
- return error;
-
- pc->pc_ucred->cr_ngroups = ngrp;
-
- bsd_gidset = pc->pc_ucred->cr_groups;
- ngrp--;
- while (ngrp >= 0) {
- bsd_gidset[ngrp] = linux_gidset[ngrp];
- ngrp--;
- }
- }
- else
- pc->pc_ucred->cr_ngroups = 1;
-
- setsugid(p);
- return 0;
-}
-
-int
-linux_getgroups(p, uap)
- struct proc *p;
- struct linux_getgroups_args *uap;
-{
- struct pcred *pc = p->p_cred;
- linux_gid_t linux_gidset[NGROUPS];
- gid_t *bsd_gidset;
- int ngrp, error;
-
- if ((ngrp = uap->gidsetsize) == 0) {
- p->p_retval[0] = pc->pc_ucred->cr_ngroups;
- return 0;
- }
-
- if (ngrp < pc->pc_ucred->cr_ngroups)
- return EINVAL;
-
- ngrp = 0;
- bsd_gidset = pc->pc_ucred->cr_groups;
- while (ngrp < pc->pc_ucred->cr_ngroups) {
- linux_gidset[ngrp] = bsd_gidset[ngrp];
- ngrp++;
- }
-
- if ((error = copyout((caddr_t)linux_gidset, (caddr_t)uap->gidset,
- ngrp * sizeof(linux_gid_t))))
- return error;
-
- p->p_retval[0] = ngrp;
- return (0);
-}