1 // SPDX-License-Identifier: GPL-2.0 1 2 3 /* 4 * This file handles the architecture independ 5 */ 6 7 #include <linux/compat.h> 8 #include <linux/errno.h> 9 #include <linux/kernel.h> 10 #include <linux/ptrace.h> 11 #include <linux/sched.h> 12 #include <linux/sched/task.h> 13 #include <linux/sched/task_stack.h> 14 #include <linux/signal.h> 15 16 #include "kernel.h" 17 18 asmlinkage long sparc_fork(struct pt_regs *reg 19 { 20 unsigned long orig_i1 = regs->u_regs[U 21 long ret; 22 struct kernel_clone_args args = { 23 .exit_signal = SIGCHLD, 24 /* Reuse the parent's stack fo 25 .stack = regs->u_regs 26 }; 27 28 ret = kernel_clone(&args); 29 30 /* If we get an error and potentially 31 * call, we're screwed because copy_th 32 * the parent's %o1. So detect that c 33 * here. 34 */ 35 if ((unsigned long)ret >= -ERESTART_RE 36 regs->u_regs[UREG_I1] = orig_i 37 38 return ret; 39 } 40 41 asmlinkage long sparc_vfork(struct pt_regs *re 42 { 43 unsigned long orig_i1 = regs->u_regs[U 44 long ret; 45 46 struct kernel_clone_args args = { 47 .flags = CLONE_VFORK 48 .exit_signal = SIGCHLD, 49 /* Reuse the parent's stack fo 50 .stack = regs->u_regs 51 }; 52 53 ret = kernel_clone(&args); 54 55 /* If we get an error and potentially 56 * call, we're screwed because copy_th 57 * the parent's %o1. So detect that c 58 * here. 59 */ 60 if ((unsigned long)ret >= -ERESTART_RE 61 regs->u_regs[UREG_I1] = orig_i 62 63 return ret; 64 } 65 66 asmlinkage long sparc_clone(struct pt_regs *re 67 { 68 unsigned long orig_i1 = regs->u_regs[U 69 unsigned int flags = lower_32_bits(reg 70 long ret; 71 72 struct kernel_clone_args args = { 73 .flags = (flags & ~CS 74 .exit_signal = (flags & CSI 75 .tls = regs->u_regs 76 }; 77 78 #ifdef CONFIG_COMPAT 79 if (test_thread_flag(TIF_32BIT)) { 80 args.pidfd = compat_ptr(r 81 args.child_tid = compat_ptr(r 82 args.parent_tid = compat_ptr(r 83 } else 84 #endif 85 { 86 args.pidfd = (int __user 87 args.child_tid = (int __user 88 args.parent_tid = (int __user 89 } 90 91 /* Did userspace give setup a separate 92 * reusing the parent's? 93 */ 94 if (regs->u_regs[UREG_I1]) 95 args.stack = regs->u_regs[UREG 96 else 97 args.stack = regs->u_regs[UREG 98 99 ret = kernel_clone(&args); 100 101 /* If we get an error and potentially 102 * call, we're screwed because copy_th 103 * the parent's %o1. So detect that c 104 * here. 105 */ 106 if ((unsigned long)ret >= -ERESTART_RE 107 regs->u_regs[UREG_I1] = orig_i 108 109 return ret; 110 } 111
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.