Update IntDispatcher.cc
This commit is contained in:
@ -13,96 +13,36 @@
|
|||||||
#include "IntDispatcher.h"
|
#include "IntDispatcher.h"
|
||||||
#include "device/cpu/CPU.h"
|
#include "device/cpu/CPU.h"
|
||||||
#include "kernel/system/Globals.h"
|
#include "kernel/system/Globals.h"
|
||||||
#include "kernel/exception//Bluescreen.h"
|
#include "kernel/exception/Bluescreen.h"
|
||||||
|
#include "lib/util/System.h"
|
||||||
extern "C" void int_disp(uint8_t vector);
|
#include "kernel/system/System.h"
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Prozedur: int_disp *
|
|
||||||
*---------------------------------------------------------------------------*
|
|
||||||
* Beschreibung: Low-Level Interrupt-Behandlung. *
|
|
||||||
* Diese Funktion ist in der IDT fuer alle Eintraege einge- *
|
|
||||||
* tragen. Dies geschieht bereits im Bootloader. *
|
|
||||||
* Sie wird also fuer alle Interrupts aufgerufen. Von hier *
|
|
||||||
* aus sollen die passenden ISR-Routinen der Treiber-Objekte*
|
|
||||||
* mithilfe von 'IntDispatcher::report' aufgerufen werden. *
|
|
||||||
* Parameter: *
|
|
||||||
* vector: Vektor-Nummer der Unterbrechung *
|
|
||||||
*****************************************************************************/
|
|
||||||
void int_disp(uint8_t vector) {
|
|
||||||
|
|
||||||
/* hier muss Code eingefuegt werden */
|
|
||||||
|
|
||||||
if (vector < 32) {
|
|
||||||
bs_dump(vector);
|
|
||||||
Device::CPU::halt();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Kernel::intdis.report(vector) < 0) {
|
|
||||||
Kernel::kout << "Panic: unexpected interrupt " << vector;
|
|
||||||
Kernel::kout << " - processor halted." << endl;
|
|
||||||
Device::CPU::halt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Methode: IntDispatcher::assign *
|
|
||||||
*---------------------------------------------------------------------------*
|
|
||||||
* Beschreibung: Registrierung einer ISR. *
|
|
||||||
* *
|
|
||||||
* Parameter: *
|
|
||||||
* vector: Vektor-Nummer der Unterbrechung *
|
|
||||||
* isr: ISR die registriert werden soll *
|
|
||||||
* *
|
|
||||||
* Rueckgabewert: 0 = Erfolg, -1 = Fehler *
|
|
||||||
*****************************************************************************/
|
|
||||||
int IntDispatcher::assign(uint8_t vector, ISR &isr) {
|
int IntDispatcher::assign(uint8_t vector, ISR &isr) {
|
||||||
|
|
||||||
/* hier muss Code eingefuegt werden */
|
/* hier muss Code eingefuegt werden */
|
||||||
|
|
||||||
if (vector >= size) {
|
handlerMap[vector] = &isr;
|
||||||
log.error() << "Invalid vector number when assigning" << endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
map[vector] = &isr;
|
|
||||||
log.info() << "Registered ISR for vector " << dec << vector << endl;
|
log.info() << "Registered ISR for vector " << dec << vector << endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
int IntDispatcher::dispatch(uint8_t vector) {
|
||||||
* Methode: IntDispatcher::report *
|
|
||||||
*---------------------------------------------------------------------------*
|
|
||||||
* Beschreibung: Eingetragene ISR ausfuehren. *
|
|
||||||
* *
|
|
||||||
* Parameter: *
|
|
||||||
* vector: Gesuchtes ISR-Objekt fuer diese Vektor-Nummer. *
|
|
||||||
* *
|
|
||||||
* Rueckgabewert: 0 = ISR wurde aufgerufen, -1 = unbekannte Vektor-Nummer *
|
|
||||||
*****************************************************************************/
|
|
||||||
int IntDispatcher::report(uint8_t vector) {
|
|
||||||
|
|
||||||
/* hier muss Code eingefuegt werden */
|
/* hier muss Code eingefuegt werden */
|
||||||
|
|
||||||
if (vector >= size) {
|
ISR *isr = handlerMap[vector];
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ISR *isr = map[vector];
|
|
||||||
|
|
||||||
if (isr == nullptr) {
|
if (isr == nullptr) {
|
||||||
log.error() << "No ISR registered for vector " << vector << endl;
|
log.error() << "No ISR registered for vector " << vector << endl;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 32 = Timer
|
// TODO: Throw exception
|
||||||
// 33 = Keyboard
|
|
||||||
// log.trace() << "Interrupt: " << dec << vector << endl;
|
Util::System::out << "Panic: unexpected interrupt " << vector;
|
||||||
if (vector == 33) {
|
Util::System::out << " - processor halted." << endl;
|
||||||
log.debug() << "Keyboard Interrupt" << endl;
|
Device::CPU::halt();
|
||||||
}
|
}
|
||||||
|
|
||||||
isr->trigger();
|
isr->trigger();
|
||||||
|
Reference in New Issue
Block a user