home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Portable Patmos 1.1 / patmos-src / src / patch1.c < prev    next >
Encoding:
Text File  |  1996-01-19  |  4.7 KB  |  186 lines  |  [TEXT/KAHL]

  1.      {
  2.      unsigned short    kind;
  3.      long newstacksize,phys_pc;
  4.     /* save the current context */
  5.      struct userregs save;
  6. #ifdef MMU68040
  7.     cpusha();
  8. #endif
  9.     pflusha();
  10.     asm { 
  11.         movem.l    d0-d7/a0-a5,save.save
  12.         };
  13.     SetCurrentA5();
  14.     memcpy(system_vectors, supervisor_vectors, vec_patch_size);
  15. #if 0
  16.     SetCursor(*nxt[7&++ccnt]);
  17. #endif
  18. #ifdef PROTECTED
  19.     newstacksize = crp->stack_limit-usp()+stack_headroom;
  20.     if ((newstacksize<stack_headroom) 
  21.         || newstacksize > crp->maxstack
  22.         || ((long)(LTP(usp()))!=-1) 
  23.         || upper_space(crp, newstacksize))
  24. #endif
  25.             {
  26.             int i,k;
  27.             unsigned short ssw,*fault_frame = &fault;
  28.             save.save[15] = usp();
  29.             asm { 
  30.                 move.l    (a6),save.save[14]
  31.                 move.w    4(a6),save.flags
  32.                 move.l    6(a6),save.pc
  33.                 move.w    10(a6),kind
  34.                 };
  35. #ifdef PROTECTED
  36.             if (virtual)
  37.             asm
  38.                 {
  39.                 move.w    save.flags,sr
  40.                 }
  41. #endif
  42.             k = kind >> 12;
  43.             kind &= 4095;
  44. #ifdef PROTECTED
  45.             if ((kind == (46<<2)) && (get_user_root()==(long)swapper))
  46.                 {
  47.                 save.pc -= 2;
  48.                 crp->registers = save;
  49.                 sched();
  50.                 }
  51.             else
  52. #endif
  53.             if (crp->trace_me && (0x2000&~save.flags) 
  54.                     && (((kind)==(9<<2))||((kind)==(47<<2))))
  55.                 {
  56.                 /* Breakpoint */
  57.                 save.flags &= ~0xC000;    /* disable tracing */
  58.                 crp->registers = save;
  59.                 crp->state = 'T';
  60.                 crp->result = W_STOPCODE(SIGTRAP);
  61.                 sched();
  62.                 }
  63. #if 0
  64.             else if ((kind>>2)==2 && !*(long *)&fault_frame[8] && !crp->trace_me)
  65.                 {
  66.                 supervisor_space(crp, 0, page_size-1);
  67.                 kprintf("Caution: access through nil pointer failed\n");
  68.                 }
  69. #endif
  70.             else
  71.                 {
  72.                 crp->result = SIGTERM;
  73.                 if (!crp->trace_me)
  74.                     {
  75.                     debug = 0;
  76.                     kprintf("Saved PC = %X USP = %X URP = %X SR = %X\n", 
  77.                         save.pc, 
  78.                         save.save[15], 
  79.                         (long)crp, save.flags);
  80.                     kprintf("Exception vector = %X, kind = %d\n", 
  81.                         kind, k);
  82.                     for (i = 0; i < 8; i++)
  83.                         kprintf("D%d = %8.8X    A%d = %8.8X\n", i, save.save[i], i, save.save[i+8]);
  84.                     }
  85.                 switch ((kind)>>2)
  86.                     {
  87.                     case 32: case 33: case 34: case 35:
  88.                     case 36: case 37: case 38: case 39:
  89.                     case 40: case 41: case 42: case 43:
  90.                     case 44: case 45: case 46: case 47:
  91.                         crp->result = SIGTRAP;
  92.                         if (!crp->trace_me) kprintf("trap #%d \n", ((kind)>>2)-32);
  93.                         break;
  94.                     case 2: 
  95.                         if (!crp->trace_me)
  96.                             {
  97.                             int i,addr;
  98.                             kprintf("bus error - Fault frame:\n");
  99.                             for (i = 4; i < 14; i++)
  100.                                 {
  101.                                 kprintf("%4.4X ", fault_frame[i]);
  102.                                 }
  103.                             ssw = fault_frame[4];
  104.                             addr = *(long *)&fault_frame[8];
  105.                             kprintf("\nAccessing fault address %8.8X (kmem=%8.8X)\n", addr, LTP(addr));
  106.                             }
  107.                         crp->result = SIGBUS;
  108.                         break;
  109.                     case 3: if (!crp->trace_me) kprintf("address error\n"); 
  110.                         crp->result = SIGBUS; break;
  111.                     case 4: if (!crp->trace_me) kprintf("illegal inst\n"); 
  112.                         crp->result = SIGILL; break;
  113.                     case 5: if (!crp->trace_me) kprintf("zero divide\n"); 
  114.                         break;
  115.                     case 6: if (!crp->trace_me) kprintf("range error\n"); 
  116.                         break;
  117.                     case 7: if (!crp->trace_me) kprintf("trapv\n"); 
  118.                         break;
  119.                     case 8: if (!crp->trace_me) kprintf("privilege\n"); 
  120.                         break;
  121.                     case 9: if (!crp->trace_me) kprintf("trace\n"); 
  122.                         break;
  123.                     case 10: if (!crp->trace_me) kprintf("line-A emulation\n"); 
  124.                         crp->result = SIGEMT; break;
  125.                     case 11: if (!crp->trace_me) kprintf("Line-F emulation\n"); 
  126.                         crp->result = SIGEMT; break;
  127.                     }
  128.                 if (!crp->trace_me) 
  129.                     {
  130.                     phys_pc = (long)LTP(save.pc);
  131.                     if (phys_pc != -1) insn_surround(save.pc);
  132.                     else kprintf("Program address not mapped\n");
  133.                     }
  134.                 if (0x2000&~save.flags)
  135.                     {
  136.                     int trace = crp->trace_me;
  137.                     if (!trace) 
  138.                         crp->state = 'X';
  139.                     else
  140.                         {
  141.                         crp->state = 'T';
  142.                         crp->result = W_STOPCODE(crp->result);    
  143.                         }
  144.                     sched();
  145.                     if (!trace) kprintf("Restored PC = %X USP = %X URP = %X\n", 
  146.                         crp->registers.pc, 
  147.                         crp->registers.save[15], 
  148.                         (long)crp);
  149.                     }
  150.                 else
  151.                     {
  152.                     kprintf("Exception occurred in supervisor mode\n");
  153.                     kInterval = 0;
  154.                     exit(1);
  155.                     }
  156.                 }
  157.             /* restore the chosen context */
  158.             save = crp->registers;
  159. #ifdef PROTECTED
  160.              put_user_root((long)crp);
  161.              if (virtual) EnterSupervisorMode();
  162. #endif
  163.             put_usp(save.save[15]);
  164.             memcpy(system_vectors, user_vectors, vec_patch_size);
  165.             cpusha();
  166.             pflusha();
  167.             asm
  168.                 {
  169.                 move.l    save.save[14],(a6)
  170.                 move.w    save.flags,4(a6)
  171.                 move.l    save.pc,6(a6)
  172.                 movem.l    save.save,d0-d7/a0-a5
  173.                 unlk    a6
  174.                  rte 
  175.                  };
  176.              }
  177.     kprintf("New stack size = %d pages\n", newstacksize/page_size);
  178.     memcpy(system_vectors, user_vectors, vec_patch_size);
  179.     asm
  180.         {
  181.         movem.l    save.save,d0-d7/a0-a5
  182.         unlk    a6
  183.          rte 
  184.          };
  185.     }
  186.