int kcinth() { u16 segment, offset; int a,b,c,d, r; segment = running->uss; offset = running->usp; //==> WRITE CODE TO GET get syscall parameters a,b,c,d from ustack a = get_word(segment, offset + 2*PA); b = get_word(segment, offset + 2*PB); c = get_word(segment, offset + 2*PC); d = get_word(segment, offset + 2*PD); switch(a){ case 0 : printf("hello in kernel a: %d cmd: %s\n", a, cmds[a]);r = kgetpid(); break; case 1 : printf("hello in kernel a: %d cmd: %s\n", a, cmds[a]);r = kps(); break; case 2 : printf("hello in kernel a: %d cmd: %s\n", a, cmds[a]);r = kchname(b); break; case 3 : printf("hello in kernel a: %d cmd: %s\n", a, cmds[a]);r = kkfork(); break; case 4 : printf("hello in kernel a: %d cmd: %s\n", a, cmds[a]);r = ktswitch(); break; case 5 : printf("hello in kernel a: %d cmd: %s\n", a, cmds[a]);r = kkwait(b); break; case 6 : printf("hello in kernel a: %d cmd: %s\n", a, cmds[a]);r = kkexit(b); break; case 7 : printf("hello in kernel a: %d cmd: %s\n", a, cmds[a]);r = kexec(b); break; case 99: kkexit(b); break; default: printf("invalid syscall # : %d\n", a); } put_word(r, segment, offset + 2*AX); return r;//this will be overwritten by the pop ax register when restoring back to uMode }
/************** syscall routing table ***********/ int kcinth() { u16 x, y, z, w, r; u16 seg, off; seg = running->uss; off = running->usp; x = get_word(seg, off+13*2); y = get_word(seg, off+14*2); z = get_word(seg, off+15*2); w = get_word(seg, off+16*2); switch(x){ case 0 : r = running->pid; break; case 1 : r = kps(); break; case 2 : r = chname(y); break; case 3 : r = kmode(); break; case 4 : r = tswitch(); break; case 5 : r = kwait(); break; case 6 : r = kexit(); break; case 7 : r = fork(); break; case 8 : r = kexec(y); break; case 9 : r = sout(y); break; case 10: r = sin(y); break; case 99: r = kexit(); break; default: printf("invalid syscall # : %d\n", x); } put_word(r, seg, off+2*8); }
int kcinth() { u16 segment, offset; int a,b,c,d,r; segment = running->uss; offset = running->usp; a = get_word(segment, offset + 2*PA); b = get_word(segment, offset + 2*(PA+1)); c = get_word(segment, offset + 2*(PA+2)); d = get_word(segment, offset + 2*(PA+3)); switch(a) { case 0: r = getpid(); break; case 1: r = kps(); break; case 2: k = kchname(); break; case 3: r = kkfork(); break; case 4: r = kswitch(); break; case 5: r = kwait(b); break; case 6: kexit(); break; default: printf("invalid syscall %d\n", a); } put_word(r, segment, offset + 2*AX); }
int body() { char c; printf("proc %d resumes to body()\n", running->pid); while(1) { printLists(); printf("proc %d[%d] running: parent=%d\n", running->pid, running->priority, running->ppid); printf("enter a char [Debug|Fork|Umode|Ps|Quit|Sleep|Wait] : "); c = getc(); printf("%c\n", c); switch(c) { case 's' : tswitch(); break; case 'f' : kfork(); break; case 'q' : kexit(); break; case 'p' : kps(); break; case 'w' : kwait(); break; case 'd' : debugStatement(); break; case 'u' : goUmode(); break; } } }
/****************** syscall handler in C ***************************/ int kcinth() { int a,b,c,d, r; //WRITE CODE TO GET get syscall parameters a,b,c,d from ustack a = get_word(running->uss, running->usp + 26); b = get_word(running->uss, running->usp + 28); c = get_word(running->uss, running->usp + 30); d = get_word(running->uss, running->usp + 32); switch(a){ case 0 : r = kgetpid(); break; case 1 : r = kps(); break; case 2 : r = kchname(b); break; case 3 : r = kmode(); break; case 4 : r = tswitch(); break; case 5 : r = kkwait(b); break; case 6 : r = kkexit(b); break; case 7 : r = fork(); break; case 8 : r = kexec(b); break; case 30: r = kpipe(b); break; case 31: r = read_pipe(b,c,d); break; case 32: r = write_pipe(b,c,d);break; case 33: r = close_pipe(b); break; case 34: r = pfd(); break; case 90: r = getc(); break; case 91: r = putc(b); break; case 99: kkexit(b); break; default: printf("invalid syscall # : %d\n", a); } //WRITE CODE to let r be the return value to Umode put_word(r, running->uss, running->usp + 16); return r; }
void debugStatement() { int flag = 1; char c; while (flag) { printf("Debug Point (l, n, p, num): "); c = getc(); printf("\n"); switch(c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': printProc(&proc[c-'0']); break; case 'n': printf("nproc: %d\n", nproc); break; case 'p': kps(); break; case 'l': printLists(); break; default: flag = 0; break; } } }
int kbhandler() { int scode, value, c; KBD *kp = &kbd; scode = in_byte(KEYBD); // get scan code value = in_byte(PORT_B); // strobe PORT_B to ack the char out_byte(PORT_B, value | KBIT); out_byte(PORT_B, value); if (scode & 0x80) {// key release: ONLY catch shift scode &= 0x7F; // mask out bit 7 if (scode == LSHIFT || scode == RSHIFT) shifted = 0; // released the shift key goto out; } // from here on, must be key press if (scode == 1) // Esc key on keyboard goto out; if (scode == LSHIFT || scode == RSHIFT) { shifted = 1; // set shifted flag goto out; } if (scode == 0x3A) { capslock++; // capslock key acts like a toggle capslock %= 2; goto out; } /************* Catch and handle F keys for debugging *************/ if (scode == F1) { kps(); goto out; } if (scode == F2) { printList("readyQueue", readyQueue); goto out; } if (scode == F3) { printList("freelist", freeList); goto out; } if( scode == F4) { printSleep(); goto out; } if (scode == F12) { kexit(F12); goto out; } // translate scan code to ASCII, using shift[ ] table if shifted; if(shifted) c = shift[scode]; else c = unshift[scode]; // Convert all to upper case if capslock is on if (capslock){ if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; else if (c >= 'a' && c <= 'z') c -= 'a' - 'A'; } /* enter the char in kbd.buf[ ] for process to get */ if (kbd.data.value == KBLEN) { printf("%c\n", BELL); goto out; // kb.buf[] already FULL } kbd.buf[kbd.head++] = c; kbd.head %= KBLEN; V(&kbd.data); out: out_byte(0x20, 0x20); }