X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/de334342a8a134a7c5b15e175d1c2ff87e6dbb2a..98fd6cb58b5bbc55cd9ceb45bd27b45a3b222df7:/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 17236f8..e88c32f 100644 --- a/lunaix-os/kernel/asm/x86/interrupt.S +++ b/lunaix-os/kernel/asm/x86/interrupt.S @@ -74,9 +74,14 @@ # 保存用户栈顶指针。这是因为我们允许系统调用内进行上下文切换,而这样一来,我们就失去了用户栈的信息, # 这样一来,就无法设置信号上下文。这主要是为了实现了pause()而做的准备 - movl (__current), %eax + movl (__current), %eax + + # 保存x87FPU的状态 + movl 64(%eax), %ebx + fxsave (%ebx) + movl 68(%esp), %ebx # 取出esp - movl %ebx, 84(%eax) # 存入__current->ustack_top + movl %ebx, 56(%eax) # 存入__current->ustack_top 1: movl %esp, %eax @@ -94,10 +99,17 @@ #ifdef __ASM_INTR_DIAGNOSIS movl %eax, (debug_resv + 8) - movl 56(%esp), %eax - movl %eax, (debug_resv + 4) + movl 44(%esp), %eax + movl 8(%eax), %eax + movl %eax, (debug_resv + 4) # eip #endif - + movl (__current), %eax + movl 64(%eax), %eax + + test %eax, %eax # do we have stored x87 context? + jz 1f + fxrstor (%eax) +1: popl %eax popl %ebx popl %ecx @@ -140,8 +152,8 @@ popl %ebx # next movl __current, %eax - movl 88(%eax), %ecx # __current->pagetable - movl 88(%ebx), %eax # next->pagetable + movl 60(%eax), %ecx # __current->pagetable + movl 60(%ebx), %eax # next->pagetable cmpl %ecx, %eax # if(next->pagtable != __current->pagetable) { jz 1f @@ -168,9 +180,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