linux-user/sparc: Fix the stackframe structure
Move target_reg_window up and use it. Fold structptr and xxargs into xargs -- the use of a host pointer was incorrect anyway. Rename the structure to target_stackf for consistency. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20210426025334.1168495-15-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
		
							parent
							
								
									4f4fdec308
								
							
						
					
					
						commit
						f8ea624e74
					
				| @ -21,16 +21,26 @@ | ||||
| #include "signal-common.h" | ||||
| #include "linux-user/trace.h" | ||||
| 
 | ||||
| /* A Sparc stack frame */ | ||||
| struct sparc_stackf { | ||||
| /* A Sparc register window */ | ||||
| struct target_reg_window { | ||||
|     abi_ulong locals[8]; | ||||
|     abi_ulong ins[8]; | ||||
|     /* It's simpler to treat fp and callers_pc as elements of ins[]
 | ||||
|          * since we never need to access them ourselves. | ||||
|          */ | ||||
|     char *structptr; | ||||
|     abi_ulong xargs[6]; | ||||
|     abi_ulong xxargs[1]; | ||||
| }; | ||||
| 
 | ||||
| /* A Sparc stack frame. */ | ||||
| struct target_stackf { | ||||
|     /*
 | ||||
|      * Since qemu does not reference fp or callers_pc directly, | ||||
|      * it's simpler to treat fp and callers_pc as elements of ins[], | ||||
|      * and then bundle locals[] and ins[] into reg_window. | ||||
|      */ | ||||
|     struct target_reg_window win; | ||||
|     /*
 | ||||
|      * Similarly, bundle structptr and xxargs into xargs[]. | ||||
|      * This portion of the struct is part of the function call abi, | ||||
|      * and belongs to the callee for spilling argument registers. | ||||
|      */ | ||||
|     abi_ulong xargs[8]; | ||||
| }; | ||||
| 
 | ||||
| typedef struct { | ||||
| @ -56,7 +66,7 @@ typedef struct { | ||||
| 
 | ||||
| 
 | ||||
| struct target_signal_frame { | ||||
|     struct sparc_stackf ss; | ||||
|     struct target_stackf ss; | ||||
|     __siginfo_t         info; | ||||
|     abi_ulong           fpu_save; | ||||
|     uint32_t            insns[2] QEMU_ALIGNED(8); | ||||
| @ -150,10 +160,10 @@ void setup_frame(int sig, struct target_sigaction *ka, | ||||
|     } | ||||
| 
 | ||||
|     for (i = 0; i < 8; i++) { | ||||
|         __put_user(env->regwptr[i + WREG_L0], &sf->ss.locals[i]); | ||||
|         __put_user(env->regwptr[i + WREG_L0], &sf->ss.win.locals[i]); | ||||
|     } | ||||
|     for (i = 0; i < 8; i++) { | ||||
|         __put_user(env->regwptr[i + WREG_I0], &sf->ss.ins[i]); | ||||
|         __put_user(env->regwptr[i + WREG_I0], &sf->ss.win.ins[i]); | ||||
|     } | ||||
|     if (err) | ||||
|         goto sigsegv; | ||||
| @ -349,12 +359,6 @@ struct target_ucontext { | ||||
|     target_mcontext_t tuc_mcontext; | ||||
| }; | ||||
| 
 | ||||
| /* A V9 register window */ | ||||
| struct target_reg_window { | ||||
|     abi_ulong locals[8]; | ||||
|     abi_ulong ins[8]; | ||||
| }; | ||||
| 
 | ||||
| /* {set, get}context() needed for 64-bit SparcLinux userland. */ | ||||
| void sparc64_set_context(CPUSPARCState *env) | ||||
| { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Richard Henderson
						Richard Henderson