| plan 9 kernel history: overview | file list | diff list |
1991/0703/pc/trap.c (diff list | history)
| pc/trap.c on 1991/0613 | ||
| 1991/0613 | #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" | |
| 1991/0703 | #include "ureg.h" | |
| 1991/0613 | /* | |
| 1991/0614 | * trap/interrupt gates | |
| 1991/0613 | */ | |
| 1991/0703 | Segdesc ilt[256]; void (*ivec[256])(void*); void sethvec(int v, void (*r)(void), int type) | |
| 1991/0613 | { | |
| 1991/0703 | ilt[v].d0 = ((ulong)r)&0xFFFF|(KESEL<<16); ilt[v].d1 = ((ulong)r)&0xFFFF0000|SEGP|SEGPL(3)|type; } | |
| 1991/0614 | ||
| 1991/0703 | void setvec(int v, void (*r)(void*), int type) { ilt[v].d1 &= ~SEGTYPE; ilt[v].d1 |= type; ivec[v] = r; } | |
| 1991/0614 | /* | |
| 1991/0703 | * set up the interrupt/trap gates | |
| 1991/0614 | */ | |
| 1991/0703 | void trapinit(void) { int i; | |
| 1991/0614 | ||
| 1991/0703 | /* * set the standard traps */ sethvec(0, intr0, SEGTG); sethvec(1, intr1, SEGTG); sethvec(2, intr2, SEGTG); sethvec(3, intr3, SEGTG); sethvec(4, intr4, SEGTG); sethvec(5, intr5, SEGTG); sethvec(6, intr6, SEGTG); sethvec(7, intr7, SEGTG); sethvec(8, intr8, SEGTG); sethvec(9, intr9, SEGTG); sethvec(10, intr10, SEGTG); sethvec(11, intr11, SEGTG); sethvec(12, intr12, SEGTG); sethvec(13, intr13, SEGTG); sethvec(14, intr14, SEGTG); sethvec(15, intr15, SEGTG); sethvec(16, intr16, SEGTG); /* * set all others to unknown */ for(i = 17; i < 256; i++) sethvec(i, intrbad, SEGIG); /* * tell the hardware where the table is (and how long) */ lidt(ilt, sizeof(ilt)); } | |
| 1991/0614 | /* | |
| 1991/0703 | * All traps | |
| 1991/0614 | */ | |
| 1991/0703 | trap(Ureg *ur) | |
| 1991/0614 | { | |
| 1991/0703 | print("trap %lux\n", ur->trap); print(" edi %lux\n", ur->edi); print(" esi %lux\n", ur->esi); print(" ebp %lux\n", ur->ebp); print(" esp %lux\n", ur->esp); print(" ebx %lux\n", ur->ebx); print(" edx %lux\n", ur->edx); print(" ecx %lux\n", ur->ecx); print(" eax %lux\n", ur->eax); print(" ds %lux\n", ur->ds); print(" trap %lux\n", ur->trap); print(" ecode %lux\n", ur->ecode); print(" eip %lux\n", ur->eip); print(" cs %lux\n", ur->cs); print(" eflags %lux\n", ur->eflags); print(" oesp %lux\n", ur->oesp); print(" ss %lux\n", ur->ss); delay(500); if(ur->trap>=256 || ivec[ur->trap] == 0) panic("bad trap type %d\n", ur->trap); (*ivec[ur->trap])(ur); | |
| 1991/0614 | } | |