X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/14b86eca7f36eedde35cb47b41afc36f9097ea7c..8357bda627bdf02c1b69eecf27993182239fb463:/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..4647e95 100644 --- a/lunaix-os/kernel/asm/x86/interrupt.S +++ b/lunaix-os/kernel/asm/x86/interrupt.S @@ -1,5 +1,6 @@ #define __ASM__ #include +#include // #define __ASM_INTR_DIAGNOSIS .macro isr_template vector, no_error_code=1 @@ -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 @@ -64,7 +107,13 @@ 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