| 1374 | } |
| 1375 | |
| 1376 | U32 KThread::sigprocmask(U32 how, U32 set, U32 oset, U32 sigsetSize) { |
| 1377 | if (oset!=0) { |
| 1378 | if (sigsetSize==4) { |
| 1379 | memory->writed(oset, (U32)this->sigMask); |
| 1380 | } else if (sigsetSize==8) { |
| 1381 | memory->writeq(oset, this->sigMask); |
| 1382 | } else { |
| 1383 | klog_fmt("sigprocmask: can't handle sigsetSize=%d", sigsetSize); |
| 1384 | } |
| 1385 | //klog("syscall_sigprocmask oset=%X", thread->sigMask); |
| 1386 | } |
| 1387 | if (set!=0) { |
| 1388 | U64 mask = 0; |
| 1389 | |
| 1390 | if (sigsetSize==4) { |
| 1391 | mask = memory->readd(set); |
| 1392 | } else if (sigsetSize==8) { |
| 1393 | mask = memory->readq(set); |
| 1394 | } else { |
| 1395 | klog_fmt("sigprocmask: can't handle sigsetSize=%d", sigsetSize); |
| 1396 | } |
| 1397 | if (how == K_SIG_BLOCK) { |
| 1398 | this->sigMask|=mask; |
| 1399 | //klog("syscall_sigprocmask block %X(%X)", set, thread->sigMask); |
| 1400 | } else if (how == K_SIG_UNBLOCK) { |
| 1401 | this->sigMask&=~mask; |
| 1402 | //klog("syscall_sigprocmask unblock %X(%X)", set, thread->sigMask); |
| 1403 | } else if (how == K_SIG_SETMASK) { |
| 1404 | this->sigMask = mask; |
| 1405 | //klog("syscall_sigprocmask set %X(%X)", set, thread->sigMask); |
| 1406 | } else { |
| 1407 | kpanic_fmt("sigprocmask how %d unsupported", how); |
| 1408 | } |
| 1409 | } |
| 1410 | return 0; |
| 1411 | } |
| 1412 | |
| 1413 | U32 KThread::sigtimedwait(U32 set, U32 info, U32 timeout, U32 sizeofSet, bool time64) { |
| 1414 | BOXEDWINE_CRITICAL_SECTION_WITH_CONDITION(sigWaitCond); |
no test coverage detected