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