xref: /aosp_15_r20/external/strace/linux/ia64/get_syscall_args.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker #include <asm/rse.h>
2*cf84ac9aSAndroid Build Coastguard Worker 
3*cf84ac9aSAndroid Build Coastguard Worker /* Return -1 on error or 1 on success (never 0!). */
4*cf84ac9aSAndroid Build Coastguard Worker static int
get_syscall_args(struct tcb * tcp)5*cf84ac9aSAndroid Build Coastguard Worker get_syscall_args(struct tcb *tcp)
6*cf84ac9aSAndroid Build Coastguard Worker {
7*cf84ac9aSAndroid Build Coastguard Worker 	unsigned long *rbs_end =
8*cf84ac9aSAndroid Build Coastguard Worker 		(unsigned long *) ia64_regs.ar[PT_AUR_BSP];
9*cf84ac9aSAndroid Build Coastguard Worker 	unsigned long sof = (ia64_regs.cfm >> 0) & 0x7f;
10*cf84ac9aSAndroid Build Coastguard Worker 	unsigned long sol = (ia64_regs.cfm >> 7) & 0x7f;
11*cf84ac9aSAndroid Build Coastguard Worker 	unsigned long *out0 = ia64_rse_skip_regs(rbs_end, -sof + sol);
12*cf84ac9aSAndroid Build Coastguard Worker 	unsigned int i;
13*cf84ac9aSAndroid Build Coastguard Worker 
14*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 0; i < tcp->s_ent->nargs; ++i) {
15*cf84ac9aSAndroid Build Coastguard Worker 		if (umove(tcp,
16*cf84ac9aSAndroid Build Coastguard Worker 			  (unsigned long) ia64_rse_skip_regs(out0, i),
17*cf84ac9aSAndroid Build Coastguard Worker 			  &tcp->u_arg[i]) < 0) {
18*cf84ac9aSAndroid Build Coastguard Worker 			if (errno == EPERM)
19*cf84ac9aSAndroid Build Coastguard Worker 				tcp->u_arg[i] = 0;
20*cf84ac9aSAndroid Build Coastguard Worker 			else
21*cf84ac9aSAndroid Build Coastguard Worker 				return -1;
22*cf84ac9aSAndroid Build Coastguard Worker 		}
23*cf84ac9aSAndroid Build Coastguard Worker 	}
24*cf84ac9aSAndroid Build Coastguard Worker 
25*cf84ac9aSAndroid Build Coastguard Worker 	return 1;
26*cf84ac9aSAndroid Build Coastguard Worker }
27