(root)/
strace-6.5/
src/
linux/
ia64/
get_syscall_args.c
       1  /*
       2   * Copyright (c) 2015-2021 The strace developers.
       3   * All rights reserved.
       4   *
       5   * SPDX-License-Identifier: LGPL-2.1-or-later
       6   */
       7  
       8  #include <asm/rse.h>
       9  
      10  /* Return -1 on error or 1 on success (never 0!). */
      11  static int
      12  arch_get_syscall_args(struct tcb *tcp)
      13  {
      14  	unsigned long *rbs_end =
      15  		(unsigned long *) ia64_regs.ar[PT_AUR_BSP];
      16  	unsigned long sof = (ia64_regs.cfm >> 0) & 0x7f;
      17  	unsigned long sol = (ia64_regs.cfm >> 7) & 0x7f;
      18  	unsigned long *out0 = ia64_rse_skip_regs(rbs_end, -sof + sol);
      19  
      20  	for (unsigned int i = 0; i < n_args(tcp); ++i) {
      21  		if (umove(tcp,
      22  			  (unsigned long) ia64_rse_skip_regs(out0, i),
      23  			  &tcp->u_arg[i]) < 0) {
      24  			if (errno == EPERM)
      25  				tcp->u_arg[i] = 0;
      26  			else
      27  				return -1;
      28  		}
      29  	}
      30  
      31  	return 1;
      32  }