Author: ros-arm-bringup
Date: Sat Jun 14 18:19:03 2008
New Revision: 33971
URL:
http://svn.reactos.org/svn/reactos?rev=33971&view=rev
Log:
- Dude, we don't need to calibrate anything... we've got a 1MHz timer, which means
1us-precision. KeStallExecutionProcessor needs 1us-precision!
- Since we have two timers (ha x86!!!), set the second one as the stall timer. It's a
one-shot periodic timer, set to the exact number of microseconds being waited on.
- To fully emulate stalling, we don't use a clock interrupt for it (it supports not
sending one!) and just busy-loop until the value reaches 0.
- Tried it with a 10 second (10000000 us) wait and it worked -perfectly-.
- Re-implemented KeStallExecutionProcessor and got rid of the other code. Back in
HalInitSystem(phase1) now...
- Also killed some DPRINT1s getting on my nerves.
Modified:
trunk/reactos/hal/halarm/generic/hal.c
trunk/reactos/ntoskrnl/ke/arm/kiinit.c
trunk/reactos/ntoskrnl/ke/arm/trapc.c
Modified: trunk/reactos/hal/halarm/generic/hal.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halarm/generic/hal.c?r…
==============================================================================
--- trunk/reactos/hal/halarm/generic/hal.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halarm/generic/hal.c [iso-8859-1] Sat Jun 14 18:19:03 2008
@@ -498,14 +498,19 @@
#define TIMER_INT_MASK (PVOID)0xE00E2014
#define TIMER_BACKGROUND_LOAD (PVOID)0xE00E2018
+#define TIMER2_LOAD (PVOID)0xE00E3000
+#define TIMER2_VALUE (PVOID)0xE00E3004
+#define TIMER2_CONTROL (PVOID)0xE00E3008
+#define TIMER2_INT_CLEAR (PVOID)0xE00E300C
+#define TIMER2_INT_STATUS (PVOID)0xE00E3010
+#define TIMER2_INT_MASK (PVOID)0xE00E3014
+#define TIMER2_BACKGROUND_LOAD (PVOID)0xE00E3018
#define _clz(a) \
({ ULONG __value, __arg = (a); \
asm ("clz\t%0, %1": "=r" (__value): "r" (__arg));
\
__value; })
-ULONG HalpStallStart, HalpStallEnd, HalpStallScaleFactor;
-
ULONG
HalGetInterruptSource(VOID)
{
@@ -535,37 +540,7 @@
//
// Clear the interrupt
//
- DPRINT1("STALL INTERRUPT!!!: %lx %lx\n", HalpStallStart, HalpStallEnd);
WRITE_REGISTER_ULONG(TIMER_INT_CLEAR, 1);
-
- //
- // Check if this is our first time here
- //
- if (!(HalpStallStart + HalpStallEnd))
- {
- //
- // Remember that we've been hit once
- //
- HalpStallEnd = 1;
- }
- else if (!(HalpStallStart) && (HalpStallEnd))
- {
- //
- // Okay, this is our second time here!
- // Load the stall execution count that was setup for us...
- // And get ready to hit the case below
- //
- HalpStallStart = PCR->StallExecutionCount;
- HalpStallEnd = 0;
- }
- else if ((HalpStallStart) && !(HalpStallEnd))
- {
- //
- // This our third time here!
- // Now we can just save the stall execution count at end time
- //
- HalpStallEnd = PCR->StallExecutionCount;
- }
}
VOID
@@ -693,6 +668,11 @@
}
else if (BootPhase == 1)
{
+ //
+ // Switch to real clock interrupt
+ //
+ PCR->InterruptRoutine[CLOCK2_LEVEL] = HalpClockInterrupt;
+
UNIMPLEMENTED;
while (TRUE);
}
@@ -1084,23 +1064,33 @@
VOID
NTAPI
-KeStallExecutionProcessor(
- ULONG Microseconds)
-{
- ULONG Index;
-
- //
- // Calculate how many times we should loop
- //
- Index = Microseconds * PCR->StallScaleFactor;
- while (Index)
- {
- //
- // Do one stall cycle
- //
- PCR->StallExecutionCount++;
- Index--;
- };
+KeStallExecutionProcessor(IN ULONG Microseconds)
+{
+ //
+ // Configure the interval to xxx Micrseconds
+ // (INTERVAL (xxx us) * TIMCLKfreq (1MHz))
+ // ---------------------------------------
+ // (TIMCLKENXdiv (1) * PRESCALEdiv (1))
+ //
+ // This works out great, since 1MHz * 1 us = 1!
+ //
+
+ //
+ // Enable the timer
+ //
+ WRITE_REGISTER_ULONG(TIMER2_LOAD, Microseconds);
+ WRITE_REGISTER_ULONG(TIMER2_CONTROL,
+ 1 << 0 | // one-shot mode
+ 1 << 1 | // 32-bit mode
+ 0 << 2 | // 0 stages of prescale, divided by 1
+ 0 << 5 | // no interrupt
+ 1 << 6 | // periodic mode
+ 1 << 7); // enable it
+
+ //
+ // Now we will loop until the timer reached 0
+ //
+ while (READ_REGISTER_ULONG(TIMER2_VALUE));
}
VOID
@@ -1127,7 +1117,7 @@
// Setup the interrupt mask for this IRQL
//
InterruptMask = KeGetPcr()->IrqlTable[NewIrql];
- DPRINT1("[LOWER] IRQL: %d InterruptMask: %lx\n", NewIrql, InterruptMask);
+// DPRINT1("[LOWER] IRQL: %d InterruptMask: %lx\n", NewIrql,
InterruptMask);
//
// Clear interrupts associated to the old IRQL
@@ -1172,7 +1162,7 @@
// Setup the interrupt mask for this IRQL
//
InterruptMask = KeGetPcr()->IrqlTable[NewIrql];
- DPRINT1("[RAISE] IRQL: %d InterruptMask: %lx\n", NewIrql, InterruptMask);
+ // DPRINT1("[RAISE] IRQL: %d InterruptMask: %lx\n", NewIrql,
InterruptMask);
ASSERT(NewIrql >= OldIrql);
//
Modified: trunk/reactos/ntoskrnl/ke/arm/kiinit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/kiinit.c?r…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/kiinit.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/kiinit.c [iso-8859-1] Sat Jun 14 18:19:03 2008
@@ -52,7 +52,7 @@
LARGE_INTEGER PageDirectory;
PKPCR Pcr;
ULONG i;
- DPRINT1("%s Process: %p Thread: %p Stack: %p PRCB: %p Number: %d LoaderBlock:
%p\n",
+ DPRINT1("[INIT] Process: %p Thread: %p Stack: %p PRCB: %p Number: %d
LoaderBlock: %p\n",
__FUNCTION__, InitProcess, InitThread, IdleStack, Prcb, Number,
LoaderBlock);
//
Modified: trunk/reactos/ntoskrnl/ke/arm/trapc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/trapc.c?re…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/trapc.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/trapc.c [iso-8859-1] Sat Jun 14 18:19:03 2008
@@ -333,7 +333,7 @@
// Get the interrupt source
//
InterruptCause = HalGetInterruptSource();
- DPRINT1("[INT] (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr,
TrapFrame->Pc);
+// DPRINT1("[INT] (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr,
TrapFrame->Pc);
//
// Get the new IRQL and Interrupt Mask
@@ -354,14 +354,14 @@
//
// FIXME: Switch to interrupt stack
//
- DPRINT1("[ISR]\n");
+ //DPRINT1("[ISR]\n");
}
else
{
//
// We know this is APC or DPC.
//
- DPRINT1("[DPC/APC]\n");
+ //DPRINT1("[DPC/APC]\n");
HalClearSoftwareInterrupt(Irql);
}
@@ -369,7 +369,7 @@
// Call the registered interrupt routine
//
Pcr->InterruptRoutine[Irql]();
- DPRINT1("[ISR RETURN]\n");
+// DPRINT1("[ISR RETURN]\n");
//
// Re-enable interrupts and return IRQL