|
mxAbbruch.c |
/* mxAbbruch.c */
#include "mxAbbruch.h"
#include "mxVektor.h"
#include "mxUhr.h"
#include "mxTrap.h"
#include "mxSystem.h"
#include "mxInterrupt.h"
#include "mxVT.h"
#include "mxSeriell.h"
#include "mxAusgabe.h"
#include "mxInit.h"
/* -------------------------------------------------------------------------------------------------------------------- */
/**********************
** Globale Variablen **
**********************/
void (*AlteUhr)(); /* alte Behandlungsroutine der Uhrunterbrechung */
void (*AlterAbbruch)(); /* Behandlungsroutine von Trap 1 im Monitor */
void *AlteAusnahmen[MAX_tInterruptVektor]; /* Behandlungsroutinen der Exceptions */
/* -------------------------------------------------------------------------------------------------------------------- */
/***************
** Funktionen **
***************/
void StelleInterruptVektorenWiederHerUndSperreUhrInterrupt(void)
{
int i;
UhrAnhalten(); /* Die Uhr stoppen */
InterruptSperren(cUhrBit); /* Uhrenunterbrechung ausschalten */
SetzeInterruptVektor(cUhrInterruptVektor, AlteUhr); /* Alte Uhr-Routine wieder einsetzen */
SetzeInterruptVektor(cTrap0 + cSystemFehlerTrap, AlterAbbruch); /* Alte Trap1-Routine wieder einsetzen */
for (i = cBusErrorVektorNr; i <= cFormatErrorVektorNr; i++) { /* alle Ausnahmen-Routinen wieder einsetzen */
SetzeInterruptVektor(i, AlteAusnahmen[i]);
}
}
void Abbruch(void *Wo, int Warum, void *s1, void *s2, void *s3, void *s4)
{
StelleInterruptVektorenWiederHerUndSperreUhrInterrupt(); /* genau das */
ScrollRegion(0,0); /* damit wir die Fehlermeldung lesen koennen */
kprintf("\nAbbruch MinMax bei Adresse %p wegen Fehler ", Wo); /* Fehlercode und Adresse ausgeben */
switch(Warum) { /* genauere Beschreibung des Fehlers ausgeben */
case cDivZeroVektorNr:
kprintf("'Division durch Null'\n");
break;
case cIllegalInstructionVektorNr:
kprintf("'Illegale Instruktion'\n");
break;
case cPrivilegeVektorNr:
kprintf("'Privilegverletzung'\n");
break;
case cEmu1010VektorNr:
kprintf("'Emulation 1010 Instruktion'\n");
break;
case cEmu1111VektorNr:
kprintf("'Emulation 1111 Instruktion'\n");
break;
default:
kprintf("%d\n", Warum);
break;
}
kprintf("Stackinhalt:\n %p\n %p\n %p\n %p\n", s1, s2, s3, s4);
_exit(Warum); /* zurueck in den Monitor */
} /* Abbruch */
/* -------------------------------------------------------------------------------------------------------------------- */
void BusAdrAbbruch(void *Wo, void *Adr, void *s1, void *s2, void *s3, void *s4)
{
StelleInterruptVektorenWiederHerUndSperreUhrInterrupt(); /* genau das */
kprintf("\nAbbruch bei Adresse %p wegen Adress-/Busfehler beim Zugriff auf %p\n", Wo, Adr);
kprintf("Stackinhalt:\n %p\n %p\n %p\n %p\n", s1, s2, s3, s4);
_exit(3); /* zurueck in den Monitor */
} /* Abbruch */
/* -------------------------------------------------------------------------------------------------------------------- */
int InitAbbruch(void)
{
int i;
SchreibSeriell(cStartZeichen); /* Startsteuerzeichen ausgeben */
AlteUhr = LiesInterruptVektor(cUhrInterruptVektor); /* Uhr-Routine des Monitors merken */
AlterAbbruch = LiesInterruptVektor(cTrap0 + cSystemFehlerTrap); /* Trap 1 Routine des Monitors merken */
for (i = cBusErrorVektorNr; i <= cFormatErrorVektorNr; i++) { /* alle Ausnahmen-Routinen merken */
AlteAusnahmen[i] = LiesInterruptVektor(i);
}
return TRUE;
}
Bei Problemen mit der Seite bitte eine Mail an Marek
Converted with C2HTML V0.669 by Iluvatar
Prozeßdatenverarbeitung