syscall.c

Go to the documentation of this file.
00001 /*****************************************************************************************
00002  Copyright (c) 2002-2004 The UbixOS Project
00003  All rights reserved.
00004 
00005  Redistribution and use in source and binary forms, with or without modification, are
00006  permitted provided that the following conditions are met:
00007 
00008  Redistributions of source code must retain the above copyright notice, this list of
00009  conditions, the following disclaimer and the list of authors.  Redistributions in binary
00010  form must reproduce the above copyright notice, this list of conditions, the following
00011  disclaimer and the list of authors in the documentation and/or other materials provided
00012  with the distribution. Neither the name of the UbixOS Project nor the names of its
00013  contributors may be used to endorse or promote products derived from this software
00014  without specific prior written permission.
00015 
00016  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
00017  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00018  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
00019  THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00020  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
00021  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00022  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
00023  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00024  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00025 
00026  $Id$
00027 
00028 *****************************************************************************************/
00029 
00030 #include <ubixos/syscall.h>
00031 #include <ubixos/syscalls.h>
00032 #include <ubixos/sched.h>
00033 #include <ubixos/types.h>
00034 #include <ubixos/exec.h>
00035 #include <ubixos/elf.h>
00036 #include <ubixos/vitals.h>
00037 #include <ubixos/endtask.h>
00038 #include <sys/video.h>
00039 #include <sys/trap.h>
00040 #include <vfs/file.h>
00041 #include <ubixfs/ubixfs.h>
00042 #include <lib/string.h>
00043 #include <lib/kprintf.h>
00044 #include <lib/kmalloc.h>
00045 /* #include <sde/sde.h> */
00046 #include <mpi/mpi.h>
00047 #include <vmm/vmm.h>
00048 
00049 long   fuword(const void *base);
00050 
00051 void sdeTestThread();
00052 
00053 asm(
00054   ".globl _sysCallNew           \n"
00055   "_sysCallNew:                 \n"
00056   "  pusha                      \n"
00057   "  push %ss                   \n"
00058   "  push %ds                   \n"
00059   "  push %es                   \n"
00060   "  push %fs                   \n"
00061   "  push %gs                   \n"
00062   "  cmpl totalCalls,%eax       \n"
00063   "  jae  invalidSysCallNew     \n"
00064   "  mov  %esp,%ebx             \n"
00065   "  add  $12,%ebx              \n"
00066   "  push (%ebx)                \n"
00067   "  call *systemCalls(,%eax,4) \n"
00068   "  add  $4,%esp               \n"
00069   "  jmp  doneNew               \n"
00070   "invalidSysCallNew:           \n"
00071   "  call InvalidSystemCall     \n"
00072   "doneNew:                     \n"
00073   "  pop %gs                    \n"
00074   "  pop %fs                    \n" 
00075   "  pop %es                    \n"
00076   "  pop %ds                    \n"
00077   "  pop %ss                    \n"
00078   "  popa                       \n"
00079   "  iret                       \n"
00080   );
00081 
00082 void InvalidSystemCall()
00083 {
00084         kprintf("attempt was made to an invalid system call\n");
00085         return;
00086 }
00087 
00088 typedef struct _UbixUser UbixUser;
00089 struct _UbixUser
00090 {
00091         char *username;
00092         char *password;
00093         int uid;
00094         int gid;
00095         char *home;
00096         char *shell;
00097 };
00098 
00099 void sysAuth(UbixUser *uu)
00100 {
00101         kprintf("authenticating user %s\n", uu->username);
00102         if(uu->username == "root" && uu->password == "user")
00103         {
00104                 uu->uid = 0;
00105                 uu->gid = 0;
00106         }
00107         uu->uid = -1;
00108         uu->gid = -1;
00109         return;
00110 }
00111 
00112 void sysPasswd(char *passwd)
00113 {
00114         kprintf("changing user password for user %d\n", _current->uid);
00115         return;
00116 }
00117 
00118 void sysAddModule()
00119 {
00120         return;
00121 }
00122 
00123 void sysRmModule()
00124 {
00125         return;
00126 }
00127 
00128 void sysGetpid(int *pid)
00129 {
00130         if (pid)
00131                 *pid = _current->id;
00132                 return;
00133 }
00134 
00135 void sysGetUid(int *uid) {
00136   if (uid)
00137     *uid = _current->uid;
00138   return;
00139   }
00140 
00141 void sysGetGid(int *gid) {
00142   if (gid)
00143     *gid = _current->gid;
00144   return;
00145   }
00146 
00147 void sysSetUid(int uid,int *status) {
00148   if (_current->uid == 0x0) {
00149     _current->uid = uid;
00150     if (status)
00151       *status = 0x0;
00152     }
00153   else {
00154     if (status)
00155       *status = 1;
00156     }
00157   return;
00158   }
00159 
00160 void sysSetGid(int gid,int *status) {
00161   if (_current->gid == 0x0) {
00162     _current->gid = gid;
00163     if (status)
00164       *status = 0x0;
00165     }
00166   else {
00167     if (status)
00168       *status = 1;
00169     }
00170   return;
00171   }  
00172 
00173 void sysExit(int status)
00174 {
00175         endTask(_current->id);
00176 }
00177 
00178 void sysCheckPid(int pid,int *ptr)
00179 {
00180         kTask_t *tmpTask = schedFindTask(pid);
00181         if ((tmpTask != 0x0) && (ptr != 0x0))
00182                 *ptr = tmpTask->state;
00183         else
00184                 *ptr = 0x0;
00185         return;
00186 }
00187 
00188 /************************************************************************
00189 
00190 Function: void sysGetFreePage();
00191 Description: Allocs A Page To The Users VM Space
00192 Notes:
00193 
00194 ************************************************************************/  
00195 void sysGetFreePage(long *ptr,int count,int type) {
00196   if (ptr) {
00197     if (type == 2)
00198       *ptr = (long) vmmGetFreeVirtualPage(_current->id,count,VM_THRD);
00199     else
00200       *ptr = (long) vmmGetFreeVirtualPage(_current->id,count,VM_TASK);
00201     }
00202   return;
00203   }
00204 
00205 void sysGetDrives(uInt32 *ptr)
00206 {
00207         if (ptr)
00208                 *ptr = 0x0;//(uInt32)devices;
00209         return;
00210 }
00211 
00212 void sysGetUptime(uInt32 *ptr)
00213 {
00214         if (ptr)
00215                 *ptr = systemVitals->sysTicks;
00216         return;
00217 }
00218 
00219 void sysGetTime(uInt32 *ptr)
00220 {
00221         if (ptr)
00222                 *ptr = systemVitals->sysUptime + systemVitals->timeStart;
00223         return;
00224 }
00225 
00226 
00227 void sysGetCwd(char *data,int len)
00228 {
00229         if (data)
00230                 sprintf(data,"%s", _current->oInfo.cwd);
00231         return;
00232 }
00233 
00234 void sysSchedYield() {
00235   sched_yield();
00236   }
00237 
00238 void sysStartSDE() {
00239   int i = 0x0;
00240   for (i=0;i<1400;i++) {
00241     asm("hlt");
00242     }
00243   //execThread(sdeThread,(uInt32)(kmalloc(0x2000)+0x2000),0x0);
00244   for (i=0;i<1400;i++) {
00245     asm("hlt");
00246     }
00247   return;
00248   }
00249 
00250 void invalidCall(int sys_call) {
00251   kprintf("Invalid System Call #[%i]\n",sys_call);
00252   return;
00253   }
00254 
00255 /***
00256  END
00257  ***/
00258 

Generated on Sun Dec 3 02:38:04 2006 for UbixOS V2 by  doxygen 1.4.7