Skip to content

Commit

Permalink
linux-user/sparc: Fix the stackframe structure
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
rth7680 authored and vivier committed May 15, 2021
1 parent 4f4fdec commit f8ea624
Showing 1 changed file with 21 additions and 17 deletions.
38 changes: 21 additions & 17 deletions linux-user/sparc/signal.c
Expand Up @@ -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 {
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit f8ea624

Please sign in to comment.