#ifndef SIZEOF_STRUCT_SPARC_STACKF # define SIZEOF_STRUCT_SPARC_STACKF sizeof(struct sparc_stackf) #endif #ifndef SIZEOF_STRUCT_PT_REGS # define SIZEOF_STRUCT_PT_REGS sizeof(struct pt_regs) #endif #ifndef PERSONALITY_WORDSIZE # define PERSONALITY_WORDSIZE PERSONALITY0_WORDSIZE #endif static void arch_sigreturn(struct tcb *tcp) { unsigned long addr = sparc_regs.u_regs[U_REG_FP] + SIZEOF_STRUCT_SPARC_STACKF + SIZEOF_STRUCT_PT_REGS; struct { unsigned int mask; char fpu_save[PERSONALITY_WORDSIZE]; char insns[PERSONALITY_WORDSIZE * 2] ATTRIBUTE_ALIGNED(8); unsigned int extramask[NSIG_BYTES / sizeof(int) - 1]; } frame; if (umove(tcp, addr, &frame) < 0) { tprintf("{mask=%#lx}", addr); } else { unsigned int mask[NSIG_BYTES / sizeof(int)]; mask[0] = frame.mask; memcpy(mask + 1, frame.extramask, sizeof(frame.extramask)); tprintsigmask_addr("{mask=", mask); tprints("}"); } } #undef PERSONALITY_WORDSIZE #undef SIZEOF_STRUCT_PT_REGS #undef SIZEOF_STRUCT_SPARC_STACKF