On Thu, Jul 07, 2011 at 07:41:13PM -0700, Matthew Dempsky wrote:
> Shrinks an i386 kernel by 190 bytes!!

tedu@ suggested just moving sys_pipe() into sys_pipe.c and merging it
with opipe().

ok?


Index: kern/syscalls.master
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/kern/syscalls.master,v
retrieving revision 1.111
diff -u -p -r1.111 syscalls.master
--- kern/syscalls.master        7 Jul 2011 23:45:00 -0000       1.111
+++ kern/syscalls.master        8 Jul 2011 02:22:23 -0000
@@ -110,7 +110,7 @@
 39     STD             { pid_t sys_getppid(void); }
 40     OBSOL           lstat43
 41     STD             { int sys_dup(int fd); }
-42     STD             { int sys_opipe(void); }
+42     OBSOL           opipe
 43     STD             { gid_t sys_getegid(void); }
 44     STD             { int sys_profil(caddr_t samples, size_t size, \
                            u_long offset, u_int scale); }
Index: kern/sys_pipe.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/kern/sys_pipe.c,v
retrieving revision 1.59
diff -u -p -r1.59 sys_pipe.c
--- kern/sys_pipe.c     27 May 2011 08:53:15 -0000      1.59
+++ kern/sys_pipe.c     8 Jul 2011 04:48:36 -0000
@@ -101,12 +101,15 @@ int       pipespace(struct pipe *, u_int);
 
 /* ARGSUSED */
 int
-sys_opipe(struct proc *p, void *v, register_t *retval)
+sys_pipe(struct proc *p, void *v, register_t *retval)
 {
+       struct sys_pipe_args /* {
+               syscallarg(int *) fdp;
+       } */ *uap = v;
        struct filedesc *fdp = p->p_fd;
        struct file *rf, *wf;
        struct pipe *rpipe, *wpipe;
-       int fd, error;
+       int fds[2], error;
 
        fdplock(fdp);
 
@@ -119,23 +122,21 @@ sys_opipe(struct proc *p, void *v, regis
        if (error != 0)
                goto free2;
 
-       error = falloc(p, &rf, &fd);
+       error = falloc(p, &rf, &fds[0]);
        if (error != 0)
                goto free2;
        rf->f_flag = FREAD | FWRITE;
        rf->f_type = DTYPE_PIPE;
        rf->f_data = rpipe;
        rf->f_ops = &pipeops;
-       retval[0] = fd;
 
-       error = falloc(p, &wf, &fd);
+       error = falloc(p, &wf, &fds[1]);
        if (error != 0)
                goto free3;
        wf->f_flag = FREAD | FWRITE;
        wf->f_type = DTYPE_PIPE;
        wf->f_data = wpipe;
        wf->f_ops = &pipeops;
-       retval[1] = fd;
 
        rpipe->pipe_peer = wpipe;
        wpipe->pipe_peer = rpipe;
@@ -144,10 +145,18 @@ sys_opipe(struct proc *p, void *v, regis
        FILE_SET_MATURE(wf);
 
        fdpunlock(fdp);
-       return (0);
+
+       error = copyout(fds, SCARG(uap, fdp), sizeof(fds));
+       if (error != 0) {
+               fdplock(fdp);
+               fdrelease(p, fds[0]);
+               fdrelease(p, fds[1]);
+               fdpunlock(fdp);
+       }
+       return (error);
 
 free3:
-       fdremove(fdp, retval[0]);
+       fdremove(fdp, fds[0]);
        closef(rf, p);
        rpipe = NULL;
 free2:
Index: kern/uipc_syscalls.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/kern/uipc_syscalls.c,v
retrieving revision 1.79
diff -u -p -r1.79 uipc_syscalls.c
--- kern/uipc_syscalls.c        4 Apr 2011 12:44:10 -0000       1.79
+++ kern/uipc_syscalls.c        8 Jul 2011 04:48:28 -0000
@@ -886,30 +886,6 @@ out:
        return (error);
 }
 
-int
-sys_pipe(struct proc *p, void *v, register_t *retval)
-{
-       struct sys_pipe_args /* {
-               syscallarg(int *) fdp;
-       } */ *uap = v;
-       int error, fds[2];
-       register_t rval[2];
-
-       if ((error = sys_opipe(p, v, rval)) != 0)
-               return (error);
-
-       fds[0] = rval[0];
-       fds[1] = rval[1];
-       error = copyout(fds, SCARG(uap, fdp), 2 * sizeof (int));
-       if (error) {
-               fdplock(p->p_fd);
-               fdrelease(p, fds[0]);
-               fdrelease(p, fds[1]);
-               fdpunlock(p->p_fd);
-       }
-       return (error);
-}
-
 /*
  * Get socket name.
  */
Index: compat/linux/syscalls.master
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/compat/linux/syscalls.master,v
retrieving revision 1.57
diff -u -p -r1.57 syscalls.master
--- compat/linux/syscalls.master        7 Jul 2011 06:15:47 -0000       1.57
+++ compat/linux/syscalls.master        8 Jul 2011 02:36:29 -0000
@@ -97,7 +97,7 @@
 39     STD             { int linux_sys_mkdir(char *path, int mode); }
 40     STD             { int linux_sys_rmdir(char *path); }
 41     NOARGS          { int sys_dup(u_int fd); }
-42     STD             { int linux_sys_pipe(int *pfds); }
+42     NOARGS          { int sys_pipe(int *fdp); }
 43     STD             { int linux_sys_times(struct times *tms); }
 44     STD             { int linux_sys_prof(void); }
 45     STD             { int linux_sys_brk(char *nsize); }
Index: compat/linux/linux_misc.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/compat/linux/linux_misc.c,v
retrieving revision 1.69
diff -u -p -r1.69 linux_misc.c
--- compat/linux/linux_misc.c   7 Jul 2011 01:19:39 -0000       1.69
+++ compat/linux/linux_misc.c   8 Jul 2011 02:30:46 -0000
@@ -765,52 +765,6 @@ linux_sys_times(p, v, retval)
 }
 
 /*
- * OpenBSD passes fd[0] in retval[0], and fd[1] in retval[1].
- * Linux directly passes the pointer.
- */
-int
-linux_sys_pipe(p, v, retval)
-       struct proc *p;
-       void *v;
-       register_t *retval;
-{
-       struct linux_sys_pipe_args /* {
-               syscallarg(int *) pfds;
-       } */ *uap = v;
-       int error;
-       int pfds[2];
-#ifdef __i386__
-       int reg_edx = retval[1];
-#endif /* __i386__ */
-
-       if ((error = sys_opipe(p, 0, retval))) {
-#ifdef __i386__
-               retval[1] = reg_edx;
-#endif /* __i386__ */
-               return error;
-       }
-
-       /* Assumes register_t is an int */
-
-       pfds[0] = retval[0];
-       pfds[1] = retval[1];
-       if ((error = copyout(pfds, SCARG(uap, pfds), 2 * sizeof (int)))) {
-#ifdef __i386__
-               retval[1] = reg_edx;
-#endif /* __i386__ */
-               fdrelease(p, retval[0]);
-               fdrelease(p, retval[1]);
-               return error;
-       }
-
-       retval[0] = 0;
-#ifdef __i386__
-       retval[1] = reg_edx;
-#endif /* __i386__ */
-       return 0;
-}
-
-/*
  * Alarm. This is a libc call which uses setitimer(2) in OpenBSD.
  * Fiddle with the timers to make it work.
  */

Reply via email to