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 Workerget_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