Commit 6e68e076e72f42d43cc3b5435751d796c2410a3f

Authored by pbrook
1 parent a4a99d71

Move clone() register setup to target specific code. Handle fork-like clone.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4623 c046a42c-6fe2-441c-8c8c-71466251a162
linux-user/syscall.c
@@ -2744,64 +2744,8 @@ int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp) @@ -2744,64 +2744,8 @@ int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp)
2744 first_task_state = ts; 2744 first_task_state = ts;
2745 /* we create a new CPU instance. */ 2745 /* we create a new CPU instance. */
2746 new_env = cpu_copy(env); 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 new_env->opaque = ts; 2749 new_env->opaque = ts;
2806 #ifdef __ia64__ 2750 #ifdef __ia64__
2807 ret = __clone2(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env); 2751 ret = __clone2(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);
@@ -2813,6 +2757,9 @@ int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp) @@ -2813,6 +2757,9 @@ int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp)
2813 if ((flags & ~CSIGNAL) != 0) 2757 if ((flags & ~CSIGNAL) != 0)
2814 return -EINVAL; 2758 return -EINVAL;
2815 ret = fork(); 2759 ret = fork();
  2760 + if (ret == 0) {
  2761 + cpu_clone_regs(env, newsp);
  2762 + }
2816 } 2763 }
2817 return ret; 2764 return ret;
2818 } 2765 }
target-alpha/cpu.h
@@ -311,6 +311,15 @@ static inline int cpu_mmu_index (CPUState *env) @@ -311,6 +311,15 @@ static inline int cpu_mmu_index (CPUState *env)
311 return (env->ps >> 3) & 3; 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 #include "cpu-all.h" 323 #include "cpu-all.h"
315 324
316 enum { 325 enum {
target-arm/cpu.h
@@ -408,6 +408,15 @@ static inline int cpu_mmu_index (CPUState *env) @@ -408,6 +408,15 @@ static inline int cpu_mmu_index (CPUState *env)
408 return (env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR ? 1 : 0; 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 #include "cpu-all.h" 420 #include "cpu-all.h"
412 421
413 #endif 422 #endif
target-cris/cpu.h
@@ -218,6 +218,15 @@ static inline int cpu_mmu_index (CPUState *env) @@ -218,6 +218,15 @@ static inline int cpu_mmu_index (CPUState *env)
218 return !!(env->pregs[PR_CCS] & U_FLAG); 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 /* Support function regs. */ 230 /* Support function regs. */
222 #define SFR_RW_GC_CFG 0][0 231 #define SFR_RW_GC_CFG 0][0
223 #define SFR_RW_MM_CFG env->pregs[PR_SRS]][0 232 #define SFR_RW_MM_CFG env->pregs[PR_SRS]][0
target-i386/cpu.h
@@ -734,6 +734,15 @@ typedef struct CCTable { @@ -734,6 +734,15 @@ typedef struct CCTable {
734 734
735 extern CCTable cc_table[]; 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 #include "cpu-all.h" 746 #include "cpu-all.h"
738 747
739 #include "svm.h" 748 #include "svm.h"
target-m68k/cpu.h
@@ -226,6 +226,15 @@ static inline int cpu_mmu_index (CPUState *env) @@ -226,6 +226,15 @@ static inline int cpu_mmu_index (CPUState *env)
226 return (env->sr & SR_S) == 0 ? 1 : 0; 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 #include "cpu-all.h" 238 #include "cpu-all.h"
230 239
231 #endif 240 #endif
target-mips/cpu.h
@@ -500,6 +500,16 @@ static inline int cpu_mmu_index (CPUState *env) @@ -500,6 +500,16 @@ static inline int cpu_mmu_index (CPUState *env)
500 return env->hflags & MIPS_HFLAG_KSU; 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 #include "cpu-all.h" 513 #include "cpu-all.h"
504 514
505 /* Memory access type : 515 /* Memory access type :
target-ppc/cpu.h
@@ -822,6 +822,17 @@ static inline int cpu_mmu_index (CPUState *env) @@ -822,6 +822,17 @@ static inline int cpu_mmu_index (CPUState *env)
822 return env->mmu_idx; 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 #include "cpu-all.h" 836 #include "cpu-all.h"
826 837
827 /*****************************************************************************/ 838 /*****************************************************************************/
target-sh4/cpu.h
@@ -143,6 +143,15 @@ static inline int cpu_mmu_index (CPUState *env) @@ -143,6 +143,15 @@ static inline int cpu_mmu_index (CPUState *env)
143 return (env->sr & SR_MD) == 0 ? 1 : 0; 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 #include "cpu-all.h" 155 #include "cpu-all.h"
147 156
148 /* Memory access type */ 157 /* Memory access type */
target-sparc/cpu.h
@@ -403,6 +403,18 @@ static inline int cpu_fpu_enabled(CPUState *env1) @@ -403,6 +403,18 @@ static inline int cpu_fpu_enabled(CPUState *env1)
403 #endif 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 #include "cpu-all.h" 418 #include "cpu-all.h"
407 419
408 #endif 420 #endif