Loading arch/microblaze/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ config MICROBLAZE select MODULES_USE_ELF_RELA select GENERIC_KERNEL_THREAD select GENERIC_KERNEL_EXECVE select CLONE_BACKWARDS config SWAP def_bool n Loading arch/microblaze/include/asm/unistd.h +5 −0 Original line number Diff line number Diff line Loading @@ -423,6 +423,11 @@ #define __ARCH_WANT_SYS_RT_SIGACTION #define __ARCH_WANT_SYS_RT_SIGSUSPEND #define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_VFORK #ifdef CONFIG_MMU #define __ARCH_WANT_SYS_FORK #endif /* * "Conditional" syscalls Loading arch/microblaze/kernel/entry-nommu.S +0 −8 Original line number Diff line number Diff line Loading @@ -559,14 +559,6 @@ no_work_pending: rtid r14, 0 nop sys_vfork: brid microblaze_vfork addk r5, r1, r0 sys_clone: brid microblaze_clone addk r7, r1, r0 sys_rt_sigreturn_wrapper: brid sys_rt_sigreturn addk r5, r1, r0 Loading arch/microblaze/kernel/entry.S +0 −26 Original line number Diff line number Diff line Loading @@ -442,18 +442,6 @@ TRAP_return: /* Make global symbol for debugging */ nop; /* These syscalls need access to the struct pt_regs on the stack, so we implement them in assembly (they're basically all wrappers anyway). */ C_ENTRY(sys_fork_wrapper): addi r5, r0, SIGCHLD /* Arg 0: flags */ lwi r6, r1, PT_R1 /* Arg 1: child SP (use parent's) */ addik r7, r1, 0 /* Arg 2: parent context */ add r8, r0, r0 /* Arg 3: (unused) */ add r9, r0, r0; /* Arg 4: (unused) */ brid do_fork /* Do real work (tail-call) */ add r10, r0, r0; /* Arg 5: (unused) */ /* This the initial entry point for a new child thread, with an appropriate stack in place that makes it look the the child is in the middle of an syscall. This function is actually `returned to' from switch_thread Loading @@ -475,20 +463,6 @@ C_ENTRY(ret_from_kernel_thread): brid ret_from_trap add r3, r0, r0 C_ENTRY(sys_vfork): brid microblaze_vfork /* Do real work (tail-call) */ addik r5, r1, 0 C_ENTRY(sys_clone): bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */ lwi r6, r1, PT_R1; /* If so, use paret's stack ptr */ 1: addik r7, r1, 0; /* Arg 2: parent context */ lwi r9, r1, PT_R8; /* parent tid. */ lwi r10, r1, PT_R9; /* child tid. */ /* do_fork will pick up TLS from regs->r10. */ brid do_fork /* Do real work (tail-call) */ add r8, r0, r0; /* Arg 3: (unused) */ C_ENTRY(sys_rt_sigreturn_wrapper): brid sys_rt_sigreturn /* Do real work */ addik r5, r1, 0; /* add user context as 1st arg */ Loading arch/microblaze/kernel/process.c +5 −3 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ #include <linux/pm.h> #include <linux/tick.h> #include <linux/bitops.h> #include <linux/ptrace.h> #include <asm/pgalloc.h> #include <asm/uaccess.h> /* for USER_DS macros */ #include <asm/cacheflush.h> Loading Loading @@ -120,7 +121,7 @@ void flush_thread(void) int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg, struct task_struct *p, struct pt_regs *regs) struct task_struct *p, struct pt_regs *unused) { struct pt_regs *childregs = task_pt_regs(p); struct thread_info *ti = task_thread_info(p); Loading @@ -141,7 +142,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, ti->cpu_context.r15 = (unsigned long)ret_from_kernel_thread - 8; return 0; } *childregs = *regs; *childregs = *current_pt_regs(); if (usp) childregs->r1 = usp; memset(&ti->cpu_context, 0, sizeof(struct cpu_context)); Loading Loading
arch/microblaze/Kconfig +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ config MICROBLAZE select MODULES_USE_ELF_RELA select GENERIC_KERNEL_THREAD select GENERIC_KERNEL_EXECVE select CLONE_BACKWARDS config SWAP def_bool n Loading
arch/microblaze/include/asm/unistd.h +5 −0 Original line number Diff line number Diff line Loading @@ -423,6 +423,11 @@ #define __ARCH_WANT_SYS_RT_SIGACTION #define __ARCH_WANT_SYS_RT_SIGSUSPEND #define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_VFORK #ifdef CONFIG_MMU #define __ARCH_WANT_SYS_FORK #endif /* * "Conditional" syscalls Loading
arch/microblaze/kernel/entry-nommu.S +0 −8 Original line number Diff line number Diff line Loading @@ -559,14 +559,6 @@ no_work_pending: rtid r14, 0 nop sys_vfork: brid microblaze_vfork addk r5, r1, r0 sys_clone: brid microblaze_clone addk r7, r1, r0 sys_rt_sigreturn_wrapper: brid sys_rt_sigreturn addk r5, r1, r0 Loading
arch/microblaze/kernel/entry.S +0 −26 Original line number Diff line number Diff line Loading @@ -442,18 +442,6 @@ TRAP_return: /* Make global symbol for debugging */ nop; /* These syscalls need access to the struct pt_regs on the stack, so we implement them in assembly (they're basically all wrappers anyway). */ C_ENTRY(sys_fork_wrapper): addi r5, r0, SIGCHLD /* Arg 0: flags */ lwi r6, r1, PT_R1 /* Arg 1: child SP (use parent's) */ addik r7, r1, 0 /* Arg 2: parent context */ add r8, r0, r0 /* Arg 3: (unused) */ add r9, r0, r0; /* Arg 4: (unused) */ brid do_fork /* Do real work (tail-call) */ add r10, r0, r0; /* Arg 5: (unused) */ /* This the initial entry point for a new child thread, with an appropriate stack in place that makes it look the the child is in the middle of an syscall. This function is actually `returned to' from switch_thread Loading @@ -475,20 +463,6 @@ C_ENTRY(ret_from_kernel_thread): brid ret_from_trap add r3, r0, r0 C_ENTRY(sys_vfork): brid microblaze_vfork /* Do real work (tail-call) */ addik r5, r1, 0 C_ENTRY(sys_clone): bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */ lwi r6, r1, PT_R1; /* If so, use paret's stack ptr */ 1: addik r7, r1, 0; /* Arg 2: parent context */ lwi r9, r1, PT_R8; /* parent tid. */ lwi r10, r1, PT_R9; /* child tid. */ /* do_fork will pick up TLS from regs->r10. */ brid do_fork /* Do real work (tail-call) */ add r8, r0, r0; /* Arg 3: (unused) */ C_ENTRY(sys_rt_sigreturn_wrapper): brid sys_rt_sigreturn /* Do real work */ addik r5, r1, 0; /* add user context as 1st arg */ Loading
arch/microblaze/kernel/process.c +5 −3 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ #include <linux/pm.h> #include <linux/tick.h> #include <linux/bitops.h> #include <linux/ptrace.h> #include <asm/pgalloc.h> #include <asm/uaccess.h> /* for USER_DS macros */ #include <asm/cacheflush.h> Loading Loading @@ -120,7 +121,7 @@ void flush_thread(void) int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg, struct task_struct *p, struct pt_regs *regs) struct task_struct *p, struct pt_regs *unused) { struct pt_regs *childregs = task_pt_regs(p); struct thread_info *ti = task_thread_info(p); Loading @@ -141,7 +142,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, ti->cpu_context.r15 = (unsigned long)ret_from_kernel_thread - 8; return 0; } *childregs = *regs; *childregs = *current_pt_regs(); if (usp) childregs->r1 = usp; memset(&ti->cpu_context, 0, sizeof(struct cpu_context)); Loading