home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-01-19 | 4.7 KB | 186 lines | [TEXT/KAHL] |
- {
- unsigned short kind;
- long newstacksize,phys_pc;
- /* save the current context */
- struct userregs save;
- #ifdef MMU68040
- cpusha();
- #endif
- pflusha();
- asm {
- movem.l d0-d7/a0-a5,save.save
- };
- SetCurrentA5();
- memcpy(system_vectors, supervisor_vectors, vec_patch_size);
- #if 0
- SetCursor(*nxt[7&++ccnt]);
- #endif
- #ifdef PROTECTED
- newstacksize = crp->stack_limit-usp()+stack_headroom;
- if ((newstacksize<stack_headroom)
- || newstacksize > crp->maxstack
- || ((long)(LTP(usp()))!=-1)
- || upper_space(crp, newstacksize))
- #endif
- {
- int i,k;
- unsigned short ssw,*fault_frame = &fault;
- save.save[15] = usp();
- asm {
- move.l (a6),save.save[14]
- move.w 4(a6),save.flags
- move.l 6(a6),save.pc
- move.w 10(a6),kind
- };
- #ifdef PROTECTED
- if (virtual)
- asm
- {
- move.w save.flags,sr
- }
- #endif
- k = kind >> 12;
- kind &= 4095;
- #ifdef PROTECTED
- if ((kind == (46<<2)) && (get_user_root()==(long)swapper))
- {
- save.pc -= 2;
- crp->registers = save;
- sched();
- }
- else
- #endif
- if (crp->trace_me && (0x2000&~save.flags)
- && (((kind)==(9<<2))||((kind)==(47<<2))))
- {
- /* Breakpoint */
- save.flags &= ~0xC000; /* disable tracing */
- crp->registers = save;
- crp->state = 'T';
- crp->result = W_STOPCODE(SIGTRAP);
- sched();
- }
- #if 0
- else if ((kind>>2)==2 && !*(long *)&fault_frame[8] && !crp->trace_me)
- {
- supervisor_space(crp, 0, page_size-1);
- kprintf("Caution: access through nil pointer failed\n");
- }
- #endif
- else
- {
- crp->result = SIGTERM;
- if (!crp->trace_me)
- {
- debug = 0;
- kprintf("Saved PC = %X USP = %X URP = %X SR = %X\n",
- save.pc,
- save.save[15],
- (long)crp, save.flags);
- kprintf("Exception vector = %X, kind = %d\n",
- kind, k);
- for (i = 0; i < 8; i++)
- kprintf("D%d = %8.8X A%d = %8.8X\n", i, save.save[i], i, save.save[i+8]);
- }
- switch ((kind)>>2)
- {
- case 32: case 33: case 34: case 35:
- case 36: case 37: case 38: case 39:
- case 40: case 41: case 42: case 43:
- case 44: case 45: case 46: case 47:
- crp->result = SIGTRAP;
- if (!crp->trace_me) kprintf("trap #%d \n", ((kind)>>2)-32);
- break;
- case 2:
- if (!crp->trace_me)
- {
- int i,addr;
- kprintf("bus error - Fault frame:\n");
- for (i = 4; i < 14; i++)
- {
- kprintf("%4.4X ", fault_frame[i]);
- }
- ssw = fault_frame[4];
- addr = *(long *)&fault_frame[8];
- kprintf("\nAccessing fault address %8.8X (kmem=%8.8X)\n", addr, LTP(addr));
- }
- crp->result = SIGBUS;
- break;
- case 3: if (!crp->trace_me) kprintf("address error\n");
- crp->result = SIGBUS; break;
- case 4: if (!crp->trace_me) kprintf("illegal inst\n");
- crp->result = SIGILL; break;
- case 5: if (!crp->trace_me) kprintf("ze ro divide\n");
- break;
- case 6: if (!crp->trace_me) kprintf("range error\n");
- break;
- case 7: if (!crp->trace_me) kprintf("trapv\n");
- break;
- case 8: if (!crp->trace_me) kprintf("privilege\n");
- break;
- case 9: if (!crp->trace_me) kprintf("trace\n");
- break;
- case 10: if (!crp->trace_me) kprintf("line-A emulation\n");
- crp->result = SIGEMT; break;
- case 11: if (!crp->trace_me) kprintf("Line-F emulation\n");
- crp->result = SIGEMT; break;
- }
- if (!crp->trace_me)
- {
- phys_pc = (long)LTP(save.pc);
- if (phys_pc != -1) insn_surround(save.pc);
- else kprintf("Program address not mapped\n");
- }
- if (0x2000&~save.flags)
- {
- int trace = crp->trace_me;
- if (!trace)
- crp->state = 'X';
- else
- {
- crp->state = 'T';
- crp->result = W_STOPCODE(crp->result);
- }
- sched();
- if (!trace) kprintf("Restored PC = %X USP = %X URP = %X\n",
- crp->registers.pc,
- crp->registers.save[15],
- (long)crp);
- }
- else
- {
- kprintf("Exception occurred in supervisor mode\n");
- kInterval = 0;
- exit(1);
- }
- }
- /* restore the chosen context */
- save = crp->registers;
- #ifdef PROTECTED
- put_user_root((long)crp);
- if (virtual) EnterSupervisorMode();
- #endif
- put_usp(save.save[15]);
- memcpy(system_vectors, user_vectors, vec_patch_size);
- cpusha();
- pflusha();
- asm
- {
- move.l save.save[14],(a6)
- move.w save.flags,4(a6)
- move.l save.pc,6(a6)
- movem.l save.save,d0-d7/a0-a5
- unlk a6
- rte
- };
- }
- kprintf("New stack size = %d pages\n", newstacksize/page_size);
- memcpy(system_vectors, user_vectors, vec_patch_size);
- asm
- {
- movem.l save.save,d0-d7/a0-a5
- unlk a6
- rte
- };
- }
-