#include <agnix/agnix.h>#include <agnix/tasks.h>#include <agnix/threads.h>#include <agnix/signals.h>#include <agnix/memory.h>#include <agnix/console.h>#include <agnix/unistd.h>Include dependency graph for signals.c:

Go to the source code of this file.
Defines | |
| #define | MOD_NAME "SIG: " |
Functions | |
| int | execute_signal_sigaction (struct regs_s *regs, struct sigaction_s *sigaction, int sig_nr) |
| int | execute_signals (struct task_s *task, struct regs_s *regs) |
|
|
|
|
||||||||||||||||
|
Definition at line 11 of file signals.c. Referenced by execute_signals(). 00012 {
00013 /* u32 task_esp;
00014 u32 signal_esp;
00015 u32 signal_eip;
00016 struct signals_frame_s *frame;
00017
00018 if (sigaction->sa_handler == (void *)0 || sigaction->sa_handler == (void *)1)
00019 return -1;
00020
00021 task_esp = regs->esp;
00022 signal_esp = (task_esp - 16) - sizeof(struct signals_frame_s);
00023 signal_eip = (u32)sigaction->sa_handler;
00024
00025 frame = (struct signals_frame_s *)(task_esp - 16);
00026 frame->retcode_ptr = (u32)(frame->retcode);
00027 frame->sig_nr = sig_nr;
00028 frame->retcode[0] = 0xb8;
00029 frame->retcode[1] = 0x58;
00030 frame->retcode[2] = __NR_sigreturn;
00031 frame->retcode[3] = 0x80;
00032 frame->retcode[4] = 0xcd;
00033 */
00034 // task_save_state(task, &(task->state));
00035 // task_set_handler(task, signal_eip, signal_esp);
00036
00037 return 0;
00038 }
|
|
||||||||||||
|
Definition at line 40 of file signals.c. References do_task_exit(), execute_signal_sigaction(), MOD_NAME, printk(), put_free_pages(), and signal_dequeue(). Referenced by execute_irq(). 00041 {
00042 struct signal_s *signal;
00043 void (* sa_handler)(int);
00044 int sig_nr;
00045
00046 signal = signal_dequeue(task);
00047 sig_nr = signal->signal_nr;
00048
00049 printk(MOD_NAME "dequeued signal nr %d %x\n", signal->signal_nr, regs->eip);
00050
00051 switch(signal->signal_nr) {
00052
00053 case SIGSTOP:
00054 task->t_state &= ~TASK_STAT_RUNNING;
00055 break;
00056
00057 case SIGKILL:
00058 task->t_state |= TASK_STAT_KILLED;
00059 do_task_exit(task, 0);
00060 break;
00061
00062 default:
00063 if (USER_THREAD(task)) {
00064 execute_signal_sigaction(regs, &(task->signals_act.sigaction[sig_nr]), sig_nr);
00065 }
00066 else {
00067 sa_handler = task->signals_act.sigaction[sig_nr].sa_handler;
00068
00069 if (sa_handler)
00070 sa_handler(sig_nr);
00071 }
00072 }
00073
00074 put_free_pages((u32)signal, 0);
00075
00076 return 0;
00077 }
Here is the call graph for this function: ![]() |