Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 136767
b: refs/heads/master
c: b12bdaf
h: refs/heads/master
i:
  136765: 4220bec
  136763: 2d084ab
  136759: c9ac8b3
  136751: 03371c7
  136735: 5a45a1b
  136703: 6080cf0
v: v3
  • Loading branch information
Brian Gerst authored and H. Peter Anvin committed Feb 11, 2009
1 parent 7e8c516 commit 50a866b
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 46 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1c0040047d5499599cc231ca3f105be3ceff8562
refs/heads/master: b12bdaf11f935d7be030207e3c77faeaeab8ded3
7 changes: 0 additions & 7 deletions trunk/arch/x86/include/asm/linkage.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,6 @@
*/
#define asmregparm __attribute__((regparm(3)))

/*
* For syscalls that need a pointer to the pt_regs struct (ie. fork).
* The regs pointer is passed in %eax as the first argument. The
* remaining function arguments remain on the stack.
*/
#define ptregscall __attribute__((regparm(1)))

/*
* Make sure the compiler doesn't do anything stupid with the
* arguments on the stack - they are owned by the *caller*, not
Expand Down
25 changes: 10 additions & 15 deletions trunk/arch/x86/include/asm/syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,21 @@ asmlinkage int sys_get_thread_area(struct user_desc __user *);
/* X86_32 only */
#ifdef CONFIG_X86_32
/* kernel/process_32.c */
ptregscall int sys_fork(struct pt_regs *);
ptregscall int sys_clone(struct pt_regs *, unsigned long,
unsigned long, int __user *,
unsigned long, int __user *);
ptregscall int sys_vfork(struct pt_regs *);
ptregscall int sys_execve(struct pt_regs *, char __user *,
char __user * __user *,
char __user * __user *);
int sys_fork(struct pt_regs *);
int sys_clone(struct pt_regs *);
int sys_vfork(struct pt_regs *);
int sys_execve(struct pt_regs *);

/* kernel/signal_32.c */
asmlinkage int sys_sigsuspend(int, int, old_sigset_t);
asmlinkage int sys_sigaction(int, const struct old_sigaction __user *,
struct old_sigaction __user *);
ptregscall int sys_sigaltstack(struct pt_regs *, const stack_t __user *,
stack_t __user *);
ptregscall unsigned long sys_sigreturn(struct pt_regs *);
ptregscall int sys_rt_sigreturn(struct pt_regs *);
int sys_sigaltstack(struct pt_regs *);
unsigned long sys_sigreturn(struct pt_regs *);
int sys_rt_sigreturn(struct pt_regs *);

/* kernel/ioport.c */
ptregscall long sys_iopl(struct pt_regs *, unsigned int);
long sys_iopl(struct pt_regs *);

/* kernel/sys_i386_32.c */
asmlinkage long sys_mmap2(unsigned long, unsigned long, unsigned long,
Expand All @@ -64,8 +59,8 @@ struct oldold_utsname;
asmlinkage int sys_olduname(struct oldold_utsname __user *);

/* kernel/vm86_32.c */
ptregscall int sys_vm86old(struct pt_regs *, struct vm86_struct __user *);
ptregscall int sys_vm86(struct pt_regs *, unsigned long, unsigned long);
int sys_vm86old(struct pt_regs *);
int sys_vm86(struct pt_regs *);

#else /* CONFIG_X86_32 */

Expand Down
3 changes: 2 additions & 1 deletion trunk/arch/x86/kernel/ioport.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,9 @@ static int do_iopl(unsigned int level, struct pt_regs *regs)
}

#ifdef CONFIG_X86_32
ptregscall long sys_iopl(struct pt_regs *regs, unsigned int level)
long sys_iopl(struct pt_regs *regs)
{
unsigned int level = regs->bx;
struct thread_struct *t = &current->thread;
int rc;

Expand Down
27 changes: 17 additions & 10 deletions trunk/arch/x86/kernel/process_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -603,15 +603,21 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
return prev_p;
}

ptregscall int sys_fork(struct pt_regs *regs)
int sys_fork(struct pt_regs *regs)
{
return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}

ptregscall int sys_clone(struct pt_regs *regs, unsigned long clone_flags,
unsigned long newsp, int __user *parent_tidptr,
unsigned long unused, int __user *child_tidptr)
int sys_clone(struct pt_regs *regs)
{
unsigned long clone_flags;
unsigned long newsp;
int __user *parent_tidptr, *child_tidptr;

clone_flags = regs->bx;
newsp = regs->cx;
parent_tidptr = (int __user *)regs->dx;
child_tidptr = (int __user *)regs->di;
if (!newsp)
newsp = regs->sp;
return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
Expand All @@ -627,26 +633,27 @@ ptregscall int sys_clone(struct pt_regs *regs, unsigned long clone_flags,
* do not have enough call-clobbered registers to hold all
* the information you need.
*/
ptregscall int sys_vfork(struct pt_regs *regs)
int sys_vfork(struct pt_regs *regs)
{
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}

/*
* sys_execve() executes a new program.
*/
ptregscall int sys_execve(struct pt_regs *regs, char __user *u_filename,
char __user * __user *argv,
char __user * __user *envp)
int sys_execve(struct pt_regs *regs)
{
int error;
char *filename;

filename = getname(u_filename);
filename = getname((char __user *) regs->bx);
error = PTR_ERR(filename);
if (IS_ERR(filename))
goto out;
error = do_execve(filename, argv, envp, regs);
error = do_execve(filename,
(char __user * __user *) regs->cx,
(char __user * __user *) regs->dx,
regs);
if (error == 0) {
/* Make sure we don't return using sysenter.. */
set_thread_flag(TIF_IRET);
Expand Down
21 changes: 14 additions & 7 deletions trunk/arch/x86/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -549,23 +549,27 @@ sys_sigaction(int sig, const struct old_sigaction __user *act,
#endif /* CONFIG_X86_32 */

#ifdef CONFIG_X86_32
ptregscall int
sys_sigaltstack(struct pt_regs *regs, const stack_t __user *uss,
stack_t __user *uoss)
int sys_sigaltstack(struct pt_regs *regs)
{
const stack_t __user *uss = (const stack_t __user *)regs->bx;
stack_t __user *uoss = (stack_t __user *)regs->cx;

return do_sigaltstack(uss, uoss, regs->sp);
}
#else /* !CONFIG_X86_32 */
asmlinkage long
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
struct pt_regs *regs)
#endif /* CONFIG_X86_32 */
{
return do_sigaltstack(uss, uoss, regs->sp);
}
#endif /* CONFIG_X86_32 */

/*
* Do a signal return; undo the signal stack.
*/
#ifdef CONFIG_X86_32
ptregscall unsigned long sys_sigreturn(struct pt_regs *regs)
unsigned long sys_sigreturn(struct pt_regs *regs)
{
struct sigframe __user *frame;
unsigned long ax;
Expand Down Expand Up @@ -629,13 +633,16 @@ static long do_rt_sigreturn(struct pt_regs *regs)
}

#ifdef CONFIG_X86_32
ptregscall int sys_rt_sigreturn(struct pt_regs *regs)
int sys_rt_sigreturn(struct pt_regs *regs)
{
return do_rt_sigreturn(regs);
}
#else /* !CONFIG_X86_32 */
asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
#endif /* CONFIG_X86_32 */
{
return do_rt_sigreturn(regs);
}
#endif /* CONFIG_X86_32 */

/*
* OK, we're invoking a handler:
Expand Down
11 changes: 6 additions & 5 deletions trunk/arch/x86/kernel/vm86_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,9 @@ static void mark_screen_rdonly(struct mm_struct *mm)
static int do_vm86_irq_handling(int subfunction, int irqnumber);
static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk);

ptregscall int sys_vm86old(struct pt_regs *regs, struct vm86_struct __user *v86)
int sys_vm86old(struct pt_regs *regs)
{
struct vm86_struct __user *v86 = (struct vm86_struct __user *)regs->bx;
struct kernel_vm86_struct info; /* declare this _on top_,
* this avoids wasting of stack space.
* This remains on the stack until we
Expand Down Expand Up @@ -226,7 +227,7 @@ ptregscall int sys_vm86old(struct pt_regs *regs, struct vm86_struct __user *v86)
}


ptregscall int sys_vm86(struct pt_regs *regs, unsigned long cmd, unsigned long arg)
int sys_vm86(struct pt_regs *regs)
{
struct kernel_vm86_struct info; /* declare this _on top_,
* this avoids wasting of stack space.
Expand All @@ -238,12 +239,12 @@ ptregscall int sys_vm86(struct pt_regs *regs, unsigned long cmd, unsigned long a
struct vm86plus_struct __user *v86;

tsk = current;
switch (cmd) {
switch (regs->bx) {
case VM86_REQUEST_IRQ:
case VM86_FREE_IRQ:
case VM86_GET_IRQ_BITS:
case VM86_GET_AND_RESET_IRQ:
ret = do_vm86_irq_handling(cmd, (int)arg);
ret = do_vm86_irq_handling(regs->bx, (int)regs->cx);
goto out;
case VM86_PLUS_INSTALL_CHECK:
/*
Expand All @@ -260,7 +261,7 @@ ptregscall int sys_vm86(struct pt_regs *regs, unsigned long cmd, unsigned long a
ret = -EPERM;
if (tsk->thread.saved_sp0)
goto out;
v86 = (struct vm86plus_struct __user *)arg;
v86 = (struct vm86plus_struct __user *)regs->cx;
tmp = copy_vm86_regs_from_user(&info.regs, &v86->regs,
offsetof(struct kernel_vm86_struct, regs32) -
sizeof(info.regs));
Expand Down

0 comments on commit 50a866b

Please sign in to comment.