Author: ros-arm-bringup
Date: Wed Jun 11 11:48:07 2008
New Revision: 33933
URL: 
http://svn.reactos.org/svn/reactos?rev=33933&view=rev
Log:
- Fix build on ARM:
  - _iob is already defined as a dll_import
  - _rotl intrinsic is now implemented (should use rol instruction, but not sure on the
syntax!)
  - Add a stub psctx.h for ARM
  - Added InterlockedEXchangePointers
  - Fix uninitialized variable warning in ex/resource.c
- Start to implement interrupt handling:
  - We now have a rudimentary interrupt handler that takes care of software interrupts
  - We now have a rudimentary DPC handler which takes care of switching to the next
thread, if any
  - We now setup the HAL Interrupt Source -> IRQL Table (The IRQLMask Table).
  - Implemented HalGetInterruptSource, which allows us to get the interrupt # that cause
the IRQ.
    Note: this wasn't needed on Alpha/PPC/MIPS NT ports, because that information is
stored on the CPU,
    and the kernel could read it -- we must abstract it through the HAL.
  - Add the OldIrql to the TRAP_FRAME, we don't use it yet.
- We are now ready to context switch to the Phase 1 thread.
Added:
    trunk/reactos/ntoskrnl/ps/arm/
    trunk/reactos/ntoskrnl/ps/arm/psctx.c   (with props)
Modified:
    trunk/reactos/hal/hal/hal_arm.def
    trunk/reactos/hal/halarm/generic/hal.c
    trunk/reactos/include/ndk/arm/ketypes.h
    trunk/reactos/include/psdk/intrin_arm.h
    trunk/reactos/include/reactos/armddk.h
    trunk/reactos/lib/sdk/crt/string/scanf.c
    trunk/reactos/ntoskrnl/ex/resource.c
    trunk/reactos/ntoskrnl/ke/arm/kiinit.c
    trunk/reactos/ntoskrnl/ke/arm/stubs_asm.s
    trunk/reactos/ntoskrnl/ke/arm/trap.s
    trunk/reactos/ntoskrnl/ke/arm/trapc.c
    trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild
Modified: trunk/reactos/hal/hal/hal_arm.def
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/hal/hal_arm.def?rev=33…
==============================================================================
--- trunk/reactos/hal/hal/hal_arm.def [iso-8859-1] (original)
+++ trunk/reactos/hal/hal/hal_arm.def [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -42,6 +42,7 @@
 HalGetBusData
 HalGetBusDataByOffset
 HalGetEnvironmentVariable
+HalGetInterruptSource
 HalGetInterruptVector
 HalHandleNMI
 HalInitSystem
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] Wed Jun 11 11:48:07 2008
@@ -414,7 +414,7 @@
 // CLOCK_LEVEL - 0x10 (everything disabled except 4)
 // POWER_LEVEL, IPI_LEVEL, HIGH_LEVEL - 0x00 (everything disabled)
-ULONG HalpIrqlTable[] =
+ULONG HalpIrqlTable[HIGH_LEVEL + 1] =
 {
     0xFFFFFFFF, // IRQL 0 PASSIVE_LEVEL
     0xFFFFFFFD, // IRQL 1 APC_LEVEL
@@ -450,44 +450,94 @@
     0x00,       // IRQL 31 HIGH_LEVEL
 };
-
-VOID
-HalpStallInterrupt(VOID)
-{
-    DPRINT1("STALL INTERRUPT!!!\n");
-    while (TRUE);
-}
-
-VOID
-HalpInitializeInterrupts(VOID)
-{
-    ULONG i;
-    PKPCR Pcr = (PKPCR)KeGetPcr();
-
-    //
-    // Fill out the IRQL mappings
-    //
-    for (i = 0; i < (HIGH_LEVEL + 1); i++)
-    {
-        //
-        // Save the valeue in the PCR
-        //
-        Pcr->IrqlTable[i] = HalpIrqlTable[i];
-    }
-
-    //
-    // Setup the clock and profile interrupt
-    //
-    Pcr->InterruptRoutine[CLOCK2_LEVEL] = HalpStallInterrupt;
-    //    Pcr->InterruptRoutine[PROFILE_LEVEL] = HalpCountInterrupt;
-}
-
-ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount;
-
+UCHAR HalpMaskTable[HIGH_LEVEL + 1] =
+{
+    PROFILE_LEVEL,
+    APC_LEVEL,
+    DISPATCH_LEVEL,
+    IPI_LEVEL,
+    CLOCK2_LEVEL,
+    3,
+    4,
+    5,
+    6,
+    7,
+    8,
+    9,
+    10,
+    11,
+    12,
+    13,
+    14,
+    15,
+    16,
+    17,
+    18,
+    19,
+    20,
+    21,
+    22,
+    23,
+    24,
+    25,
+    26,
+    26,
+    26
+};
+
+#define VICINTSTATUS     (PVOID)0xE0040000
 #define VICINTENABLE     (PVOID)0xE0040010
 #define VICINTENCLEAR    (PVOID)0xE0040014
 #define VICSOFTINT       (PVOID)0xE0040018
 #define VICSOFTINTCLEAR  (PVOID)0xE004001C
+
+
+#define _clz(a) \
+({ ULONG __value, __arg = (a); \
+        asm ("clz\t%0, %1": "=r" (__value): "r" (__arg)); \
+        __value; })
+
+ULONG
+HalGetInterruptSource(VOID)
+{
+    ULONG InterruptStatus;
+
+    //
+    // Get the interrupt status, and return the highest bit set
+    //
+    InterruptStatus = READ_REGISTER_ULONG(VICINTSTATUS);
+    return 31 - _clz(InterruptStatus);
+}
+
+VOID
+HalpStallInterrupt(VOID)
+{
+    DPRINT1("STALL INTERRUPT!!!\n");
+    while (TRUE);
+}
+
+VOID
+HalpInitializeInterrupts(VOID)
+{
+    PKPCR Pcr = (PKPCR)KeGetPcr();
+
+    //
+    // Fill out the IRQL mappings
+    //
+    RtlCopyMemory(Pcr->IrqlTable, HalpIrqlTable, sizeof(Pcr->IrqlTable));
+    RtlCopyMemory(Pcr->IrqlMask, HalpMaskTable, sizeof(Pcr->IrqlMask));
+//    Pcr->IrqlTable = HalpIrqlTable;
+  //  Pcr->IrqlMask = HalpMaskTable;
+
+    //
+    // Setup the clock and profile interrupt
+    //
+    Pcr->InterruptRoutine[CLOCK2_LEVEL] = HalpStallInterrupt;
+    //    Pcr->InterruptRoutine[PROFILE_LEVEL] = HalpCountInterrupt;
+}
+
+ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount;
+
 /*
  * @implemented
@@ -714,13 +764,38 @@
     WRITE_REGISTER_ULONG(VICSOFTINT, Interrupt);
 }
-VOID FASTCALL
-HalClearSoftwareInterrupt(
-  IN KIRQL Request)
-{
-  UNIMPLEMENTED;
-}
-
+VOID
+FASTCALL
+HalClearSoftwareInterrupt(IN KIRQL Request)
+{
+    ULONG Interrupt = 0;
+
+    //
+    // Get the interrupt that maches this IRQL level
+    //
+    switch (Request)
+    {
+        case APC_LEVEL:
+
+            Interrupt = 1 << 1;
+            break;
+
+        case DISPATCH_LEVEL:
+
+            Interrupt = 1 << 2;
+            break;
+
+        default:
+
+            ASSERT(FALSE);
+    }
+
+    //
+    // Force a software interrupt
+    //
+    DPRINT1("About to kill interrupt mask: %d\n", Interrupt);
+    WRITE_REGISTER_ULONG(VICSOFTINTCLEAR, Interrupt);
+}
 VOID
 NTAPI
Modified: trunk/reactos/include/ndk/arm/ketypes.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/arm/ketypes.h?…
==============================================================================
--- trunk/reactos/include/ndk/arm/ketypes.h [iso-8859-1] (original)
+++ trunk/reactos/include/ndk/arm/ketypes.h [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -78,8 +78,8 @@
     ULONG SvcSp;
     ULONG SvcLr;
     ULONG Pc;
-//    UCHAR OldIrql;
-//    UCHAR PreviousMode;
+    ULONG OldIrql;
+//  UCHAR PreviousMode;
 //    ULONG Fpscr;
 //    ULONG FpExc;
 //    ULONG S[33];
Modified: trunk/reactos/include/psdk/intrin_arm.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/intrin_arm.h?…
==============================================================================
--- trunk/reactos/include/psdk/intrin_arm.h [iso-8859-1] (original)
+++ trunk/reactos/include/psdk/intrin_arm.h [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -83,6 +83,12 @@
        return a;
 }
+
+static __inline__ __attribute__((always_inline)) void * _InterlockedExchangePointer(void
* volatile * const Target, void * const Value)
+{
+    return _InterlockedExchange(Target, Value);
+}
+
 static __inline__ __attribute__((always_inline)) char _InterlockedAnd8(volatile char *
const value, const char mask)
 {
        char x;
@@ -276,5 +282,13 @@
     );
 }
+#ifndef __MSVCRT__
+static __inline__ __attribute__((always_inline)) unsigned long _rotl(const unsigned long
value, const unsigned char shift)
+{
+       return (((value) << ((int)(shift))) | ((value) >> (32 -
(int)(shift))));
+}
+#endif
+
+
 #endif
 /* EOF */
Modified: trunk/reactos/include/reactos/armddk.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/armddk.h?r…
==============================================================================
--- trunk/reactos/include/reactos/armddk.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/armddk.h [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -53,7 +53,9 @@
 // On ARM, it's actually readable from user-mode, much like KUSER_SHARED_DATA
 //
 #ifdef _WINNT_H
-#define PKINTERRUPT_ROUTINE PVOID // Hack!
+typedef
+VOID
+(*PKINTERRUPT_ROUTINE)(VOID);
 #endif
 typedef struct _KPCR
 {
@@ -85,7 +87,7 @@
     PVOID InstructionBusError;
     ULONG CachePolicy;
     ULONG AlignedCachePolicy;
-//    UCHAR IrqlMask[64];
+    UCHAR IrqlMask[HIGH_LEVEL + 1];
     ULONG IrqlTable[HIGH_LEVEL + 1];
     UCHAR CurrentIrql;
     KAFFINITY SetMember;
Modified: trunk/reactos/lib/sdk/crt/string/scanf.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/string/scanf.c…
==============================================================================
--- trunk/reactos/lib/sdk/crt/string/scanf.c [iso-8859-1] (original)
+++ trunk/reactos/lib/sdk/crt/string/scanf.c [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -33,7 +33,7 @@
 #define debugstr_a
 #endif
-extern FILE _iob[];
+//extern FILE _iob[];
 /* helper function for *scanf.  Returns the value of character c in the
  * given base, or -1 if the given character is not a digit of the base.
Modified: trunk/reactos/ntoskrnl/ex/resource.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/resource.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/ex/resource.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ex/resource.c [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -895,7 +895,7 @@
 {
     KLOCK_QUEUE_HANDLE LockHandle;
     ERESOURCE_THREAD Thread;
-    POWNER_ENTRY Owner;
+    POWNER_ENTRY Owner = NULL;
     BOOLEAN FirstEntryBusy;
     /* Get the thread */
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] Wed Jun 11 11:48:07 2008
@@ -142,7 +142,7 @@
         //
         // Point to the same template
         //
-        Pcr->InterruptRoutine[i] = &KxUnexpectedInterrupt.DispatchCode;
+        Pcr->InterruptRoutine[i] = (PVOID)&KxUnexpectedInterrupt.DispatchCode;
     }
     //
Modified: trunk/reactos/ntoskrnl/ke/arm/stubs_asm.s
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/stubs_asm.…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/stubs_asm.s [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/stubs_asm.s [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -42,7 +42,6 @@
 //
 // Internal Ke Arch-Specific Helpers
 //
-GENERATE_ARM_STUB KiDispatchInterrupt
 GENERATE_ARM_STUB KiSaveProcessorControlState
 GENERATE_ARM_STUB KiInitializeUserApc
 GENERATE_ARM_STUB KeDisableInterrupts
@@ -69,3 +68,4 @@
 GENERATE_ARM_STUB RtlpGetStackLimits
 GENERATE_ARM_STUB KdpGdbStubInit
+GENERATE_ARM_STUB MmDbgTranslatePhysicalAddress
Modified: trunk/reactos/ntoskrnl/ke/arm/trap.s
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/trap.s?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/trap.s [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/trap.s [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -142,6 +142,11 @@
     mov r2, sp
     //
+    // Dummy OldIrql
+    //
+    //str r0, [sp, #-4]!
+
+    //
     // Save the abort lr
     //
     str r0, [sp, #-4]!
@@ -217,6 +222,91 @@
     NESTED_ENTRY KiInterruptException
     PROLOG_END KiInterruptException
+    //
+    // Fixup lr
+    //
+    sub lr, lr, #4
+
+    //
+    // Save the bottom 4 registers
+    //
+    stmdb sp, {r0-r3}
+
+    //
+    // Save the IRQ lr, sp, spsr, cpsr
+    //
+    mov r0, lr
+    mov r1, sp
+    mrs r2, cpsr
+    mrs r3, spsr
+
+    //
+    // Switch to SVC mode
+    //
+    bic r2, r2, #CPSR_MODES
+    orr r2, r2, #CPSR_SVC_MODE
+    msr cpsr_c, r2
+
+    //
+    // Save the SVC sp before we modify it
+    //
+    mov r2, sp
+
+    //
+    // Dummy OldIrql
+    //
+    //str r0, [sp, #-4]!
+
+    //
+    // Save the IRQ lr
+    //
+    str r0, [sp, #-4]!
+
+    //
+    // Save the SVC lr and sp
+    //
+    str lr, [sp, #-4]!
+    str r2, [sp, #-4]!
+
+    //
+    // Restore the saved SPSR
+    //
+    msr spsr_all, r3
+
+    //
+    // Restore our 4 registers
+    //
+    ldmdb r1, {r0-r3}
+
+    //
+    // Make space for the trap frame
+    //
+    sub sp, sp, #(4*15) // TrapFrameLength
+
+    //
+    // Save user-mode registers
+    //
+    stmia sp, {r0-r12}
+    add r0, sp, #(4*13)
+    stmia r0, {r13-r14}^
+    mov r0, r0
+
+    //
+    // Save SPSR
+    //
+    mrs r0, spsr_all
+    str r0, [sp, #-4]!
+
+    //
+    // Call the C handler
+    //
+    adr lr, IntExit
+    mov r0, sp
+    mov r1, #0
+    ldr pc, =KiInterruptHandler
+
+IntExit:
+
     //
     // FIXME: TODO
     //
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] Wed Jun 11 11:48:07 2008
@@ -27,6 +27,166 @@
 /* FUNCTIONS ******************************************************************/
+
+ULONG
+HalGetInterruptSource(VOID);
+
+VOID FASTCALL
+HalClearSoftwareInterrupt(IN KIRQL Request);
+
+VOID
+KiDispatchInterrupt(VOID)
+{
+    PKPCR Pcr;
+    PKTHREAD NewThread, OldThread;
+
+    //
+    // Get the PCR and disable interrupts
+    //
+    Pcr = (PKPCR)KeGetPcr();
+    _disable();
+
+    //
+    //Check if we have to deliver DPCs, timers, or deferred threads
+    //
+    if ((Pcr->Prcb->DpcData[0].DpcQueueDepth) ||
+        (Pcr->Prcb->TimerRequest) ||
+        (Pcr->Prcb->DeferredReadyListHead.Next))
+    {
+        //
+        // FIXME: TODO
+        //
+        DPRINT1("DPC/Timer Delivery!\n");
+        while (TRUE);
+    }
+
+    //
+    // Re-enable interrupts
+    //
+    _enable();
+
+    //
+    // Check for quantum end
+    //
+    if (Pcr->Prcb->QuantumEnd)
+    {
+        //
+        // FIXME: TODO
+        //
+        DPRINT1("Quantum End!\n");
+        while (TRUE);
+        return;
+    }
+
+    //
+    // Check if we have a thread to swap to
+    //
+    if (Pcr->Prcb->NextThread)
+    {
+        DPRINT1("Switching threads!\n");
+
+        //
+        // Next is now current
+        //
+        OldThread = Pcr->Prcb->CurrentThread;
+        NewThread = Pcr->Prcb->NextThread;
+        Pcr->Prcb->CurrentThread = NewThread;
+        Pcr->Prcb->NextThread = NULL;
+
+        //
+        // Update thread states
+        //
+        NewThread->State = Running;
+        OldThread->WaitReason = WrDispatchInt;
+
+        //
+        // Make the old thread ready
+        //
+        DPRINT1("Queueing the ready thread\n");
+        KxQueueReadyThread(OldThread, Pcr->Prcb);
+
+        //
+        // Swap to the new thread
+        //
+        DPRINT1("Swapping context!\n");
+        //KiSwapContextInternal();
+        while (TRUE);
+    }
+}
+
+VOID
+KiInterruptHandler(IN PKTRAP_FRAME TrapFrame,
+                   IN ULONG Reserved)
+{
+    KIRQL OldIrql, Irql;
+    ULONG InterruptCause, InterruptMask;
+    PKPCR Pcr;
+
+    //
+    // Get the old IRQL
+    //
+    OldIrql = TrapFrame->OldIrql;
+
+    //
+    // Get the interrupt source
+    //
+    InterruptCause = HalGetInterruptSource();
+    DPRINT1("Interrupt (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr,
TrapFrame->Pc);
+
+    //
+    // Get the new IRQL and Interrupt Mask
+    //
+    Pcr = (PKPCR)KeGetPcr();
+    Irql = Pcr->IrqlMask[InterruptCause];
+    InterruptMask = Pcr->IrqlTable[Irql];
+    DPRINT1("IRQL (%x) MASK (%x)\n", Irql, InterruptMask);
+
+    //
+    // Make sure the IRQL is valid
+    //
+    //if (OldIrql < Irql)
+    //{
+        //
+        // We should just return, probably
+        //
+        //DPRINT1("IRQL Race!\n");
+        //while (TRUE);
+    //}
+
+    //
+    // Check if this interrupt is at DISPATCH or higher
+    //
+    if (Irql > DISPATCH_LEVEL)
+    {
+        //
+        // ISR Handling Code
+        //
+        DPRINT1("ISR!\n");
+        while (TRUE);
+    }
+
+    //
+    // We know this is APC or DPC.
+    // Clear the software interrupt.
+    // Reenable interrupts and update the IRQL
+    //
+    HalClearSoftwareInterrupt(Irql);
+    _enable();
+    Pcr->CurrentIrql = Irql;
+
+    //
+    // Increment interrupt count
+    //
+    Pcr->Prcb->InterruptCount++;
+
+    //
+    // Call the registered interrupt routine
+    //
+    DPRINT1("Calling handler\n");
+    Pcr->InterruptRoutine[Irql]();
+    DPRINT1("Done!\n");
+    while (TRUE);
+}
 NTSTATUS
 KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame)
Modified: trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl-generic.…
==============================================================================
--- trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -403,6 +403,11 @@
                                <file>psctx.c</file>
                        </directory>
                </if>
+               <if property="ARCH" value="arm">
+                       <directory name="arm">
+                               <file>psctx.c</file>
+                       </directory>
+               </if>
                <file>debug.c</file>
                <file>job.c</file>
                <file>kill.c</file>
Added: trunk/reactos/ntoskrnl/ps/arm/psctx.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ps/arm/psctx.c?re…
==============================================================================
--- trunk/reactos/ntoskrnl/ps/arm/psctx.c (added)
+++ trunk/reactos/ntoskrnl/ps/arm/psctx.c [iso-8859-1] Wed Jun 11 11:48:07 2008
@@ -1,0 +1,47 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/ps/arm/pxctx.c
+ * PURPOSE:         Process Manager: Set/Get Context for ARM
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+NTAPI
+PspGetContext(IN PKTRAP_FRAME TrapFrame,
+              IN PVOID NonVolatileContext,
+              IN OUT PCONTEXT Context)
+{
+    PAGED_CODE();
+}
+
+VOID
+NTAPI
+PspSetContext(OUT PKTRAP_FRAME TrapFrame,
+              OUT PVOID NonVolatileContext,
+              IN PCONTEXT Context,
+              IN KPROCESSOR_MODE Mode)
+{
+    PAGED_CODE();
+}
+
+VOID
+NTAPI
+PspGetOrSetContextKernelRoutine(IN PKAPC Apc,
+                                IN OUT PKNORMAL_ROUTINE* NormalRoutine,
+                                IN OUT PVOID* NormalContext,
+                                IN OUT PVOID* SystemArgument1,
+                                IN OUT PVOID* SystemArgument2)
+{
+    UNIMPLEMENTED;
+}
+
+/* EOF */
Propchange: trunk/reactos/ntoskrnl/ps/arm/psctx.c
------------------------------------------------------------------------------
    svn:eol-style = native
Propchange: trunk/reactos/ntoskrnl/ps/arm/psctx.c
------------------------------------------------------------------------------
    svn:eol-tyle = native
Propchange: trunk/reactos/ntoskrnl/ps/arm/psctx.c
------------------------------------------------------------------------------
    svn:mime-type = text/plain