41 lines
1.1 KiB
C++
41 lines
1.1 KiB
C++
#include "Pledge.h"
|
|
#include "sys/Syscall.h"
|
|
#include "thread/Scheduler.h"
|
|
|
|
Result<u64> sys_pledge(Registers*, SyscallArgs args)
|
|
{
|
|
int promises = TRY(parse_promises(args[0]));
|
|
int execpromises = TRY(parse_promises(args[1]));
|
|
|
|
auto* current = Scheduler::current();
|
|
|
|
if (promises >= 0)
|
|
{
|
|
int actual_promises = promises & ~(1 << (int)Promise::p_error);
|
|
int old_promises = current->promises & ~(1 << (int)Promise::p_error);
|
|
|
|
if (actual_promises & ~old_promises)
|
|
{
|
|
if (current->promises & ~(1 << (int)Promise::p_error)) return 0;
|
|
return err(EPERM);
|
|
}
|
|
}
|
|
|
|
if (execpromises >= 0)
|
|
{
|
|
int actual_execpromises = execpromises & ~(1 << (int)Promise::p_error);
|
|
int old_execpromises = current->execpromises & ~(1 << (int)Promise::p_error);
|
|
|
|
if (actual_execpromises & ~old_execpromises)
|
|
{
|
|
if (current->execpromises & ~(1 << (int)Promise::p_error)) return 0;
|
|
return err(EPERM);
|
|
}
|
|
}
|
|
|
|
if (promises >= 0) current->promises = promises;
|
|
if (execpromises >= 0) current->execpromises = execpromises;
|
|
|
|
return 0;
|
|
}
|