lkml.org 
[lkml]   [2005]   [May]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[patch 1/4] uml: do_fork calling cleanup
    From
    Date

    Fix the do_fork calling convention: normal arch pass the regs and the new sp
    value to do_fork instead of NULL.

    Currently the arch-independent code ignores these values, while the UML code
    (actually it's copy_thread) gets the right values by itself.

    With this patch, things are fixed up.

    Low-priority.

    Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
    ---

    linux-2.6.git-paolo/arch/um/kernel/process_kern.c | 17 ++-----------
    linux-2.6.git-paolo/arch/um/kernel/skas/process_kern.c | 13 ----------
    linux-2.6.git-paolo/arch/um/kernel/syscall_kern.c | 19 +++-----------
    linux-2.6.git-paolo/arch/um/kernel/tt/process_kern.c | 15 +----------
    linux-2.6.git-paolo/arch/um/sys-i386/syscalls.c | 22 ++---------------
    linux-2.6.git-paolo/arch/um/sys-x86_64/syscalls.c | 22 ++---------------
    6 files changed, 17 insertions(+), 91 deletions(-)

    diff -puN arch/um/sys-i386/syscalls.c~uml-do_fork-param-cleanup arch/um/sys-i386/syscalls.c
    --- linux-2.6.git/arch/um/sys-i386/syscalls.c~uml-do_fork-param-cleanup 2005-05-27 02:39:32.000000000 +0200
    +++ linux-2.6.git-paolo/arch/um/sys-i386/syscalls.c 2005-05-27 02:39:32.000000000 +0200
    @@ -69,15 +69,10 @@ long sys_clone(unsigned long clone_flags
    {
    long ret;

    - /* XXX: normal arch do here this pass, and also pass the regs to
    - * do_fork, instead of NULL. Currently the arch-independent code
    - * ignores these values, while the UML code (actually it's
    - * copy_thread) does the right thing. But this should change,
    - probably. */
    - /*if (!newsp)
    - newsp = UPT_SP(current->thread.regs);*/
    + if (!newsp)
    + newsp = UPT_SP(&current->thread.regs.regs);
    current->thread.forking = 1;
    - ret = do_fork(clone_flags, newsp, NULL, 0, parent_tid, child_tid);
    + ret = do_fork(clone_flags, newsp, &current->thread.regs, 0, parent_tid, child_tid);
    current->thread.forking = 0;
    return(ret);
    }
    @@ -197,14 +192,3 @@ long sys_sigaction(int sig, const struct

    return ret;
    }
    -
    -/*
    - * Overrides for Emacs so that we follow Linus's tabbing style.
    - * Emacs will notice this stuff at the end of the file and automatically
    - * adjust the settings for this buffer only. This must remain at the end
    - * of the file.
    - * ---------------------------------------------------------------------------
    - * Local variables:
    - * c-file-style: "linux"
    - * End:
    - */
    diff -puN arch/um/kernel/tt/process_kern.c~uml-do_fork-param-cleanup arch/um/kernel/tt/process_kern.c
    --- linux-2.6.git/arch/um/kernel/tt/process_kern.c~uml-do_fork-param-cleanup 2005-05-27 02:39:32.000000000 +0200
    +++ linux-2.6.git-paolo/arch/um/kernel/tt/process_kern.c 2005-05-27 02:39:32.000000000 +0200
    @@ -266,8 +266,8 @@ int copy_thread_tt(int nr, unsigned long
    }

    if(current->thread.forking){
    - sc_to_sc(UPT_SC(&p->thread.regs.regs),
    - UPT_SC(&current->thread.regs.regs));
    + sc_to_sc(UPT_SC(&p->thread.regs.regs),
    + UPT_SC(&regs->regs));
    SC_SET_SYSCALL_RETURN(UPT_SC(&p->thread.regs.regs), 0);
    if(sp != 0) SC_SP(UPT_SC(&p->thread.regs.regs)) = sp;
    }
    @@ -459,14 +459,3 @@ int is_valid_pid(int pid)
    read_unlock(&tasklist_lock);
    return(0);
    }
    -
    -/*
    - * Overrides for Emacs so that we follow Linus's tabbing style.
    - * Emacs will notice this stuff at the end of the file and automatically
    - * adjust the settings for this buffer only. This must remain at the end
    - * of the file.
    - * ---------------------------------------------------------------------------
    - * Local variables:
    - * c-file-style: "linux"
    - * End:
    - */
    diff -puN arch/um/kernel/skas/process_kern.c~uml-do_fork-param-cleanup arch/um/kernel/skas/process_kern.c
    --- linux-2.6.git/arch/um/kernel/skas/process_kern.c~uml-do_fork-param-cleanup 2005-05-27 02:39:32.000000000 +0200
    +++ linux-2.6.git-paolo/arch/um/kernel/skas/process_kern.c 2005-05-27 02:39:32.000000000 +0200
    @@ -107,7 +107,7 @@ int copy_thread_skas(int nr, unsigned lo

    if(current->thread.forking){
    memcpy(&p->thread.regs.regs.skas,
    - &current->thread.regs.regs.skas,
    + &regs->regs.skas,
    sizeof(p->thread.regs.regs.skas));
    REGS_SET_SYSCALL_RETURN(p->thread.regs.regs.skas.regs, 0);
    if(sp != 0) REGS_SP(p->thread.regs.regs.skas.regs) = sp;
    @@ -196,14 +196,3 @@ int thread_pid_skas(struct task_struct *
    #warning Need to look up userspace_pid by cpu
    return(userspace_pid[0]);
    }
    -
    -/*
    - * Overrides for Emacs so that we follow Linus's tabbing style.
    - * Emacs will notice this stuff at the end of the file and automatically
    - * adjust the settings for this buffer only. This must remain at the end
    - * of the file.
    - * ---------------------------------------------------------------------------
    - * Local variables:
    - * c-file-style: "linux"
    - * End:
    - */
    diff -puN arch/um/kernel/syscall_kern.c~uml-do_fork-param-cleanup arch/um/kernel/syscall_kern.c
    --- linux-2.6.git/arch/um/kernel/syscall_kern.c~uml-do_fork-param-cleanup 2005-05-27 02:39:32.000000000 +0200
    +++ linux-2.6.git-paolo/arch/um/kernel/syscall_kern.c 2005-05-27 02:39:32.000000000 +0200
    @@ -31,7 +31,8 @@ long sys_fork(void)
    long ret;

    current->thread.forking = 1;
    - ret = do_fork(SIGCHLD, 0, NULL, 0, NULL, NULL);
    + ret = do_fork(SIGCHLD, UPT_SP(&current->thread.regs.regs),
    + &current->thread.regs, 0, NULL, NULL);
    current->thread.forking = 0;
    return(ret);
    }
    @@ -41,8 +42,9 @@ long sys_vfork(void)
    long ret;

    current->thread.forking = 1;
    - ret = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0, NULL, 0, NULL,
    - NULL);
    + ret = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
    + UPT_SP(&current->thread.regs.regs), &current->thread.regs, 0,
    + NULL, NULL);
    current->thread.forking = 0;
    return(ret);
    }
    @@ -162,14 +164,3 @@ int next_syscall_index(int limit)
    spin_unlock(&syscall_lock);
    return(ret);
    }
    -
    -/*
    - * Overrides for Emacs so that we follow Linus's tabbing style.
    - * Emacs will notice this stuff at the end of the file and automatically
    - * adjust the settings for this buffer only. This must remain at the end
    - * of the file.
    - * ---------------------------------------------------------------------------
    - * Local variables:
    - * c-file-style: "linux"
    - * End:
    - */
    diff -puN arch/um/kernel/process_kern.c~uml-do_fork-param-cleanup arch/um/kernel/process_kern.c
    --- linux-2.6.git/arch/um/kernel/process_kern.c~uml-do_fork-param-cleanup 2005-05-27 02:39:32.000000000 +0200
    +++ linux-2.6.git-paolo/arch/um/kernel/process_kern.c 2005-05-27 02:39:32.000000000 +0200
    @@ -108,8 +108,9 @@ int kernel_thread(int (*fn)(void *), voi

    current->thread.request.u.thread.proc = fn;
    current->thread.request.u.thread.arg = arg;
    - pid = do_fork(CLONE_VM | CLONE_UNTRACED | flags, 0, NULL, 0, NULL,
    - NULL);
    + pid = do_fork(CLONE_VM | CLONE_UNTRACED | flags,
    + 0, &current->thread.regs, 0,
    + NULL, NULL);
    if(pid < 0)
    panic("do_fork failed in kernel_thread, errno = %d", pid);
    return(pid);
    @@ -480,15 +481,3 @@ unsigned long arch_align_stack(unsigned
    return sp & ~0xf;
    }
    #endif
    -
    -
    -/*
    - * Overrides for Emacs so that we follow Linus's tabbing style.
    - * Emacs will notice this stuff at the end of the file and automatically
    - * adjust the settings for this buffer only. This must remain at the end
    - * of the file.
    - * ---------------------------------------------------------------------------
    - * Local variables:
    - * c-file-style: "linux"
    - * End:
    - */
    diff -puN arch/um/sys-x86_64/syscalls.c~uml-do_fork-param-cleanup arch/um/sys-x86_64/syscalls.c
    --- linux-2.6.git/arch/um/sys-x86_64/syscalls.c~uml-do_fork-param-cleanup 2005-05-27 02:39:32.000000000 +0200
    +++ linux-2.6.git-paolo/arch/um/sys-x86_64/syscalls.c 2005-05-27 02:39:32.000000000 +0200
    @@ -174,26 +174,10 @@ long sys_clone(unsigned long clone_flags
    {
    long ret;

    - /* XXX: normal arch do here this pass, and also pass the regs to
    - * do_fork, instead of NULL. Currently the arch-independent code
    - * ignores these values, while the UML code (actually it's
    - * copy_thread) does the right thing. But this should change,
    - probably. */
    - /*if (!newsp)
    - newsp = UPT_SP(current->thread.regs);*/
    + if (!newsp)
    + newsp = UPT_SP(&current->thread.regs.regs);
    current->thread.forking = 1;
    - ret = do_fork(clone_flags, newsp, NULL, 0, parent_tid, child_tid);
    + ret = do_fork(clone_flags, newsp, &current->thread.regs, 0, parent_tid, child_tid);
    current->thread.forking = 0;
    return(ret);
    }
    -
    -/*
    - * Overrides for Emacs so that we follow Linus's tabbing style.
    - * Emacs will notice this stuff at the end of the file and automatically
    - * adjust the settings for this buffer only. This must remain at the end
    - * of the file.
    - * ---------------------------------------------------------------------------
    - * Local variables:
    - * c-file-style: "linux"
    - * End:
    - */
    _
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-05-27 03:37    [W:2.915 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site