|
@@ -1,5 +1,6 @@
|
|
|
#include "trap.h"
|
|
|
#include "gate.h"
|
|
|
+#include "../process/ptrace.h"
|
|
|
|
|
|
void init_sys_vector()
|
|
|
{
|
|
@@ -10,7 +11,7 @@ void init_sys_vector()
|
|
|
set_system_trap_gate(4, 1, overflow);
|
|
|
set_system_trap_gate(5, 1, bounds);
|
|
|
set_trap_gate(6, 1, undefined_opcode);
|
|
|
- set_trap_gate(7, 1, dev_not_available);
|
|
|
+ set_trap_gate(7, 1, dev_not_avaliable);
|
|
|
set_trap_gate(8, 1, double_fault);
|
|
|
set_trap_gate(9, 1, coprocessor_segment_overrun);
|
|
|
set_trap_gate(10, 1, invalid_TSS);
|
|
@@ -30,132 +31,132 @@ void init_sys_vector()
|
|
|
}
|
|
|
|
|
|
// 0 #DE 除法错误
|
|
|
-void do_divide_error(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_divide_error(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_divide_error(0),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_divide_error(0),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 1 #DB 调试异常
|
|
|
-void do_debug(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_debug(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR / TRAP");
|
|
|
- printk(" ] do_debug(1),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_debug(1),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 2 不可屏蔽中断
|
|
|
-void do_nmi(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_nmi(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(BLUE, BLACK, "INT");
|
|
|
- printk(" ] do_nmi(2),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_nmi(2),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 3 #BP 断点异常
|
|
|
-void do_int3(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_int3(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(YELLOW, BLACK, "TRAP");
|
|
|
- printk(" ] do_int3(3),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_int3(3),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 4 #OF 溢出异常
|
|
|
-void do_overflow(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_overflow(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(YELLOW, BLACK, "TRAP");
|
|
|
- printk(" ] do_overflow(4),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_overflow(4),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 5 #BR 越界异常
|
|
|
-void do_bounds(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_bounds(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_bounds(5),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_bounds(5),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 6 #UD 无效/未定义的机器码
|
|
|
-void do_undefined_opcode(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_undefined_opcode(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_undefined_opcode(6),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_undefined_opcode(6),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 7 #NM 设备异常(FPU不存在)
|
|
|
-void do_dev_not_avaliable(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_dev_not_avaliable(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_dev_not_avaliable(7),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_dev_not_avaliable(7),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 8 #DF 双重错误
|
|
|
-void do_double_fault(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_double_fault(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "Terminate");
|
|
|
- printk(" ] do_double_fault(8),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_double_fault(8),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 9 协处理器越界(保留)
|
|
|
-void do_coprocessor_segment_overrun(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_coprocessor_segment_overrun(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_coprocessor_segment_overrun(9),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_coprocessor_segment_overrun(9),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 10 #TS 无效的TSS段
|
|
|
-void do_invalid_TSS(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_invalid_TSS(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk("] do_invalid_TSS(10),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk("] do_invalid_TSS(10),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
printk_color(YELLOW, BLACK, "Information:\n");
|
|
|
// 解析错误码
|
|
@@ -181,43 +182,43 @@ void do_invalid_TSS(unsigned long rsp, unsigned long error_code)
|
|
|
}
|
|
|
|
|
|
// 11 #NP 段不存在
|
|
|
-void do_segment_not_exists(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_segment_not_exists(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_segment_not_exists(11),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_segment_not_exists(11),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 12 #SS SS段错误
|
|
|
-void do_stack_segment_fault(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_stack_segment_fault(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_stack_segment_fault(12),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_stack_segment_fault(12),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 13 #GP 通用保护性异常
|
|
|
-void do_general_protection(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_general_protection(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_general_protection(13),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_general_protection(13),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
return;
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 14 #PF 页故障
|
|
|
-void do_page_fault(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_page_fault(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
unsigned long cr2 = 0;
|
|
|
// 先保存cr2寄存器的值,避免由于再次触发页故障而丢失值
|
|
@@ -225,10 +226,10 @@ void do_page_fault(unsigned long rsp, unsigned long error_code)
|
|
|
__asm__ __volatile__("movq %%cr2, %0"
|
|
|
: "=r"(cr2)::"memory");
|
|
|
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_page_fault(14),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\tCR2:%#18lx\n", error_code, rsp, *rip, cr2);
|
|
|
+ printk(" ] do_page_fault(14),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\tCR2:%#18lx\n", error_code, regs->rsp, regs->rip, cr2);
|
|
|
|
|
|
printk_color(YELLOW, BLACK, "Information:\n");
|
|
|
if (!(error_code & 0x01))
|
|
@@ -257,60 +258,60 @@ void do_page_fault(unsigned long rsp, unsigned long error_code)
|
|
|
// 15 Intel保留,请勿使用
|
|
|
|
|
|
// 16 #MF x87FPU错误
|
|
|
-void do_x87_FPU_error(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_x87_FPU_error(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_x87_FPU_error(16),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_x87_FPU_error(16),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 17 #AC 对齐检测
|
|
|
-void do_alignment_check(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_alignment_check(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_alignment_check(17),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_alignment_check(17),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 18 #MC 机器检测
|
|
|
-void do_machine_check(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_machine_check(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_machine_check(18),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_machine_check(18),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 19 #XM SIMD浮点异常
|
|
|
-void do_SIMD_exception(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_SIMD_exception(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_SIMD_exception(19),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_SIMD_exception(19),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
// 20 #VE 虚拟化异常
|
|
|
-void do_virtualization_exception(unsigned long rsp, unsigned long error_code)
|
|
|
+void do_virtualization_exception(struct pt_regs * regs, unsigned long error_code)
|
|
|
{
|
|
|
- unsigned long *rip = (unsigned long *)(rsp + 0x98);
|
|
|
+
|
|
|
printk("[ ");
|
|
|
printk_color(RED, BLACK, "ERROR");
|
|
|
- printk(" ] do_virtualization_exception(20),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, rsp, *rip);
|
|
|
+ printk(" ] do_virtualization_exception(20),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\n", error_code, regs->rsp, regs->rip);
|
|
|
|
|
|
while (1)
|
|
|
;
|