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: syscall_8c-source.html 88 2016-01-12 00:11:29Z reddawg $
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/endtask.h>
00037 #include <ubixos/time.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 <ubixos/vitals.h>
00046 /* #include <sde/sde.h> */
00047 #include <mpi/mpi.h>
00048 #include <vmm/vmm.h>
00049 
00050 long   fuword(const void *base);
00051 
00052 void sdeTestThread();
00053 
00054 asm(
00055   ".globl _sysCallNew           \n"
00056   "_sysCallNew:                 \n"
00057   "  pusha                      \n"
00058   "  push %ss                   \n"
00059   "  push %ds                   \n"
00060   "  push %es                   \n"
00061   "  push %fs                   \n"
00062   "  push %gs                   \n"
00063   "  cmpl totalCalls,%eax       \n"
00064   "  jae  invalidSysCallNew     \n"
00065   "  mov  %esp,%ebx             \n"
00066   "  add  $12,%ebx              \n"
00067   "  push (%ebx)                \n"
00068   "  call *systemCalls(,%eax,4) \n"
00069   "  add  $4,%esp               \n"
00070   "  jmp  doneNew               \n"
00071   "invalidSysCallNew:           \n"
00072   "  call InvalidSystemCall     \n"
00073   "doneNew:                     \n"
00074   "  pop %gs                    \n"
00075   "  pop %fs                    \n" 
00076   "  pop %es                    \n"
00077   "  pop %ds                    \n"
00078   "  pop %ss                    \n"
00079   "  popa                       \n"
00080   "  iret                       \n"
00081   );
00082 
00083 void InvalidSystemCall()
00084 {
00085         kprintf("attempt was made to an invalid system call\n");
00086         return;
00087 }
00088 
00089 typedef struct _UbixUser UbixUser;
00090 struct _UbixUser
00091 {
00092         char *username;
00093         char *password;
00094         int uid;
00095         int gid;
00096         char *home;
00097         char *shell;
00098 };
00099 
00100 void sysAuth(UbixUser *uu)
00101 {
00102         kprintf("authenticating user %s\n", uu->username);
00103         if(uu->username == "root" && uu->password == "user")
00104         {
00105                 uu->uid = 0;
00106                 uu->gid = 0;
00107         }
00108         uu->uid = -1;
00109         uu->gid = -1;
00110         return;
00111 }
00112 
00113 void sysPasswd(char *passwd)
00114 {
00115         kprintf("changing user password for user %d\n", _current->uid);
00116         return;
00117 }
00118 
00119 void sysAddModule()
00120 {
00121         return;
00122 }
00123 
00124 void sysRmModule()
00125 {
00126         return;
00127 }
00128 
00129 void sysGetpid(int *pid)
00130 {
00131         if (pid)
00132                 *pid = _current->id;
00133                 return;
00134 }
00135 
00136 void sysGetUid(int *uid) {
00137   if (uid)
00138     *uid = _current->uid;
00139   return;
00140   }
00141 
00142 void sysGetGid(int *gid) {
00143   if (gid)
00144     *gid = _current->gid;
00145   return;
00146   }
00147 
00148 void sysSetUid(int uid,int *status) {
00149   if (_current->uid == 0x0) {
00150     _current->uid = uid;
00151     if (status)
00152       *status = 0x0;
00153     }
00154   else {
00155     if (status)
00156       *status = 1;
00157     }
00158   return;
00159   }
00160 
00161 void sysSetGid(int gid,int *status) {
00162   if (_current->gid == 0x0) {
00163     _current->gid = gid;
00164     if (status)
00165       *status = 0x0;
00166     }
00167   else {
00168     if (status)
00169       *status = 1;
00170     }
00171   return;
00172   }  
00173 
00174 void sysExit(int status)
00175 {
00176         endTask(_current->id);
00177 }
00178 
00179 void sysCheckPid(int pid,int *ptr)
00180 {
00181         kTask_t *tmpTask = schedFindTask(pid);
00182         if ((tmpTask != 0x0) && (ptr != 0x0))
00183                 *ptr = tmpTask->state;
00184         else
00185                 *ptr = 0x0;
00186         return;
00187 }
00188 
00189 /************************************************************************
00190 
00191 Function: void sysGetFreePage();
00192 Description: Allocs A Page To The Users VM Space
00193 Notes:
00194 
00195 ************************************************************************/  
00196 void sysGetFreePage(long *ptr,int count,int type) {
00197   if (ptr) {
00198     if (type == 2)
00199       *ptr = (long) vmmGetFreeVirtualPage(_current->id,count,VM_THRD);
00200     else
00201       *ptr = (long) vmmGetFreeVirtualPage(_current->id,count,VM_TASK);
00202     }
00203   return;
00204   }
00205 
00206 void sysGetDrives(uInt32 *ptr)
00207 {
00208         if (ptr)
00209                 *ptr = 0x0;//(uInt32)devices;
00210         return;
00211 }
00212 
00213 void sysGetUptime(uInt32 *ptr)
00214 {
00215         if (ptr)
00216                 *ptr = systemVitals->sysTicks;
00217         return;
00218 }
00219 
00220 void sysGetTime(uInt32 *ptr)
00221 {
00222         if (ptr)
00223                 *ptr = systemVitals->sysUptime + systemVitals->timeStart;
00224         return;
00225 }
00226 
00227 
00228 void sysGetCwd(char *data,int len)
00229 {
00230         if (data)
00231                 sprintf(data,"%s", _current->oInfo.cwd);
00232         return;
00233 }
00234 
00235 void sysSchedYield() {
00236   sched_yield();
00237   }
00238 
00239 void sysStartSDE() {
00240   int i = 0x0;
00241   for (i=0;i<1400;i++) {
00242     asm("hlt");
00243     }
00244   //execThread(sdeThread,(uInt32)(kmalloc(0x2000)+0x2000),0x0);
00245   for (i=0;i<1400;i++) {
00246     asm("hlt");
00247     }
00248   return;
00249   }
00250 
00251 void invalidCall(int sys_call) {
00252   kprintf("Invalid System Call #[%i]\n",sys_call);
00253   return;
00254   }
00255 
00256 /***
00257  END
00258  ***/
00259 

Generated on Fri Dec 15 11:18:55 2006 for UbixOS V2 by  doxygen 1.4.7