/* * Since the FPR[0-31] is stored in the first double word of VSR[0-31] and * FPR are saved through the FP state, there is no need to save the upper part * of the first 32 VSX registers. * Furthermore, the 32 last VSX registers are also the 32 Altivec registers * already saved, so no need to save them. * As a consequence, only the doubleword 1 of the 32 first VSX registers have * to be saved (the ones are returned by PTRACE_GETVSRREGS). */ static int get_vsx_regs(pid_t pid, CoreEntry *core) { UserPpc64VsxstateEntry *vse; uint64_t vsregs[32]; int i; if (ptrace(PTRACE_GETVSRREGS, pid, 0, (void*)&vsregs) < 0) { /* * EIO is returned in the case PTRACE_GETVRREGS is not * supported. */ if (errno == EIO) { pr_debug("VSX register's dump not supported.\n"); return 0; } pr_perror("Couldn't get VSX registers"); return -1; } pr_debug("Dumping VSX registers\n"); vse = xmalloc(sizeof(*vse)); if (!vse) return -1; user_ppc64_vsxstate_entry__init(vse); vse->n_vsxregs = 32; vse->vsxregs = xmalloc(vse->n_vsxregs * sizeof(vse->vsxregs[0])); if (!vse->vsxregs) { xfree(vse); return -1; } for (i = 0; i < vse->n_vsxregs; i++) vse->vsxregs[i] = vsregs[i]; core->ti_ppc64->vsxstate = vse; /* * Force the MSR_VSX bit of the restored MSR otherwise the kernel * will not restore them from the signal frame. */ core->ti_ppc64->gpregs->msr |= MSR_VSX; return 0; }
static UserPpc64VsxstateEntry* copy_vsx_regs(uint64_t *vsregs) { UserPpc64VsxstateEntry *vse; int i; vse = xmalloc(sizeof(*vse)); if (!vse) return NULL; user_ppc64_vsxstate_entry__init(vse); vse->n_vsxregs = NVSXREG; vse->vsxregs = xmalloc(vse->n_vsxregs*sizeof(vse->vsxregs[0])); if (!vse->vsxregs) { xfree(vse); return NULL; } for (i = 0; i < vse->n_vsxregs; i++) vse->vsxregs[i] = vsregs[i]; return vse; }