Revision 6e68e076 linux-user/syscall.c
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 |
} |
Also available in: Unified diff