Revision 6e68e076
b/linux-user/syscall.c | ||
---|---|---|
2744 | 2744 |
first_task_state = ts; |
2745 | 2745 |
/* we create a new CPU instance. */ |
2746 | 2746 |
new_env = cpu_copy(env); |
2747 |
#if defined(TARGET_I386) |
|
2748 |
if (!newsp) |
|
2749 |
newsp = env->regs[R_ESP]; |
|
2750 |
new_env->regs[R_ESP] = newsp; |
|
2751 |
new_env->regs[R_EAX] = 0; |
|
2752 |
#elif defined(TARGET_ARM) |
|
2753 |
if (!newsp) |
|
2754 |
newsp = env->regs[13]; |
|
2755 |
new_env->regs[13] = newsp; |
|
2756 |
new_env->regs[0] = 0; |
|
2757 |
#elif defined(TARGET_SPARC) |
|
2758 |
if (!newsp) |
|
2759 |
newsp = env->regwptr[22]; |
|
2760 |
new_env->regwptr[22] = newsp; |
|
2761 |
new_env->regwptr[0] = 0; |
|
2762 |
/* XXXXX */ |
|
2763 |
printf ("HELPME: %s:%d\n", __FILE__, __LINE__); |
|
2764 |
#elif defined(TARGET_M68K) |
|
2765 |
if (!newsp) |
|
2766 |
newsp = env->aregs[7]; |
|
2767 |
new_env->aregs[7] = newsp; |
|
2768 |
new_env->dregs[0] = 0; |
|
2769 |
/* ??? is this sufficient? */ |
|
2770 |
#elif defined(TARGET_MIPS) |
|
2771 |
if (!newsp) |
|
2772 |
newsp = env->gpr[env->current_tc][29]; |
|
2773 |
new_env->gpr[env->current_tc][29] = newsp; |
|
2774 |
#elif defined(TARGET_PPC) |
|
2775 |
if (!newsp) |
|
2776 |
newsp = env->gpr[1]; |
|
2777 |
new_env->gpr[1] = newsp; |
|
2778 |
{ |
|
2779 |
int i; |
|
2780 |
for (i = 7; i < 32; i++) |
|
2781 |
new_env->gpr[i] = 0; |
|
2782 |
} |
|
2783 |
#elif defined(TARGET_SH4) |
|
2784 |
if (!newsp) |
|
2785 |
newsp = env->gregs[15]; |
|
2786 |
new_env->gregs[15] = newsp; |
|
2787 |
/* XXXXX */ |
|
2788 |
#elif defined(TARGET_ALPHA) |
|
2789 |
if (!newsp) |
|
2790 |
newsp = env->ir[30]; |
|
2791 |
new_env->ir[30] = newsp; |
|
2792 |
/* ? */ |
|
2793 |
{ |
|
2794 |
int i; |
|
2795 |
for (i = 7; i < 30; i++) |
|
2796 |
new_env->ir[i] = 0; |
|
2797 |
} |
|
2798 |
#elif defined(TARGET_CRIS) |
|
2799 |
if (!newsp) |
|
2800 |
newsp = env->regs[14]; |
|
2801 |
new_env->regs[14] = newsp; |
|
2802 |
#else |
|
2803 |
#error unsupported target CPU |
|
2804 |
#endif |
|
2747 |
/* Init regs that differ from the parent. */ |
|
2748 |
cpu_clone_regs(new_env, newsp); |
|
2805 | 2749 |
new_env->opaque = ts; |
2806 | 2750 |
#ifdef __ia64__ |
2807 | 2751 |
ret = __clone2(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env); |
... | ... | |
2813 | 2757 |
if ((flags & ~CSIGNAL) != 0) |
2814 | 2758 |
return -EINVAL; |
2815 | 2759 |
ret = fork(); |
2760 |
if (ret == 0) { |
|
2761 |
cpu_clone_regs(env, newsp); |
|
2762 |
} |
|
2816 | 2763 |
} |
2817 | 2764 |
return ret; |
2818 | 2765 |
} |
b/target-alpha/cpu.h | ||
---|---|---|
311 | 311 |
return (env->ps >> 3) & 3; |
312 | 312 |
} |
313 | 313 |
|
314 |
#if defined(CONFIG_USER_ONLY) |
|
315 |
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
|
316 |
{ |
|
317 |
if (!newsp) |
|
318 |
env->ir[30] = newsp; |
|
319 |
/* FIXME: Zero syscall return value. */ |
|
320 |
} |
|
321 |
#endif |
|
322 |
|
|
314 | 323 |
#include "cpu-all.h" |
315 | 324 |
|
316 | 325 |
enum { |
b/target-arm/cpu.h | ||
---|---|---|
408 | 408 |
return (env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR ? 1 : 0; |
409 | 409 |
} |
410 | 410 |
|
411 |
#if defined(CONFIG_USER_ONLY) |
|
412 |
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
|
413 |
{ |
|
414 |
if (!newsp) |
|
415 |
env->regs[13] = newsp; |
|
416 |
env->regs[0] = 0; |
|
417 |
} |
|
418 |
#endif |
|
419 |
|
|
411 | 420 |
#include "cpu-all.h" |
412 | 421 |
|
413 | 422 |
#endif |
b/target-cris/cpu.h | ||
---|---|---|
218 | 218 |
return !!(env->pregs[PR_CCS] & U_FLAG); |
219 | 219 |
} |
220 | 220 |
|
221 |
#if defined(CONFIG_USER_ONLY) |
|
222 |
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
|
223 |
{ |
|
224 |
if (!newsp) |
|
225 |
env->regs[14] = newsp; |
|
226 |
env->regs[10] = 0; |
|
227 |
} |
|
228 |
#endif |
|
229 |
|
|
221 | 230 |
/* Support function regs. */ |
222 | 231 |
#define SFR_RW_GC_CFG 0][0 |
223 | 232 |
#define SFR_RW_MM_CFG env->pregs[PR_SRS]][0 |
b/target-i386/cpu.h | ||
---|---|---|
734 | 734 |
|
735 | 735 |
extern CCTable cc_table[]; |
736 | 736 |
|
737 |
#if defined(CONFIG_USER_ONLY) |
|
738 |
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
|
739 |
{ |
|
740 |
if (!newsp) |
|
741 |
env->regs[R_ESP] = newsp; |
|
742 |
env->regs[R_EAX] = 0; |
|
743 |
} |
|
744 |
#endif |
|
745 |
|
|
737 | 746 |
#include "cpu-all.h" |
738 | 747 |
|
739 | 748 |
#include "svm.h" |
b/target-m68k/cpu.h | ||
---|---|---|
226 | 226 |
return (env->sr & SR_S) == 0 ? 1 : 0; |
227 | 227 |
} |
228 | 228 |
|
229 |
#if defined(CONFIG_USER_ONLY) |
|
230 |
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
|
231 |
{ |
|
232 |
if (!newsp) |
|
233 |
env->aregs[7] = newsp; |
|
234 |
env->dregs[0] = 0; |
|
235 |
} |
|
236 |
#endif |
|
237 |
|
|
229 | 238 |
#include "cpu-all.h" |
230 | 239 |
|
231 | 240 |
#endif |
b/target-mips/cpu.h | ||
---|---|---|
500 | 500 |
return env->hflags & MIPS_HFLAG_KSU; |
501 | 501 |
} |
502 | 502 |
|
503 |
#if defined(CONFIG_USER_ONLY) |
|
504 |
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
|
505 |
{ |
|
506 |
if (!newsp) |
|
507 |
env->gpr[env->current_tc][29] = newsp; |
|
508 |
env->gpr[env->current_tc][7] = 0; |
|
509 |
env->gpr[env->current_tc][2] = 0; |
|
510 |
} |
|
511 |
#endif |
|
512 |
|
|
503 | 513 |
#include "cpu-all.h" |
504 | 514 |
|
505 | 515 |
/* Memory access type : |
b/target-ppc/cpu.h | ||
---|---|---|
822 | 822 |
return env->mmu_idx; |
823 | 823 |
} |
824 | 824 |
|
825 |
#if defined(CONFIG_USER_ONLY) |
|
826 |
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
|
827 |
{ |
|
828 |
int i; |
|
829 |
if (!newsp) |
|
830 |
env->gpr[1] = newsp; |
|
831 |
for (i = 7; i < 32; i++) |
|
832 |
env->gpr[i] = 0; |
|
833 |
} |
|
834 |
#endif |
|
835 |
|
|
825 | 836 |
#include "cpu-all.h" |
826 | 837 |
|
827 | 838 |
/*****************************************************************************/ |
b/target-sh4/cpu.h | ||
---|---|---|
143 | 143 |
return (env->sr & SR_MD) == 0 ? 1 : 0; |
144 | 144 |
} |
145 | 145 |
|
146 |
#if defined(CONFIG_USER_ONLY) |
|
147 |
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
|
148 |
{ |
|
149 |
if (!newsp) |
|
150 |
env->gregs[15] = newsp; |
|
151 |
env->gregs[0] = 0; |
|
152 |
} |
|
153 |
#endif |
|
154 |
|
|
146 | 155 |
#include "cpu-all.h" |
147 | 156 |
|
148 | 157 |
/* Memory access type */ |
b/target-sparc/cpu.h | ||
---|---|---|
403 | 403 |
#endif |
404 | 404 |
} |
405 | 405 |
|
406 |
#if defined(CONFIG_USER_ONLY) |
|
407 |
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
|
408 |
{ |
|
409 |
if (!newsp) |
|
410 |
env->regwptr[22] = newsp; |
|
411 |
env->regwptr[0] = 0; |
|
412 |
/* FIXME: Do we also need to clear CF? */ |
|
413 |
/* XXXXX */ |
|
414 |
printf ("HELPME: %s:%d\n", __FILE__, __LINE__); |
|
415 |
} |
|
416 |
#endif |
|
417 |
|
|
406 | 418 |
#include "cpu-all.h" |
407 | 419 |
|
408 | 420 |
#endif |
Also available in: Unified diff