X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;ds=sidebyside;f=ntoskrnl%2Fke%2Fi386%2Fexp.c;fp=ntoskrnl%2Fke%2Fi386%2Fexp.c;h=40ba941ed6c3e44bd50028afa2c333f7eafe063a;hb=e3ed2d773259cc445c7ff8181ebd934931365328;hp=c8da711a0e45c9ab184144f11282edd57fdb761d;hpb=d378c68f5a9bb25c9e671dacd482d2e25d211df3;p=reactos.git diff --git a/ntoskrnl/ke/i386/exp.c b/ntoskrnl/ke/i386/exp.c index c8da711..40ba941 100644 --- a/ntoskrnl/ke/i386/exp.c +++ b/ntoskrnl/ke/i386/exp.c @@ -46,6 +46,8 @@ /* GLOBALS *****************************************************************/ +#define FLAG_IF (1<<9) + #define _STR(x) #x #define STR(x) _STR(x) @@ -522,7 +524,10 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) */ if (ExceptionNr == 14) { - __asm__("sti\n\t"); + if (Tf->Eflags & FLAG_IF) + { + __asm__("sti\n\t"); + } Status = MmPageFault(Tf->Cs&0xffff, &Tf->Eip, &Tf->Eax, @@ -578,6 +583,14 @@ static void set_interrupt_gate(unsigned int sel, unsigned int func) DPRINT("set_interrupt_gate(sel %d, func %x)\n",sel,func); KiIdt[sel].a = (((int)func)&0xffff) + (KERNEL_CS << 16); + KiIdt[sel].b = 0x8e00 + (((int)func)&0xffff0000); +} + +static void set_trap_gate(unsigned int sel, unsigned int func) +{ + DPRINT("set_trap_gate(sel %d, func %x)\n",sel,func); + KiIdt[sel].a = (((int)func)&0xffff) + + (KERNEL_CS << 16); KiIdt[sel].b = 0x8f00 + (((int)func)&0xffff0000); } @@ -601,27 +614,28 @@ KeInitExceptions(VOID) /* * Set up the other gates */ - set_interrupt_gate(0, (ULONG)KiTrap0); - set_interrupt_gate(1, (ULONG)KiTrap1); - set_interrupt_gate(2, (ULONG)KiTrap2); - set_interrupt_gate(3, (ULONG)KiTrap3); - set_interrupt_gate(4, (ULONG)KiTrap4); - set_interrupt_gate(5, (ULONG)KiTrap5); - set_interrupt_gate(6, (ULONG)KiTrap6); - set_interrupt_gate(7, (ULONG)KiTrap7); + set_trap_gate(0, (ULONG)KiTrap0); + set_trap_gate(1, (ULONG)KiTrap1); + set_trap_gate(2, (ULONG)KiTrap2); + set_trap_gate(3, (ULONG)KiTrap3); + set_trap_gate(4, (ULONG)KiTrap4); + set_trap_gate(5, (ULONG)KiTrap5); + set_trap_gate(6, (ULONG)KiTrap6); + set_trap_gate(7, (ULONG)KiTrap7); set_task_gate(8, TRAP_TSS_SELECTOR); - set_interrupt_gate(9, (ULONG)KiTrap9); - set_interrupt_gate(10, (ULONG)KiTrap10); - set_interrupt_gate(11, (ULONG)KiTrap11); - set_interrupt_gate(12, (ULONG)KiTrap12); - set_interrupt_gate(13, (ULONG)KiTrap13); + set_trap_gate(9, (ULONG)KiTrap9); + set_trap_gate(10, (ULONG)KiTrap10); + set_trap_gate(11, (ULONG)KiTrap11); + set_trap_gate(12, (ULONG)KiTrap12); + set_trap_gate(13, (ULONG)KiTrap13); + set_trap_gate(14, (ULONG)KiTrap14); set_interrupt_gate(14, (ULONG)KiTrap14); - set_interrupt_gate(15, (ULONG)KiTrap15); - set_interrupt_gate(16, (ULONG)KiTrap16); + set_trap_gate(15, (ULONG)KiTrap15); + set_trap_gate(16, (ULONG)KiTrap16); for (i=17;i<256;i++) { - set_interrupt_gate(i,(int)KiTrapUnknown); + set_trap_gate(i,(int)KiTrapUnknown); } set_system_call_gate(0x2d,(int)interrupt_handler2d);