int8_t nice; // -20 to +19 (maps to priority)
process_state_t state;
uint32_t wake_at_tick;
+ uint32_t alarm_tick;
int exit_status;
int has_user_regs;
SYSCALL_SIGSUSPEND = 80,
SYSCALL_READV = 81,
SYSCALL_WRITEV = 82,
+ SYSCALL_ALARM = 83,
};
#endif
rq_enqueue(rq_active, iter);
}
}
+ if (iter->alarm_tick != 0 && current_tick >= iter->alarm_tick) {
+ iter->alarm_tick = 0;
+ iter->sig_pending_mask |= (1U << 14); /* SIGALRM */
+ }
iter = iter->next;
} while (iter != start);
return;
}
+ if (syscall_no == SYSCALL_ALARM) {
+ if (!current_process) { regs->eax = 0; return; }
+ uint32_t seconds = regs->ebx;
+ uint32_t now = get_tick_count();
+ uint32_t old_remaining = 0;
+ if (current_process->alarm_tick > now) {
+ old_remaining = (current_process->alarm_tick - now) / 50 + 1;
+ }
+ if (seconds == 0) {
+ current_process->alarm_tick = 0;
+ } else {
+ current_process->alarm_tick = now + seconds * 50;
+ }
+ regs->eax = old_remaining;
+ return;
+ }
+
if (syscall_no == SYSCALL_SIGSUSPEND) {
if (!current_process) { regs->eax = (uint32_t)-EINVAL; return; }
uint32_t new_mask = 0;
SYS_SIGSUSPEND = 80,
SYS_READV = 81,
SYS_WRITEV = 82,
+ SYS_ALARM = 83,
};
/* Raw syscall wrappers — up to 5 args via INT 0x80 */
int setgid(int gid);
int truncate(const char* path, int length);
int ftruncate(int fd, int length);
+unsigned int alarm(unsigned int seconds);
void* brk(void* addr);
void _exit(int status) __attribute__((noreturn));
return __syscall_ret(_syscall2(SYS_FTRUNCATE, fd, length));
}
+unsigned int alarm(unsigned int seconds) {
+ return (unsigned int)_syscall1(SYS_ALARM, (int)seconds);
+}
+
void* brk(void* addr) {
return (void*)_syscall1(SYS_BRK, (int)addr);
}