Author: ion Date: Thu Aug 24 23:17:14 2006 New Revision: 23692
URL: http://svn.reactos.org/svn/reactos?rev=23692&view=rev Log: - Fix some bugs in clock.S - Enable clock.S versions of KeUpdateSystem/RunTime and export them properly. - Enable systimer.S to call into kernel's KeUpdateSystemTime. - Enable Hal's Clock Interrupt during Phase 1. - Remove most of the code that was still left in irq.c - Only one large problem remains now, which is the spurious firing of the clock interrupt before we're ready to handle it... I will try to fix this today.
Modified: trunk/reactos/hal/halx86/generic/halinit.c trunk/reactos/hal/halx86/generic/systimer.S trunk/reactos/ntoskrnl/ke/clock.c trunk/reactos/ntoskrnl/ke/i386/clock.S trunk/reactos/ntoskrnl/ke/i386/irq.c trunk/reactos/ntoskrnl/ntoskrnl.def
Modified: trunk/reactos/hal/halx86/generic/halinit.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/halinit.... ============================================================================== --- trunk/reactos/hal/halx86/generic/halinit.c (original) +++ trunk/reactos/hal/halx86/generic/halinit.c Thu Aug 24 23:17:14 2006 @@ -32,10 +32,6 @@ return STATUS_SUCCESS; }
-#define MAKEULONG(x, y) \ - (((((ULONG)(x))<<16) & 0xffff0000) | \ - ((ULONG)(y) & 0xffff)) - BOOLEAN STDCALL HalInitSystem (ULONG BootPhase, PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -47,14 +43,13 @@ } else if (BootPhase == 1) { -#if 0 /* Enable the clock interrupt */ ((PKIPCR)KeGetPcr())->IDT[IRQ2VECTOR(0)].ExtendedOffset = (USHORT)(((ULONG_PTR)HalpClockInterrupt >> 16) & 0xFFFF); ((PKIPCR)KeGetPcr())->IDT[IRQ2VECTOR(0)].Offset = (USHORT)HalpClockInterrupt; HalEnableSystemInterrupt(IRQ2VECTOR(0), CLOCK2_LEVEL, Latched); -#endif + /* Initialize display and make the screen black */ HalInitializeDisplay ((PROS_LOADER_PARAMETER_BLOCK)LoaderBlock); HalpInitBusHandlers();
Modified: trunk/reactos/hal/halx86/generic/systimer.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/systimer... ============================================================================== --- trunk/reactos/hal/halx86/generic/systimer.S (original) +++ trunk/reactos/hal/halx86/generic/systimer.S Thu Aug 24 23:17:14 2006 @@ -38,7 +38,8 @@ jz Spurious
/* Do a tick */ - //jmp _KeUpdateSystemTime@0 + mov eax, 100000 + jmp _KeUpdateSystemTime@0
Spurious:
Modified: trunk/reactos/ntoskrnl/ke/clock.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/clock.c?rev=236... ============================================================================== --- trunk/reactos/ntoskrnl/ke/clock.c (original) +++ trunk/reactos/ntoskrnl/ke/clock.c Thu Aug 24 23:17:14 2006 @@ -36,13 +36,9 @@ #endif
CHAR KiTimerSystemAuditing = 0; -static KDPC KiExpireTimerDpc; +KDPC KiExpireTimerDpc; BOOLEAN KiClockSetupComplete = FALSE;
-extern ULONG KiMaximumDpcQueueDepth; -extern ULONG KiMinimumDpcRate; -extern ULONG KiAdjustDpcThreshold; -extern ULONG KiIdealDpcRate;
/* * Number of timer interrupts since initialisation @@ -82,7 +78,7 @@ { TIME_FIELDS TimeFields;
- DPRINT("KiInitializeSystemClock()\n"); + DPRINT1("KiInitializeSystemClock()\n"); InitializeListHead(&KiTimerListHead); KeInitializeDpc(&KiExpireTimerDpc, (PKDEFERRED_ROUTINE)KiExpireTimers, 0);
@@ -101,7 +97,7 @@ SharedUserData->SystemTime.High1Time = SystemBootTime.u.HighPart;
KiClockSetupComplete = TRUE; - DPRINT("Finished KiInitializeSystemClock()\n"); + DPRINT1("Finished KiInitializeSystemClock()\n"); }
VOID @@ -235,192 +231,6 @@ }
/* - * NOTE: On Windows this function takes exactly one parameter and EBP is - * guaranteed to point to KTRAP_FRAME. The function is used only - * by HAL, so there's no point in keeping that prototype. - * - * @implemented - */ -VOID -STDCALL -KeUpdateRunTime(IN PKTRAP_FRAME TrapFrame, - IN KIRQL Irql) -{ - PKPRCB Prcb = KeGetCurrentPrcb(); - PKTHREAD CurrentThread = Prcb->CurrentThread; - PKPROCESS CurrentProcess = CurrentThread->ApcState.Process; - - /* Increase interrupt count */ - Prcb->InterruptCount++; - - /* Check if we came from user mode */ - if ((TrapFrame->EFlags & EFLAGS_V86_MASK) || - (TrapFrame->SegCs & MODE_MASK)) - { - /* Update user times */ - CurrentThread->UserTime++; - InterlockedIncrement((PLONG)&CurrentProcess->UserTime); - Prcb->UserTime++; - } - else - { - /* Update CPU kernel time in all cases */ - Prcb->KernelTime++; - - /* Check IRQ */ - if (Irql > DISPATCH_LEVEL) - { - /* This was an interrupt */ - Prcb->InterruptTime++; - } - else if ((Irql < DISPATCH_LEVEL) || !(Prcb->DpcRoutineActive)) - { - /* This was normal kernel time */ - CurrentThread->KernelTime++; - InterlockedIncrement((PLONG)&CurrentProcess->KernelTime); - } - else if (Irql == DISPATCH_LEVEL) - { - /* This was DPC time */ - Prcb->DpcTime++; - } - } - - /* Set the last DPC Count and request rate */ - Prcb->DpcLastCount = Prcb->DpcData[0].DpcCount; - Prcb->DpcRequestRate = ((Prcb->DpcData[0].DpcCount - Prcb->DpcLastCount) + - Prcb->DpcRequestRate) / 2; - - /* Check if we should request a DPC */ - if ((Prcb->DpcData[0].DpcQueueDepth) && - !(Prcb->DpcRoutineActive) && - !(Prcb->DpcInterruptRequested)) - { - /* Request one */ - HalRequestSoftwareInterrupt(DISPATCH_LEVEL); - - /* Update the depth if needed */ - if ((Prcb->DpcRequestRate < KiIdealDpcRate) && - (Prcb->MaximumDpcQueueDepth > 1)) - { - /* Decrease the maximum depth by one */ - Prcb->MaximumDpcQueueDepth--; - } - } - else - { - /* Decrease the adjustment threshold */ - if (!(--Prcb->AdjustDpcThreshold)) - { - /* We've hit 0, reset it */ - Prcb->AdjustDpcThreshold = KiAdjustDpcThreshold; - - /* Check if we've hit queue maximum */ - if (KiMaximumDpcQueueDepth != Prcb->MaximumDpcQueueDepth) - { - /* Increase maximum by one */ - Prcb->MaximumDpcQueueDepth++; - } - } - } - - /* - * If we're at end of quantum request software interrupt. The rest - * is handled in KiDispatchInterrupt. - * - * NOTE: If one stays at DISPATCH_LEVEL for a long time the DPC routine - * which checks for quantum end will not be executed and decrementing - * the quantum here can result in overflow. This is not a problem since - * we don't care about the quantum value anymore after the QuantumEnd - * flag is set. - */ - if (((CurrentThread->Quantum -= 3) <= 0) && - (Prcb->IdleThread != CurrentThread)) - { - Prcb->QuantumEnd = TRUE; - HalRequestSoftwareInterrupt(DISPATCH_LEVEL); - } -} - - -/* - * NOTE: On Windows this function takes exactly zero parameters and EBP is - * guaranteed to point to KTRAP_FRAME. Also [esp+0] contains an IRQL. - * The function is used only by HAL, so there's no point in keeping - * that prototype. - * - * @implemented - */ -VOID -STDCALL -KeUpdateSystemTime(IN PKTRAP_FRAME TrapFrame, - IN KIRQL Irql, - IN ULONG Increment) -{ - LONG OldOffset; - LARGE_INTEGER Time; - ASSERT(KeGetCurrentIrql() == PROFILE_LEVEL); - - /* Update interrupt time */ - Time.LowPart = SharedUserData->InterruptTime.LowPart; - Time.HighPart = SharedUserData->InterruptTime.High1Time; - Time.QuadPart += Increment; - SharedUserData->InterruptTime.High2Time = Time.u.HighPart; - SharedUserData->InterruptTime.LowPart = Time.u.LowPart; - SharedUserData->InterruptTime.High1Time = Time.u.HighPart; - - /* Increase the tick offset */ - KiTickOffset -= Increment; - OldOffset = KiTickOffset; - - /* Check if this isn't a tick yet */ - if (KiTickOffset > 0) - { - /* Expire timers */ - KeInsertQueueDpc(&KiExpireTimerDpc, (PVOID)TrapFrame->Eip, 0); - } - else - { - /* Setup time structure for system time */ - Time.LowPart = SharedUserData->SystemTime.LowPart; - Time.HighPart = SharedUserData->SystemTime.High1Time; - Time.QuadPart += KeTimeAdjustment; - SharedUserData->SystemTime.High2Time = Time.HighPart; - SharedUserData->SystemTime.LowPart = Time.LowPart; - SharedUserData->SystemTime.High1Time = Time.HighPart; - - /* Setup time structure for tick time */ - Time.LowPart = KeTickCount.LowPart; - Time.HighPart = KeTickCount.High1Time; - Time.QuadPart += 1; - KeTickCount.High2Time = Time.HighPart; - KeTickCount.LowPart = Time.LowPart; - KeTickCount.High1Time = Time.HighPart; - SharedUserData->TickCount.High2Time = Time.HighPart; - SharedUserData->TickCount.LowPart = Time.LowPart; - SharedUserData->TickCount.High1Time = Time.HighPart; - - /* Update tick count in shared user data as well */ - SharedUserData->TickCountLowDeprecated++; - - /* Queue a DPC that will expire timers */ - KeInsertQueueDpc(&KiExpireTimerDpc, (PVOID)TrapFrame->Eip, 0); - } - - /* Update process and thread times */ - if (OldOffset <= 0) - { - /* This was a tick, calculate the next one */ - KiTickOffset += KeMaximumIncrement; - KeUpdateRunTime(TrapFrame, Irql); - } - - /* Return from the interrupt */ - Ke386DisableInterrupts(); - HalEndSystemInterrupt(Irql, 0); -} - -/* * @implemented */ ULONG
Modified: trunk/reactos/ntoskrnl/ke/i386/clock.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/clock.S?re... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/clock.S (original) +++ trunk/reactos/ntoskrnl/ke/i386/clock.S Thu Aug 24 23:17:14 2006 @@ -17,12 +17,13 @@ .extern _KiTickOffset .extern _KeTickCount .extern _KeMaximumIncrement +.extern _KiExpireTimerDpc
/* FUNCTIONS ******************************************************************/
-.globl _KeUpdateRunTime2@0 -.func KeUpdateRunTime2@0 -_KeUpdateRunTime2@0: +.globl _KeUpdateRunTime@4 +.func KeUpdateRunTime@4 +_KeUpdateRunTime@4:
/* Get KPCR */ mov eax, [fs:KPCR_SELF] @@ -155,9 +156,9 @@ ret 4 .endfunc
-.globl _KeUpdateSystemTime2@0 -.func KeUpdateSystemTime2@0 -_KeUpdateSystemTime2@0: +.globl _KeUpdateSystemTime@0 +.func KeUpdateSystemTime@0 +_KeUpdateSystemTime@0:
/* Get shared data in ECX */ mov ecx, USER_SHARED_DATA @@ -185,8 +186,8 @@ mov ebx, USER_SHARED_DATA
/* Get system time */ - mov edi, [ebx+USER_SHARED_DATA_SYSTEM_TIME] - mov esi, [ebx+USER_SHARED_DATA_SYSTEM_TIME+4] + mov ecx, [ebx+USER_SHARED_DATA_SYSTEM_TIME] + mov edx, [ebx+USER_SHARED_DATA_SYSTEM_TIME+4]
/* Add the increment and get the carry */ add ecx, _KeTimeAdjustment @@ -218,9 +219,16 @@ mov [USER_SHARED_DATA+USER_SHARED_DATA_TICK_COUNT], ecx mov [USER_SHARED_DATA+USER_SHARED_DATA_TICK_COUNT+4], edx
+ /* FIXME: HACK */ + mov [USER_SHARED_DATA], ecx + IncompleteTick:
- /* Queue DPC to handle registered timers */ + /* FIXME: NASTY Queue DPC to handle registered timers */ + push 0 + push [esp+KTRAP_FRAME_EIP] + push offset _KiExpireTimerDpc + call _KeInsertQueueDpc@12
/* Check if this was a full tick */ cmp dword ptr _KiTickOffset, 0 @@ -231,8 +239,8 @@ add _KiTickOffset, eax
/* Update system run time */ - push esp - call _KeUpdateRunTime@8 + push [esp] + call _KeUpdateRunTime@4 jmp Done
IncompleteTick2:
Modified: trunk/reactos/ntoskrnl/ke/i386/irq.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/irq.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/irq.c (original) +++ trunk/reactos/ntoskrnl/ke/i386/irq.c Thu Aug 24 23:17:14 2006 @@ -83,29 +83,6 @@ I486_INTERRUPT_GATE; }
-STATIC VOID -KeIRQTrapFrameToTrapFrame(PKIRQ_TRAPFRAME IrqTrapFrame, - PKTRAP_FRAME TrapFrame) -{ - TrapFrame->SegGs = (USHORT)IrqTrapFrame->Gs; - TrapFrame->SegFs = (USHORT)IrqTrapFrame->Fs; - TrapFrame->SegEs = (USHORT)IrqTrapFrame->Es; - TrapFrame->SegDs = (USHORT)IrqTrapFrame->Ds; - TrapFrame->Eax = IrqTrapFrame->Eax; - TrapFrame->Ecx = IrqTrapFrame->Ecx; - TrapFrame->Edx = IrqTrapFrame->Edx; - TrapFrame->Ebx = IrqTrapFrame->Ebx; - TrapFrame->HardwareEsp = IrqTrapFrame->Esp; - TrapFrame->Ebp = IrqTrapFrame->Ebp; - TrapFrame->Esi = IrqTrapFrame->Esi; - TrapFrame->Edi = IrqTrapFrame->Edi; - TrapFrame->Eip = IrqTrapFrame->Eip; - TrapFrame->SegCs = IrqTrapFrame->Cs; - TrapFrame->EFlags = IrqTrapFrame->Eflags; -} - -extern BOOLEAN KiClockSetupComplete; - VOID KiInterruptDispatch (ULONG vector, PKIRQ_TRAPFRAME Trapframe) /* @@ -115,23 +92,6 @@ */ { KIRQL old_level; - KTRAP_FRAME KernelTrapFrame; - ASSERT(vector == 0x30); -#if 0 - PULONG Frame; - DPRINT1("Received Interrupt: %lx\n", vector); - DPRINT1("My trap frame: %p\n", Trapframe); - DPRINT1("Stack trace\n"); - __asm__("mov %%ebp, %0" : "=r" (Frame) : ); - DPRINT1("Stack trace: %p %p %p %p\n", Frame, *Frame, Frame[1], *(PULONG)Frame[1]); - DPRINT1("Clock setup: %lx\n", KiClockSetupComplete); - if (KiClockSetupComplete) while(TRUE); -#endif - - /* - * At this point we have interrupts disabled, nothing has been done to - * the PIC. - */ KeGetCurrentPrcb()->InterruptCount++;
/* @@ -145,23 +105,7 @@ return; }
- - /* - * Enable interrupts - * NOTE: Only higher priority interrupts will get through - */ Ke386EnableInterrupts(); - - //DPRINT1("Tick\n"); - if (KiClockSetupComplete) - { - KeIRQTrapFrameToTrapFrame(Trapframe, &KernelTrapFrame); - return KeUpdateSystemTime(&KernelTrapFrame, old_level, 100000); - } - - /* - * End the system interrupt. - */ Ke386DisableInterrupts(); HalEndSystemInterrupt (old_level, 0); }
Modified: trunk/reactos/ntoskrnl/ntoskrnl.def URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl.def?rev=2... ============================================================================== --- trunk/reactos/ntoskrnl/ntoskrnl.def (original) +++ trunk/reactos/ntoskrnl/ntoskrnl.def Thu Aug 24 23:17:14 2006 @@ -647,8 +647,8 @@ KeTerminateThread@4 KeTickCount DATA @KeTryToAcquireGuardedMutex@4 -KeUpdateRunTime@8 -KeUpdateSystemTime@12 +KeUpdateRunTime@4 +KeUpdateSystemTime@0 KeUnstackDetachProcess@4 KeUserModeCallback@20 KeWaitForMultipleObjects@32