diff --git a/src/arch/x86/linux/syscall_tbl64.cc b/src/arch/x86/linux/syscall_tbl64.cc index 94837cd080..7231595fe7 100644 --- a/src/arch/x86/linux/syscall_tbl64.cc +++ b/src/arch/x86/linux/syscall_tbl64.cc @@ -244,7 +244,7 @@ SyscallDescTable EmuLinux::syscallDescs64 = { { 201, "time", timeFunc }, { 202, "futex", futexFunc }, { 203, "sched_setaffinity", ignoreFunc }, - { 204, "sched_getaffinity", ignoreFunc }, + { 204, "sched_getaffinity", schedGetaffinityFunc }, { 205, "set_thread_area" }, { 206, "io_setup" }, { 207, "io_destroy" }, diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index cd2d8d16ef..3c1ad04f72 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -57,6 +57,7 @@ /// application on the host machine. #if defined(__linux__) +#include #include #include @@ -2603,4 +2604,26 @@ eventfdFunc(SyscallDesc *desc, ThreadContext *tc, #endif } +/// Target sched_getaffinity +template +SyscallReturn +schedGetaffinityFunc(SyscallDesc *desc, ThreadContext *tc, + pid_t pid, size_t cpusetsize, VPtr<> cpu_set_mask) +{ +#if defined(__linux__) + if (cpusetsize < CPU_ALLOC_SIZE(tc->getSystemPtr()->threads.size())) + return -EINVAL; + + BufferArg maskBuf(cpu_set_mask, cpusetsize); + maskBuf.copyIn(tc->getVirtProxy()); + for (int i = 0; i < tc->getSystemPtr()->threads.size(); i++) { + CPU_SET(i, (cpu_set_t *)maskBuf.bufferPtr()); + } + maskBuf.copyOut(tc->getVirtProxy()); + return CPU_ALLOC_SIZE(tc->getSystemPtr()->threads.size()); +#else + warnUnsupportedOS("sched_getaffinity"); + return -1; +#endif +} #endif // __SIM_SYSCALL_EMUL_HH__