[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 29/59] linux-user/sparc: Add 64-bit support to fpu save/restore
From: |
Laurent Vivier |
Subject: |
[PULL 29/59] linux-user/sparc: Add 64-bit support to fpu save/restore |
Date: |
Mon, 17 May 2021 20:13:54 +0200 |
From: Richard Henderson <richard.henderson@linaro.org>
The shape of the kernel's __siginfo_fpu_t is dependent on
the cpu type, not the abi. Which is weird, but there ya go.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20210426025334.1168495-23-richard.henderson@linaro.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
linux-user/sparc/signal.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
index 0ff57af43d1e..41a8b33bac3c 100644
--- a/linux-user/sparc/signal.c
+++ b/linux-user/sparc/signal.c
@@ -44,6 +44,12 @@ struct target_stackf {
};
struct target_siginfo_fpu {
+#ifdef TARGET_SPARC64
+ uint64_t si_double_regs[32];
+ uint64_t si_fsr;
+ uint64_t si_gsr;
+ uint64_t si_fprs;
+#else
/* It is more convenient for qemu to move doubles, not singles. */
uint64_t si_double_regs[16];
uint32_t si_fsr;
@@ -52,6 +58,7 @@ struct target_siginfo_fpu {
uint32_t insn_addr;
uint32_t insn;
} si_fpqueue [16];
+#endif
};
struct target_signal_frame {
@@ -167,21 +174,50 @@ static void save_fpu(struct target_siginfo_fpu *fpu,
CPUSPARCState *env)
{
int i;
+#ifdef TARGET_SPARC64
+ for (i = 0; i < 32; ++i) {
+ __put_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
+ }
+ __put_user(env->fsr, &fpu->si_fsr);
+ __put_user(env->gsr, &fpu->si_gsr);
+ __put_user(env->fprs, &fpu->si_fprs);
+#else
for (i = 0; i < 16; ++i) {
__put_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
}
__put_user(env->fsr, &fpu->si_fsr);
__put_user(0, &fpu->si_fpqdepth);
+#endif
}
static void restore_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
{
int i;
+#ifdef TARGET_SPARC64
+ uint64_t fprs;
+ __get_user(fprs, &fpu->si_fprs);
+
+ /* In case the user mucks about with FPRS, restore as directed. */
+ if (fprs & FPRS_DL) {
+ for (i = 0; i < 16; ++i) {
+ __get_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
+ }
+ }
+ if (fprs & FPRS_DU) {
+ for (i = 16; i < 32; ++i) {
+ __get_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
+ }
+ }
+ __get_user(env->fsr, &fpu->si_fsr);
+ __get_user(env->gsr, &fpu->si_gsr);
+ env->fprs |= fprs;
+#else
for (i = 0; i < 16; ++i) {
__get_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
}
__get_user(env->fsr, &fpu->si_fsr);
+#endif
}
void setup_frame(int sig, struct target_sigaction *ka,
--
2.31.1
- [PULL 12/59] linux-user/sparc: Include TARGET_STACK_BIAS in get_sp_from_cpustate, (continued)
- [PULL 12/59] linux-user/sparc: Include TARGET_STACK_BIAS in get_sp_from_cpustate, Laurent Vivier, 2021/05/17
- [PULL 16/59] linux-user/sparc: Merge sparc64 target_structs.h, Laurent Vivier, 2021/05/17
- [PULL 19/59] linux-user/sparc: Remove target_sigcontext as unused, Laurent Vivier, 2021/05/17
- [PULL 20/59] linux-user/sparc: Remove target_rt_signal_frame as unused, Laurent Vivier, 2021/05/17
- [PULL 22/59] linux-user/sparc: Use target_pt_regs, Laurent Vivier, 2021/05/17
- [PULL 25/59] linux-user/sparc: Save and restore fpu in signal frame, Laurent Vivier, 2021/05/17
- [PULL 21/59] linux-user/sparc: Fix the stackframe structure, Laurent Vivier, 2021/05/17
- [PULL 04/59] linux-user/arm: Do not emulate fpa11 in thumb mode, Laurent Vivier, 2021/05/17
- [PULL 09/59] linux-user: Use target_restore_altstack in all sigreturn, Laurent Vivier, 2021/05/17
- [PULL 10/59] linux-user: Pass CPUArchState to do_sigaltstack, Laurent Vivier, 2021/05/17
- [PULL 29/59] linux-user/sparc: Add 64-bit support to fpu save/restore,
Laurent Vivier <=
- [PULL 18/59] linux-user/sparc: Merge sparc64/ into sparc/, Laurent Vivier, 2021/05/17
- [PULL 30/59] linux-user/sparc: Implement sparc32 rt signals, Laurent Vivier, 2021/05/17
- [PULL 32/59] tests/tcg/sparc64: Re-enable linux-test, Laurent Vivier, 2021/05/17
- [PULL 28/59] linux-user/sparc: Minor corrections to do_sigreturn, Laurent Vivier, 2021/05/17
- [PULL 36/59] linux-user/s390x: Remove restore_sigregs return value, Laurent Vivier, 2021/05/17
- [PULL 37/59] linux-user/s390x: Fix trace in restore_regs, Laurent Vivier, 2021/05/17
- [PULL 23/59] linux-user/sparc: Split out save_reg_win, Laurent Vivier, 2021/05/17
- [PULL 27/59] linux-user/sparc: Clean up setup_frame, Laurent Vivier, 2021/05/17
- [PULL 26/59] linux-user/sparc: Add rwin_save to signal frame, Laurent Vivier, 2021/05/17
- [PULL 33/59] linux-user/s390x: Fix sigframe types, Laurent Vivier, 2021/05/17