mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-01-22 18:05:10 +00:00
compel/aarch64: refactor fpregs handling
Refactor user_fpregs_struct_t to wrap user_fpsimd_state in a dedicated struct, preparing for future extending by just adding new members Signed-off-by: Igor Svilenkov Bozic <svilenkov@gmail.com> [ alex: fixes ] Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com> Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com> Acked-by: Mike Rapoport <rppt@kernel.org>
This commit is contained in:
parent
90300748ef
commit
501b714f76
3 changed files with 18 additions and 14 deletions
|
|
@ -16,7 +16,11 @@
|
|||
*/
|
||||
|
||||
typedef struct user_pt_regs user_regs_struct_t;
|
||||
typedef struct user_fpsimd_state user_fpregs_struct_t;
|
||||
|
||||
struct user_fpregs_struct {
|
||||
struct user_fpsimd_state fpstate;
|
||||
};
|
||||
typedef struct user_fpregs_struct user_fpregs_struct_t;
|
||||
|
||||
#define __compel_arch_fetch_thread_area(tid, th) 0
|
||||
#define compel_arch_fetch_thread_area(tctl) 0
|
||||
|
|
|
|||
|
|
@ -43,10 +43,10 @@ int sigreturn_prep_regs_plain(struct rt_sigframe *sigframe, user_regs_struct_t *
|
|||
sigframe->uc.uc_mcontext.pc = regs->pc;
|
||||
sigframe->uc.uc_mcontext.pstate = regs->pstate;
|
||||
|
||||
memcpy(fpsimd->vregs, fpregs->vregs, 32 * sizeof(__uint128_t));
|
||||
memcpy(fpsimd->vregs, fpregs->fpstate.vregs, 32 * sizeof(__uint128_t));
|
||||
|
||||
fpsimd->fpsr = fpregs->fpsr;
|
||||
fpsimd->fpcr = fpregs->fpcr;
|
||||
fpsimd->fpsr = fpregs->fpstate.fpsr;
|
||||
fpsimd->fpcr = fpregs->fpstate.fpcr;
|
||||
|
||||
fpsimd->head.magic = FPSIMD_MAGIC;
|
||||
fpsimd->head.size = sizeof(*fpsimd);
|
||||
|
|
@ -59,7 +59,7 @@ int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe, struct rt_sigfr
|
|||
return 0;
|
||||
}
|
||||
|
||||
int compel_get_task_regs(pid_t pid, user_regs_struct_t *regs, user_fpregs_struct_t *fpsimd, save_regs_t save,
|
||||
int compel_get_task_regs(pid_t pid, user_regs_struct_t *regs, user_fpregs_struct_t *ext_regs, save_regs_t save,
|
||||
void *arg, __maybe_unused unsigned long flags)
|
||||
{
|
||||
struct iovec iov;
|
||||
|
|
@ -74,14 +74,14 @@ int compel_get_task_regs(pid_t pid, user_regs_struct_t *regs, user_fpregs_struct
|
|||
goto err;
|
||||
}
|
||||
|
||||
iov.iov_base = fpsimd;
|
||||
iov.iov_len = sizeof(*fpsimd);
|
||||
iov.iov_base = &ext_regs->fpstate;
|
||||
iov.iov_len = sizeof(ext_regs->fpstate);
|
||||
if ((ret = ptrace(PTRACE_GETREGSET, pid, NT_PRFPREG, &iov))) {
|
||||
pr_perror("Failed to obtain FPU registers for %d", pid);
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = save(pid, arg, regs, fpsimd);
|
||||
ret = save(pid, arg, regs, ext_regs);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -92,8 +92,8 @@ int compel_set_task_ext_regs(pid_t pid, user_fpregs_struct_t *ext_regs)
|
|||
|
||||
pr_info("Restoring GP/FPU registers for %d\n", pid);
|
||||
|
||||
iov.iov_base = ext_regs;
|
||||
iov.iov_len = sizeof(*ext_regs);
|
||||
iov.iov_base = &ext_regs->fpstate;
|
||||
iov.iov_len = sizeof(ext_regs->fpstate);
|
||||
if (ptrace(PTRACE_SETREGSET, pid, NT_PRFPREG, &iov)) {
|
||||
pr_perror("Failed to set FPU registers for %d", pid);
|
||||
return -1;
|
||||
|
|
|
|||
|
|
@ -157,11 +157,11 @@ int save_task_regs(pid_t pid, void *x, user_regs_struct_t *regs, user_fpregs_str
|
|||
|
||||
// Save the FP/SIMD state
|
||||
for (i = 0; i < 32; ++i) {
|
||||
core->ti_aarch64->fpsimd->vregs[2 * i] = fpsimd->vregs[i];
|
||||
core->ti_aarch64->fpsimd->vregs[2 * i + 1] = fpsimd->vregs[i] >> 64;
|
||||
core->ti_aarch64->fpsimd->vregs[2 * i] = fpsimd->fpstate.vregs[i];
|
||||
core->ti_aarch64->fpsimd->vregs[2 * i + 1] = fpsimd->fpstate.vregs[i] >> 64;
|
||||
}
|
||||
assign_reg(core->ti_aarch64->fpsimd, fpsimd, fpsr);
|
||||
assign_reg(core->ti_aarch64->fpsimd, fpsimd, fpcr);
|
||||
assign_reg(core->ti_aarch64->fpsimd, &fpsimd->fpstate, fpsr);
|
||||
assign_reg(core->ti_aarch64->fpsimd, &fpsimd->fpstate, fpcr);
|
||||
|
||||
if (save_pac_keys(pid, core))
|
||||
return -1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue