Skip to content

Commit

Permalink
syscall/eventfd2: add support
Browse files Browse the repository at this point in the history
  • Loading branch information
FrankReh committed Oct 9, 2024
1 parent f04d1f6 commit 2675f14
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 29 deletions.
12 changes: 12 additions & 0 deletions src/tools/miri/src/shims/unix/linux/foreign_items.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {

let sys_getrandom = this.eval_libc("SYS_getrandom").to_target_usize(this)?;
let sys_futex = this.eval_libc("SYS_futex").to_target_usize(this)?;
let sys_eventfd2 = this.eval_libc("SYS_eventfd2").to_target_usize(this)?;

if args.is_empty() {
throw_ub_format!(
Expand Down Expand Up @@ -155,6 +156,17 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
id if id == sys_futex => {
futex(this, &args[1..], dest)?;
}
id if id == sys_eventfd2 => {
let [_, initval, flags, ..] = args else {
throw_ub_format!(
"incorrect number of arguments for `eventfd2` syscall: got {}, expected at least 3",
args.len()
);
};

let result = this.eventfd(initval, flags)?;
this.write_int(result.to_i32()?, dest)?;
}
id => {
this.handle_unsupported_foreign_item(format!(
"can't execute syscall with ID {id}"
Expand Down
14 changes: 0 additions & 14 deletions src/tools/miri/tests/fail-dep/libc/libc_syscall_eventfd2.rs

This file was deleted.

15 changes: 0 additions & 15 deletions src/tools/miri/tests/fail-dep/libc/libc_syscall_eventfd2.stderr

This file was deleted.

9 changes: 9 additions & 0 deletions src/tools/miri/tests/pass-dep/libc/libc-eventfd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use std::thread;
fn main() {
test_read_write();
test_race();
test_syscall();
}

fn read_bytes<const N: usize>(fd: i32, buf: &mut [u8; N]) -> i32 {
Expand Down Expand Up @@ -109,3 +110,11 @@ fn test_race() {
thread::yield_now();
thread1.join().unwrap();
}

// This is a test for calling eventfd2 through a syscall.
fn test_syscall() {
let initval = 0 as libc::c_uint;
let flags = (libc::EFD_CLOEXEC | libc::EFD_NONBLOCK) as libc::c_int;
let fd = unsafe { libc::syscall(libc::SYS_eventfd2, initval, flags) };
assert_ne!(fd, -1);
}

0 comments on commit 2675f14

Please sign in to comment.