1 /* Return -1 on error or 1 on success (never 0!). */ 2 static int 3 get_syscall_args(struct tcb *tcp) 4 { 5 if (x86_io.iov_len != sizeof(i386_regs)) { 6 /* x86-64 or x32 ABI */ 7 tcp->u_arg[0] = x86_64_regs.rdi; 8 tcp->u_arg[1] = x86_64_regs.rsi; 9 tcp->u_arg[2] = x86_64_regs.rdx; 10 tcp->u_arg[3] = x86_64_regs.r10; 11 tcp->u_arg[4] = x86_64_regs.r8; 12 tcp->u_arg[5] = x86_64_regs.r9; 13 #ifdef X32 14 tcp->ext_arg[0] = x86_64_regs.rdi; 15 tcp->ext_arg[1] = x86_64_regs.rsi; 16 tcp->ext_arg[2] = x86_64_regs.rdx; 17 tcp->ext_arg[3] = x86_64_regs.r10; 18 tcp->ext_arg[4] = x86_64_regs.r8; 19 tcp->ext_arg[5] = x86_64_regs.r9; 20 #endif 21 } else { 22 /* i386 ABI */ 23 /* Zero-extend from 32 bits */ 24 /* Use widen_to_long(tcp->u_arg[N]) in syscall handlers 25 * if you need to use *sign-extended* parameter. 26 */ 27 tcp->u_arg[0] = (long)(uint32_t)i386_regs.ebx; 28 tcp->u_arg[1] = (long)(uint32_t)i386_regs.ecx; 29 tcp->u_arg[2] = (long)(uint32_t)i386_regs.edx; 30 tcp->u_arg[3] = (long)(uint32_t)i386_regs.esi; 31 tcp->u_arg[4] = (long)(uint32_t)i386_regs.edi; 32 tcp->u_arg[5] = (long)(uint32_t)i386_regs.ebp; 33 } 34 return 1; 35 } 36