#include "mt_os.h" #include "mt_thread.h" #include "mt_vm.h" /* * Initialize data structures for mt_os, such as page tables etc. */ void mt_initialize() { } /* Clock tick -- gets called after every CLOCK_INTERVAL-instructions. * This simulates preemption for the user level program. interrupts * are enabled ONLY on entry into minithread functions. We do NOT * want interrupts occuring during mipsi's execution. As a result, * remember to disable interrupts when switching to a new thread when * first entering that thread. */ void mt_os_tick() { enable_interrupts(); mt_minithread_yield(); disable_interrupts(); /* re-entering mipsi */ } /* Dispatch mt_os system calls and TLB-related exceptions to the * appropriate service routines. */ int mt_syscall(unsigned num, unsigned arg1, unsigned arg2, unsigned arg3) { int retval; if (num == MT_TLB_TRANSLATE_FAULT) return mt_tlb_translate_fault(arg1); if (num == MT_TLB_WRITE_FAULT) return mt_tlb_write_fault(arg1); enable_interrupts(); switch (num) { case MT_MINITHREAD_FORK: retval = mt_minithread_fork(arg1,arg2); break; case MT_MINITHREAD_SELF: retval = mt_minithread_self(); break; case MT_MINITHREAD_DIE: retval = mt_minithread_die(); break; case MT_MINITHREAD_YIELD: retval = mt_minithread_yield(); break; case MT_SEMAPHORE_CREATE: retval = mt_semaphore_create(); break; case MT_SEMAPHORE_INITIALIZE: retval = mt_semaphore_initialize(arg1,arg2); break; case MT_SEMAPHORE_DESTROY: retval = mt_semaphore_destroy(arg1); break; case MT_SEMAPHORE_P: retval = mt_semaphore_P(arg1); break; case MT_SEMAPHORE_V: retval = mt_semaphore_V(arg1); break; case MT_TLB_TRANSLATE_FAULT: /* uncomment for part 3: */ retval = mt_tlb_translate_fault(arg1); break; case MT_TLB_WRITE_FAULT: /* uncomment for part 3: */ retval = mt_tlb_write_fault(arg1); break; default: printf("Invalid MT_OS system call number: %d",num); retval = -1; break; } disable_interrupts(); /* re-entering mipsi */ return retval; }