[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 22/25] linux-user/sparc: Add 64-bit support to fpu save/restor
From: |
Richard Henderson |
Subject: |
[PATCH v2 22/25] linux-user/sparc: Add 64-bit support to fpu save/restore |
Date: |
Sun, 25 Apr 2021 19:53:31 -0700 |
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>
---
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 0ff57af43d..41a8b33bac 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.25.1
- [PATCH v2 01/25] linux-user: Split out target_restore_altstack, (continued)
- [PATCH v2 01/25] linux-user: Split out target_restore_altstack, Richard Henderson, 2021/04/25
- [PATCH v2 02/25] linux-user: Use target_restore_altstack in all sigreturn, Richard Henderson, 2021/04/25
- [PATCH v2 03/25] linux-user: Pass CPUArchState to do_sigaltstack, Richard Henderson, 2021/04/25
- [PATCH v2 07/25] linux-user/sparc: Merge sparc64 target_syscall.h, Richard Henderson, 2021/04/25
- [PATCH v2 04/25] linux-user: Pass CPUArchState to target_restore_altstack, Richard Henderson, 2021/04/25
- [PATCH v2 06/25] linux-user/sparc: Clean up init_thread, Richard Henderson, 2021/04/25
- [PATCH v2 16/25] linux-user/sparc: Split out save_reg_win, Richard Henderson, 2021/04/25
- [PATCH v2 17/25] linux-user/sparc: Clean up get_sigframe, Richard Henderson, 2021/04/25
- [PATCH v2 05/25] linux-user/sparc: Include TARGET_STACK_BIAS in get_sp_from_cpustate, Richard Henderson, 2021/04/25
- [PATCH v2 10/25] linux-user/sparc: Merge sparc64 termbits.h, Richard Henderson, 2021/04/25
- [PATCH v2 22/25] linux-user/sparc: Add 64-bit support to fpu save/restore,
Richard Henderson <=
- [PATCH v2 11/25] linux-user/sparc: Merge sparc64/ into sparc/, Richard Henderson, 2021/04/25
- [PATCH v2 14/25] linux-user/sparc: Fix the stackframe structure, Richard Henderson, 2021/04/25
- [PATCH v2 13/25] linux-user/sparc: Remove target_rt_signal_frame as unused, Richard Henderson, 2021/04/25
- [PATCH v2 15/25] linux-user/sparc: Use target_pt_regs, Richard Henderson, 2021/04/25
- [PATCH v2 20/25] linux-user/sparc: Clean up setup_frame, Richard Henderson, 2021/04/25
- [PATCH v2 24/25] linux-user/sparc: Implement sparc64 rt signals, Richard Henderson, 2021/04/25
- [PATCH v2 09/25] linux-user/sparc: Merge sparc64 target_structs.h, Richard Henderson, 2021/04/25
- [PATCH v2 25/25] tests/tcg/sparc64: Re-enable linux-test, Richard Henderson, 2021/04/25
- [PATCH v2 12/25] linux-user/sparc: Remove target_sigcontext as unused, Richard Henderson, 2021/04/25
- [PATCH v2 08/25] linux-user/sparc: Merge sparc64 target_elf.h, Richard Henderson, 2021/04/25