|
|
linux 0.01-rm2.2
/* * asm.s contains the low-level code for most hardware faults. * page_exception is handled by the mm, so that isn't here. This * file also handles (hopefully) fpu-exceptions due to TS-bit, as * the fpu must be properly saved/resored. This hasn't been tested. */ .globl divide_error,debug,nmi,int3,overflow,bounds,invalid_op .globl device_not_available,double_fault,coprocessor_segment_overrun .globl invalid_TSS,segment_not_present,stack_segment .globl general_protection,coprocessor_error,reserved divide_error: pushl $do_divide_error no_error_code: xchgl %eax,(%esp) pushl %ebx pushl %ecx pushl %edx pushl %edi pushl %esi pushl %ebp push %ds push %es push %fs pushl $0 # "error code" lea 44(%esp),%edx pushl %edx movl $0x10,%edx mov %dx,%ds mov %dx,%es mov %dx,%fs call *%eax addl $8,%esp pop %fs pop %es pop %ds popl %ebp popl %esi popl %edi popl %edx popl %ecx popl %ebx popl %eax iret debug: pushl $do_int3 # _do_debug jmp no_error_code nmi: pushl $do_nmi jmp no_error_code int3: pushl $do_int3 jmp no_error_code overflow: pushl $do_overflow jmp no_error_code bounds: pushl $do_bounds jmp no_error_code invalid_op: pushl $do_invalid_op jmp no_error_code math_emulate: popl %eax pushl $do_device_not_available jmp no_error_code device_not_available: pushl %eax movl %cr0,%eax bt $2,%eax # EM (math emulation bit) jc math_emulate clts # clear TS so that we can use math movl current,%eax cmpl last_task_used_math,%eax je 1f # shouldn't happen really ... pushl %ecx pushl %edx push %ds movl $0x10,%eax mov %ax,%ds call math_state_restore pop %ds popl %edx popl %ecx 1: popl %eax iret coprocessor_segment_overrun: pushl $do_coprocessor_segment_overrun jmp no_error_code reserved: pushl $do_reserved jmp no_error_code coprocessor_error: pushl $do_coprocessor_error jmp no_error_code double_fault: pushl $do_double_fault error_code: xchgl %eax,4(%esp) # error code <-> %eax xchgl %ebx,(%esp) # &function <-> %ebx pushl %ecx pushl %edx pushl %edi pushl %esi pushl %ebp push %ds push %es push %fs pushl %eax # error code lea 44(%esp),%eax # offset pushl %eax movl $0x10,%eax mov %ax,%ds mov %ax,%es mov %ax,%fs call *%ebx addl $8,%esp pop %fs pop %es pop %ds popl %ebp popl %esi popl %edi popl %edx popl %ecx popl %ebx popl %eax iret invalid_TSS: pushl $do_invalid_TSS jmp error_code segment_not_present: pushl $do_segment_not_present jmp error_code stack_segment: pushl $do_stack_segment jmp error_code general_protection: pushl $do_general_protection jmp error_code
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.