[NTOS]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 17 Mar 2010 13:12:46 +0000 (13:12 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 17 Mar 2010 13:12:46 +0000 (13:12 +0000)
commit69330a579525f6ff1638525fff93bca7b71cfcff
treebc5e12d80df999fbe77172e26ae7ce228986db3b
parentb6e52b15e393bfdab09d8d890bef9465db127608
[NTOS]
Rewrite Trap exits stubs in raw assembly (2nd try) and remove inline assembly. Bugcheck in KiTrap0DHandler, when the fault was not handled. Replace code patching for sysexit vs iret with a function pointer. Slightly refactor KiSystemServiceHandler/KiFastCallEntryHanlder. Unroll the loop in the systemcall handler and use volatile keyword when reloading TrapFrame and DescriptorTable from the new stack after converting to gui thread to prevent the compiler from optimizing it away (or moving it out of the loop). Add an asm macro KiCallHandler, which expands to call on debug builds to make sure backtraces work as expected and to jmp on release builds for improved performance. Modify KiExitV86Trap to always exit and add DECLSPEC_NORETURN. Use __debugbreak() instead of while(TRUE) on errors in KiExitTrapDebugChecks.
The old code hat 2 issues: one was restoring segments in KiExitV86Trap when they shouldn't be, leading to a bugcheck. And the other was a long hang (5 mintes or more) in 3rd stage on qemu when selecting RosDbg, caused by the KiFastCallExitHandler function pointer being initialized with a pointer to the iret handler. Initializing it in code solved the issue. To figure out why is left as an exercise to the reader.

svn path=/trunk/; revision=46247
reactos/ntoskrnl/include/internal/i386/asmmacro.S
reactos/ntoskrnl/include/internal/trap_x.h
reactos/ntoskrnl/ke/i386/cpu.c
reactos/ntoskrnl/ke/i386/trap.s
reactos/ntoskrnl/ke/i386/traphdlr.c