From 05cad9b6dd31b532b0a498c37aecac228f2181a3 Mon Sep 17 00:00:00 2001 From: hinus Date: Fri, 13 Aug 2021 11:21:26 +0800 Subject: [PATCH] Title: Set all interruption services. Issue: https://gitee.com/hinus/linux_kernel_011/issues/I45AAD Description: For every trap, I mean, EVERY. --- kernel/asm.S | 53 +++++++++++++++++++++- kernel/sys_call.S | 28 +++++++++++- kernel/traps.c | 113 +++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 184 insertions(+), 10 deletions(-) diff --git a/kernel/asm.S b/kernel/asm.S index c6e39b1..69d829e 100644 --- a/kernel/asm.S +++ b/kernel/asm.S @@ -1,7 +1,9 @@ .code32 -.globl divide_error, +.globl divide_error, debug, nmi, int3, overflow, bounds, invalid_op +.globl double_fault, coprocessor_segment_overrun .globl invalid_TSS, segment_not_present, stack_segment -.globl general_protection +.globl general_protection, coprocessor_error, irq13, reserved +.globl alignment_check divide_error: pushl $do_divide_error @@ -37,6 +39,49 @@ no_error_code: popl %eax iret +debug: + pushl $do_int3 + 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 + +coprocessor_segment_overrun: + pushl $do_coprocessor_segment_overrun + jmp no_error_code + +reserved: + pushl $do_reserved + jmp no_error_code + +irq13: + pushl %eax + xorb %al, %al + outb %al, $0xF0 + movb $0x20, %al + outb %al,$0x20 + jmp 1f +1: jmp 1f +1: outb %al,$0xA0 + popl %eax + jmp coprocessor_error double_fault: pushl $do_double_fault @@ -88,3 +133,7 @@ general_protection: pushl $do_general_protection jmp error_code +alignment_check: + pushl $do_alignment_check + jmp error_code + diff --git a/kernel/sys_call.S b/kernel/sys_call.S index 8285c48..541cbc7 100644 --- a/kernel/sys_call.S +++ b/kernel/sys_call.S @@ -2,6 +2,7 @@ .text .globl system_call, timer_interrupt, sys_fork .globl hd_interrupt, floppy_interrupt, sys_execve +.globl coprocessor_error, device_not_available, parallel_interrupt EAX = 0x00 EBX = 0x04 @@ -57,7 +58,7 @@ system_call: pushl %eax pushl $show_ind - call printk + //call printk popl %eax popl %eax @@ -104,6 +105,24 @@ ret_from_sys_call: popl %ds iret +.align 4 +coprocessor_error: +device_not_available: + pushl %ds + pushl %es + pushl %fs + pushl $-1 + pushl %edx + pushl %ecx + pushl %ebx + pushl %eax + movl $0x10, %eax + movw %ax, %ds + movw %ax, %es + movl $0x17, %eax + movw %ax, %fs + jmp ret_from_sys_call + .align 4 timer_interrupt: pushl %ds @@ -212,3 +231,10 @@ floppy_interrupt: popl %eax iret +.align 4 +parallel_interrupt: + pushl %eax + movb $0x20,%al + outb %al,$0x20 + popl %eax + iret diff --git a/kernel/traps.c b/kernel/traps.c index f10cce2..62cc6b8 100644 --- a/kernel/traps.c +++ b/kernel/traps.c @@ -1,6 +1,11 @@ -#include +#include +#include + #include #include +#include +#include +#include #define get_seg_byte(seg,addr) ({ \ register char __res; \ @@ -20,12 +25,29 @@ register unsigned short __res; \ __asm__("mov %%fs,%%ax":"=a" (__res):); \ __res;}) +void page_exception(void); + void divide_error(); +void debug(); +void nmi(); +void int3(); +void overflow(); +void bounds(); +void invalid_op(); +void device_not_available(); +void double_fault(); +void coprocessor_segment_overrun(); void invalid_TSS(); void segment_not_present(); void stack_segment(); void general_protection(); void page_fault(); +void coprocessor_error(); +void reserved(); +void parallel_interrupt(); +void irq13(); +void alignment_check(); + static void die(char* str, long esp_ptr, long nr) { int i = 0; @@ -48,16 +70,67 @@ static void die(char* str, long esp_ptr, long nr) { printk("%02x ",0xff & get_seg_byte(esp[1],(i+(char *)esp[0]))); printk("\n\r"); - while (1) { - } + do_exit(11); +} + +void do_double_fault(long esp, long error_code) { + die("double fault", esp, error_code); +} + +void do_general_protection(long esp, long error_code) { + die("general protection", esp, error_code); +} + +void do_alignment_check(long esp, long error_code) { + die("alignment check", esp, error_code); } void do_divide_error(long esp, long error_code) { die("divide error", esp, error_code); } -void do_double_fault(long esp, long error_code) { - die("double fault", esp, error_code); +void do_int3(long * esp, long error_code, + long fs,long es,long ds, + long ebp,long esi,long edi, + long edx,long ecx,long ebx,long eax) { + int tr; + + __asm__("str %%ax":"=a" (tr):"" (0)); + printk("eax\t\tebx\t\tecx\t\tedx\n\r%8x\t%8x\t%8x\t%8x\n\r", + eax,ebx,ecx,edx); + printk("esi\t\tedi\t\tebp\t\tesp\n\r%8x\t%8x\t%8x\t%8x\n\r", + esi,edi,ebp,(long) esp); + printk("\n\rds\tes\tfs\ttr\n\r%4x\t%4x\t%4x\t%4x\n\r", + ds,es,fs,tr); + printk("EIP: %8x CS: %4x EFLAGS: %8x\n\r",esp[0],esp[1],esp[2]); +} + +void do_nmi(long esp, long error_code) { + die("nmi", esp, error_code); +} + +void do_debug(long esp, long error_code) { + die("debug", esp, error_code); +} + +void do_overflow(long esp, long error_code) { + die("overflow", esp, error_code); +} + +void do_bounds(long esp, long error_code) { + die("bounds", esp, error_code); +} + +void do_invalid_op(long esp, long error_code) { + die("invalid_op", esp, error_code); +} + +void do_device_not_available(long esp, long error_code) { + die("device not available", esp, error_code); +} + +void do_coprocessor_segment_overrun(long esp, long error_code) { + die("coprocessor segment overrun", esp, error_code); } void do_segment_not_present(long esp, long error_code) { @@ -72,16 +145,42 @@ void do_stack_segment(long esp, long error_code) { die("stack segment", esp, error_code); } -void do_general_protection(long esp, long error_code) { - die("general protection", esp, error_code); +void do_coprocessor_error(long esp, long error_code) { + die("coprocessor error",esp,error_code); +} + +void do_reserved(long esp, long error_code) { + die("reserved (15,17-47) error",esp,error_code); } void trap_init() { + int i; + set_trap_gate(0, ÷_error); + set_trap_gate(1,&debug); + set_trap_gate(2,&nmi); + set_system_gate(3,&int3); + set_system_gate(4,&overflow); + set_system_gate(5,&bounds); + set_trap_gate(6,&invalid_op); + set_trap_gate(7,&device_not_available); + set_trap_gate(8,&double_fault); + set_trap_gate(9,&coprocessor_segment_overrun); set_trap_gate(10, &invalid_TSS); set_trap_gate(11, &segment_not_present); set_trap_gate(12, &stack_segment); set_trap_gate(13, &general_protection); set_trap_gate(14, &page_fault); + set_trap_gate(15,&reserved); + set_trap_gate(16,&coprocessor_error); + set_trap_gate(17,&alignment_check); + + for (i=18;i<48;i++) + set_trap_gate(i,&reserved); + + set_trap_gate(45,&irq13); + outb_p(inb_p(0x21)&0xfb,0x21); + outb(inb_p(0xA1)&0xdf,0xA1); + set_trap_gate(39,¶llel_interrupt); } -- Gitee