/*
 * Copyright (c) 2015-2021 The strace developers.
 * All rights reserved.
 *
 * SPDX-License-Identifier: LGPL-2.1-or-later
 */

static void
arch_sigreturn(struct tcb *tcp)
{
	unsigned long addr, sp;

	/* Fetch pointer to struct sigcontext.  */
	if (!get_stack_pointer(tcp, &sp) ||
	    umove_or_printaddr(tcp, sp + 2 * sizeof(int), &addr))
		return;

	unsigned long mask[NSIG_BYTES / sizeof(long)];
	/* Fetch first word of signal mask.  */
	if (umove_or_printaddr(tcp, addr, &mask[0]))
		return;

	/* Fetch remaining words of signal mask, located immediately before.  */
	addr -= sizeof(mask) - sizeof(long);
	if (umoven_or_printaddr(tcp, addr, sizeof(mask) - sizeof(long), &mask[1]))
		return;

	tprintsigmask_addr(mask);
}