/************************************************************************************** Copyright (c) 2002 The UbixOS Project All rights reserved. Redistribution and use in source and binary forms, with or without modification, are prohibited. $Id$ **************************************************************************************/ #include <ubixos/syscall.h> #include <ubixos/syscalls.h> #include <ubixos/schedule.h> #include <ubixos/types.h> #include <drivers/video.h> asm( ".globl _sysCall \n" "_sysCall: \n" //" pusha \n" /* Save all registers */ //" pushw %ds \n" /* Set up the data segment */ //" pushw %es \n" //" pushw %ss \n" /* Note that ss is always valid */ //" pushw %ss \n" //" popw %ds \n" //" popw %es \n" " cmpl totalCalls,%eax \n" " jae invalidCall \n" " call *systemCalls(,%eax,4) \n" //" popw %es \n" //" popw %ds \n" /* Restore registers */ //" popa \n" " iret \n" /* Exit interrupt */ ); void invalidCall() { kprintf("Invalid System Call!!\n"); //_current->status = AVAILABLE; //schedule(); } void sysFwrite() { char *ptr; char data[1024]; int i=0; int size; int fd; asm("": "=b" (ptr),"=c" (size),"=d" (fd)); if (fd == 0) { for (i=0;i<size;i++) { data[i] = ptr[i]; } kprintf("%s",data); } else { kprintf("Id: [%i],Size: [%i]\n",fd,size); } } void sysGetpid() { char *pid; asm ( "" : "=b" (pid) ); pid[0] = _current->id; } void sysExit() { int *status; asm("":"=b" (status)); freeProcesspages(_current->id); _current->status = AVAILABLE; schedule(); kprintf("Status: [%i]\n",status); } void sysExec() { char *file; asm("":"=b" (file)); kprintf("File [%s]\n",file); disableIrq(0); asm("sti"); execFile(file); kprintf("Executed File\n"); // while(1); enableIrq(0); }