Main Page | Directories | File List | Globals

signals.c

Go to the documentation of this file.
00001 #include <agnix/agnix.h>
00002 #include <agnix/tasks.h>
00003 #include <agnix/threads.h>
00004 #include <agnix/signals.h>
00005 #include <agnix/memory.h>
00006 #include <agnix/console.h>
00007 #include <agnix/unistd.h>
00008 
00009 #define MOD_NAME        "SIG: "
00010 
00011 int execute_signal_sigaction(struct regs_s *regs, struct sigaction_s *sigaction, int sig_nr)
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 }
00039 
00040 int execute_signals(struct task_s *task, struct regs_s *regs)
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 }
Dokumentacje wygenerowano programem Doxygen 1.4.2 dla projektu Agnix