X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/48b4a227035048fdebcd32532deb7a857c6199ac..efbabf3bcf37c1da148c1e7579974999021f2b86:/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 471a8e6..a03bce6 100644 --- a/lunaix-os/kernel/asm/x86/interrupt.S +++ b/lunaix-os/kernel/asm/x86/interrupt.S @@ -1,6 +1,7 @@ #define __ASM__ #include -// #define __ASM_INTR_DIAGNOSIS +#include +#define __ASM_INTR_DIAGNOSIS .macro isr_template vector, no_error_code=1 .global _asm_isr\vector @@ -36,8 +37,39 @@ isr_template PC_KBD_IV interrupt_wrapper: + /* + Stack layout + msa: [ss] + [esp] + eflags + cs + eip + err_code + vector > offset = 28 + 16 + 4 = 48 + esp + gs + fs + es + ds > offset = 7 * 4 = 28 + esi + ebp + edi + edx + ecx + ebx + lsa: eax > offset = 0 + + las: Least Significant Address + msa: Most Significant Address + */ pushl %esp + subl $16, %esp + movw %gs, 12(%esp) + movw %fs, 8(%esp) + movw %es, 4(%esp) + movw %ds, (%esp) + pushl %esi pushl %ebp pushl %edi @@ -46,6 +78,17 @@ pushl %ebx pushl %eax + movl 60(%esp), %eax /* 取出 %cs */ + andl $0x3, %eax /* 判断 RPL */ + jz 1f + + movw $KDATA_SEG, %ax /* 如果从用户模式转来,则切换至内核数据段 */ + movw %ax, %gs + movw %ax, %fs + movw %ax, %ds + movw %ax, %es + + 1: movl %esp, %eax andl $0xfffffff0, %esp subl $16, %esp @@ -53,9 +96,11 @@ call intr_handler + movl (%esp), %eax + .global soft_iret soft_iret: - popl %esp + movl %eax, %esp popl %eax popl %ebx @@ -64,19 +109,20 @@ popl %edi popl %ebp popl %esi - popl %esp + + movw (%esp), %ds + movw 4(%esp), %es + movw 8(%esp), %fs + movw 12(%esp), %gs + + movl 16(%esp), %esp addl $8, %esp #ifdef __ASM_INTR_DIAGNOSIS - cmpl $0, (%esp) - jz 1f - iret -1: - movl $__current, %eax - movl (%esp), %ebx - movl $debug_resv, %ecx - ud2 -#else - iret + pushl %eax + movl 4(%esp), %eax + movl %eax, debug_resv + popl %eax #endif + iret