- Add func.endfunc decoration.

- Add code to wait for SwapBusy == FALSE on SMP.
- Add stub code to check for new PCR fields in 2003. Currently disabled because thread swap code still uses XP fields.
- Check for active DPCs at the end of thread swap, not at the beginning.
- Set PRCB->IdleThread outside of the thread swap routine.
- Don't set the thread state to running inside the swap routine, we already do it outside.

svn path=/trunk/; revision=24180
This commit is contained in:
Alex Ionescu 2006-09-17 23:17:07 +00:00
parent 70cca480e5
commit b52483ba9a
2 changed files with 35 additions and 13 deletions

View file

@ -229,6 +229,7 @@ Return:
* If a return from a system thread is detected, a bug check will occur. * If a return from a system thread is detected, a bug check will occur.
* *
*--*/ *--*/
.func KiThreadStartup@156
.globl _KiThreadStartup@156 .globl _KiThreadStartup@156
_KiThreadStartup@156: _KiThreadStartup@156:
@ -268,6 +269,7 @@ BadThread:
/* A system thread returned...this is very bad! */ /* A system thread returned...this is very bad! */
int 3 int 3
.endfunc
/*++ /*++
* KiSwapContextInternal * KiSwapContextInternal
@ -287,22 +289,32 @@ BadThread:
* Absolutely all registers except ESP can be trampled here for maximum code flexibility. * Absolutely all registers except ESP can be trampled here for maximum code flexibility.
* *
*--*/ *--*/
.globl @KiSwapContextInternal@0 .func @KiSwapContextInternal@0, @KiSwapContextInternal@0
@KiSwapContextInternal@0: @KiSwapContextInternal@0:
/* Set the Thread to running */
mov byte ptr es:[esi+KTHREAD_STATE], Running
/* Save the IRQL */ /* Save the IRQL */
push ecx push ecx
#ifdef CONFIG_SMP
GetSwapLock:
/* Acquire the swap lock */
cmp [esi+KTHREAD_SWAP_BUSY], 0
jz NotBusy
pause
jmp GetSwapLock
#endif
/* Increase context switches (use ES for lazy load) */
//inc dword ptr es:[ebx+KPCR_CONTEXT_SWITCHES]
/* Save the Exception list */ /* Save the Exception list */
push [ebx+KPCR_EXCEPTION_LIST] push [ebx+KPCR_EXCEPTION_LIST]
/* DPC shouldn't be active */ /* Check for WMI */
cmp byte ptr [ebx+KPCR_PRCB_DPC_ROUTINE_ACTIVE], 0 //cmp dword ptr [ebx+KPCR_PERF_GLOBAL_GROUP_MASK], 0
jnz BugCheckDpc //jnz WmiTrace
AfterTrace:
/* Switching, disable interrupts now */ /* Switching, disable interrupts now */
cli cli
@ -391,7 +403,6 @@ SameProcess:
/* Increase context switches */ /* Increase context switches */
inc dword ptr [esi+KTHREAD_CONTEXT_SWITCHES] inc dword ptr [esi+KTHREAD_CONTEXT_SWITCHES]
//inc dword ptr [esi+KPRC_PRCB_CONTEXT_SWITCHES]
/* Restore exception list */ /* Restore exception list */
pop [ebx+KPCR_EXCEPTION_LIST] pop [ebx+KPCR_EXCEPTION_LIST]
@ -399,6 +410,10 @@ SameProcess:
/* Restore IRQL */ /* Restore IRQL */
pop ecx pop ecx
/* DPC shouldn't be active */
cmp byte ptr [ebx+KPCR_PRCB_DPC_ROUTINE_ACTIVE], 0
jnz BugCheckDpc
/* Check if kernel APCs are pending */ /* Check if kernel APCs are pending */
cmp byte ptr [esi+KTHREAD_PENDING_KERNEL_APC], 0 cmp byte ptr [esi+KTHREAD_PENDING_KERNEL_APC], 0
jnz CheckApc jnz CheckApc
@ -446,9 +461,18 @@ LdtStuff:
mov eax, KGDT_LDT mov eax, KGDT_LDT
jmp LoadLdt jmp LoadLdt
WmiTrace:
/* No WMI support yet */
int 3
/* Jump back */
jmp AfterTrace
BugCheckDpc: BugCheckDpc:
push ATTEMPTED_SWITCH_FROM_DPC push ATTEMPTED_SWITCH_FROM_DPC
call _KeBugCheck@4 call _KeBugCheck@4
.endfunc
/*++ /*++
* KiSwapContext * KiSwapContext
@ -460,7 +484,7 @@ BugCheckDpc:
* switch to. * switch to.
* *
* Returns: * Returns:
* The WaitStatus of the Target Thread. NOT YET SUPPORTED. * The WaitStatus of the Target Thread.
* *
* Remarks: * Remarks:
* This is a wrapper around KiSwapContextInternal which will save all the * This is a wrapper around KiSwapContextInternal which will save all the
@ -472,7 +496,7 @@ BugCheckDpc:
* *
*--*/ *--*/
.globl @KiSwapContext@8 .globl @KiSwapContext@8
.func @KiSwapContext@8, @KiSwapContext@8 .func @KiSwapContext@8, @KiSwapContext@8
@KiSwapContext@8: @KiSwapContext@8:
/* Note, we CANNOT touch ebp */ /* Note, we CANNOT touch ebp */
@ -494,9 +518,6 @@ BugCheckDpc:
/* Get the New Thread */ /* Get the New Thread */
mov esi, edx mov esi, edx
/* Save it as Current thread */
mov fs:[KPCR_CURRENT_THREAD], esi
/* Get the wait IRQL */ /* Get the wait IRQL */
movzx ecx, byte ptr [edi+KTHREAD_WAIT_IRQL] movzx ecx, byte ptr [edi+KTHREAD_WAIT_IRQL]

View file

@ -154,6 +154,7 @@ KiDispatchThreadNoLock(ULONG NewThreadStatus)
/* Special note for Filip: This will release the Dispatcher DB Lock ;-) -- Alex */ /* Special note for Filip: This will release the Dispatcher DB Lock ;-) -- Alex */
DPRINT("You are : %x, swapping to: %x.\n", OldThread, CurrentThread); DPRINT("You are : %x, swapping to: %x.\n", OldThread, CurrentThread);
KeGetCurrentPrcb()->CurrentThread = CurrentThread;
ApcState = KiSwapContext(OldThread, CurrentThread); ApcState = KiSwapContext(OldThread, CurrentThread);
DPRINT("You are : %x, swapped from: %x\n", OldThread, CurrentThread); DPRINT("You are : %x, swapped from: %x\n", OldThread, CurrentThread);
return ApcState; return ApcState;