/* See COPYRIGHT for copyright information. */ #include #include #include #include ################################################################### # exceptions/interrupts ################################################################### /* The TRAPHANDLER macro defines a globally-visible function for handling * a trap. It pushes a trap number onto the stack, then jumps to _alltraps. * Use TRAPHANDLER for traps where the CPU automatically pushes an error code. */ #define TRAPHANDLER(name, num) \ .globl name; \ .type name, @function; \ .align 2; /* align function definition */ \ name: /* function starts here */ \ pushl $(num); \ jmp _alltraps /* Use TRAPHANDLER_NOEC for traps where the CPU doesn't push an error code. * It pushes a 0 in place of the error code, so the trap frame has the same * format in either case. */ #define TRAPHANDLER_NOEC(name, num) \ .globl name; \ .type name, @function; \ .align 2; \ name: \ pushl $0; \ pushl $(num); \ jmp _alltraps /* * Lab 3: Your code here for generating entry points for the different traps. */ .text TRAPHANDLER_NOEC(vector0,T_DIVIDE) TRAPHANDLER_NOEC(vector1,T_DEBUG) TRAPHANDLER_NOEC(vector2,T_NMI) TRAPHANDLER_NOEC(vector3,T_BRKPT) TRAPHANDLER_NOEC(vector4,T_OFLOW) TRAPHANDLER_NOEC(vector5,T_BOUND) TRAPHANDLER_NOEC(vector6,T_ILLOP) TRAPHANDLER_NOEC(vector7,T_DEVICE) TRAPHANDLER(vector8,T_DBLFLT) TRAPHANDLER(vector10,T_TSS) TRAPHANDLER(vector11,T_SEGNP) TRAPHANDLER(vector12,T_STACK) TRAPHANDLER(vector13,T_GPFLT) TRAPHANDLER(vector14,T_PGFLT) TRAPHANDLER_NOEC(vector16,T_FPERR) TRAPHANDLER(vector17,T_ALIGN) TRAPHANDLER_NOEC(vector18,T_MCHK) TRAPHANDLER_NOEC(vector19,T_SIMDERR) TRAPHANDLER_NOEC(vector32,IRQ_OFFSET+IRQ_TIMER) TRAPHANDLER_NOEC(vector33,IRQ_OFFSET+IRQ_KBD) TRAPHANDLER_NOEC(vector46,IRQ_OFFSET+IRQ_IDE) TRAPHANDLER_NOEC(vector48,T_SYSCALL) TRAPHANDLER_NOEC(vector500,T_DEFAULT) .data .globl idtptr idtptr: .long vector0 .long vector1 .long vector2 .long vector3 .long vector4 .long vector5 .long vector6 .long vector7 .long vector8 .long vector500 .long vector10 .long vector11 .long vector12 .long vector13 .long vector14 .long vector500 .long vector16 .long vector17 .long vector18 .long vector19 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector32 .long vector33 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector500 .long vector48 /* * Lab 3: Your code here for _alltraps */ .text _alltraps: pushl %ds pushl %es pushal movl $GD_KD, %eax movw %ax, %ds movw %ax, %es push %esp cli call trap sti addl $4, %esp popal pop %es pop %ds iret