return write(id,buffer,(size_t)size); }
int SysRead(char*buffer ,int size,OpenFileId id) {
return read(id, buffer, (size_t) size); }
SpaceId SysExec(char* exec_name) {
pid_t child; child = vfork(); if(child == 0) {
execl (SHELL, SHELL, \ _exit (EXIT_FAILURE); }
else if(child < 0) return EPERM;
return (SpaceId) child; }
int SysJoin(SpaceId id) {
return waitpid((pid_t) id, (int*) 0, 0); }
int SysStrncmp(char*buffer,char *str,int n) {
return strncmp(buffer,str,(size_t)n); }
3. exception.cc case SC_Write:
DEBUG(dbgSys,\from buffer to consoleOutput\5)<
char wbuffer[60];//the buffer to store information from userprogram int size ;
size=(int)kernel->machine->ReadRegister(5); OpenFileId printOut;
printOut= (OpenFileId)kernel->machine->ReadRegister(6); int addressOne;
addressOne=(int)kernel->machine->ReadRegister(4); int i; i=0; do{
kernel->machine->ReadMem(addressOne++,1,(int*)&wbuffer[i++]); }while(i n1=SysWrite((char*)wbuffer,size,printOut); kernel->machine->WriteRegister(2,n1); /* Modify return point */ { /* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg)); /* set programm counter to next instruction (all Instructions are 4 byte wide)*/ kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4); /* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); } return; ASSERTNOTREACHED(); break; case SC_Read: DEBUG(dbgSys, \from buffer\<< kernel->machine->ReadRegister(4) << kernel->machine->ReadRegister(5)<< kernel->machine->ReadRegister(6) << \ int rsize ; rsize=(int)kernel->machine->ReadRegister(5); OpenFileId enterIn; enterIn = (OpenFileId)kernel->machine->ReadRegister(6); char addressTwo; addressTwo = (char)kernel->machine->ReadRegister(4); int local ; local= (int)kernel->machine->ReadRegister(4);; int n2 ; n2= SysRead(&addressTwo,rsize,enterIn); kernel->machine->WriteMem(local,1,(int)addressTwo); kernel->machine->WriteRegister(2,n2); /* Modify return point */ { /* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg)); /* set programm counter to next instruction (all Instructions are 4 byte wide)*/ kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4); /* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); } return; ASSERTNOTREACHED(); break; case SC_Exec: DEBUG(dbgSys,\a command\ char ebuffer[60]; int addressThree; addressThree = kernel->machine->ReadRegister(4); int c; c = 0; do{ kernel->machine->ReadMem(addressThree++,1,(int*)&ebuffer[c++]); }while(c<60); kernel->machine->WriteRegister(2,SysExec(ebuffer)); /* Modify return point */ {/* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg)); /* set programm counter to next instruction (all Instructions are 4 byte wide)*/ kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4); /* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); } return; ASSERTNOTREACHED(); break; case SC_Join: DEBUG(dbgSys,\ kernel->machine->WriteRegister(2,SysJoin((SpaceId)kernel->machine->ReadRegister(4))); /* Modify return point */ { /* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg)); /* set programm counter to next instruction (all Instructions are 4 byte wide)*/ kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4); /* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); } Return; ASSERTNOTREACHED(); break; case SC_Strncmp: DEBUG(dbgSys, \two string \<< kernel->machine->ReadRegister(4) < addressFour = kernel->machine->ReadRegister(4); int addressFive; addressFive = kernel->machine->ReadRegister(5); char str1buffer[60]; char str2buffer[60]; int d,e; d= 0; e=0; do{ kernel->machine->ReadMem(addressFour++,1,(int*)&str1buffer[d++]); }while(d<60); --addressFour; do{ kernel->machine->ReadMem(addressFive++,1,(int*)&str2buffer[e++]); }while(e<60); --addressFive; int n3; n=SysStrncmp(str1buffer,str2buffer,kernel->machine->ReadRegister(6)); kernel->machine->WriteRegister(2,n3); /* Modify return point */ {/* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg)); /* set programm counter to next instruction (all Instructions are 4 byte wide)*/ kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4); /* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); } return; ASSERTNOTREACHED(); break;
相关推荐: