|
Listing 11:
/* [excerpted from i386.c] */
...
test386(){
...
/* test handling exceptions */
printf("breakpoint "); getchar();
asm (" int $3 ");
...
/* Trap exception processing code */
trap(es, ds, edi, esi, ebp, dummy, ebx, edx, ecx, eax,
fault, ec, eip, cs, eflags, esp, ss) {
printf("pc:%x cs:%x ds:%x eflags:%x ec %x fault %x cr0 %x cr2 %x \n",
eip, cs, ds, eflags, ec, fault, rcr0(), rcr2());
printf("edi %x esi %x ebp %x ebx %x edx %x ecx %x eax %x\n",
edi, esi, ebp, ebx, edx, ecx, eax);
eip++; /* simple way to 'jump' over fault */
getchar();
}
...
# excerpted from srt.s
...
#include <machine/i386/trap.h>
#define IDTVEC(name) .align 4; .globl _X##name; _X##name:
...
/* Trap and fault vector routines */
#define TRAP(a) pushl $##a ; jmp alltraps
IDTVEC(div)
pushl $0; TRAP(T_DIVIDE)
IDTVEC(dbg)
pushl $0; TRAP(T_DEBUG)
IDTVEC(nmi)
pushl $0; TRAP(T_NMI)
IDTVEC(bpt)
pushl $0; TRAP(T_BPTFLT)
IDTVEC(ofl)
pushl $0; TRAP(T_OFLOW)
IDTVEC(bnd)
pushl $0; TRAP(T_BOUND)
IDTVEC(ill)
pushl $0; TRAP(T_PRIVINFLT)
IDTVEC(dna)
pushl $0; TRAP(T_DNA)
IDTVEC(dble)
TRAP(T_DOUBLEFLT)
IDTVEC(fpusegm)
pushl $0; TRAP(T_FPOPFLT)
IDTVEC(tss)
TRAP(T_TSSFLT)
IDTVEC(missing)
TRAP(T_SEGNPFLT)
IDTVEC(stk)
TRAP(T_STKFLT)
IDTVEC(prot)
TRAP(T_PROTFLT)
IDTVEC(page)
TRAP(T_PAGEFLT)
IDTVEC(rsvd)
pushl $0; TRAP(T_RESERVED)
IDTVEC(fpu)
pushl $0; TRAP(T_ARITHTRAP)
/* 17 - 31 reserved for future exp */
IDTVEC(rsvd0)
pushl $0; TRAP(17)
IDTVEC(rsvd1)
pushl $0; TRAP(18)
IDTVEC(rsvd2)
pushl $0; TRAP(19)
IDTVEC(rsvd3)
pushl $0; TRAP(20)
IDTVEC(rsvd4)
pushl $0; TRAP(21)
IDTVEC(rsvd5)
pushl $0; TRAP(22)
IDTVEC(rsvd6)
pushl $0; TRAP(23)
IDTVEC(rsvd7)
pushl $0; TRAP(24)
IDTVEC(rsvd8)
pushl $0; TRAP(25)
IDTVEC(rsvd9)
pushl $0; TRAP(26)
IDTVEC(rsvd10)
pushl $0; TRAP(27)
IDTVEC(rsvd11)
pushl $0; TRAP(28)
IDTVEC(rsvd12)
pushl $0; TRAP(29)
IDTVEC(rsvd13)
pushl $0; TRAP(30)
IDTVEC(rsvd14)
pushl $0; TRAP(31)
alltraps:
pushal
push %ds # save old selector's we will use
push %es
movw $0x10,%ax # load them with kernel global data sel
movw %ax,%ds
movw %ax,%es
call _trap
pop %es
pop %ds
popal
addl $8,%esp # pop type, code
iret
Listing 15:
/* [excerpted from i386.c] */
...
test386(){
int x, *pi, timeout;
...
/* generate a page fault exception */
printf("dopagflt\n"); getchar();
pi = (int *) 0x800000; /* above 4MB */
x = *pi; /* will fault invalid read */
*pi = ++x ; /* will fault invalid write */
...
|