Commit Graph

277 Commits

Author SHA1 Message Date
Matthew Leach
bc5d1cd91e syscalls: wait4: make interruptable()
Make the `sys_wait4` system call interruptable via signal delivery.

Also include some a test in `usertest` to ensure proper functionality.
2026-01-17 10:22:53 +00:00
Matthew Leach
ecdfd360d1 sched: remove force_resched()
This function is used to force the scheduler to reschedule another task,
avoiding the fast-path exit.  Given the sheer number of task state
change points in the code, the fast-path exit code has become too
brittle.

Instead, check that the current task's state is still `Running` before
taking the fast-path short-circuit. The cost of one spinlock uncontended
lock-unlock cycle is worth the cost of avoiding many subtle scheduling
logic bugs.
2026-01-17 10:21:17 +00:00
Matthew Leach
4a88739804 syscalls: tty: read: make interruptable()
Allow a `read()` on a tty to be interrupted by a syscall. This is the
fundamental fix for making '^C' interrupt a process like `cat` when it's
reading from `stdin`.
2026-01-17 10:21:17 +00:00
Matthew Leach
612bbdb172 syscalls: pipe: read: make interruptable()
Allow interrupt for `read()` calls on a pipe.  If the syscall is
interrupted simply return `-EINVAL`.

Add a testcase to `usertest` for this case.
2026-01-17 10:21:17 +00:00
Matthew Leach
2655e8e78a syscalls: sleep: make interruptable()
Allow the `nanosleep` family of functions to be interrupted. When an
interruption occures, calculation the remaining duration and write that
back to user-space.

Add a test to ensure proper functionality into usertest.
2026-01-17 10:21:17 +00:00
Matthew Leach
770f32c30c process: signals: add interruptable()
Add a new struct, `InterruptableFut` which allows signal
short-circuiting logic. If a future within the kernel's syscall logic is
wrapped in a `InterruptableFut`, then a wakeup with any pending signals
causes the underlying future to be dropped and it's operation cancelled.

Provide a `InterruptResult` enum to allow the caller to know whether the
operation was interrupted and allows them to take appropriate action.
Typically exiting with `-EINTR`.

Finally, provide a blanket implementation for all futures, allowing then
to call `.interruptable()` to easily wrap any future.
2026-01-17 10:21:17 +00:00
Matthew Leach
b5f184a6d9 process: peek_signal: new
Add a new function that allows for peeking at a task's currently pending
signals without consuming the signal.
2026-01-17 10:21:17 +00:00
Matthew Leach
3ba7f668d6 libkernel: error: add Interrupted
Add the `Interrupted` discriminant for the `KernelError` enum. Also map
it to Linux's `EINTR` error value.
2026-01-17 10:21:17 +00:00
Matthew Leach
71d120ebe7 thread_group: deliver_signal: ensure signal delivery
If all tasks within a thread group are sleeping when a signal is
delivered, wake at least one task to action the signal.
2026-01-17 10:21:17 +00:00
Matthew Leach
798cad0c38 fd_table: don't close CLOEXEC FDs until exec
Currently we close CLOEXEC FDs when we call `clone()` when making a copy
of the file descriptor table. Defer this until the `exec` syscall.

This fixes numerous bugs, namely with bash and setting the foreground
process group for the current TTY.
2026-01-17 10:21:17 +00:00
Matthew Leach
6fc1990597 thread_group: pgid: inherit from parent
Inherit the process-group ID from the parent. If there is no parent
specified then the pgid is the same as the tgid.
2026-01-17 10:21:17 +00:00
Matthew Leach
1e91c60f0b Merge pull request #165 from hexagonal-sun/ptrace-follow-forks
ptrace: trace children on fork
2026-01-17 10:19:20 +00:00
Matthew Leach
3932dd96a7 ptrace: trace children on fork
When calling `clone()` with PTRACE_O_TRACEFORK set, make the child
inherit the current ptrace context.  Also start the process with SIGSTOP
pending as per the ptrace docs.

This enable strace follow-forks functionality `strace -f`.
2026-01-17 08:35:33 +00:00
Ashwin Naren
f4a9512a41 support waiting on a value less than -1 2026-01-16 15:51:47 -08:00
Ashwin Naren
08f42868b2 proper cross-cpu task insertion logic
chooses the CPU with the least weight of both running and runnable tasks
2026-01-16 15:51:35 -08:00
Ashwin Naren
e7a0ec6801 fix proc fs crashing 2026-01-16 15:51:35 -08:00
Ashwin Naren
c6dd7b07c0 partially implement sys_close_range 2026-01-15 08:43:08 -08:00
Matthew Leach
b064c14a88 Merge pull request #155 from arihant2math/timeofday
Proper timeofday implementations
2026-01-15 12:24:50 +00:00
Matthew Leach
4bb3158812 Merge pull request #153 from arihant2math/prctl-updates
Implement more of prctl
2026-01-15 12:24:27 +00:00
Matthew Leach
14e6c4ccf2 Merge pull request #159 from arihant2math/fix-mem-fault-crash
Fix mem fault crash
2026-01-15 12:24:08 +00:00
Matthew Leach
ffe08ce206 Merge pull request #157 from arihant2math/stubs
Fix gnu coreutils `ls -la`
2026-01-15 12:04:00 +00:00
Matthew Leach
af9c77ddcb Merge pull request #158 from arihant2math/fix-strace-panic
Fix `strace` panic
2026-01-15 12:03:07 +00:00
Ashwin Naren
dc33679c54 fix mem fault crash 2026-01-14 15:03:37 -08:00
Ashwin Naren
e3675a9c1f explicitly return not supported for name_to_handle_at and open_by_handle_at 2026-01-14 14:59:08 -08:00
Ashwin Naren
27b960a986 handle tasks finishing 2026-01-14 14:37:48 -08:00
Matthew Leach
2b55e1d972 sycalls: name_to_handle_at: stub
Return EOPNOTSUPP for `sys_name_to_handle_at`.
2026-01-14 14:24:35 -08:00
Matthew Leach
b452d5812c Merge pull request #138 from arihant2math/xattr
Implement xattr syscalls
2026-01-14 19:13:04 +00:00
Ashwin Naren
3e60a57d67 implement xattr syscalls 2026-01-14 10:51:48 -08:00
Ashwin Naren
27f8028315 proper timeofday implementations 2026-01-14 01:13:26 -08:00
Ashwin Naren
82993b05d3 implement PR_CAPBSET_DROP, PR_GET_SECUREBITS, PR_GET_NO_NEW_PRIVS, and PR_CAP_AMBIENT 2026-01-13 23:52:36 -08:00
Ashwin Naren
96fe0378b7 implement F_DUPFD for sys_fcntl 2026-01-13 16:48:33 -08:00
Ashwin Naren
56f3bcd654 add test 2026-01-13 16:48:10 -08:00
Ashwin Naren
99d881a0e6 implement pr_get_name and pr_set_name 2026-01-13 16:48:10 -08:00
Ashwin Naren
bc68aae677 stub sys_clock_nanosleep
# Conflicts:
#	src/arch/arm64/exceptions/syscall.rs
2026-01-13 16:48:01 -08:00
Ashwin Naren
ff13b392f1 some support for ext4 writing 2026-01-13 16:47:51 -08:00
Matthew Leach
d9de03096a Merge pull request #152 from hexagonal-sun/tty-implement-termios2-syscalls 2026-01-13 04:53:08 +00:00
Ashwin Naren
cff5005c06 execute scripts
checks for shebang and executes the specified program
2026-01-12 14:23:49 -08:00
Matthew Leach
b0bc8e5abd tty: implement termios2 ioctls
We currently implement `TCGETS`, `TCSETS` and `TCSETSW` which operate on
a `Termios` struct.  glibc uses the `Termios2` variants of these
syscalls to additionally get the terminal baud rate.

Use a `Termios2` as the main state of the tty.  Return that struct
verbatim  for the newly implemented `Termios2` ioctls.  Convert to/from
the legacy `Termios` struct for the currently implemented ioctls.
2026-01-12 21:44:38 +00:00
Matthew Leach
64bc004cdb process: sys_wait4: return ECHILD with no children
If the calling process has no children and no pending exit events to
handle, return ECHILD instead of waiting forever.
2026-01-11 19:23:47 -08:00
Matthew Leach
a003ab8f71 syscall: sys_exit*: add ptrace events
Add ptrace events for the exit family of syscalls.
2026-01-11 19:23:47 -08:00
Matthew Leach
f4557c1f0f arch: arm64: syscall: don't return result on task exit
If a task has called one of `sys_exit` or `sys_exit_group`, don't follow
the standard syscall exit path. Since the task is dead and it will never
be rescheduled, there's no point in processing the result of sys_exit.
2026-01-11 19:23:47 -08:00
Matthew Leach
abbc8261c5 kill: awake sleepy tasks on SIGKILL
If a SIGKILL has been received, ensure all sleepy tasks are set to
runnable so that they can action the signal.
2026-01-11 19:23:47 -08:00
Matthew Leach
df578992b8 syscalls: sys_process_vm_readv: implement
Implement the `sys_process_vm_readv` syscall.
2026-01-11 19:23:47 -08:00
Matthew Leach
ede1ef39d9 process: sys_rt_sigprocmask: fix UNMASKABLE_SIGNALS
We currently union the UNMASKABLE_SIGNALS set with the new signal mask.
This does the complete opposite of what we wnat, we want to *remove*
those signals from the newly computed signal mask.

This patch removes the UNMASKABLE_SIGNALS set from any newly computed
signal mask.
2026-01-11 19:23:47 -08:00
Matthew Leach
f9e02d9227 process: get_page: new
Add a function that allows an owned page to be atomically obtained from
a new process.
2026-01-11 19:23:47 -08:00
Matthew Leach
64b337ca63 ptrace: send SIGSTOP and PTRACE_EVENT_STOP for stoppable signal
When a new child stops due to a stoppable-signal after PTRACE_TRACEME,
send a SIGSTOP with a `PTRACE_EVENT_STOP`.
2026-01-11 19:23:47 -08:00
Matthew Leach
3a0e1f80e1 ptrace: implement PTRACE_SETOPTIONS
Add option definitions `PTRACE_O_*` and change the ptrace state
depdening upon which options are set in the call.
2026-01-11 19:23:47 -08:00
Matthew Leach
5911eb49ef ptrace: handle continuiation calls
handle `PTRACE_CONT` and `PTRACE_SYSCALL` operations.
2026-01-11 19:23:47 -08:00
Matthew Leach
70d9d730c0 ptrace: add event waiting
Make it such that when a ptrace event is hit:

 - The current regset is saved in the ptrace state.
 - The current task is put to sleep.
 - Arrange for a SIGCHLD to be set to the parent.
 - Notify any waiters with the appopriate signal.
2026-01-11 19:23:47 -08:00
Matthew Leach
c304ec07fe uspc_ret: ensure task is dropped before exiting
Fix current task double-borrow bug when exiting with a signal.
2026-01-11 19:23:47 -08:00