void startup() { USLOSS_Console("startup\n"); USLOSS_IntVec[USLOSS_CLOCK_INT] = dummy; USLOSS_Console("1 psr = %d\n", USLOSS_PsrGet()); USLOSS_PsrSet(USLOSS_PsrGet() | USLOSS_PSR_CURRENT_INT); USLOSS_Console("2 psr = %d\n", USLOSS_PsrGet()); USLOSS_PsrSet(USLOSS_PsrGet() & ~USLOSS_PSR_CURRENT_INT); USLOSS_Console("3 psr = %d\n", USLOSS_PsrGet()); USLOSS_PsrSet((USLOSS_PsrGet() & ~USLOSS_PSR_CURRENT_MODE) | USLOSS_PSR_CURRENT_INT); USLOSS_Console("4 psr = %d\n", USLOSS_PsrGet()); USLOSS_Console("This will cause a trap.\n"); USLOSS_PsrSet(3); }
/* ------------------------------------------------------------------------ Name - launch Purpose - Dummy function to enable interrupts and launch a given process upon startup. Parameters - none Returns - nothing Side Effects - enable interrupts ------------------------------------------------------------------------ */ void launch(void){ Check_Your_Privilege(); int rc; USLOSS_PsrSet(USLOSS_PsrGet() | USLOSS_PSR_CURRENT_INT); rc = procTable[currPid].startFunc(procTable[currPid].startArg); // USLOSS_Console("Laung Ending for %s\n",procTable[currPid].name); /* quit if we ever come back */ P1_Quit(rc); } /* End of launch */
/* * Disables the interrupts. */ static void disableInterrupts() { /* turn the interrupts OFF iff we are in kernel mode */ if( (USLOSS_PSR_CURRENT_MODE & USLOSS_PsrGet()) == 0 ) { //not in kernel mode USLOSS_Console("Kernel Error: Not in kernel mode, may not "); USLOSS_Console("disable interrupts\n"); USLOSS_Halt(1); } else /* We ARE in kernel mode */ USLOSS_PsrSet( USLOSS_PsrGet() & ~USLOSS_PSR_CURRENT_INT ); } /* disableInterrupts */
/* * Enables the interrupts */ static void enableInterrupts(int dev, void *args) { /* turn the interrupts ON iff we are in kernel mode */ if ( (USLOSS_PSR_CURRENT_MODE & USLOSS_PsrGet()) == 0 ) { //not in kernel mode USLOSS_Console("Kernel Error: Not in kernel mode, may not "); USLOSS_Console("disable interrupts\n"); USLOSS_Halt(1); } else { /* We ARE in kernel mode */ USLOSS_PsrSet( USLOSS_PsrGet() | USLOSS_PSR_CURRENT_INT); } }
void startup() { int status; int i, j, k; FILE *f; char name[50]; int n; // Compute the inputs and write them to the term*.in file. Each terminal reads unique content. k = 0; for(i = 0; i < USLOSS_TERM_UNITS; i++) { memset(buffers[i], '\0', NUMCHARS); counts[i] = 0; snprintf(name, sizeof(name), "term%d.in", i); f = fopen(name, "w"); assert(f != NULL); for (j = 0; j < NUMCHARS; j++) { inputs[i][j] = 'a' + k++; } n = fwrite(inputs[i], 1, NUMCHARS, f); assert(n == NUMCHARS); fclose(f); } for (i = 0; i < USLOSS_NUM_INTS; i++) { USLOSS_IntVec[i] = dummy_handler; } // Turn on receive interrupts. for(i = 0; i < USLOSS_TERM_UNITS; i++) { status = USLOSS_DeviceOutput(USLOSS_TERM_DEV, i, (void *) USLOSS_TERM_CTRL_RECV_INT(0)); } USLOSS_IntVec[USLOSS_TERM_INT] = term_handler; // Turn on interrupts. USLOSS_PsrSet(USLOSS_PsrGet() | USLOSS_PSR_CURRENT_INT); // Read from the terminals. while(done < USLOSS_TERM_UNITS ) { USLOSS_WaitInt(); } USLOSS_Halt(0); }
static void syscallHandler(int dev, void *args) { // get args systemArgs *sysPtr = (systemArgs *) args; // check if valid dev if (dev != USLOSS_SYSCALL_INT) { USLOSS_Console("syscallHandler(): Bad call\n"); USLOSS_Halt(1); } // check if valid range of args if (sysPtr->number < 0 || sysPtr->number >= MAXSYSCALLS) { USLOSS_Console("syscallHandler(): sys number %d is wrong. Halting...\n", sysPtr->number); USLOSS_Halt(1); } USLOSS_PsrSet( USLOSS_PsrGet() | USLOSS_PSR_CURRENT_INT); sys_vec[sysPtr->number](sysPtr); }
void startup() { int status; int i; for (i = 0; i < USLOSS_NUM_INTS; i++) { USLOSS_IntVec[i] = dummy_handler; } // Turn on receive interrupts for terminal 0. status = USLOSS_DeviceOutput(USLOSS_TERM_DEV, 0, (void *) USLOSS_TERM_CTRL_RECV_INT(0)); USLOSS_IntVec[USLOSS_TERM_INT] = term_handler; // Turn on interrupts. USLOSS_PsrSet(USLOSS_PsrGet() | USLOSS_PSR_CURRENT_INT); // Wait in an infinite loops for interrupts. while(1) { USLOSS_WaitInt(); } }
static void userMode(void) { USLOSS_PsrSet(USLOSS_PsrGet() & ~(USLOSS_PSR_CURRENT_MODE)); }
static void interruptsOn(void) { USLOSS_PsrSet(USLOSS_PsrGet() | USLOSS_PSR_CURRENT_INT); }
void int_enable(){ USLOSS_PsrSet(USLOSS_PsrGet() | USLOSS_PSR_CURRENT_INT); }
void int_disable(){ USLOSS_PsrSet(USLOSS_PsrGet() & ~(USLOSS_PSR_CURRENT_INT)); }