Skip to content

process_madvise

Implemented in Antinomie 0.7.0 · Syscall list

long process_madvise(int pidfd, const struct iovec *vec, size_t vlen, int behavior, unsigned int flags);
Number (x86-64) 440
ABI common
Kernel entry point sys_process_madvise

This is the raw kernel prototype from the pinned Linux 6.12.94 schema, not the libc wrapper.

Like madvise, applied to ranges in another process.

Name Type Meaning
pidfd (arg0) int File descriptor referring to a process.
vec (arg1) const struct iovec * Pointer to an array of iovec structures.
vlen (arg2) size_t Number of messages or vector entries.
behavior (arg3) int Advice or behavior selector.
flags (arg4) unsigned int Option flags that change the behavior of the call.

On success: The number of bytes transferred (see the description for what 0 means).

In an Antinomie trace the Return column and the ret filter field show the raw kernel return value. On failure that is the negative errno, for example -2 for ENOENT, not the -1 plus errno that the libc wrapper gives. syscall.errno holds the positive errno and syscall.success is false.

Raw return Name Meaning
-9 EBADF A file descriptor is not valid for this operation.
-1 EPERM The operation is not permitted for this process.

process_madvise(2) on man7.org

Coverage mark: Implemented. Every pointer argument has a capture rule in the pinned kernel patch and none of them records a “no decoder”, “address only” or “not observed” gap on any code path. Individual values can still be incomplete on a particular call; see the capture statuses.

Every call is recorded as an Entry record (the six argument words and the pointees copied at entry) and an Exit record (the return value and the pointees copied at exit).

Argument When How Recorded field key Condition
pidfd (arg0) Entry raw scalar word args.0, args.pidfd
vec (arg1) Entry the pointer itself, as a raw word args.1, args.raw[1]
↳ pointee Entry array of iovec describing the ranges in the other process (the array itself, not the ranges’ contents) arg1.remote_ranges always
vlen (arg2) Entry raw scalar word args.2, args.vlen
behavior (arg3) Entry raw scalar word args.3, args.behavior
flags (arg4) Entry raw scalar word; Syscall Trace also decodes it into flag names (unknown group), listing unknown bits separately args.4, args.flags
  • Result: ret, syscall.errno, syscall.success, syscall.duration_ns.
  • Argument words: args.pidfd (arg0), args.vec (arg1), args.vlen (arg2), args.behavior (arg3), args.flags (arg4); args.0 to args.5 by position.
  • Structure iovec[] behind vec (arg1): args.vec.<member> for iov_base, iov_len.

See Syscall Trace filter for the full syntax.

For what the capture statuses mean, see Capture statuses. For what is never recorded, see Known gaps.