00001
00006 #include <routix/system.h>
00007 #include <routix/task.h>
00008 #include <signal.h>
00009 #include <routix/signal.h>
00010 #include <sys/types.h>
00011 #include <routix/kstdio.h>
00012 #include <error.h>
00013 #include <routix/debug.h>
00014 #include <routix/syscalls.h>
00015
00016 void exec_sig_default (task_struct_t *task, int signo);
00017 void sig_kill(task_struct_t *task);
00018
00151
00152
00153 unsigned int task_signals_alloc = 0;
00154 unsigned int task_signals_free = 0;
00155
00156
00157
00163 int check_sigpending(task_struct_t *task, int save_context)
00164 {
00165
00166 if (actual==pre_init_task)
00167 return -1;
00168
00169 if (getvar("pepe")==1)
00170 return 0;
00171
00172
00173 if (TASK_SIGPENDING(task)==0) {
00174 return 0;
00175 }
00176
00177 int signo = 0;
00178 unsigned long sig = TASK_SIGPENDING(task);
00179
00180 while (signo < SIGMAX) {
00181
00182 if ( (sig & 1) && !IS_MASKED(task,signo)) {
00183 exec_sigpending(task, signo, save_context);
00184 TASK_SIGNAL_COUNT(task, signo)--;
00185 if (TASK_SIGNAL_COUNT(task, signo)<1)
00186
00187 TASK_SIGPENDING(task) = TASK_SIGPENDING(task) ^ (1<<signo);
00188
00189 return 1;
00190 }
00191
00192 else if ( (sig & 1) && ((signo==SIGKILL) || (signo==SIGSTOP)) )
00193 sig_kill(actual);
00194 sig = sig >> 1;
00195 signo++;
00196 }
00197
00198 return 0;
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 }
00219
00220
00221
00229 void exec_sigpending(task_struct_t *task, int signo, int save_context)
00230 {
00231 if (TASK_SIGNAL_HANDLER(task, signo) == SIG_DFL) {
00232 exec_sig_default(task, signo);
00233 return;
00234 }
00235
00236
00237
00238 cli();
00239
00240
00241 struct int_regs_ext *context = GET_CONTEXT(task);
00242
00243 unsigned long *user_ptr = (unsigned long *) context->esp;
00244
00245 user_ptr = convertir_direccion( user_ptr, actual->cr3_backup);
00246
00247
00248
00249 if (save_context == 1) {
00250
00251 *(--user_ptr) = context->eip;
00252
00253 context->esp -= 4;
00254 *(--user_ptr) = context->eax;
00255 *(--user_ptr) = context->ebx;
00256 *(--user_ptr) = context->ecx;
00257 *(--user_ptr) = context->edx;
00258 *(--user_ptr) = context->edi;
00259 *(--user_ptr) = context->esi;
00260 context->esp -= (6 * sizeof(dword));
00261
00262 *(--user_ptr) = TASK_SIGMASK(task);
00263 context->esp -= 4;
00264
00265
00266
00267
00268 *(--user_ptr) = signo;
00269
00270 *(--user_ptr) = TASK_SIGADDR(task);
00271 context->esp -= 8;
00272 context->eip = (dword) TASK_SIGNAL_HANDLER(task, signo);
00273 }
00274 else {
00275
00276 *(user_ptr) = TASK_SIGMASK(task);
00277
00278 context->esp -= 4;
00279 *(--user_ptr) = signo;
00280 *(--user_ptr) = TASK_SIGADDR(task);
00281
00282 context->eip = (dword) TASK_SIGNAL_HANDLER(task, signo);
00283 context->esp -= 4;
00284
00285 }
00286
00287
00288 TASK_SIGMASK(task) = TASK_SIGNAL_MASK(task, signo);
00289 sti();
00290
00291 }
00292
00297 void exec_sig_default (task_struct_t *task, int signo)
00298 {
00299 if (signo==9)
00300 sig_kill(actual);
00301 else kprintf("Proceso PID: %d\tSIG_DFL para la senal: %d no implementado \n", task->pid, signo);
00302 }
00303
00304
00305 void sig_kill(task_struct_t *task)
00306 {
00307 sys_exit(0);
00308 }
00309