00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 #include <stdarg.h>
00017 #include <stdio.h>
00018 #include <cubeos.h>
00019 #include "sys_var.h"
00020 #include <ttyio.h>
00021 
00038 void KERN_exphandler (unsigned long par1, unsigned long par2,...)
00039 {
00040         va_list ap;
00041         char *e_name[36] =
00042         {"UNKNOWN", "BUS ERROR", "ADDRESS ERROR",
00043          "ILLEGAL INSTRUCTION",
00044          "DIVIDE BY ZERO", "CHK, CHK2", "TRAPCCV",
00045          "PRIVILEGE VIOLATION", "TRACE", "UNUSED VECTOR",
00046          "HARDWARE BREAKPOINT", "UNINITIALISED",
00047          "SPURIOUS INTERRUPT", "AUTOVECTOR 1", "AUTOVECTOR 2",
00048          "AUTOVECTOR 3", "AUTOVECTOR 4", "AUTOVECTOR 5",
00049          "AUTOVECTOR 6", "AUTOVECTOR 7",
00050          "TRAP0", "TRAP1", "TRAP2", "TRAP3", "TRAP4", "TRAP5", "TRAP6",
00051          "TRAP7", "TRAP8", "TRAP9", "TRAP10", "TRAP11", "TRAP12",
00052          "TRAP13", "TRAP14", "TRAP15"
00053         };
00054 
00055         unsigned short stat_reg, fmt_vector;
00056         unsigned long prg_ctr;
00057         unsigned int fmt, tmp1, tmp2, ssw;
00058         unsigned int my_errno;
00059 
00060 
00061 
00062         asm (" ori.w #0x0700,%sr");     
00063 
00064         
00065         
00066         
00067         writeshort (SIM_MCR, readshort (SIM_MCR) | 0x8000);
00068         
00069         
00070         
00071         
00072         
00073 
00074         TTY_Blocking_Serial_Out = 1;    
00075         TTY_soutchar('E');
00076         TTY_soutchar('R');
00077         TTY_soutchar('R');
00078         TTY_soutchar('O');
00079         TTY_soutchar('R');
00080         TTY_soutchar('\n');
00081         TTY_soutchar('\r');
00082 
00083         TTY_tty[_TTY_contty].mode=TTY_MODE_TXUNBUF|TTY_MODE_RXBLOCKING|TTY_MODE_TXBLOCKING;
00084         stat_reg = (par1 >> 16);
00085         prg_ctr = (par2 >> 16) | ((par1 & 0xffff) << 16);
00086         fmt_vector = (par2 & 0xffff);
00087 
00088         my_errno = _KERN_sys_errorcode;
00089         if (my_errno > 35)
00090                 my_errno = 0;
00091 
00092         printf ("\r\n*******SYSTEM ERROR********\r\n");
00093         printf ("%s [%d] (vector offset %03x) @ %08lx\n\r", e_name[my_errno], _KERN_sys_errorcode,
00094                 (fmt_vector & 0xfff), prg_ctr);
00095         printf ("Statusregister: %04x\r\n", stat_reg);
00096         printf ("Trace mode: %1d\r\n", ((stat_reg & 0xc000) >> 14));
00097         if (stat_reg & 0x2000)
00098                 printf ("Supervisor mode\r\n");
00099         else
00100                 printf ("User mode\r\n");
00101         printf ("Interrupt priority mask: %1d\r\n", ((stat_reg & 0x700) >> 8));
00102         printf ("Flags: ");
00103         if (stat_reg & 0x10)
00104                 printf ("Extend ");
00105         if (stat_reg & 0x8)
00106                 printf ("Negative ");
00107         if (stat_reg & 0x4)
00108                 printf ("Zero ");
00109         if (stat_reg & 0x2)
00110                 printf ("Overflow ");
00111         if (stat_reg & 0x1)
00112                 printf ("Carry");
00113         printf ("\r\n");
00114 
00115         fmt = (fmt_vector & 0xf000) >> 12;
00116         va_start (ap, par2);
00117 
00118         switch (fmt) {
00119         case (0):
00120                 break;
00121         case (2):
00122                 printf ("Faulted instr PC: %08lx\r\n", va_arg (ap, unsigned long));
00123 
00124                 break;
00125         case (12):
00126                 printf ("Faulted addr. PC: %08lx\r\n", va_arg (ap, unsigned long));
00127                 tmp1 = va_arg (ap, unsigned long);
00128                 tmp2 = va_arg (ap, unsigned long);
00129                 printf ("Microcode rev. no.: %02x\n\r", va_arg (ap, unsigned char));
00130                 printf ("Transfer count: %02x\n\r", va_arg (ap, unsigned char));
00131                 ssw = va_arg (ap, unsigned int);
00132 
00133                 printf ("SSW: ");
00134                 if (ssw & 0x8000)
00135                         printf ("TP ");
00136                 if (ssw & 0x4000)
00137                         printf ("MV ");
00138                 if (ssw & 0x1000)
00139                         printf ("TR ");
00140                 if (ssw & 0x800)
00141                         printf ("B1 ");
00142                 if (ssw & 0x400)
00143                         printf ("B0 ");
00144                 if (ssw & 0x200)
00145                         printf ("RR ");
00146                 if (ssw & 0x100)
00147                         printf ("RM ");
00148                 if (ssw & 0x80)
00149                         printf ("IN ");
00150                 if (ssw & 0x40)
00151                         printf ("RW ");
00152                 if (ssw & 0x20)
00153                         printf ("LG ");
00154                 printf ("SIZ=%1d ", ((ssw & 18) >> 3));
00155                 printf ("FCT=%1d ", (ssw & 7));
00156                 printf ("\r\n");
00157                 if (ssw & 0x8000) {
00158                         printf ("Pre-exception SR: %04x\n\r", (tmp1 >> 16));
00159                         printf ("Faulted exception format/vector: %04x\n\r", (tmp1 & 0xffff));
00160                         printf ("Faulted exception PC: %08x\n\r", tmp2);
00161                 } else {
00162                         printf ("Data Buffer (DBUF): %08x\n\r", tmp1);
00163                         printf ("Current instr. PC: %08x\n\r", tmp2);
00164                 }
00165                 break;
00166         default:
00167                 printf ("Something strange happened: fmt=%2d\n\r", fmt);
00168         }
00169 
00170         printf ("*******SYSTEM HALTED*******\r\n");
00171 
00172         while (1);
00173 }