mn10300: switch to generic kernel_execve()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
8f1597e959
commit
6e75421014
|
@ -61,7 +61,7 @@
|
||||||
###############################################################################
|
###############################################################################
|
||||||
.macro RESTORE_ALL
|
.macro RESTORE_ALL
|
||||||
# peel back the stack to the calling frame
|
# peel back the stack to the calling frame
|
||||||
# - this permits execve() to discard extra frames due to kernel syscalls
|
# - we need that when returning from interrupts to kernel mode
|
||||||
GET_THREAD_INFO a0
|
GET_THREAD_INFO a0
|
||||||
mov (TI_frame,a0),fp
|
mov (TI_frame,a0),fp
|
||||||
mov fp,sp
|
mov fp,sp
|
||||||
|
|
|
@ -119,20 +119,13 @@ struct thread_struct {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* do necessary setup to start up a newly executed thread
|
* do necessary setup to start up a newly executed thread
|
||||||
* - need to discard the frame stacked by the kernel thread invoking the execve
|
|
||||||
* syscall (see RESTORE_ALL macro)
|
|
||||||
*/
|
*/
|
||||||
static inline void start_thread(struct pt_regs *regs,
|
static inline void start_thread(struct pt_regs *regs,
|
||||||
unsigned long new_pc, unsigned long new_sp)
|
unsigned long new_pc, unsigned long new_sp)
|
||||||
{
|
{
|
||||||
struct thread_info *ti = current_thread_info();
|
regs->epsw = EPSW_nSL | EPSW_IE | EPSW_IM;
|
||||||
struct pt_regs *frame0;
|
regs->pc = new_pc;
|
||||||
|
regs->sp = new_sp;
|
||||||
frame0 = thread_info_to_uregs(ti);
|
|
||||||
frame0->epsw = EPSW_nSL | EPSW_IE | EPSW_IM;
|
|
||||||
frame0->pc = new_pc;
|
|
||||||
frame0->sp = new_sp;
|
|
||||||
ti->frame = frame0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -383,6 +383,7 @@
|
||||||
#define __ARCH_WANT_SYS_RT_SIGACTION
|
#define __ARCH_WANT_SYS_RT_SIGACTION
|
||||||
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
|
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
|
||||||
#define __ARCH_WANT_SYS_EXECVE
|
#define __ARCH_WANT_SYS_EXECVE
|
||||||
|
#define __ARCH_WANT_KERNEL_EXECVE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "Conditional" syscalls
|
* "Conditional" syscalls
|
||||||
|
|
|
@ -8,7 +8,7 @@ fpu-obj-$(CONFIG_FPU) := fpu.o fpu-low.o
|
||||||
|
|
||||||
obj-y := process.o signal.o entry.o traps.o irq.o \
|
obj-y := process.o signal.o entry.o traps.o irq.o \
|
||||||
ptrace.o setup.o time.o sys_mn10300.o io.o \
|
ptrace.o setup.o time.o sys_mn10300.o io.o \
|
||||||
switch_to.o mn10300_ksyms.o kernel_execve.o $(fpu-obj-y) \
|
switch_to.o mn10300_ksyms.o $(fpu-obj-y) \
|
||||||
csrc-mn10300.o cevt-mn10300.o
|
csrc-mn10300.o cevt-mn10300.o
|
||||||
|
|
||||||
obj-$(CONFIG_SMP) += smp.o smp-low.o
|
obj-$(CONFIG_SMP) += smp.o smp-low.o
|
||||||
|
|
|
@ -62,6 +62,13 @@ ENTRY(ret_from_kernel_thread)
|
||||||
calls (a0)
|
calls (a0)
|
||||||
jmp sys_exit
|
jmp sys_exit
|
||||||
|
|
||||||
|
ENTRY(ret_from_kernel_execve)
|
||||||
|
add -12,d0 /* pt_regs -> frame */
|
||||||
|
mov d0,sp
|
||||||
|
GET_THREAD_INFO a2
|
||||||
|
clr d0
|
||||||
|
jmp syscall_exit
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# system call handler
|
# system call handler
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
/* MN10300 In-kernel program execution
|
|
||||||
*
|
|
||||||
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
|
||||||
* Written by David Howells (dhowells@redhat.com)
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public Licence
|
|
||||||
* as published by the Free Software Foundation; either version
|
|
||||||
* 2 of the Licence, or (at your option) any later version.
|
|
||||||
*/
|
|
||||||
#include <linux/linkage.h>
|
|
||||||
#include <asm/unistd.h>
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# Do a system call from kernel instead of calling sys_execve so we end up with
|
|
||||||
# proper pt_regs.
|
|
||||||
#
|
|
||||||
# int kernel_execve(const char *filename, char *const argv[],
|
|
||||||
# char *const envp[])
|
|
||||||
#
|
|
||||||
# On entry: D0/D1/8(SP): arguments to function
|
|
||||||
# On return: D0: syscall return.
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
.globl kernel_execve
|
|
||||||
.type kernel_execve,@function
|
|
||||||
kernel_execve:
|
|
||||||
mov a3,a1
|
|
||||||
mov d0,a0
|
|
||||||
mov (12,sp),a3
|
|
||||||
mov +__NR_execve,d0
|
|
||||||
syscall 0
|
|
||||||
mov a1,a3
|
|
||||||
rets
|
|
||||||
|
|
||||||
.size kernel_execve,.-kernel_execve
|
|
Loading…
Reference in New Issue