Skip to content

Instantly share code, notes, and snippets.

@gsmaverick
Created March 14, 2012 20:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gsmaverick/2039394 to your computer and use it in GitHub Desktop.
Save gsmaverick/2039394 to your computer and use it in GitHub Desktop.
Exception Handler
// exception.cc
// Entry point into the Nachos kernel from user programs.
// There are two kinds of things that can cause control to
// transfer back to here from user code:
//
// syscall -- The user code explicitly requests to call a procedure
// in the Nachos kernel. Right now, the only function we support is
// "Halt".
//
// exceptions -- The user code does something that the CPU can't handle.
// For instance, accessing memory that doesn't exist, arithmetic errors,
// etc.
//
// Interrupts (which can also cause control to transfer from user
// code into the Nachos kernel) are handled elsewhere.
//
// For now, this only handles the Halt() system call.
// Everything else core dumps.
//
// Copyright (c) 1992-1996 The Regents of the University of California.
// All rights reserved. See copyright.h for copyright notice and limitation
// of liability and disclaimer of warranty provisions.
#include "copyright.h"
#include "main.h"
#include "syscall.h"
//----------------------------------------------------------------------
// ExceptionHandler
// Entry point into the Nachos kernel. Called when a user program
// is executing, and either does a syscall, or generates an addressing
// or arithmetic exception.
//
// For system calls, the following is the calling convention:
//
// system call code -- r2
// arg1 -- r4
// arg2 -- r5
// arg3 -- r6
// arg4 -- r7
//
// The result of the system call, if any, must be put back into r2.
//
// And don't forget to increment the pc before returning. (Or else you'll
// loop making the same system call forever!
//
// "which" is the kind of exception. The list of possible exceptions
// are in machine.h.
//----------------------------------------------------------------------
void
ExceptionHandler(ExceptionType which)
{
int type = kernel->machine->ReadRegister(2);
switch (which) {
case SyscallException:
switch(type) {
case SC_Halt:
DEBUG(dbgAddr, "Shutdown, initiated by user program.\n");
kernel->interrupt->Halt();
break;
default:
cerr << "Unexpected system call " << type << "\n";
break;
}
break;
case PageFaultException:
int vPage = kernel->machine->ReadRegister(39);
unsigned int vPageNumber = (unsigned)vPage / PageSize;
if (vPageNumber > NumPhysPages) {
}
break;
default:
cerr << "Unexpected user mode exception" << which << "\n";
break;
}
ASSERTNOTREACHED();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment