You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

631 lines
11 KiB

.file "traps.c"
.text
LC0:
.ascii "%s: %04x\12\15\0"
.align 32
LC1:
.ascii "EIP:\11%04x:%p\12EFLAGS:\11%p\12ESP:\11%04x:%p\12\0"
LC2:
.ascii "fs: %04x\12\0"
LC3:
.ascii "base: %p, limit: %p\12\0"
LC7:
.ascii "Pid: %d, process nr: %d\12\15\0"
LC8:
.ascii "%02x \0"
LC9:
.ascii "\12\15\0"
LC4:
.ascii "Stack: \0"
LC5:
.ascii "%p \0"
LC6:
.ascii "\12\0"
.p2align 2,,3
.def _die; .scl 3; .type 32; .endef
_die:
pushl %edi
pushl %esi
pushl %ebx
movl 20(%esp), %esi
pushl %ebx
movzwl 28(%esp), %eax
pushl %eax
pushl 24(%esp)
pushl $LC0
call _printk
popl %edx
popl %ecx
pushl 12(%esi)
pushl 16(%esi)
pushl 8(%esi)
pushl (%esi)
pushl 4(%esi)
pushl $LC1
call _printk
/APP
mov %fs,%ax
/NO_APP
addl $24, %esp
movzwl %ax, %eax
pushl %eax
pushl $LC2
call _printk
addl $12, %esp
movl $23, %edx
movl _current, %eax
/APP
lsll %edx,%ecx
incl %ecx
/NO_APP
addl $728, %eax
/APP
movb 7(%eax),%dh
movb 4(%eax),%dl
shll $16,%edx
movw 2(%eax),%dx
/NO_APP
pushl %ecx
pushl %edx
pushl $LC3
call _printk
addl $16, %esp
cmpl $23, 16(%esi)
je L18
L3:
xorl %edx, %edx
movl %edx, %eax
/APP
str %ax
subl $32,%eax
shrl $4,%eax
/NO_APP
movl %eax, %ebx
pushl %eax
movzwl %bx,%eax
pushl %eax
movl _current, %eax
pushl 556(%eax)
pushl $LC7
call _printk
xorl %ebx, %ebx
addl $16, %esp
.p2align 2,,3
L13:
movl 4(%esi), %eax
movl (%esi), %edx
/APP
push %fs;mov %ax,%fs;movb %fs:(%ebx,%edx),%al;pop %fs
/NO_APP
subl $8, %esp
movzbl %al, %eax
pushl %eax
pushl $LC8
incl %ebx
call _printk
addl $16, %esp
cmpl $9, %ebx
jle L13
subl $12, %esp
pushl $LC9
call _printk
addl $16, %esp
movl $11, 16(%esp)
popl %ebx
popl %esi
popl %edi
jmp _do_exit
L18:
subl $12, %esp
pushl $LC4
call _printk
xorl %ebx, %ebx
addl $16, %esp
movl $23, %edi
L8:
subl $8, %esp
movl 12(%esi), %edx
movl %edi, %eax
/APP
push %fs;mov %ax,%fs;movl %fs:(%edx,%ebx,4),%eax;pop %fs
/NO_APP
pushl %eax
pushl $LC5
incl %ebx
call _printk
addl $16, %esp
cmpl $3, %ebx
jle L8
subl $12, %esp
pushl $LC6
call _printk
addl $16, %esp
jmp L3
LC10:
.ascii "double fault\0"
.p2align 2,,3
.globl _do_double_fault
.def _do_double_fault; .scl 2; .type 32; .endef
_do_double_fault:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC10
call _die
addl $28, %esp
ret
LC11:
.ascii "general protection\0"
.p2align 2,,3
.globl _do_general_protection
.def _do_general_protection; .scl 2; .type 32; .endef
_do_general_protection:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC11
call _die
addl $28, %esp
ret
LC12:
.ascii "divide error\0"
.p2align 2,,3
.globl _do_divide_error
.def _do_divide_error; .scl 2; .type 32; .endef
_do_divide_error:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC12
call _die
addl $28, %esp
ret
.align 32
LC13:
.ascii "eax\11\11ebx\11\11ecx\11\11edx\12\15%8x\11%8x\11%8x\11%8x\12\15\0"
.align 32
LC14:
.ascii "esi\11\11edi\11\11ebp\11\11esp\12\15%8x\11%8x\11%8x\11%8x\12\15\0"
.align 32
LC15:
.ascii "\12\15ds\11es\11fs\11tr\12\15%4x\11%4x\11%4x\11%4x\12\15\0"
.align 32
LC16:
.ascii "EIP: %8x CS: %4x EFLAGS: %8x\12\15\0"
.p2align 2,,3
.globl _do_int3
.def _do_int3; .scl 2; .type 32; .endef
_do_int3:
pushl %ebp
pushl %edi
pushl %esi
pushl %ebx
subl $40, %esp
movl 68(%esp), %eax
movl %eax, 36(%esp)
movl 72(%esp), %eax
movl %eax, 32(%esp)
movl 76(%esp), %eax
movl %eax, 28(%esp)
movl 84(%esp), %eax
movl 60(%esp), %esi
movl 80(%esp), %ebp
movl 88(%esp), %edi
movl %eax, 24(%esp)
pushl 92(%esp)
pushl 100(%esp)
pushl 108(%esp)
pushl 116(%esp)
xorl %ebx, %ebx
movl %ebx, %eax
pushl $LC13
/APP
str %ax
/NO_APP
movl %eax, %ebx
call _printk
addl $20, %esp
pushl %esi
pushl %ebp
pushl %edi
pushl 36(%esp)
pushl $LC14
call _printk
addl $20, %esp
pushl %ebx
pushl 40(%esp)
pushl 40(%esp)
pushl 40(%esp)
pushl $LC15
call _printk
movl 8(%esi), %eax
movl %eax, 92(%esp)
movl 4(%esi), %eax
movl %eax, 88(%esp)
movl (%esi), %eax
movl %eax, 84(%esp)
movl $LC16, 80(%esp)
addl $60, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
jmp _printk
LC17:
.ascii "nmi\0"
.p2align 2,,3
.globl _do_nmi
.def _do_nmi; .scl 2; .type 32; .endef
_do_nmi:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC17
call _die
addl $28, %esp
ret
LC18:
.ascii "debug\0"
.p2align 2,,3
.globl _do_debug
.def _do_debug; .scl 2; .type 32; .endef
_do_debug:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC18
call _die
addl $28, %esp
ret
LC19:
.ascii "overflow\0"
.p2align 2,,3
.globl _do_overflow
.def _do_overflow; .scl 2; .type 32; .endef
_do_overflow:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC19
call _die
addl $28, %esp
ret
LC20:
.ascii "bounds\0"
.p2align 2,,3
.globl _do_bounds
.def _do_bounds; .scl 2; .type 32; .endef
_do_bounds:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC20
call _die
addl $28, %esp
ret
LC21:
.ascii "invalid operand\0"
.p2align 2,,3
.globl _do_invalid_op
.def _do_invalid_op; .scl 2; .type 32; .endef
_do_invalid_op:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC21
call _die
addl $28, %esp
ret
LC22:
.ascii "device not available\0"
.p2align 2,,3
.globl _do_device_not_available
.def _do_device_not_available; .scl 2; .type 32; .endef
_do_device_not_available:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC22
call _die
addl $28, %esp
ret
LC23:
.ascii "coprocessor segment overrun\0"
.p2align 2,,3
.globl _do_coprocessor_segment_overrun
.def _do_coprocessor_segment_overrun; .scl 2; .type 32; .endef
_do_coprocessor_segment_overrun:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC23
call _die
addl $28, %esp
ret
LC24:
.ascii "invalid TSS\0"
.p2align 2,,3
.globl _do_invalid_TSS
.def _do_invalid_TSS; .scl 2; .type 32; .endef
_do_invalid_TSS:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC24
call _die
addl $28, %esp
ret
LC25:
.ascii "segment not present\0"
.p2align 2,,3
.globl _do_segment_not_present
.def _do_segment_not_present; .scl 2; .type 32; .endef
_do_segment_not_present:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC25
call _die
addl $28, %esp
ret
LC26:
.ascii "stack segment\0"
.p2align 2,,3
.globl _do_stack_segment
.def _do_stack_segment; .scl 2; .type 32; .endef
_do_stack_segment:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC26
call _die
addl $28, %esp
ret
LC27:
.ascii "coprocessor error\0"
.p2align 2,,3
.globl _do_coprocessor_error
.def _do_coprocessor_error; .scl 2; .type 32; .endef
_do_coprocessor_error:
subl $12, %esp
movl _current, %eax
cmpl %eax, _last_task_used_math
je L35
L33:
addl $12, %esp
ret
.p2align 2,,3
L35:
pushl %eax
pushl 24(%esp)
pushl 24(%esp)
pushl $LC27
call _die
addl $16, %esp
jmp L33
LC28:
.ascii "reserved (15,17-47) error\0"
.p2align 2,,3
.globl _do_reserved
.def _do_reserved; .scl 2; .type 32; .endef
_do_reserved:
subl $16, %esp
pushl 24(%esp)
pushl 24(%esp)
pushl $LC28
call _die
addl $28, %esp
ret
.p2align 2,,3
.globl _trap_init
.def _trap_init; .scl 2; .type 32; .endef
_trap_init:
pushl %ebp
pushl %edi
pushl %esi
pushl %ebx
movl $_divide_error, %edx
movl $524288, %eax
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt
movl %edx,_idt+4
/NO_APP
movl $_debug, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+8
movl %edx,_idt+12
/NO_APP
movl $_nmi, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+16
movl %edx,_idt+20
/NO_APP
movl $_int3, %edx
/APP
movw %dx,%ax
movw $-4352,%dx
movl %eax,_idt+24
movl %edx,_idt+28
/NO_APP
movl $_overflow, %edx
/APP
movw %dx,%ax
movw $-4352,%dx
movl %eax,_idt+32
movl %edx,_idt+36
/NO_APP
movl $_bounds, %edx
/APP
movw %dx,%ax
movw $-4352,%dx
movl %eax,_idt+40
movl %edx,_idt+44
/NO_APP
movl $_invalid_op, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+48
movl %edx,_idt+52
/NO_APP
movl $_device_not_available, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+56
movl %edx,_idt+60
/NO_APP
movl $_double_fault, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+64
movl %edx,_idt+68
/NO_APP
movl $_coprocessor_segment_overrun, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+72
movl %edx,_idt+76
/NO_APP
movl $_invalid_TSS, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+80
movl %edx,_idt+84
/NO_APP
movl $_segment_not_present, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+88
movl %edx,_idt+92
/NO_APP
movl $_stack_segment, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+96
movl %edx,_idt+100
/NO_APP
movl $_general_protection, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+104
movl %edx,_idt+108
/NO_APP
movl $_page_fault, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+112
movl %edx,_idt+116
/NO_APP
movl $_reserved, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+120
movl %edx,_idt+124
/NO_APP
movl $_coprocessor_error, %edx
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+128
movl %edx,_idt+132
/NO_APP
movl $17, %edi
movl $_idt, %esi
movl $_idt+4, %ebx
movl $_reserved, %ecx
movl $524288, %ebp
.p2align 2,,3
L42:
movl %ecx, %edx
movl %ebp, %eax
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,(%esi,%edi,8)
movl %edx,(%ebx,%edi,8)
/NO_APP
incl %edi
cmpl $47, %edi
jle L42
movl $_irq13, %edx
movl $524288, %eax
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+360
movl %edx,_idt+364
/NO_APP
movl $33, %edx
/APP
inb %dx,%al
jmp 1f
1: jmp 1f
1:
/NO_APP
andl $251, %eax
/APP
outb %al,%dx
jmp 1f
1: jmp 1f
1:
/NO_APP
movl $161, %edx
/APP
inb %dx,%al
jmp 1f
1: jmp 1f
1:
/NO_APP
andl $223, %eax
/APP
outb %al,%dx
/NO_APP
movl $_parallel_interrupt, %edx
movl $524288, %eax
/APP
movw %dx,%ax
movw $-28928,%dx
movl %eax,_idt+312
movl %edx,_idt+316
/NO_APP
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.def _parallel_interrupt; .scl 2; .type 32; .endef
.def _irq13; .scl 2; .type 32; .endef
.def _coprocessor_error; .scl 2; .type 32; .endef
.def _reserved; .scl 2; .type 32; .endef
.def _page_fault; .scl 2; .type 32; .endef
.def _general_protection; .scl 2; .type 32; .endef
.def _stack_segment; .scl 2; .type 32; .endef
.def _segment_not_present; .scl 2; .type 32; .endef
.def _invalid_TSS; .scl 2; .type 32; .endef
.def _coprocessor_segment_overrun; .scl 2; .type 32; .endef
.def _double_fault; .scl 2; .type 32; .endef
.def _device_not_available; .scl 2; .type 32; .endef
.def _invalid_op; .scl 2; .type 32; .endef
.def _bounds; .scl 2; .type 32; .endef
.def _overflow; .scl 2; .type 32; .endef
.def _int3; .scl 2; .type 32; .endef
.def _nmi; .scl 2; .type 32; .endef
.def _debug; .scl 2; .type 32; .endef
.def _divide_error; .scl 2; .type 32; .endef
.def _do_exit; .scl 2; .type 32; .endef
.def _printk; .scl 2; .type 32; .endef