| static void |
| arch_sigreturn(struct tcb *tcp) |
| { |
| long addr; |
| |
| if (upeek(tcp->pid, 4*PT_USP, &addr) < 0) |
| return; |
| /* Fetch pointer to struct sigcontext. */ |
| if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0) |
| return; |
| |
| unsigned long mask[NSIG / 8 / sizeof(long)]; |
| /* Fetch first word of signal mask. */ |
| if (umove(tcp, addr, &mask[0]) < 0) |
| return; |
| |
| /* Fetch remaining words of signal mask, located immediately before. */ |
| addr -= sizeof(mask) - sizeof(long); |
| if (umoven(tcp, addr, sizeof(mask) - sizeof(long), &mask[1]) < 0) |
| return; |
| |
| tprintsigmask_addr("{mask=", mask); |
| tprints("}"); |
| } |