00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 #include <ubixos/types.h>
00031 #include <sys/sysproto.h>
00032 #include <sys/thread.h>
00033 #include <sys/kern_sysctl.h>
00034 #include <ubixos/endtask.h>
00035 #include <ubixos/kpanic.h>
00036 #include <lib/kprintf.h>
00037 #include <lib/kmalloc.h>
00038 #include <assert.h>
00039 #include <string.h>
00040 
00041 static struct sysctl_entry *ctls = 0x0;
00042 
00043 static struct sysctl_entry *sysctl_find(int *,int);
00044 
00045 
00046 static void def_ctls() {
00047   int name[CTL_MAXNAME], name_len;
00048   uInt32 page_val = 0x1000;
00049   name[0] = 6;
00050   name[1] = 7;
00051   name_len = 2; 
00052   sysctl_add(name,name_len,"page_size",&page_val,sizeof(uInt32));
00053   
00054   name[0] = 1;
00055   name [1] = 12;
00056   page_val = 0x3E8;
00057   sysctl_add(name,name_len,"page_size",&page_val,sizeof(uInt32));
00058   
00059   name[0] = 1;
00060   name [1] = 33;
00061   page_val = 0xCBE8000;
00062   sysctl_add(name,name_len,"page_size",&page_val,sizeof(uInt32));
00063   }
00064 
00065 int sysctl_init() {
00066   struct sysctl_entry *tmpCtl = 0x0;
00067   if (ctls != 0x0) {
00068     kprintf("sysctl already Initialized\n");
00069     while (1);
00070     }
00071 
00072   ctls = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00073   ctls->prev     = 0x0;
00074   ctls->id       = CTL_UNSPEC;
00075   ctls->children = 0x0;
00076   sprintf(ctls->name,"unspec");
00077 
00078   tmpCtl = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00079   tmpCtl->prev     = ctls;
00080   tmpCtl->id       = CTL_KERN;
00081   tmpCtl->children = 0x0;
00082   sprintf(tmpCtl->name,"kern");
00083   ctls->next = tmpCtl;
00084 
00085   tmpCtl->next = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00086   tmpCtl->next->prev = tmpCtl;
00087   tmpCtl             = tmpCtl->next;
00088   tmpCtl->id         = CTL_VM;
00089   tmpCtl->children   = 0x0;
00090   sprintf(tmpCtl->name,"vm");
00091 
00092   tmpCtl->next = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00093   tmpCtl->next->prev = tmpCtl;
00094   tmpCtl             = tmpCtl->next;
00095   tmpCtl->id         = CTL_VFS;
00096   tmpCtl->children   = 0x0;
00097   sprintf(tmpCtl->name,"vfs");
00098 
00099   tmpCtl->next = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00100   tmpCtl->next->prev = tmpCtl;
00101   tmpCtl             = tmpCtl->next;
00102   tmpCtl->id         = CTL_NET;
00103   tmpCtl->children   = 0x0;
00104   sprintf(tmpCtl->name,"net");
00105 
00106   tmpCtl->next = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00107   tmpCtl->next->prev = tmpCtl;
00108   tmpCtl             = tmpCtl->next;
00109   tmpCtl->id         = CTL_DEBUG;
00110   tmpCtl->children   = 0x0;
00111   sprintf(tmpCtl->name,"debug");
00112 
00113   tmpCtl->next = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00114   tmpCtl->next->prev = tmpCtl;
00115   tmpCtl             = tmpCtl->next;
00116   tmpCtl->id         = CTL_HW;
00117   tmpCtl->children   = 0x0;
00118   sprintf(tmpCtl->name,"hw");
00119 
00120   tmpCtl->next = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00121   tmpCtl->next->prev = tmpCtl;
00122   tmpCtl             = tmpCtl->next;
00123   tmpCtl->id         = CTL_MACHDEP;
00124   tmpCtl->children   = 0x0;
00125   sprintf(tmpCtl->name,"machdep");
00126 
00127   tmpCtl->next = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00128   tmpCtl->next->prev = tmpCtl;
00129   tmpCtl             = tmpCtl->next;
00130   tmpCtl->id         = CTL_USER;
00131   tmpCtl->children   = 0x0;
00132   sprintf(tmpCtl->name,"user");
00133 
00134   tmpCtl->next = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00135   tmpCtl->next->prev = tmpCtl;
00136   tmpCtl             = tmpCtl->next;
00137   tmpCtl->id         = CTL_P1003_1B;
00138   tmpCtl->children   = 0x0;
00139   sprintf(tmpCtl->name,"p1003_1b");
00140 
00141   tmpCtl->next = (struct sysctl_enctry *)kmalloc(sizeof(struct sysctl_entry));
00142   tmpCtl->next->prev = tmpCtl;
00143   tmpCtl             = tmpCtl->next;
00144   tmpCtl->id         = CTL_UBIX;
00145   tmpCtl->children   = 0x0;
00146   sprintf(tmpCtl->name,"ubix");
00147 
00148   def_ctls();
00149 
00150   return(0x0);
00151   }
00152 
00153 int __sysctl(struct thread *td, struct sysctl_args *uap) {
00154   struct sysctl_entry *tmpCtl = 0x0;
00155   int i = 0;
00156 
00157   if (ctls == 0x0)
00158     K_PANIC("sysctl not initialized");
00159 
00160   if (uap->newlen < 0) {
00161     kprintf("Changing Not supported yet.\n");
00162     endTask(_current->id);
00163     }
00164 
00165   tmpCtl = sysctl_find(uap->name,uap->namelen);
00166   if (tmpCtl == 0x0) { 
00167     kprintf("Invalid CTL\n");
00168     for (i = 0x0;i < uap->namelen;i++)
00169       kprintf("(%i)",uap->name[i]);
00170     kprintf("\n");
00171     endTask(_current->id);
00172     }
00173 
00174   if ((u_int32_t)uap->oldlenp < tmpCtl->val_len) 
00175      memcpy(uap->old,tmpCtl->value,(uInt32)uap->oldlenp);
00176   else
00177      memcpy(uap->old,tmpCtl->value,tmpCtl->val_len);
00178 
00179   td->td_retval[0] = 0x0;
00180 
00181   return(0x0);
00182   }
00183 
00184 static struct sysctl_entry *sysctl_find(int *name,int namelen) {
00185   int i = 0x0;
00186   struct sysctl_entry *tmpCtl = 0x0;
00187   struct sysctl_entry *lCtl = ctls;
00188 
00189   
00190   for (i = 0x0; i < namelen;i++) {
00191     for (tmpCtl = lCtl;tmpCtl != 0x0;tmpCtl = tmpCtl->next) {
00192       
00193       if (tmpCtl->id == name[i]) {
00194          if ((i+1) == namelen) {
00195            return(tmpCtl);
00196            }
00197          lCtl = tmpCtl->children;
00198          break;
00199          }
00200       }
00201     }
00202   return(0x0);
00203   }
00204 
00205 int sysctl_add(int *name,int namelen,char *str_name,void *buf,int buf_size) {
00206   struct sysctl_entry *tmpCtl = 0x0;
00207   struct sysctl_entry *newCtl = 0x0;
00208 
00209   
00210   tmpCtl = sysctl_find(name,namelen);
00211   if (tmpCtl != 0x0) {
00212     kprintf("Node Exists!\n");
00213     while (1);
00214     }
00215 
00216   
00217   tmpCtl = sysctl_find(name,namelen-1);
00218   if (tmpCtl == 0x0) {
00219     kprintf("Parent Node Non Existant\n");
00220     return(-1);
00221     }
00222   if (tmpCtl->children == 0x0) {
00223     tmpCtl->children = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry));
00224     tmpCtl->children->children = 0x0;
00225     tmpCtl->children->prev     = 0x0;
00226     tmpCtl->children->next     = 0x0;
00227     tmpCtl->children->id       = name[namelen-1];
00228     sprintf(tmpCtl->children->name,str_name);
00229     tmpCtl->children->value = (void  *)kmalloc(buf_size);
00230     memcpy(tmpCtl->children->value,buf,buf_size);
00231     tmpCtl->children->val_len = buf_size;
00232     }
00233   else {
00234     newCtl = (struct sysctl_entry *)kmalloc(sizeof(struct sysctl_entry)); 
00235     newCtl->prev     = 0x0;
00236     newCtl->next     = tmpCtl->children;
00237     newCtl->children = 0x0;
00238     newCtl->id       = name[namelen-1];
00239     sprintf(newCtl->name,str_name);
00240     newCtl->value    = (void *)kmalloc(buf_size);
00241     memcpy(newCtl->value,buf,buf_size);
00242     newCtl->val_len  = buf_size;
00243     tmpCtl->children->prev = newCtl;
00244     tmpCtl->children = newCtl;
00245     }
00246 
00247   return(0x0);
00248   }
00249 
00250 
00251 
00252 
00253