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
00030
00031
00032
00033
00034
00035
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
00046
00047
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
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
00077 int setvar(char *nombre, int valor)
00078 {
00079 int i;
00080
00081 if ( (i=find_var(nombre)) ==-1 ) {
00082 if ( (i = find_empty_var()) ==-1 ) {
00083 if (getvar("vardebug")==1)
00084 kprintf("SYS_SETVAR: no hay espacio libre\n");
00085 return -1;
00086 }
00087 strncpy(variables[i].nombre, nombre, VAR_NAME_MAX);
00088 variables[i].valor = valor;
00089 if (getvar("vardebug")==1)
00090 kprintf("SYS_SETVAR: no estaba definida... definiendola en indice: %d\n", i);
00091 return 0;
00092 }
00093
00094
00095 if (getvar("vardebug")==1)
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
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
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
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
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
00191
00192
00193
00194
00195
00196
00197
00198 }
00199