#include "sys_proc.h"
#include "sys_io.h"
#include "current.h"
#include "get_proc.h"
#include "signal.h"
#include <stop.h>
#include <system.h>
#include <system_data_structs.h>
#include <it_stack_structs.h>
#include <errno.h>
#include <stddef.h>
static inline int get_rpl(const struct interrupted_instruction_struct *interrupted_instruction)
{
struct sel_data_struct sel_data;
get_sel(&interrupted_instruction->cs, &sel_data);
return sel_data.rpl;
}
int is_orphaned_pg(int pgid)
{
struct proc_group_struct *proc_group;
if (!(proc_group = get_proc_group(pgid)))
return 0;
return is_orphaned_proc_group(proc_group);
}
void signal_pg(int pgid, int sig)
{
struct proc_group_struct *proc_group;
if (!(proc_group = get_proc_group(pgid)))
return;
signal_group(proc_group, sig);
}
void preempt(const struct interrupted_instruction_struct *interrupted_instruction)
{
if (is_idle() || get_rpl(interrupted_instruction))
yield();
}
int do_invalid_syscall()
{
return -ENOSYS;
}
void *const syscall_table[] = {
NULL,
do_exit,
do_fork,
do_exec,
do_getpid,
do_getpgid,
do_setpgid,
do_chdir,
do_sbrk,
do_sleep,
do_wait,
do_kill,
do_uname,
do_open,
do_close,
do_dup,
do_dup2,
do_pipe,
do_fcntl,
do_read,
do_write,
do_seek,
do_stat,
do_ioctl,
do_create,
do_remove,
do_mkdir,
do_rmdir,
do_rename,
do_mount,
do_umount,
do_reboot,
do_gettime,
do_mmap,
do_munmap,
do_mprotect
};
const unsigned int syscall_table_size = sizeof syscall_table / sizeof *syscall_table;
static void __attribute__ ((noreturn)) sh_terminate(int sig)
{
abort(sig);
}
static void __attribute__ ((noreturn)) sh_abort(int sig)
{
abort(sig);
}
static void sh_ignore(int sig) {}
static void sh_stop(int sig)
{
stop(sig);
}
static void sh_continue(int sig) {}
typedef void (*sighandler_t)(int);
static const sighandler_t signal_handler[] = {
NULL,
sh_terminate,
sh_terminate,
sh_abort,
sh_abort,
sh_abort,
sh_abort,
sh_abort,
sh_abort,
sh_terminate,
sh_terminate,
sh_abort,
sh_terminate,
sh_terminate,
sh_terminate,
sh_terminate,
sh_terminate,
sh_ignore,
sh_continue,
sh_stop,
sh_stop,
sh_stop,
sh_stop,
sh_ignore,
sh_abort,
sh_abort,
sh_terminate,
sh_terminate,
sh_ignore,
sh_terminate,
sh_terminate,
sh_abort
};
static void handle_signals()
{
int sig;
while ((sig = deliver_signal()))
signal_handler[sig](sig);
}
void do_bottom_half_it(const struct interrupted_instruction_struct *interrupted_instruction)
{
int rpl;
rpl = get_rpl(interrupted_instruction);
if (rpl)
handle_signals();
if (is_idle() || rpl)
reap_orphan_zombies();
}
void do_bottom_half_syscall()
{
handle_signals();
reap_orphan_zombies();
}