🆕 实现了异常捕获模块

This commit is contained in:
fslongjin
2022-01-25 18:04:18 +08:00
parent 14374d5faf
commit 06cfb1ceb9
10 changed files with 744 additions and 29 deletions

View File

@ -1,3 +1,4 @@
#include"../common/asm.h"
R15 = 0x00
R14 = 0x08
@ -24,3 +25,239 @@ RFLAGS = 0xa8
OLD_RSP = 0xb0
OLDSS = 0xb8
Restore_all:
// === ===
popq %r15
popq %r14
popq %r13
popq %r12
popq %r11
popq %r10
popq %r9
popq %r8
popq %rbx
popq %rcx
popq %rdx
popq %rsi
popq %rdi
popq %rbp
popq %rax // popds
movq %rax, %ds
popq %rax
movq %rax, %es
popq %rax
addq $0x10, %rsp // FUNCerrcode
iretq
ret_from_exception:
// === ===
ENTRY(ret_from_intr)
jmp Restore_all
Err_Code:
// =====
pushq %rax
movq %es, %rax
pushq %rax
movq %ds, %rax
pushq %rax
xorq %rax, %rax
pushq %rbp
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
pushq %rbx
pushq %r8
pushq %r9
pushq %r10
pushq %r11
pushq %r12
pushq %r13
pushq %r14
pushq %r15
cld
movq ERRCODE(%rsp), %rsi // rsi
movq FUNC(%rsp), %rdx
movq $0x10, %rdi //
movq %rdi, %ds
movq %rdi, %es
movq %rsp, %rdi // rdi
callq *%rdx // *
jmp ret_from_exception
// 0 #DE
ENTRY(divide_error)
pushq $0 //#DE0
pushq %rax // rax
leaq do_divide_error(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 1 #DB
ENTRY(debug)
pushq $0
pushq %rax
leaq do_debug(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 2
ENTRY(nmi)
//
//
pushq $0 //err_code
pushq %rax
leaq do_nmi(%rip), %rax
xchgq %rax, (%rsp)
jmp Err_Code
// 3 #BP
ENTRY(int3)
pushq $0
pushq %rax
leaq do_int3(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 4 #OF
ENTRY(overflow)
pushq $0
pushq %rax
leaq do_overflow(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 5 #BR
ENTRY(bounds)
pushq $0
pushq %rax
leaq do_bounds(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 6 #UD /
ENTRY(undefined_opcode)
pushq $0
pushq %rax
leaq do_undefined_opcode(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 7 #NM FPU
ENTRY(dev_not_available)
pushq $0
pushq %rax
leaq do_dev_not_avaliable(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 8 #DF
ENTRY(double_fault)
pushq %rax
leaq do_double_fault(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 9
ENTRY(coprocessor_segment_overrun)
pushq $0
pushq %rax
leaq do_coprocessor_segment_overrun(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 10 #TS TSS
ENTRY(invalid_TSS)
// === #TS ==
// ,
pushq %rax
leaq do_invalid_TSS(%rip), %rax
xchgq %rax, (%rsp)
jmp Err_Code
// 11 #NP
ENTRY(segment_not_exists)
pushq %rax
leaq do_segment_not_exists(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 12 #SS
ENTRY(stack_segment_fault)
pushq %rax
leaq do_stack_segment_fault(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 13 #GP
ENTRY(general_protection)
pushq %rax
leaq do_general_protection(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 14 #PF
ENTRY(page_fault)
// === #PF ==
//
pushq %rax
leaq do_page_fault(%rip), %rax
xchgq %rax, (%rsp)
jmp Err_Code
// 15 Intel使
// 16 #MF X87 FPU
ENTRY(x87_FPU_error)
pushq $0
pushq %rax
leaq do_x87_FPU_error(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 17 #AC
ENTRY(alignment_check)
pushq %rax
leaq do_alignment_check(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 18 #MC
ENTRY(machine_check)
pushq $0
pushq %rax
leaq do_machine_check(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 19 #XM SIMD
ENTRY(SIMD_exception)
pushq $0
pushq %rax
leaq do_SIMD_exception(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code
// 20 #VE
ENTRY(virtualization_exception)
pushq $0
pushq %rax
leaq do_virtualization_exception(%rip), %rax //
xchgq %rax, (%rsp) // FUNC
jmp Err_Code