use nix::libc::user_regs_struct;
use crate::error::CouldNotResume;
use crate::process::TargetController;
use crate::run::Executing;
fn call_remote_syscall<E>(
ctrl: &mut TargetController<E>,
regs: user_regs_struct,
) -> Result<u64, CouldNotResume>
where
E: Executing,
{
let rip = regs.rip as usize;
let save = ctrl.read(rip, 2)?;
ctrl.write(rip, &[0x0f, 0x05])?;
ctrl.blind_singlestep()?;
let rax = ctrl.get_registers()?.rax;
ctrl.write(rip, &save)?;
Ok(rax)
}
macro_rules! define_syscall {
(
$(#[$outer: meta])*
$name: ident ($code: expr, $($reg: ident: $arg: ident),* )
) => {
$(#[$outer])*
pub fn $name<E>(
ctrl: &mut TargetController<E>,
$($arg: u64),*
) -> Result<u64, CouldNotResume>
where
E: Executing,
{
crate::with_registers!(
ctrl,
rax: $code, $($reg: $arg),*;
call_remote_syscall)
}
}
}
define_syscall! {
read(0, rdi: fd, rsi: buf, rdx: count)
}
define_syscall! {
write(1, rdi: fd, rsi: buf, rdx: count)
}
define_syscall! {
open(2, rdi: filename, rsi: flags, rdx: mode)
}
define_syscall! {
close(3, rdi: fd)
}
define_syscall! {
stat(4, rdi: filename, rsi: statbuf)
}
define_syscall! {
fstat(5, rdi: fd, rsi: statbuf)
}
define_syscall! {
lstat(6, rdi: filename, rsi: statbuf)
}
define_syscall! {
poll(7, rdi: ufds, rsi: nfds, rdx: timeout_msecs)
}
define_syscall! {
lseek(8, rdi: fd, rsi: offset, rdx: whence)
}
define_syscall! {
mmap(9, rdi: addr, rsi: len, rdx: prot, r10: flags, r8: fd, r9: off)
}
define_syscall! {
mprotect(10, rdi: start, rsi: len, rdx: prot)
}
define_syscall! {
munmap(11, rdi: addr, rsi: len)
}
define_syscall! {
brk(12, rdi: brk)
}
define_syscall! {
rt_sigaction(13, rdi: sig, rsi: act, rdx: oact, r10: sigsetsize)
}
define_syscall! {
rt_sigprocmask(14, rdi: how, rsi: nset, rdx: oset, r10: sigsetsize)
}
define_syscall! {
pread64(17, rdi: fd, rsi: buf, rdx: count, r10: pos)
}
define_syscall! {
pwrite64(18, rdi: fd, rsi: buf, rdx: count, r10: pos)
}
define_syscall! {
readv(19, rdi: fd, rsi: vec, rdx: vlen)
}
define_syscall! {
writev(20, rdi: fd, rsi: vec, rdx: vlen)
}
define_syscall! {
access(21, rdi: filename, rsi: mode)
}
define_syscall! {
pipe(22, rdi: fildes)
}
define_syscall! {
select(23, rdi: n, rsi: inp, rdx: outp, r10: exp, r8: tvp)
}
define_syscall! {
msync(26, rdi: start, rsi: len, rdx: flags)
}
define_syscall! {
mincore(27, rdi: start, rsi: len, rdx: vec)
}
define_syscall! {
madvise(28, rdi: start, rsi: len_in, rdx: behavior)
}
define_syscall! {
shmget(29, rdi: key, rsi: size, rdx: shmflg)
}
define_syscall! {
shmat(30, rdi: shmid, rsi: shmaddr, rdx: shmflg)
}
define_syscall! {
shmctl(31, rdi: shmid, rsi: cmd, rdx: buf)
}
define_syscall! {
dup(32, rdi: fildes)
}
define_syscall! {
dup2(33, rdi: oldfd, rsi: newfd)
}
define_syscall! {
getitimer(36, rdi: which, rsi: value)
}
define_syscall! {
alarm(37, rdi: seconds)
}
define_syscall! {
setitimer(38, rdi: which, rsi: value, rdx: ovalue)
}
define_syscall! {
socket(41, rdi: family, rsi: type_, rdx: protocol)
}
define_syscall! {
connect(42, rdi: fd, rsi: uservaddr, rdx: addrlen)
}
define_syscall! {
accept(43, rdi: fd, rsi: upeer_sockaddr, rdx: upeer_addrlen)
}
define_syscall! {
sendto(44, rdi: fd, rsi: buff, rdx: len, r10: flags, r8: addr, r9: addr_len)
}
define_syscall! {
recvfrom(45, rdi: fd, rsi: ubuf, rdx: size, r10: flags, r8: addr, r9: addr_len)
}
define_syscall! {
sendmsg(46, rdi: fd, rsi: msg, rdx: flags)
}
define_syscall! {
recvmsg(47, rdi: fd, rsi: msg, rdx: flags)
}
define_syscall! {
shutdown(48, rdi: fd, rsi: how)
}
define_syscall! {
bind(49, rdi: fd, rsi: umyaddr, rdx: addrlen)
}
define_syscall! {
listen(50, rdi: fd, rsi: backlog)
}
define_syscall! {
getsockname(51, rdi: fd, rsi: usockaddr, rdx: usockaddr_len)
}
define_syscall! {
getpeername(52, rdi: fd, rsi: usockaddr, rdx: usockaddr_len)
}
define_syscall! {
socketpair(53, rdi: family, rsi: type_, rdx: protocol, r10: usockvec)
}
define_syscall! {
setsockopt(54, rdi: fd, rsi: level, rdx: optname, r10: optval, r8: optlen)
}
define_syscall! {
getsockopt(55, rdi: fd, rsi: level, rdx: optname, r10: optval, r8: optlen)
}
define_syscall! {
clone(56, rdi: clone_flags, rsi: newsp, rdx: parent_tidptr, r10: child_tidptr, r8: tls_val)
}
define_syscall! {
execve(59, rdi: filename, rsi: argv, rdx: envp)
}
define_syscall! {
exit(60, rdi: error_code)
}
define_syscall! {
wait4(61, rdi: upid, rsi: stat_addr, rdx: options, r10: ru)
}
define_syscall! {
kill(62, rdi: pid, rsi: sig)
}
define_syscall! {
uname(63, rdi: name)
}
define_syscall! {
semget(64, rdi: key, rsi: nsems, rdx: semflg)
}
define_syscall! {
semop(65, rdi: semid, rsi: tsops, rdx: nsops)
}
define_syscall! {
semctl(66, rdi: semid, rsi: semnum, rdx: cmd, r10: arg)
}
define_syscall! {
shmdt(67, rdi: shmaddr)
}
define_syscall! {
msgget(68, rdi: key, rsi: msgflg)
}
define_syscall! {
msgsnd(69, rdi: msqid, rsi: msgp, rdx: msgsz, r10: msgflg)
}
define_syscall! {
msgrcv(70, rdi: msqid, rsi: msgp, rdx: msgsz, r10: msgtyp, r8: msgflg)
}
define_syscall! {
msgctl(71, rdi: msqid, rsi: cmd, rdx: buf)
}
define_syscall! {
fcntl(72, rdi: fd, rsi: cmd, rdx: arg)
}
define_syscall! {
flock(73, rdi: fd, rsi: cmd)
}
define_syscall! {
fsync(74, rdi: fd)
}
define_syscall! {
fdatasync(75, rdi: fd)
}
define_syscall! {
truncate(76, rdi: path, rsi: length)
}
define_syscall! {
ftruncate(77, rdi: fd, rsi: length)
}
define_syscall! {
getdents(78, rdi: fd, rsi: dirent, rdx: count)
}
define_syscall! {
getcwd(79, rdi: buf, rsi: size)
}
define_syscall! {
chdir(80, rdi: filename)
}
define_syscall! {
fchdir(81, rdi: fd)
}
define_syscall! {
rename(82, rdi: oldname, rsi: newname)
}
define_syscall! {
mkdir(83, rdi: pathname, rsi: mode)
}
define_syscall! {
rmdir(84, rdi: pathname)
}
define_syscall! {
creat(85, rdi: pathname, rsi: mode)
}
define_syscall! {
link(86, rdi: oldname, rsi: newname)
}
define_syscall! {
unlink(87, rdi: pathname)
}
define_syscall! {
symlink(88, rdi: oldname, rsi: newname)
}
define_syscall! {
readlink(89, rdi: path, rsi: buf, rdx: bufsiz)
}
define_syscall! {
chmod(90, rdi: filename, rsi: mode)
}
define_syscall! {
fchmod(91, rdi: fd, rsi: mode)
}
define_syscall! {
chown(92, rdi: filename, rsi: user, rdx: group)
}
define_syscall! {
fchown(93, rdi: fd, rsi: user, rdx: group)
}
define_syscall! {
lchown(94, rdi: filename, rsi: user, rdx: group)
}
define_syscall! {
umask(95, rdi: mask)
}
define_syscall! {
gettimeofday(96, rdi: tv, rsi: tz)
}
define_syscall! {
getrlimit(97, rdi: resource, rsi: rlim)
}
define_syscall! {
getrusage(98, rdi: who, rsi: ru)
}
define_syscall! {
sysinfo(99, rdi: info)
}
define_syscall! {
times(100, rdi: tbuf)
}
define_syscall! {
ptrace(101, rdi: request, rsi: pid, rdx: addr, r10: data)
}
define_syscall! {
setgid(106, rdi: gid)
}
define_syscall! {
setpgid(109, rdi: pid, rsi: pgid)
}
define_syscall! {
setregid(114, rdi: rgid, rsi: egid)
}
define_syscall! {
getgroups(115, rdi: gidsetsize, rsi: grouplist)
}
define_syscall! {
setgroups(116, rdi: gidsetsize, rsi: grouplist)
}
define_syscall! {
setresuid(117, rdi: ruid, rsi: euid, rdx: suid)
}
define_syscall! {
getresuid(118, rdi: ruidp, rsi: euidp, rdx: suidp)
}
define_syscall! {
setresgid(119, rdi: rgid, rsi: egid, rdx: sgid)
}
define_syscall! {
getresgid(120, rdi: rgidp, rsi: egidp, rdx: sgidp)
}
define_syscall! {
getpgid(121, rdi: pid)
}
define_syscall! {
setfsuid(122, rdi: uid)
}
define_syscall! {
setfsgid(123, rdi: gid)
}
define_syscall! {
getsid(124, rdi: pid)
}
define_syscall! {
capget(125, rdi: header, rsi: dataptr)
}
define_syscall! {
capset(126, rdi: header, rsi: data)
}
define_syscall! {
rt_sigpending(127, rdi: uset, rsi: sigsetsize)
}
define_syscall! {
rt_sigtimedwait(128, rdi: uthese, rsi: uinfo, rdx: uts, r10: sigsetsize)
}
define_syscall! {
rt_sigqueueinfo(129, rdi: pid, rsi: sig, rdx: uinfo)
}
define_syscall! {
rt_sigsuspend(130, rdi: unewset, rsi: sigsetsize)
}
define_syscall! {
sigaltstack(131, rdi: uss, rsi: uoss)
}
define_syscall! {
utime(132, rdi: filename, rsi: times)
}
define_syscall! {
mknod(133, rdi: filename, rsi: mode, rdx: dev)
}
define_syscall! {
uselib(134, rdi: library)
}
define_syscall! {
personality(135, rdi: personality)
}
define_syscall! {
ustat(136, rdi: dev, rsi: ubuf)
}
define_syscall! {
statfs(137, rdi: pathname, rsi: buf)
}
define_syscall! {
fstatfs(138, rdi: fd, rsi: buf)
}
define_syscall! {
sysfs(139, rdi: option, rsi: arg1, rdx: arg2)
}
define_syscall! {
getpriority(140, rdi: which, rsi: who)
}
define_syscall! {
setpriority(141, rdi: which, rsi: who, rdx: niceval)
}
define_syscall! {
sched_setparam(142, rdi: pid, rsi: param)
}
define_syscall! {
sched_getparam(143, rdi: pid, rsi: param)
}
define_syscall! {
sched_setscheduler(144, rdi: pid, rsi: policy, rdx: param)
}
define_syscall! {
sched_getscheduler(145, rdi: pid)
}
define_syscall! {
sched_get_priority_max(146, rdi: policy)
}
define_syscall! {
sched_get_priority_min(147, rdi: policy)
}
define_syscall! {
sched_rr_get_interval(148, rdi: pid, rsi: interval)
}
define_syscall! {
mlock(149, rdi: start, rsi: len)
}
define_syscall! {
munlock(150, rdi: start, rsi: len)
}
define_syscall! {
mlockall(151, rdi: flags)
}
define_syscall! {
modify_ldt(154, rdi: func, rsi: ptr, rdx: bytecount)
}
define_syscall! {
pivot_root(155, rdi: new_root, rsi: put_old)
}
define_syscall! {
_sysctl(156, rdi: args)
}
define_syscall! {
prctl(157, rdi: option, rsi: arg2, rdx: arg3, r10: arg4, r8: arg5)
}
define_syscall! {
arch_prctl(158, rdi: task, rsi: code, rdx: addr)
}
define_syscall! {
adjtimex(159, rdi: txc_p)
}
define_syscall! {
setrlimit(160, rdi: resource, rsi: rlim)
}
define_syscall! {
chroot(161, rdi: filename)
}
define_syscall! {
settimeofday(164, rdi: tv, rsi: tz)
}
define_syscall! {
mount(165, rdi: dev_name, rsi: dir_name, rdx: type_, r10: flags, r8: data)
}
define_syscall! {
umount2(166, rdi: name, rsi: flags)
}
define_syscall! {
swapon(167, rdi: specialfile, rsi: swap_flags)
}
define_syscall! {
swapoff(168, rdi: specialfile)
}
define_syscall! {
reboot(169, rdi: magic1, rsi: magic2, rdx: cmd, r10: arg)
}
define_syscall! {
sethostname(170, rdi: name, rsi: len)
}
define_syscall! {
setdomainname(171, rdi: name, rsi: len)
}
define_syscall! {
iopl(172, rdi: level)
}
define_syscall! {
ioperm(173, rdi: from, rsi: num, rdx: turn_on)
}
define_syscall! {
init_module(175, rdi: umod, rsi: len, rdx: uargs)
}
define_syscall! {
delete_module(176, rdi: name_user, rsi: flags)
}
define_syscall! {
quotactl(179, rdi: cmd, rsi: special, rdx: id, r10: addr)
}
define_syscall! {
setxattr(188, rdi: pathname, rsi: name, rdx: value, r10: size, r8: flags)
}
define_syscall! {
lsetxattr(189, rdi: pathname, rsi: name, rdx: value, r10: size, r8: flags)
}
define_syscall! {
fsetxattr(190, rdi: fd, rsi: name, rdx: value, r10: size, r8: flags)
}
define_syscall! {
getxattr(191, rdi: pathname, rsi: name, rdx: value, r10: size)
}
define_syscall! {
lgetxattr(192, rdi: pathname, rsi: name, rdx: value, r10: size)
}
define_syscall! {
fgetxattr(193, rdi: fd, rsi: name, rdx: value, r10: size)
}
define_syscall! {
listxattr(194, rdi: pathname, rsi: list, rdx: size)
}
define_syscall! {
llistxattr(195, rdi: pathname, rsi: list, rdx: size)
}
define_syscall! {
flistxattr(196, rdi: fd, rsi: list, rdx: size)
}
define_syscall! {
removexattr(197, rdi: pathname, rsi: name)
}
define_syscall! {
lremovexattr(198, rdi: pathname, rsi: name)
}
define_syscall! {
fremovexattr(199, rdi: fd, rsi: name)
}
define_syscall! {
tkill(200, rdi: pid, rsi: sig)
}
define_syscall! {
time(201, rdi: tloc)
}
define_syscall! {
futex(202, rdi: uaddr, rsi: op, rdx: val, r10: utime, r8: uaddr2, r9: val3)
}
define_syscall! {
sched_setaffinity(203, rdi: pid, rsi: len, rdx: user_mask_ptr)
}
define_syscall! {
sched_getaffinity(204, rdi: pid, rsi: len, rdx: user_mask_ptr)
}
define_syscall! {
set_thread_area(205, rdi: u_info)
}
define_syscall! {
io_setup(206, rdi: nr_events, rsi: ctxp)
}
define_syscall! {
io_destroy(207, rdi: ctx)
}
define_syscall! {
io_getevents(208, rdi: ctx_id, rsi: min_nr, rdx: nr, r10: events, r8: timeout)
}
define_syscall! {
io_submit(209, rdi: ctx_id, rsi: nr, rdx: iocbpp)
}
define_syscall! {
io_cancel(210, rdi: ctx_id, rsi: iocb, rdx: result)
}
define_syscall! {
get_thread_area(211, rdi: u_info)
}
define_syscall! {
lookup_dcookie(212, rdi: cookie64, rsi: buf, rdx: len)
}
define_syscall! {
epoll_create(213, rdi: size)
}
define_syscall! {
remap_file_pages(216, rdi: start, rsi: size, rdx: prot, r10: pgoff, r8: flags)
}
define_syscall! {
getdents64(217, rdi: fd, rsi: dirent, rdx: count)
}
define_syscall! {
set_tid_address(218, rdi: tidptr)
}
define_syscall! {
fadvise64(221, rdi: fd, rsi: offset, rdx: len, r10: advice)
}
define_syscall! {
timer_create(222, rdi: which_clock, rsi: timer_event_spec, rdx: created_timer_id)
}
define_syscall! {
timer_settime(223, rdi: timer_id, rsi: flags, rdx: new_setting, r10: old_setting)
}
define_syscall! {
timer_gettime(224, rdi: timer_id, rsi: setting)
}
define_syscall! {
timer_getoverrun(225, rdi: timer_id)
}
define_syscall! {
timer_delete(226, rdi: timer_id)
}
define_syscall! {
clock_settime(227, rdi: which_clock, rsi: tp)
}
define_syscall! {
clock_gettime(228, rdi: which_clock, rsi: tp)
}
define_syscall! {
clock_getres(229, rdi: which_clock, rsi: tp)
}
define_syscall! {
clock_nanosleep(230, rdi: which_clock, rsi: flags, rdx: rqtp, r10: rmtp)
}
define_syscall! {
exit_group(231, rdi: error_code)
}
define_syscall! {
epoll_wait(232, rdi: epfd, rsi: events, rdx: maxevents, r10: timeout)
}
define_syscall! {
epoll_ctl(233, rdi: epfd, rsi: op, rdx: fd, r10: event)
}
define_syscall! {
tgkill(234, rdi: tgid, rsi: pid, rdx: sig)
}
define_syscall! {
utimes(235, rdi: filename, rsi: utimes)
}
define_syscall! {
mbind(237, rdi: start, rsi: len, rdx: mode, r10: nmask, r8: maxnode, r9: flags)
}
define_syscall! {
set_mempolicy(238, rdi: mode, rsi: nmask, rdx: maxnode)
}
define_syscall! {
get_mempolicy(239, rdi: policy, rsi: nmask, rdx: maxnode, r10: addr, r8: flags)
}
define_syscall! {
mq_open(240, rdi: u_name, rsi: oflag, rdx: mode, r10: u_attr)
}
define_syscall! {
mq_unlink(241, rdi: u_name)
}
define_syscall! {
mq_timedsend(242, rdi: mqdes, rsi: u_msg_ptr, rdx: msg_len, r10: msg_prio, r8: u_abs_timeout)
}
define_syscall! {
mq_timedreceive(243, rdi: mqdes, rsi: u_msg_ptr, rdx: msg_len, r10: u_msg_prio, r8: u_abs_timeout)
}
define_syscall! {
mq_notify(244, rdi: mqdes, rsi: u_notification)
}
define_syscall! {
mq_getsetattr(245, rdi: mqdes, rsi: u_mqstat, rdx: u_omqstat)
}
define_syscall! {
kexec_load(246, rdi: entry, rsi: nr_segments, rdx: segments, r10: flags)
}
define_syscall! {
waitid(247, rdi: which, rsi: upid, rdx: infop, r10: options, r8: ru)
}
define_syscall! {
add_key(248, rdi: _type_, rsi: _description, rdx: _payload, r10: plen, r8: ringid)
}
define_syscall! {
request_key(249, rdi: _type_, rsi: _description, rdx: _callout_info, r10: destringid)
}
define_syscall! {
keyctl(250, rdi: option, rsi: arg2, rdx: arg3, r10: arg4, r8: arg5)
}
define_syscall! {
ioprio_set(251, rdi: which, rsi: who, rdx: ioprio)
}
define_syscall! {
ioprio_get(252, rdi: which, rsi: who)
}
define_syscall! {
inotify_rm_watch(255, rdi: fd, rsi: wd)
}
define_syscall! {
migrate_pages(256, rdi: pid, rsi: maxnode, rdx: old_nodes, r10: new_nodes)
}
define_syscall! {
openat(257, rdi: dfd, rsi: filename, rdx: flags, r10: mode)
}
define_syscall! {
mkdirat(258, rdi: dfd, rsi: pathname, rdx: mode)
}
define_syscall! {
mknodat(259, rdi: dfd, rsi: filename, rdx: mode, r10: dev)
}
define_syscall! {
fchownat(260, rdi: dfd, rsi: filename, rdx: user, r10: group, r8: flag)
}
define_syscall! {
futimesat(261, rdi: dfd, rsi: filename, rdx: utimes)
}
define_syscall! {
newfstatat(262, rdi: dfd, rsi: filename, rdx: statbuf, r10: flag)
}
define_syscall! {
unlinkat(263, rdi: dfd, rsi: pathname, rdx: flag)
}
define_syscall! {
renameat(264, rdi: olddfd, rsi: oldname, rdx: newdfd, r10: newname)
}
define_syscall! {
linkat(265, rdi: olddfd, rsi: oldname, rdx: newdfd, r10: newname, r8: flags)
}
define_syscall! {
symlinkat(266, rdi: oldname, rsi: newdfd, rdx: newname)
}
define_syscall! {
readlinkat(267, rdi: dfd, rsi: pathname, rdx: buf, r10: bufsiz)
}
define_syscall! {
fchmodat(268, rdi: dfd, rsi: filename, rdx: mode)
}
define_syscall! {
faccessat(269, rdi: dfd, rsi: filename, rdx: mode)
}
define_syscall! {
pselect6(270, rdi: n, rsi: inp, rdx: outp, r10: exp, r8: tsp, r9: sig)
}
define_syscall! {
ppoll(271, rdi: ufds, rsi: nfds, rdx: tsp, r10: sigmask, r8: sigsetsize)
}
define_syscall! {
unshare(272, rdi: unshare_flags)
}
define_syscall! {
set_robust_list(273, rdi: head, rsi: len)
}
define_syscall! {
get_robust_list(274, rdi: pid, rsi: head_ptr, rdx: len_ptr)
}
define_syscall! {
splice(275, rdi: fd_in, rsi: off_in, rdx: fd_out, r10: off_out, r8: len, r9: flags)
}
define_syscall! {
tee(276, rdi: fdin, rsi: fdout, rdx: len, r10: flags)
}
define_syscall! {
sync_file_range(277, rdi: fd, rsi: offset, rdx: nbytes, r10: flags)
}
define_syscall! {
vmsplice(278, rdi: fd, rsi: iov, rdx: nr_segs, r10: flags)
}
define_syscall! {
move_pages(279, rdi: pid, rsi: nr_pages, rdx: pages, r10: nodes, r8: status, r9: flags)
}
define_syscall! {
utimensat(280, rdi: dfd, rsi: filename, rdx: utimes, r10: flags)
}
define_syscall! {
epoll_pwait(281, rdi: epfd, rsi: events, rdx: maxevents, r10: timeout, r8: sigmask, r9: sigsetsize)
}
define_syscall! {
signalfd(282, rdi: ufd, rsi: user_mask, rdx: sizemask)
}
define_syscall! {
timerfd_create(283, rdi: clockid, rsi: flags)
}
define_syscall! {
eventfd(284, rdi: count)
}
define_syscall! {
fallocate(285, rdi: fd, rsi: mode, rdx: offset, r10: len)
}
define_syscall! {
timerfd_settime(286, rdi: ufd, rsi: flags, rdx: utmr, r10: otmr)
}
define_syscall! {
timerfd_gettime(287, rdi: ufd, rsi: otmr)
}
define_syscall! {
accept4(288, rdi: fd, rsi: upeer_sockaddr, rdx: upeer_addrlen, r10: flags)
}
define_syscall! {
signalfd4(289, rdi: ufd, rsi: user_mask, rdx: sizemask, r10: flags)
}
define_syscall! {
eventfd2(290, rdi: count, rsi: flags)
}
define_syscall! {
epoll_create1(291, rdi: flags)
}
define_syscall! {
dup3(292, rdi: oldfd, rsi: newfd, rdx: flags)
}
define_syscall! {
pipe2(293, rdi: fildes, rsi: flags)
}
define_syscall! {
inotify_init1(294, rdi: flags)
}
define_syscall! {
preadv(295, rdi: fd, rsi: vec, rdx: vlen, r10: pos_l, r8: pos_h)
}
define_syscall! {
pwritev(296, rdi: fd, rsi: vec, rdx: vlen, r10: pos_l, r8: pos_h)
}
define_syscall! {
rt_tgsigqueueinfo(297, rdi: tgid, rsi: pid, rdx: sig, r10: uinfo)
}
define_syscall! {
perf_event_open(298, rdi: attr_uptr, rsi: pid, rdx: cpu, r10: group_fd, r8: flags)
}
define_syscall! {
recvmmsg(299, rdi: fd, rsi: mmsg, rdx: vlen, r10: flags, r8: timeout)
}
define_syscall! {
fanotify_init(300, rdi: flags, rsi: event_f_flags)
}
define_syscall! {
fanotify_mark(301, rdi: fanotify_fd, rsi: flags, rdx: mask, r10: dfd, r8: pathname)
}
define_syscall! {
prlimit64(302, rdi: pid, rsi: resource, rdx: new_rlim, r10: old_rlim)
}
define_syscall! {
name_to_handle_at(303, rdi: dfd, rsi: name, rdx: handle, r10: mnt_id, r8: flag)
}
define_syscall! {
open_by_handle_at(304, rdi: mountdirfd, rsi: handle, rdx: flags)
}
define_syscall! {
clock_adjtime(305, rdi: which_clock, rsi: utx)
}
define_syscall! {
syncfs(306, rdi: fd)
}
define_syscall! {
sendmmsg(307, rdi: fd, rsi: mmsg, rdx: vlen, r10: flags)
}
define_syscall! {
setns(308, rdi: fd, rsi: nstype_)
}
define_syscall! {
getcpu(309, rdi: cpup, rsi: nodep, rdx: unused)
}
define_syscall! {
process_vm_readv(310, rdi: pid, rsi: lvec, rdx: liovcnt, r10: rvec, r8: riovcnt, r9: flags)
}
define_syscall! {
process_vm_writev(311, rdi: pid, rsi: lvec, rdx: liovcnt, r10: rvec, r8: riovcnt, r9: flags)
}
define_syscall! {
kcmp(312, rdi: pid1, rsi: pid2, rdx: type_, r10: idx1, r8: idx2)
}
define_syscall! {
finit_module(313, rdi: fd, rsi: uargs, rdx: flags)
}
#[cfg(test)]
mod tests {
use anyhow::Error as AnyError;
use crate::process::spawn_process;
use super::*;
#[allow(clippy::cast_sign_loss)]
#[test]
fn remote_mmap() -> Result<(), AnyError> {
let target = spawn_process("/bin/ls", ["-a"])?;
let mut ctrl = target.wait()?.assume_alive()?;
let minus1 = -1_i64 as u64;
let map_addr = mmap(&mut ctrl, 0, 0x1000, 0o777, 0x20, minus1, 0)?;
assert_ne!(minus1, map_addr);
Ok(())
}
}