#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: |