Skip to content

Commit 42cba27

Browse files
committed
Support 'epoll_pwait' when given a NULL sigmask
The 'epoll_pwait' syscall with a NULL signal mask is equivalent to calling 'epoll_wait'. Golang uses 'epoll_pwait' rather than 'epoll_wait' in its runtime scheduler.
1 parent 9fca3be commit 42cba27

3 files changed

Lines changed: 14 additions & 0 deletions

File tree

src/main/host/syscall/epoll.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,15 @@ SysCallReturn syscallhandler_epoll_wait(SysCallHandler* sys,
216216
/* Return the number of events that are ready. */
217217
return (SysCallReturn){.state = SYSCALL_DONE, .retval.as_i64 = nEvents};
218218
}
219+
220+
SysCallReturn syscallhandler_epoll_pwait(SysCallHandler* sys, const SysCallArgs* args) {
221+
PluginPtr sigmask = args->args[4].as_ptr;
222+
223+
if (sigmask.val != 0) {
224+
error("epoll_pwait called with non-null sigmask, which is not yet supported by shadow; "
225+
"returning ENOSYS");
226+
return (SysCallReturn){.state = SYSCALL_DONE, .retval.as_i64 = -ENOSYS};
227+
}
228+
229+
return syscallhandler_epoll_wait(sys, args);
230+
}

src/main/host/syscall/epoll.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
SYSCALL_HANDLER(epoll_create);
1212
SYSCALL_HANDLER(epoll_create1);
1313
SYSCALL_HANDLER(epoll_ctl);
14+
SYSCALL_HANDLER(epoll_pwait);
1415
SYSCALL_HANDLER(epoll_wait);
1516

1617
#endif /* SRC_MAIN_HOST_SYSCALL_EPOLL_H_ */

src/main/host/syscall_handler.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ SysCallReturn syscallhandler_make_syscall(SysCallHandler* sys,
281281
HANDLE(epoll_create);
282282
HANDLE(epoll_create1);
283283
HANDLE(epoll_ctl);
284+
HANDLE(epoll_pwait);
284285
HANDLE(epoll_wait);
285286
HANDLE(eventfd);
286287
HANDLE(eventfd2);

0 commit comments

Comments
 (0)