X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/cb529e7c1abcfe6b61241e47a780172031b82840..642855f81fd03b9fd6540ac99c665b57b4b38cc8:/lunaix-os/kernel/asm/x86/interrupt.S diff --git a/lunaix-os/kernel/asm/x86/interrupt.S b/lunaix-os/kernel/asm/x86/interrupt.S index 7c40673..2961f3b 100644 --- a/lunaix-os/kernel/asm/x86/interrupt.S +++ b/lunaix-os/kernel/asm/x86/interrupt.S @@ -4,17 +4,6 @@ #include #define __ASM_INTR_DIAGNOSIS -.macro isr_template vector, no_error_code=1 - .global _asm_isr\vector - .type _asm_isr\vector, @function - _asm_isr\vector: - .if \no_error_code - pushl $0x0 - .endif - pushl $\vector - jmp interrupt_wrapper -.endm - #ifdef __ASM_INTR_DIAGNOSIS .section .bss .global debug_resv @@ -29,21 +18,7 @@ tmp_stack: .section .text - isr_template FAULT_DIVISION_ERROR - isr_template FAULT_GENERAL_PROTECTION, no_error_code=0 - isr_template FAULT_PAGE_FAULT, no_error_code=0 - isr_template FAULT_STACK_SEG_FAULT, no_error_code=0 - - isr_template LUNAIX_SYS_PANIC - isr_template LUNAIX_SYS_CALL - - isr_template APIC_ERROR_IV - isr_template APIC_LINT0_IV - isr_template APIC_TIMER_IV - isr_template APIC_SPIV_IV - isr_template RTC_TIMER_IV - isr_template PC_KBD_IV - + .global interrupt_wrapper interrupt_wrapper: /* Stack layout (layout of struct isr_param) @@ -99,7 +74,12 @@ # 保存用户栈顶指针。这是因为我们允许系统调用内进行上下文切换,而这样一来,我们就失去了用户栈的信息, # 这样一来,就无法设置信号上下文。这主要是为了实现了pause()而做的准备 - movl (__current), %eax + movl (__current), %eax + + # 保存x87FPU的状态 + movl 92(%eax), %ebx + fxsave (%ebx) + movl 68(%esp), %ebx # 取出esp movl %ebx, 84(%eax) # 存入__current->ustack_top @@ -117,6 +97,18 @@ soft_iret: movl %eax, %esp +#ifdef __ASM_INTR_DIAGNOSIS + movl %eax, (debug_resv + 8) + movl 56(%esp), %eax + movl %eax, (debug_resv + 4) +#endif + movl (__current), %eax + movl 92(%eax), %eax + + test %eax, %eax # do we have stored x87 context? + jz 1f + fxrstor (%eax) +1: popl %eax popl %ebx popl %ecx @@ -187,9 +179,9 @@ # 注意2:handle_signal在调用之前,须确保proc_sig已经写入用户栈! leal 8(%eax), %ebx # arg1 in %eax: addr of proc_sig structure in user stack - pushl $UDATA_SEG # proc_sig->prev_context.ss + pushl $UDATA_SEG # proc_sig->prev_context.proc_regs.ss pushl %eax # esp - pushl 64(%ebx) # proc_sig->prev_context.eflags + pushl 64(%ebx) # proc_sig->prev_context.proc_regs.eflags pushl $UCODE_SEG # cs pushl $sig_wrapper # eip for sig wrapper