sys_time.c

Go to the documentation of this file.
00001 
00007 #include "routix/system.h"
00008 #include "routix/paging.h"
00009 #include "routix/segm.h"
00010 #include "routix/debug.h"
00011 #include "sys/syscalls.h"
00012 #include "routix/syscalls.h"
00013 #include "routix/elf.h"
00014 #include "routix/file.h"
00015 #include "error.h"
00016 #include "routix/timer.h"
00017 #include "routix/atomic.h"
00018 #include "routix/kalloc.h"
00019 #include <routix/kstdio.h>
00020 
00021 #ifndef __TASK
00022 #include "routix/task.h"
00023 #endif
00024 
00025 
00026 //Nuevas
00027 extern int sys_process (void);
00028 extern int sys_console (void);
00029 extern int sys_timer (void);
00030 extern int sys_mem (void);
00031 
00032 extern task_struct_t *actual;
00033 
00034 // Acceso al listado
00035 //extern timer_t *timer_inicio;
00036 extern dword jiffies;
00037 
00038 
00039 
00040 // Vector de funciones de llamadas al sistema (grupo Timer)
00041 int (*syscall_timer[MAX_SYSCALLS]) (void) = {
00042         (int (*) (void)) sys_sleep,
00043         (int (*) (void)) sys_proc_dump,
00044         (int (*) (void)) sys_kill,
00045         (int (*) (void)) sys_usleep,
00046         (int (*) (void)) sys_proc_dump_v,
00047         (int (*) (void)) sys_timer_dump
00048 };
00049 
00050 
00051 
00052 // Funcion llamada por el timer en el retorno para sys_sleep y sys_usleep
00053 static void despertar(timer_t *info)
00054 {
00055   if ( info != NULL ) {
00056     despertar_task(TIMER_PROCESS(info));
00057   }
00058 }
00059 
00060 
00061 int sys_sleep(int segundos)
00062 {
00063  sys_usleep(segundos*1000000);
00064  return OK;
00065 }
00066 
00067 int sys_usleep(int usegundos)
00068 {
00069         timer_t *timer;
00070 
00071         // Creamos el timer
00072         if ( (timer=create_timer(USECONDS_TO_TICKS(usegundos), actual, despertar, NULL))==NULL ) {
00073                 return -1;
00074         }
00075  
00076         // Dormimos la tarea actual
00077         dormir_task(actual);
00078 
00079         // Switcheamos de proceso mediante la macro _reschedule quien realiza una llamada
00080         // a la interrupción 0x51
00081         _reschedule();
00082 
00083         // Volvemos ! el timer se venció. Este es nuestro punto de retorno.
00084         // todavía estamos en modo kernel en la llamada al sistema
00085 
00086         return OK;
00087 }
00088 
00089 
00090 
00091 int sys_proc_dump(void)
00092 {
00093  task_struct_t *tmp;
00094 
00095  char *estados[] = { "TASK_RUNNING", "TASK_STOPPED", "TASK_SLEEPING", "TASK_ININTERRUMPIBLE", "TASK_ZOMBIE", \
00096                                         "TASK_CLEAN" };
00097 
00098  kprintf("pid ppid descripcion estado pri cuenta cpu sigpending sigmask\n");
00099  for (tmp = tareas_inicio; tmp != NULL ; tmp=tmp->proxima ) {
00100 
00101   kprintf("%d\t%d\t%s", tmp->pid, tmp->padre->pid, tmp->descripcion);
00102   kprintf(" %s %d %d %d",estados[tmp->estado], tmp->prioridad,tmp->cuenta,tmp->tiempo_cpu);
00103   kprintf(" 0x%x\t\t0x%x\n", TASK_SIGPENDING(tmp), TASK_SIGMASK(tmp));
00104 
00105  }
00106 
00107  return 0;
00108 }
00109 
00110 // Sys Proc Dump Verbose
00111 int sys_proc_dump_v(int pid)
00112 {
00113     task_struct_t *tmp;
00114     //Ubicar el pid en la lista de procesos
00115 
00116     if ( (tmp=encontrar_proceso_por_pid(pid))==NULL ) {
00117                 actual->err_no = ESRCH;     //proceso no existe
00118         return -1;
00119     }
00120 
00121         if (tmp->estado == TASK_ZOMBIE) { //Si el proceso es Zombie, no tiene que mostrar
00122                 actual->err_no = ESRCH;     
00123                 return -1;
00124         }
00125         
00126     kprintf("Descripcion: %s\tPID: %d\n", tmp->descripcion, tmp->pid);
00127     kprintf("Memoria utilizada: ");
00128     kprintf("Codigo: %d\tDatos: %d\tStack: %d", tmp->num_code, tmp->num_data, tmp->num_stack);
00129     kprintf("\nCR3: 0x%x\t", tmp->cr3_backup);
00130     kprintf("Stack Kernel: 0x%x\t", tmp->esp0 & 0xfffff000);
00131     struct user_page *mem;
00132     kprintf("\nPaginas Codigo:\n");
00133     for(mem=tmp->mcode ; mem ; mem=mem->next)
00134         kprintf("Direccion: 0x%x\tDireccion logica: 0x%x\n", mem->dir, mem->vdir);
00135     kprintf("Paginas Datos:\n");
00136     for(mem=tmp->mdata ; mem ; mem=mem->next)
00137         kprintf("Direccion: 0x%x\tDireccion logica: 0x%x\n", mem->dir, mem->vdir);
00138     kprintf("Paginas Stack:\n");
00139     for(mem=tmp->mstack ; mem ; mem=mem->next)
00140         kprintf("Direccion: 0x%x\tDireccion logica: 0x%x\n", mem->dir, mem->vdir);
00141 
00142         kprintf("Hijos de la tarea:\n");
00143         task_struct_t *hijo;
00144 /*      LIST_FOREACH(hijo, actual->childs, brothers) {
00145                 kprintf("PID: %d\t", TASK_PID(hijo));
00146         }*/
00147          char *estados[] = { "R", "ST", "SL", "U", "Z", \
00148                                         "C" };
00149         
00150         for(hijo=tmp->childs.next ; hijo!=NULL; hijo=hijo->brothers.next)
00151                 kprintf("PID: %d-%s\t", TASK_PID(hijo), estados[hijo->estado]);
00152         kprintf("\n");
00153 
00154     return OK;
00155 }       
00156 
00157 
00158 
00159 int sys_timer_dump(void)
00160 {
00161         timer_dump();
00162 
00163         return 1;
00164 }
00165 

Generated on Sun May 30 18:38:35 2004 for Routix OS by doxygen 1.3.6