Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 333649
b: refs/heads/master
c: be6abfa
h: refs/heads/master
i:
  333647: 9e1ca3d
v: v3
  • Loading branch information
Al Viro committed Oct 1, 2012
1 parent 04176ae commit ad2255b
Show file tree
Hide file tree
Showing 9 changed files with 22 additions and 52 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: 58254e1002a82eb383c5977ad9fd5a451b91fe29
refs/heads/master: be6abfa769fa07ce89ac73273360b335ae978805
2 changes: 2 additions & 0 deletions trunk/arch/powerpc/include/asm/ptrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ extern unsigned long ptrace_get_reg(struct task_struct *task, int regno);
extern int ptrace_put_reg(struct task_struct *task, int regno,
unsigned long data);

#define current_pt_regs() \
((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
/*
* We use the least-significant bit of the trap field to indicate
* whether we have saved the full set of registers, or only a
Expand Down
3 changes: 0 additions & 3 deletions trunk/arch/powerpc/include/asm/syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,6 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,
asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len,
unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff);
asmlinkage int sys_execve(unsigned long a0, unsigned long a1,
unsigned long a2, unsigned long a3, unsigned long a4,
unsigned long a5, struct pt_regs *regs);
asmlinkage int sys_clone(unsigned long clone_flags, unsigned long usp,
int __user *parent_tidp, void __user *child_threadptr,
int __user *child_tidp, int p6, struct pt_regs *regs);
Expand Down
2 changes: 2 additions & 0 deletions trunk/arch/powerpc/include/asm/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,8 @@
#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_NEWFSTATAT
#endif
#define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_KERNEL_EXECVE

/*
* "Conditional" syscalls
Expand Down
5 changes: 5 additions & 0 deletions trunk/arch/powerpc/kernel/entry_32.S
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,11 @@ ret_from_kernel_thread:
li r3,0
b do_exit # no return

.globl __ret_from_kernel_execve
__ret_from_kernel_execve:
addi r1,r3,-STACK_FRAME_OVERHEAD
b ret_from_syscall

/* Traced system call support */
syscall_dotrace:
SAVE_NVGPRS(r1)
Expand Down
6 changes: 6 additions & 0 deletions trunk/arch/powerpc/kernel/entry_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,12 @@ _GLOBAL(ret_from_kernel_thread)
li r3,0
b .do_exit # no return

_GLOBAL(__ret_from_kernel_execve)
addi r1,r3,-STACK_FRAME_OVERHEAD
li r10,1
std r10,SOFTE(r1)
b syscall_exit

.section ".toc","aw"
DSCR_DEFAULT:
.tc dscr_default[TC],dscr_default
Expand Down
7 changes: 0 additions & 7 deletions trunk/arch/powerpc/kernel/misc.S
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,6 @@ _GLOBAL(add_reloc_offset)
.align 3
2: PPC_LONG 1b

_GLOBAL(kernel_execve)
li r0,__NR_execve
sc
bnslr
neg r3,r3
blr

_GLOBAL(setjmp)
mflr r0
PPC_STL r0,0(r3)
Expand Down
25 changes: 6 additions & 19 deletions trunk/arch/powerpc/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -1064,26 +1064,13 @@ int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3,
regs, 0, NULL, NULL);
}

int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,
unsigned long a3, unsigned long a4, unsigned long a5,
struct pt_regs *regs)
void __ret_from_kernel_execve(struct pt_regs *normal)
__noreturn;

void ret_from_kernel_execve(struct pt_regs *normal)
{
int error;
char *filename;

filename = getname((const char __user *) a0);
error = PTR_ERR(filename);
if (IS_ERR(filename))
goto out;
flush_fp_to_thread(current);
flush_altivec_to_thread(current);
flush_spe_to_thread(current);
error = do_execve(filename,
(const char __user *const __user *) a1,
(const char __user *const __user *) a2, regs);
putname(filename);
out:
return error;
set_thread_flag(TIF_RESTOREALL);
__ret_from_kernel_execve(normal);
}

static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
Expand Down
22 changes: 0 additions & 22 deletions trunk/arch/powerpc/kernel/sys_ppc32.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,28 +187,6 @@ asmlinkage int compat_sys_sendfile64(int out_fd, int in_fd, compat_loff_t __user
return ret;
}

long compat_sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,
unsigned long a3, unsigned long a4, unsigned long a5,
struct pt_regs *regs)
{
int error;
char * filename;

filename = getname((char __user *) a0);
error = PTR_ERR(filename);
if (IS_ERR(filename))
goto out;
flush_fp_to_thread(current);
flush_altivec_to_thread(current);

error = compat_do_execve(filename, compat_ptr(a1), compat_ptr(a2), regs);

putname(filename);

out:
return error;
}

/* Note: it is necessary to treat option as an unsigned int,
* with the corresponding cast to a signed int to insure that the
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
Expand Down

0 comments on commit ad2255b

Please sign in to comment.