sir_richard, Trunk is still broken and is causing issues for some of the dev team.
You can see the problems in our buildbot test machine: - Go to the following address : http://build.reactos.org:8010 - under the x86_(Test) machine, click on the stdio for the 'test' stage. - You'll see stage 1 complete, the stage 2 bugchecks. Could you please address this problem before continuing your work as it's ruining the test system. The problem is that because our test machine can't run we aren't able to monitor other commits in other areas, meaning we're potentially introducing other bugs that we're now missing. According to our policy, failure to fix this soon (it's normally 24 hours) will result in us having to freeze development on trunk until the bug is fixed. If we're unable to fix it in a reasonable amount of time then the changes need to be reverted until we have a bootable OS again. Regards, Ged Murphy. -----Original Message----- From: ros-diffs-boun...@reactos.org [mailto:ros-diffs-boun...@reactos.org] On Behalf Of sir_rich...@svn.reactos.org Sent: 13 January 2010 03:43 To: ros-di...@reactos.org Subject: [ros-diffs] [sir_richard] 45057: [NTOS]: Fix some bugs and cleanup V8086 code in regards to flags usage. [NTOS]: Add VDM debug spew to see why there's now an invalid opcode on Windows builds of VMWare and certain QEmu combinations. (Note: the double fault Author: sir_richard Date: Wed Jan 13 04:43:03 2010 New Revision: 45057 URL: http://svn.reactos.org/svn/reactos?rev=45057&view=rev Log: [NTOS]: Fix some bugs and cleanup V8086 code in regards to flags usage. [NTOS]: Add VDM debug spew to see why there's now an invalid opcode on Windows builds of VMWare and certain QEmu combinations. (Note: the double fault issue is fixed, this is a new issue). Modified: trunk/reactos/ntoskrnl/ke/i386/v86vdm.c Modified: trunk/reactos/ntoskrnl/ke/i386/v86vdm.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/v86vdm.c?rev=45057&r1=45056&r2=45057&view=diff ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/v86vdm.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ke/i386/v86vdm.c [iso-8859-1] Wed Jan 13 04:43:03 2010 @@ -12,6 +12,9 @@ #include <ntoskrnl.h> #define NDEBUG #include <debug.h> + +#define KiVdmGetInstructionSize(x) ((x) & 0xFF) +#define KiVdmGetPrefixFlags(x) ((x) & 0xFFFFFF00) /* GLOBALS ********************************************************************/ @@ -51,6 +54,7 @@ ULONG Esp, V86EFlags, TrapEFlags; /* Get current V8086 flags and mask out interrupt flag */ + DbgPrint("VDM: Handling PUSHF (PREFIX [0x%lx])\n", KiVdmGetPrefixFlags(Flags)); V86EFlags = *KiNtVdmState; V86EFlags &= ~EFLAGS_INTERRUPT_MASK; @@ -67,7 +71,7 @@ Esp -= 2; /* Check for OPER32 */ - if (Flags & PFX_FLAG_OPER32) + if (KiVdmGetPrefixFlags(Flags) & PFX_FLAG_OPER32) { /* Save EFlags */ Esp -= 2; @@ -81,7 +85,7 @@ /* Set new ESP and EIP */ TrapFrame->HardwareEsp = (USHORT)Esp; - TrapFrame->Eip += (Flags & 0xFF); + TrapFrame->Eip += KiVdmGetInstructionSize(Flags); /* We're done */ return TRUE; @@ -95,6 +99,7 @@ ULONG Esp, V86EFlags, EFlags, TrapEFlags; /* Build flat ESP */ + DbgPrint("VDM: Handling POPF (PREFIX [0x%lx])\n", KiVdmGetPrefixFlags(Flags)); Esp = (TrapFrame->HardwareSegSs << 4) + (USHORT)TrapFrame->HardwareEsp; /* Read EFlags */ @@ -102,7 +107,7 @@ Esp += 4; /* Check for OPER32 */ - if (!(Flags & PFX_FLAG_OPER32)) + if (!(KiVdmGetPrefixFlags(Flags) & PFX_FLAG_OPER32)) { /* Read correct flags and use correct stack address */ Esp -= 2; @@ -140,7 +145,7 @@ /* FIXME: Check for VDM interrupts */ /* Update EIP */ - TrapFrame->Eip += (Flags & 0xFF); + TrapFrame->Eip += KiVdmGetInstructionSize(Flags); /* We're done */ return TRUE; @@ -187,7 +192,7 @@ /* Push IP */ Esp -= 2; - *(PUSHORT)(Esp) = (USHORT)TrapFrame->Eip + (Flags & 0xFF) + 1; + *(PUSHORT)(Esp) = (USHORT)TrapFrame->Eip + KiVdmGetInstructionSize(Flags) + 1; /* Update ESP */ TrapFrame->HardwareEsp = (USHORT)Esp; @@ -196,11 +201,12 @@ Eip = (TrapFrame->SegCs << 4) + TrapFrame->Eip; /* Now get the *next* EIP address (current is original + the count - 1) */ - Eip += (Flags & 0xFF); + Eip += KiVdmGetInstructionSize(Flags); /* Now read the interrupt number */ Interrupt = *(PUCHAR)Eip; - + DbgPrint("VDM: Handling INT [0x%lx]\n", Interrupt); + /* Read the EIP from its IVT entry */ Interrupt = *(PULONG)(Interrupt * 4); TrapFrame->Eip = (USHORT)Interrupt; @@ -240,12 +246,13 @@ IN ULONG Flags) { ULONG Esp, V86EFlags, EFlags, TrapEFlags, Eip; - + /* Build flat ESP */ + DbgPrint("VDM: Handling IRET (PREFIX [0x%lx])\n", KiVdmGetPrefixFlags(Flags)); Esp = (TrapFrame->HardwareSegSs << 4) + TrapFrame->HardwareEsp; /* Check for OPER32 */ - if (Flags & PFX_FLAG_OPER32) + if (KiVdmGetPrefixFlags(Flags) & PFX_FLAG_OPER32) { /* Build segmented EIP */ TrapFrame->Eip = *(PULONG)Esp; @@ -292,6 +299,7 @@ /* Build flat EIP and check if this is the BOP instruction */ Eip = (TrapFrame->SegCs << 4) + TrapFrame->Eip; + DbgPrint("VDM: Handling IRET EIP @ 0x%p [OPCODE: %lx]\n", Eip, *(PUSHORT)Eip); if (*(PUSHORT)Eip == 0xC4C4) { /* Dispatch the BOP */ @@ -313,11 +321,12 @@ { /* FIXME: Support VME */ - /* disable interrupts */ + /* Disable interrupts */ + DbgPrint("VDM: Handling CLI\n"); KiVdmClearVdmEFlags(EFLAGS_INTERRUPT_MASK); /* Skip instruction */ - TrapFrame->Eip += (Flags & 0xFF); + TrapFrame->Eip += KiVdmGetInstructionSize(Flags); /* Done */ return TRUE; @@ -331,10 +340,11 @@ /* FIXME: Support VME */ /* Enable interrupts */ + DbgPrint("VDM: Handling STI\n"); KiVdmSetVdmEFlags(EFLAGS_INTERRUPT_MASK); /* Skip instruction */ - TrapFrame->Eip += (Flags & 0xFF); + TrapFrame->Eip += KiVdmGetInstructionSize(Flags); /* Done */ return TRUE; @@ -351,7 +361,8 @@ /* Get flat EIP of the *current* instruction (not the original EIP) */ Eip = (TrapFrame->SegCs << 4) + TrapFrame->Eip; - Eip += (Flags & 0xFF) - 1; + DbgPrint("VDM: Handling Opcode @ 0x%p\n", Eip); + Eip += KiVdmGetInstructionSize(Flags) - 1; /* Read the opcode entry */ switch (*(PUCHAR)Eip) @@ -409,6 +420,7 @@ IN ULONG Flags) { /* Increase instruction size */ + DbgPrint("VDM: Handling PREFIX [%lx] Opcode @ 0x%p\n", KiVdmGetPrefixFlags(Flags), TrapFrame->Eip); Flags++; /* Handle the next opcode */ @@ -623,7 +635,9 @@ Tss->IoMapBase = (USHORT)IOPM_OFFSET; /* Switch stacks and work the magic */ + DbgPrint("VDM: Entering V8086 Mode\n"); Ki386SetupAndExitToV86Mode(VdmTeb); + DbgPrint("VDM: Exiting V8086 Mode\n"); /* Restore IOPM */ RtlCopyMemory(&Tss->IoMaps[0].IoMap, Ki386IopmSaveArea, PAGE_SIZE * 2); _______________________________________________ Ros-dev mailing list Ros-dev@reactos.org http://www.reactos.org/mailman/listinfo/ros-dev