mirror of
https://github.com/drasko/codezero.git
synced 2026-01-12 02:43:15 +01:00
- Implemented reasonable way to suspend task.
- A task that has a pending suspend would be interrupted
from its sleep via the suspender task.
- If suspend was raised and right after, task became about to sleep,
then scheduler wakes it up.
- If suspend was raised when task was in user mode, then an irq suspends it.
- Also suspends are checked at the end of a syscall so that if suspend was
raised because of a syscall from the task, the task is suspended before it
goes back to user mode.
- This mechanism is very similar to signals, and it may lead as a base for
implementing signal handling.
- Implemented common vma dropping for shadow vm object dropping and task exiting.
27 lines
561 B
C
27 lines
561 B
C
|
|
#include <l4lib/arch/syscalls.h>
|
|
#include <l4lib/arch/syslib.h>
|
|
#include <l4lib/ipcdefs.h>
|
|
#include <unistd.h>
|
|
#include <l4/macros.h>
|
|
|
|
static inline void __attribute__ ((noreturn)) l4_exit(int status)
|
|
{
|
|
int ret;
|
|
|
|
write_mr(L4SYS_ARG0, status);
|
|
|
|
/* Call pager with exit() request and block on its receive phase */
|
|
ret = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_EXIT);
|
|
|
|
/* This call should not fail or return */
|
|
printf("%s: L4 IPC returned: %d.\n", __FUNCTION__, ret);
|
|
BUG();
|
|
}
|
|
|
|
void __attribute__ ((noreturn)) _exit(int status)
|
|
{
|
|
l4_exit(status);
|
|
}
|
|
|