sys_misc.c

Go to the documentation of this file.
00001 
00009 #include "routix/system.h"
00010 #include "routix/paging.h"
00011 #include "routix/segm.h"
00012 #include "routix/debug.h"
00013 #include "sys/syscalls.h"
00014 #include "routix/syscalls.h"
00015 #include "error.h"
00016 #include "routix/kalloc.h"
00017 #include <routix/kstdio.h>
00018 #include "string.h"
00019 #ifndef __TASK
00020 #include "routix/task.h"
00021 #endif
00022 
00023 #include "routix/misc.h"
00024 #include "routix/device.h"
00025 #include "fs/blockcache.h"
00026 
00027 extern task_struct_t *actual;
00028 /*
00029 int sys_setvar(char *nombre, int valor);
00030 int sys_getvar(char *nombre);
00031 
00032 int find_var(char *nombre);
00033 int find_empty_var(void);
00034 */
00035 // Vector de funciones de llamadas al sistema (grupo Misc)
00036 int (*syscall_misc[MAX_SYSCALLS]) (void) = {
00037         (int (*) (void)) sys_setvar,
00038         (int (*) (void)) sys_getvar,
00039         (int (*) (void)) sys_read_debug
00040 
00041 };
00042 
00043 
00044 
00045 // Aqui se definen unas estructuras para guardar los pares (Nombre, valor) de variables accesibles via
00046 // setvar y getvar.
00047 // Esto es solo momentaneo, no se encariñen. Utilizado para propositos de debug en tiempo real
00048 
00049 #define VARIABLES_MAX   12
00050 #define VAR_NAME_MAX    15
00051 struct {
00052         char nombre[VAR_NAME_MAX + 1];
00053         int valor;
00054 } variables[VARIABLES_MAX];
00055 
00056 // Inicializar como vacias (-1) todas los pares (nombre, valor)
00057 void init_var(void)
00058 {
00059         int i;
00060         for (i=0 ; i<VARIABLES_MAX ; i++)
00061                 variables[i].valor = -1;
00062 }
00063 
00064 
00065 inline int sys_setvar(char *nombre, int valor)
00066 {
00067         return setvar(convertir_direccion (nombre , actual->cr3_backup), valor);
00068 }
00069 
00070 inline int sys_getvar(char *nombre)
00071 {
00072         return getvar(convertir_direccion (nombre , actual->cr3_backup));
00073 }
00074 
00075 
00076 // Setea una variable en el array variables[] si no existe alli, y modifica su valor en caso de ya encontrarse
00077 int setvar(char *nombre, int valor)
00078 {
00079         int i;
00080         
00081         if ( (i=find_var(nombre)) ==-1 )        {               //Variable no esta definida. Agregarla
00082                 if ( (i = find_empty_var()) ==-1 )      {
00083                         if (getvar("vardebug")==1)      // Imprimir info de debug ???
00084                                 kprintf("SYS_SETVAR: no hay espacio libre\n");
00085                         return -1;                                      //No hay un espacio libre
00086                 }
00087                 strncpy(variables[i].nombre, nombre, VAR_NAME_MAX);
00088                 variables[i].valor = valor;
00089                 if (getvar("vardebug")==1)      // Imprimir info de debug ???
00090                         kprintf("SYS_SETVAR: no estaba definida... definiendola en indice: %d\n", i);
00091                 return 0;
00092         }
00093         
00094         //Si llegó aquí, la variable esta definida en el indice "i", debo modificarla
00095         if (getvar("vardebug")==1)      // Imprimir info de debug ???
00096                 kprintf("SYS_SETVAR: estaba definida ... modificandola en indice: %d\n", i);
00097         
00098         variables[i].valor = valor;
00099         return 0;
00100         
00101 }
00102         
00103 int getvar(char *nombre)
00104 {
00105         int i;
00106 
00107         if ( (i=find_var(nombre))!=-1) {
00108                 return variables[i].valor;
00109         }
00110 
00111         return -1;
00112 }
00113 
00114 // Busca una variable en el array y retorna el indice en caso de exito, o -1 en caso de no encontrarse
00115 int find_var (char *nombre)
00116 {
00117         int i=0;
00118         for (i=0 ; i<VARIABLES_MAX ; i++)
00119                 if (strcmp(variables[i].nombre, nombre)==0)
00120                         return i;
00121                         
00122         return -1;
00123 }
00124 
00125 // Busca un espacio libre para definir una variable. Devuelve el indice en caso de encontrarlo o -1 en caso contrario
00126 int find_empty_var (void)
00127 {
00128         int i=0;
00129         for (i=0 ; i<VARIABLES_MAX ; i++)
00130                 if (variables[i].valor==-1)
00131                         return i;
00132         return -1;
00133 }
00134 
00135 /*
00136 void sys_read_debug(int sector)
00137 {
00138 
00139   kprintf("Leyendo sector %d\n",sector);
00140 
00141   buffer_block_t *buf = (buffer_block_t *) malloc(sizeof(buffer_block_t));
00142 
00143   byte *data = (byte *) malloc( 512 * sizeof(byte) );
00144 
00145   BUFFER_BLOCK_DEVICE(buf)=fd0;
00146   BUFFER_BLOCK_PROCESO(buf)=actual;
00147   BUFFER_BLOCK_SECTOR(buf)=sector;
00148   BUFFER_BLOCK_OPERACION(buf)=IOREAD;
00149   BUFFER_BLOCK_BUFFER(buf)=data;
00150 
00151   insertar_buffer_block(buf);
00152 
00153   kprintf("Voy a dormir un rato...\n");
00154   dormir_task(actual);
00155 
00156   // Switcheamos de proceso mediante la macro _reschedule quien realiza una llamada
00157   // a la interrupción 0x51
00158   _reschedule();
00159 
00160   remover_buffer_block(buf);
00161 
00162   kprintf("Sector leido ok !!!\n");
00163 
00164   int i;
00165   for(i=0; i<512; i++) {
00166           kprintf("%c", data[i]);
00167   }
00168 
00169   kprintf("\n");
00170 
00171 }
00172 */
00173 
00174 // Realiza la lectura de un sector lógico, desde el buffer de cache
00175 void sys_read_debug(int sector)
00176 {
00177   device_t dev=fd0;
00178 
00179   kprintf("Leyendo sector %d\n",sector);
00180 
00181   byte *data = (byte *) malloc( 512 * sizeof(byte) );
00182   
00183   cache_read(dev,sector,0,data,512);
00184 
00185         free(data);
00186 
00187   kprintf("Sector leido ok !!!\n");
00188 
00189         /*
00190   int i;
00191   for(i=0; i<512; i++) {
00192           kprintf("%c", data[i]);
00193   }
00194 
00195   kprintf("\n");
00196         */
00197 
00198 }
00199 

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