aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/kernel/process.c')
-rw-r--r--arch/s390/kernel/process.c64
1 files changed, 27 insertions, 37 deletions
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
index 5cd38a90e64..e0563baa1cf 100644
--- a/arch/s390/kernel/process.c
+++ b/arch/s390/kernel/process.c
@@ -1,18 +1,10 @@
1/* 1/*
2 * arch/s390/kernel/process.c 2 * This file handles the architecture dependent parts of process handling.
3 * 3 *
4 * S390 version 4 * Copyright IBM Corp. 1999,2009
5 * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation 5 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>,
6 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), 6 * Hartmut Penner <hp@de.ibm.com>,
7 * Hartmut Penner (hp@de.ibm.com), 7 * Denis Joseph Barrow,
8 * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
9 *
10 * Derived from "arch/i386/kernel/process.c"
11 * Copyright (C) 1995, Linus Torvalds
12 */
13
14/*
15 * This file handles the architecture-dependent parts of process handling..
16 */ 8 */
17 9
18#include <linux/compiler.h> 10#include <linux/compiler.h>
@@ -168,34 +160,34 @@ void release_thread(struct task_struct *dead_task)
168} 160}
169 161
170int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp, 162int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp,
171 unsigned long unused, 163 unsigned long unused,
172 struct task_struct * p, struct pt_regs * regs) 164 struct task_struct *p, struct pt_regs *regs)
173{ 165{
174 struct fake_frame 166 struct fake_frame
175 { 167 {
176 struct stack_frame sf; 168 struct stack_frame sf;
177 struct pt_regs childregs; 169 struct pt_regs childregs;
178 } *frame; 170 } *frame;
179 171
180 frame = container_of(task_pt_regs(p), struct fake_frame, childregs); 172 frame = container_of(task_pt_regs(p), struct fake_frame, childregs);
181 p->thread.ksp = (unsigned long) frame; 173 p->thread.ksp = (unsigned long) frame;
182 /* Store access registers to kernel stack of new process. */ 174 /* Store access registers to kernel stack of new process. */
183 frame->childregs = *regs; 175 frame->childregs = *regs;
184 frame->childregs.gprs[2] = 0; /* child returns 0 on fork. */ 176 frame->childregs.gprs[2] = 0; /* child returns 0 on fork. */
185 frame->childregs.gprs[15] = new_stackp; 177 frame->childregs.gprs[15] = new_stackp;
186 frame->sf.back_chain = 0; 178 frame->sf.back_chain = 0;
187 179
188 /* new return point is ret_from_fork */ 180 /* new return point is ret_from_fork */
189 frame->sf.gprs[8] = (unsigned long) ret_from_fork; 181 frame->sf.gprs[8] = (unsigned long) ret_from_fork;
190 182
191 /* fake return stack for resume(), don't go back to schedule */ 183 /* fake return stack for resume(), don't go back to schedule */
192 frame->sf.gprs[9] = (unsigned long) frame; 184 frame->sf.gprs[9] = (unsigned long) frame;
193 185
194 /* Save access registers to new thread structure. */ 186 /* Save access registers to new thread structure. */
195 save_access_regs(&p->thread.acrs[0]); 187 save_access_regs(&p->thread.acrs[0]);
196 188
197#ifndef CONFIG_64BIT 189#ifndef CONFIG_64BIT
198 /* 190 /*
199 * save fprs to current->thread.fp_regs to merge them with 191 * save fprs to current->thread.fp_regs to merge them with
200 * the emulated registers and then copy the result to the child. 192 * the emulated registers and then copy the result to the child.
201 */ 193 */
@@ -220,10 +212,9 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp,
220#endif /* CONFIG_64BIT */ 212#endif /* CONFIG_64BIT */
221 /* start new process with ar4 pointing to the correct address space */ 213 /* start new process with ar4 pointing to the correct address space */
222 p->thread.mm_segment = get_fs(); 214 p->thread.mm_segment = get_fs();
223 /* Don't copy debug registers */ 215 /* Don't copy debug registers */
224 memset(&p->thread.per_info,0,sizeof(p->thread.per_info)); 216 memset(&p->thread.per_info, 0, sizeof(p->thread.per_info));
225 217 return 0;
226 return 0;
227} 218}
228 219
229SYSCALL_DEFINE0(fork) 220SYSCALL_DEFINE0(fork)
@@ -311,7 +302,7 @@ out:
311int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs) 302int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs)
312{ 303{
313#ifndef CONFIG_64BIT 304#ifndef CONFIG_64BIT
314 /* 305 /*
315 * save fprs to current->thread.fp_regs to merge them with 306 * save fprs to current->thread.fp_regs to merge them with
316 * the emulated registers and then copy the result to the dump. 307 * the emulated registers and then copy the result to the dump.
317 */ 308 */
@@ -346,4 +337,3 @@ unsigned long get_wchan(struct task_struct *p)
346 } 337 }
347 return 0; 338 return 0;
348} 339}
349