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
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
00035
00036 extern dword jiffies;
00037
00038
00039
00040
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
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
00072 if ( (timer=create_timer(USECONDS_TO_TICKS(usegundos), actual, despertar, NULL))==NULL ) {
00073 return -1;
00074 }
00075
00076
00077 dormir_task(actual);
00078
00079
00080
00081 _reschedule();
00082
00083
00084
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
00111 int sys_proc_dump_v(int pid)
00112 {
00113 task_struct_t *tmp;
00114
00115
00116 if ( (tmp=encontrar_proceso_por_pid(pid))==NULL ) {
00117 actual->err_no = ESRCH;
00118 return -1;
00119 }
00120
00121 if (tmp->estado == TASK_ZOMBIE) {
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
00145
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