Implement schedsleep() syscall to sleep a process for a given time

This commit is contained in:
2025-11-02 16:46:37 +01:00
parent 179c4b98e2
commit 0f93aa2a81
9 changed files with 29 additions and 6 deletions

View File

@ -193,9 +193,7 @@ void hal_syscalldispatch(IntrStackFrame *frame) {
frame->regs.rax = E_BADSYSCALL;
return;
}
spinlock_acquire(&PROCS.spinlock);
uint64_t calling_proc_pid = PROCS.current->pid;
spinlock_release(&PROCS.spinlock);
hal_intr_enable();
int32_t ret = fn(frame, calling_proc_pid, frame->regs.rdi, frame->regs.rsi, frame->regs.rdx,
frame->regs.r10, frame->regs.r8, frame->regs.r9);

View File

@ -29,12 +29,11 @@ void pit_init(void) {
uint32_t hz = 1000;
uint32_t div = PIT_FREQ / hz;
io_out8(PIT_CMD, PIT_CMD_BINARY | PIT_CMD_MODE3 | PIT_CMD_RW_BOTH | PIT_CMD_COUNTER0);
io_out8(PIT_COUNTER0, div);
io_out8(PIT_COUNTER0, div & 0xFF);
io_out8(PIT_COUNTER0, div >> 8);
}
void pit_wait(uint32_t ms) {
uint32_t now = PIT_TICKS;
++ms;
while (PIT_TICKS - now < ms);
}

View File

@ -9,3 +9,9 @@
int32_t SYSCALL0(sys_schedrelease) {
return E_DOSCHEDULING;
}
int32_t SYSCALL1(sys_schedsleep, ms1) {
uint32_t ms = (uint32_t)ms1;
hal_wait(ms);
return E_OK;
}

View File

@ -5,5 +5,6 @@
#include "syscall.h"
int32_t SYSCALL0(sys_schedrelease);
int32_t SYSCALL1(sys_schedsleep, ms1);
#endif // SYSCALL_SCHED_H_

View File

@ -27,6 +27,7 @@ SyscallFn SYSCALL_TABLE[SYSCALLS_MAX] = {
[SYS_MMAN_UNMAP] = &sys_mman_unmap,
[SYS_SCHEDRELEASE] = &sys_schedrelease,
[SYS_SCHEDSLEEP] = &sys_schedsleep,
[SYS_RAND] = &sys_rand,