* x32-specific system call numbers start at 512 to avoid cache impact
* for native 64-bit operation.
*/
-[512] = { 4, TS, SEN(rt_sigaction), "rt_sigaction" },
-[513] = { 0, TS, SEN(sigreturn), "rt_sigreturn" },
-[514] = { 3, TD, SEN(ioctl), "ioctl" },
-[515] = { 3, TD, SEN(readv), "readv" },
-[516] = { 3, TD, SEN(writev), "writev" },
-[517] = { 6, TN, SEN(recvfrom), "recvfrom" },
-[518] = { 3, TN, SEN(sendmsg), "sendmsg" },
-[519] = { 3, TN, SEN(recvmsg), "recvmsg" },
-[520] = { 3, TF|TP|SE|SI, SEN(execve), "execve" },
-[521] = { 4, 0, SEN(ptrace), "ptrace" },
-[522] = { 2, TS, SEN(rt_sigpending), "rt_sigpending" },
-[523] = { 4, TS, SEN(rt_sigtimedwait), "rt_sigtimedwait" },
-[524] = { 3, TS, SEN(rt_sigqueueinfo), "rt_sigqueueinfo" },
-[525] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
-[526] = { 3, 0, SEN(timer_create), "timer_create" },
-[527] = { 2, 0, SEN(mq_notify), "mq_notify" },
-[528] = { 4, 0, SEN(kexec_load), "kexec_load" },
-[529] = { 5, TP, SEN(waitid), "waitid" },
-[530] = { 2, 0, SEN(set_robust_list), "set_robust_list" },
-[531] = { 3, 0, SEN(get_robust_list), "get_robust_list" },
-[532] = { 4, TD, SEN(vmsplice), "vmsplice" },
-[533] = { 6, TM, SEN(move_pages), "move_pages" },
+[512] = { 4, CST|TS, SEN(rt_sigaction), "rt_sigaction" },
+[513] = { 0, CST|TS, SEN(sigreturn), "rt_sigreturn" },
+[514] = { 3, CST|TD, SEN(ioctl), "ioctl" },
+[515] = { 3, CST|TD, SEN(readv), "readv" },
+[516] = { 3, CST|TD, SEN(writev), "writev" },
+[517] = { 6, CST|TN, SEN(recvfrom), "recvfrom" },
+[518] = { 3, CST|TN, SEN(sendmsg), "sendmsg" },
+[519] = { 3, CST|TN, SEN(recvmsg), "recvmsg" },
+[520] = { 3, CST|TF|TP|SE|SI,SEN(execve), "execve" },
+[521] = { 4, CST, SEN(ptrace), "ptrace" },
+[522] = { 2, CST|TS, SEN(rt_sigpending), "rt_sigpending" },
+[523] = { 4, CST|TS, SEN(rt_sigtimedwait), "rt_sigtimedwait" },
+[524] = { 3, CST|TS, SEN(rt_sigqueueinfo), "rt_sigqueueinfo" },
+[525] = { 2, CST|TS, SEN(sigaltstack), "sigaltstack" },
+[526] = { 3, CST, SEN(timer_create), "timer_create" },
+[527] = { 2, CST, SEN(mq_notify), "mq_notify" },
+[528] = { 4, CST, SEN(kexec_load), "kexec_load" },
+[529] = { 5, CST|TP, SEN(waitid), "waitid" },
+[530] = { 2, CST, SEN(set_robust_list), "set_robust_list" },
+[531] = { 3, CST, SEN(get_robust_list), "get_robust_list" },
+[532] = { 4, CST|TD, SEN(vmsplice), "vmsplice" },
+[533] = { 6, CST|TM, SEN(move_pages), "move_pages" },
[534] = { 4, TD, SEN(preadv), "preadv" },
[535] = { 4, TD, SEN(pwritev), "pwritev" },
-[536] = { 4, TP|TS, SEN(rt_tgsigqueueinfo), "rt_tgsigqueueinfo" },
-[537] = { 5, TN, SEN(recvmmsg), "recvmmsg" },
-[538] = { 4, TN, SEN(sendmmsg), "sendmmsg" },
-[539] = { 6, 0, SEN(process_vm_readv), "process_vm_readv" },
-[540] = { 6, 0, SEN(process_vm_writev), "process_vm_writev" },
-[541] = { 5, TN, SEN(setsockopt), "setsockopt" },
-[542] = { 5, TN, SEN(getsockopt), "getsockopt" },
-[543] = { 2, TM, SEN(io_setup), "io_setup" },
-[544] = { 3, 0, SEN(io_submit), "io_submit" },
-[545] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
+[536] = { 4, CST|TP|TS, SEN(rt_tgsigqueueinfo), "rt_tgsigqueueinfo" },
+[537] = { 5, CST|TN, SEN(recvmmsg), "recvmmsg" },
+[538] = { 4, CST|TN, SEN(sendmmsg), "sendmmsg" },
+[539] = { 6, CST, SEN(process_vm_readv), "process_vm_readv" },
+[540] = { 6, CST, SEN(process_vm_writev), "process_vm_writev" },
+[541] = { 5, CST|TN, SEN(setsockopt), "setsockopt" },
+[542] = { 5, CST|TN, SEN(getsockopt), "getsockopt" },
+[543] = { 2, CST|TM, SEN(io_setup), "io_setup" },
+[544] = { 3, CST, SEN(io_submit), "io_submit" },
+[545] = { 5, CST|TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
[546] = { 6, TD, SEN(preadv2), "preadv2" },
[547] = { 6, TD, SEN(pwritev2), "pwritev2" },
{
if (x86_io.iov_len != sizeof(i386_regs)) {
/* x86-64 or x32 ABI */
- tcp->u_arg[0] = x86_64_regs.rdi;
- tcp->u_arg[1] = x86_64_regs.rsi;
- tcp->u_arg[2] = x86_64_regs.rdx;
- tcp->u_arg[3] = x86_64_regs.r10;
- tcp->u_arg[4] = x86_64_regs.r8;
- tcp->u_arg[5] = x86_64_regs.r9;
+ if (tcp->s_ent->sys_flags & COMPAT_SYSCALL_TYPES) {
+ /*
+ * X32 compat syscall: zero-extend from 32 bits.
+ * Use widen_to_long(tcp->u_arg[N]) in syscall handlers
+ * if you need to use *sign-extended* parameter.
+ */
#ifdef X32
- tcp->ext_arg[0] = x86_64_regs.rdi;
- tcp->ext_arg[1] = x86_64_regs.rsi;
- tcp->ext_arg[2] = x86_64_regs.rdx;
- tcp->ext_arg[3] = x86_64_regs.r10;
- tcp->ext_arg[4] = x86_64_regs.r8;
- tcp->ext_arg[5] = x86_64_regs.r9;
+ tcp->u_arg[0] = tcp->ext_arg[0] = (uint32_t) x86_64_regs.rdi;
+ tcp->u_arg[1] = tcp->ext_arg[1] = (uint32_t) x86_64_regs.rsi;
+ tcp->u_arg[2] = tcp->ext_arg[2] = (uint32_t) x86_64_regs.rdx;
+ tcp->u_arg[3] = tcp->ext_arg[3] = (uint32_t) x86_64_regs.r10;
+ tcp->u_arg[4] = tcp->ext_arg[4] = (uint32_t) x86_64_regs.r8;
+ tcp->u_arg[5] = tcp->ext_arg[5] = (uint32_t) x86_64_regs.r9;
+#else
+ tcp->u_arg[0] = (uint32_t) x86_64_regs.rdi;
+ tcp->u_arg[1] = (uint32_t) x86_64_regs.rsi;
+ tcp->u_arg[2] = (uint32_t) x86_64_regs.rdx;
+ tcp->u_arg[3] = (uint32_t) x86_64_regs.r10;
+ tcp->u_arg[4] = (uint32_t) x86_64_regs.r8;
+ tcp->u_arg[5] = (uint32_t) x86_64_regs.r9;
#endif
+ } else {
+#ifdef X32
+ tcp->u_arg[0] = tcp->ext_arg[0] = x86_64_regs.rdi;
+ tcp->u_arg[1] = tcp->ext_arg[1] = x86_64_regs.rsi;
+ tcp->u_arg[2] = tcp->ext_arg[2] = x86_64_regs.rdx;
+ tcp->u_arg[3] = tcp->ext_arg[3] = x86_64_regs.r10;
+ tcp->u_arg[4] = tcp->ext_arg[4] = x86_64_regs.r8;
+ tcp->u_arg[5] = tcp->ext_arg[5] = x86_64_regs.r9;
+#else
+ tcp->u_arg[0] = x86_64_regs.rdi;
+ tcp->u_arg[1] = x86_64_regs.rsi;
+ tcp->u_arg[2] = x86_64_regs.rdx;
+ tcp->u_arg[3] = x86_64_regs.r10;
+ tcp->u_arg[4] = x86_64_regs.r8;
+ tcp->u_arg[5] = x86_64_regs.r9;
+#endif
+ }
} else {
- /* i386 ABI */
- /* Zero-extend from 32 bits */
- /* Use widen_to_long(tcp->u_arg[N]) in syscall handlers
+ /*
+ * i386 ABI: zero-extend from 32 bits.
+ * Use widen_to_long(tcp->u_arg[N]) in syscall handlers
* if you need to use *sign-extended* parameter.
*/
- tcp->u_arg[0] = (long)(uint32_t)i386_regs.ebx;
- tcp->u_arg[1] = (long)(uint32_t)i386_regs.ecx;
- tcp->u_arg[2] = (long)(uint32_t)i386_regs.edx;
- tcp->u_arg[3] = (long)(uint32_t)i386_regs.esi;
- tcp->u_arg[4] = (long)(uint32_t)i386_regs.edi;
- tcp->u_arg[5] = (long)(uint32_t)i386_regs.ebp;
+ tcp->u_arg[0] = (uint32_t) i386_regs.ebx;
+ tcp->u_arg[1] = (uint32_t) i386_regs.ecx;
+ tcp->u_arg[2] = (uint32_t) i386_regs.edx;
+ tcp->u_arg[3] = (uint32_t) i386_regs.esi;
+ tcp->u_arg[4] = (uint32_t) i386_regs.edi;
+ tcp->u_arg[5] = (uint32_t) i386_regs.ebp;
}
return 1;
}