- Make another kind of page fault also be handleable by our hacked-up handler: paged...
authorReactOS Portable Systems Group <ros-arm-bringup@svn.reactos.org>
Wed, 12 Mar 2008 00:13:09 +0000 (00:13 +0000)
committerReactOS Portable Systems Group <ros-arm-bringup@svn.reactos.org>
Wed, 12 Mar 2008 00:13:09 +0000 (00:13 +0000)
- Current status: we now make it all the way to the first system call at the end of Phase 0!
- We now make the IRQL routines modify the IRQL saved in the KPCR, to make some assertions work.
- Build mem.c and memgen.c from RTL in order to get non-optimized but portable Rtl*Memory routines and Rtl*Swap routines.
- Take the PPC non-optimized but portable Ex*Interlocked* routines and make them available for ARM as well. Play with the code a bit to get other routines in there too.
- Major TODO: Cleanup these routines, re-format them, make them compatible for all architectures, and later on, provided optimized ARM versions.
- Remove _all* _aull* MSVC-i386 helper exports from the kernel, as well as Exfi386* routines -- they're only for x86 kernels.

svn path=/trunk/; revision=32664

reactos/hal/halarm/generic/hal.c
reactos/lib/rtl/rtl.rbuild
reactos/ntoskrnl/ex/fastinterlck.c [moved from reactos/ntoskrnl/ex/powerpc/fastinterlck.c with 67% similarity]
reactos/ntoskrnl/ke/arm/stubs_asm.s
reactos/ntoskrnl/ke/arm/thrdini.c
reactos/ntoskrnl/ke/arm/trapc.c
reactos/ntoskrnl/ntoskrnl-generic.rbuild
reactos/ntoskrnl/ntoskrnl_arm.def

index 1225c08..88ab9b3 100644 (file)
@@ -769,7 +769,8 @@ FASTCALL
 KfLowerIrql(
   KIRQL NewIrql)
 {
-  UNIMPLEMENTED;
+    KeGetPcr()->CurrentIrql = NewIrql;
+    UNIMPLEMENTED;
 }
 
 
@@ -778,9 +779,11 @@ FASTCALL
 KfRaiseIrql(
   KIRQL NewIrql)
 {
-  UNIMPLEMENTED;
+    KIRQL OldIrql = KeGetPcr()->CurrentIrql;
+    KeGetPcr()->CurrentIrql = NewIrql;
+    UNIMPLEMENTED;
 
-  return (KIRQL)0;
+    return OldIrql;
 }
 
 VOID
@@ -912,22 +915,28 @@ WRITE_PORT_USHORT(
 KIRQL
 KeSwapIrql(IN KIRQL Irql)
 {
+    KIRQL OldIrql = KeGetPcr()->CurrentIrql;
+    KeGetPcr()->CurrentIrql = Irql;
     UNIMPLEMENTED;
-    return 0;
+    return OldIrql;
 }
 
 KIRQL
 KeRaiseIrqlToDpcLevel(VOID)
 {
+    KIRQL OldIrql = KeGetPcr()->CurrentIrql;
+    KeGetPcr()->CurrentIrql = SYNCH_LEVEL;
     UNIMPLEMENTED;
-    return 0;
+    return OldIrql;
 }
 
 KIRQL
 KeRaiseIrqlToSynchLevel(VOID)
 {
+    KIRQL OldIrql = KeGetPcr()->CurrentIrql;
+    KeGetPcr()->CurrentIrql = SYNCH_LEVEL;
     UNIMPLEMENTED;
-    return 0;
+    return OldIrql;
 }
 
 BOOLEAN HalpProcessorIdentified;
index 7fae202..51dca8e 100644 (file)
@@ -33,6 +33,8 @@
                <directory name="arm">
                        <file>debug_asm.S</file>
                </directory>
+        <file>mem.c</file>
+        <file>memgen.c</file>
        </if>
        <directory name="austin">
                <file>avl.c</file>
similarity index 67%
rename from reactos/ntoskrnl/ex/powerpc/fastinterlck.c
rename to reactos/ntoskrnl/ex/fastinterlck.c
index 3f0722f..a0d239d 100644 (file)
-/*\r
- * PROJECT:         ReactOS Kernel\r
- * COPYRIGHT:       GPL - See COPYING in the top level directory\r
- * FILE:            ntoskrnl/ex/powerpc/fastinterlck.c\r
- * PURPOSE:         Executive Atom Functions\r
- * PROGRAMMERS:     Art Yerkes\r
- */\r
-\r
-/* INCLUDES *****************************************************************/\r
-\r
-#include <ntoskrnl.h>\r
-#include <internal/debug.h>\r
-\r
-NTKERNELAPI\r
-PSINGLE_LIST_ENTRY\r
-FASTCALL\r
-ExInterlockedFlushSList(IN PSLIST_HEADER  ListHead)\r
-{\r
-    PSLIST_ENTRY NewHead = NULL;\r
-    _InterlockedExchangePointer((PVOID *)&ListHead->Next.Next, &NewHead);\r
-    return NewHead;\r
-}\r
-\r
-#undef ExInterlockedPushEntrySList\r
-NTKERNELAPI\r
-PSLIST_ENTRY\r
-FASTCALL\r
-ExInterlockedPushEntrySList\r
-(IN PSLIST_HEADER  ListHead,\r
- IN PSLIST_ENTRY  ListEntry)\r
-{\r
-    return InterlockedPushEntrySList(ListHead, ListEntry);\r
-}\r
-\r
-#undef ExInterlockedPopEntrySList\r
-NTKERNELAPI\r
-PSINGLE_LIST_ENTRY\r
-NTAPI\r
-ExInterlockedPopEntrySList(\r
-  IN PSLIST_HEADER  ListHead,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    return InterlockedPopEntrySList(ListHead);\r
-}\r
-\r
-#undef ExInterlockedAddULong\r
-NTKERNELAPI\r
-ULONG\r
-NTAPI\r
-ExfInterlockedAddUlong(\r
-  IN PULONG  Addend,\r
-  IN ULONG  Increment,\r
-  PKSPIN_LOCK  Lock)\r
-{\r
-    KIRQL OldIrql;\r
-    KeAcquireSpinLock(Lock, &OldIrql);\r
-    *Addend += Increment;\r
-    KeReleaseSpinLock(Lock, OldIrql);\r
-    return *Addend;\r
-}\r
-\r
-NTKERNELAPI\r
-LONGLONG\r
-FASTCALL\r
-ExfInterlockedCompareExchange64(\r
-  IN OUT LONGLONG volatile  *Destination,\r
-  IN PLONGLONG  Exchange,\r
-  IN PLONGLONG  Comperand)\r
-{\r
-    return _InterlockedCompareExchange64(Destination, *Exchange, *Comperand);\r
-}\r
-\r
-NTKERNELAPI\r
-PLIST_ENTRY\r
-FASTCALL\r
-ExfInterlockedInsertHeadList(\r
-  IN PLIST_ENTRY  ListHead,\r
-  IN PLIST_ENTRY  ListEntry,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    KIRQL OldIrql;\r
-    PLIST_ENTRY OldHead = NULL;\r
-    KeAcquireSpinLock(Lock, &OldIrql);\r
-    if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink;\r
-    InsertHeadList(ListHead, ListEntry);\r
-    KeReleaseSpinLock(Lock, OldIrql);\r
-    return OldHead;\r
-}\r
-\r
-NTKERNELAPI\r
-PLIST_ENTRY\r
-FASTCALL\r
-ExfInterlockedInsertTailList(\r
-  IN PLIST_ENTRY  ListHead,\r
-  IN PLIST_ENTRY  ListEntry,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    KIRQL OldIrql;\r
-    PLIST_ENTRY OldHead = NULL;\r
-    KeAcquireSpinLock(Lock,&OldIrql);\r
-    if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink;\r
-    InsertTailList(ListHead, ListEntry);\r
-    KeReleaseSpinLock(Lock, OldIrql);\r
-    return OldHead;\r
-}\r
-\r
-NTKERNELAPI\r
-PSINGLE_LIST_ENTRY\r
-FASTCALL\r
-ExfInterlockedPopEntryList(\r
-  IN PSINGLE_LIST_ENTRY  ListHead,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    return NULL;\r
-}\r
-\r
-NTKERNELAPI\r
-PSINGLE_LIST_ENTRY\r
-FASTCALL\r
-ExfInterlockedPushEntryList(\r
-  IN PSINGLE_LIST_ENTRY  ListHead,\r
-  IN PSINGLE_LIST_ENTRY  ListEntry,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    return NULL;\r
-}\r
-\r
-NTKERNELAPI\r
-PLIST_ENTRY\r
-FASTCALL\r
-ExfInterlockedRemoveHeadList(\r
-  IN PLIST_ENTRY  ListHead,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    return ExInterlockedRemoveHeadList(ListHead, Lock);\r
-}\r
-\r
-NTKERNELAPI\r
-INTERLOCKED_RESULT\r
-FASTCALL\r
-Exfi386InterlockedIncrementLong(\r
-  IN PLONG  Addend)\r
-{\r
-    return InterlockedIncrement(Addend);\r
-}\r
-\r
-NTKERNELAPI\r
-INTERLOCKED_RESULT\r
-FASTCALL\r
-Exfi386InterlockedDecrementLong(\r
-  IN PLONG  Addend)\r
-{\r
-    return InterlockedDecrement(Addend);\r
-}\r
-\r
-NTKERNELAPI\r
-ULONG\r
-FASTCALL\r
-Exfi386InterlockedExchangeUlong(\r
-  IN PULONG  Target,\r
-  IN ULONG  Value)\r
-{\r
-    return (ULONG)_InterlockedExchange((PLONG)Target, Value);\r
-}\r
-\r
-NTKERNELAPI\r
-LARGE_INTEGER\r
-NTAPI\r
-ExInterlockedAddLargeInteger(\r
-  IN PLARGE_INTEGER  Addend,\r
-  IN LARGE_INTEGER  Increment,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    LARGE_INTEGER tmp, comp, outnum;\r
-\r
-    do {\r
-        tmp.QuadPart = Addend->QuadPart + Increment.QuadPart;\r
-        comp = *Addend;\r
-        outnum.QuadPart = _InterlockedCompareExchange64\r
-            (&Addend->QuadPart, tmp.QuadPart, comp.QuadPart);\r
-    } while(outnum.QuadPart != comp.QuadPart);\r
-\r
-    return outnum;\r
-}\r
-\r
-NTKERNELAPI\r
-ULONG\r
-NTAPI\r
-ExInterlockedAddUlong(\r
-  IN PULONG  Addend,\r
-  IN ULONG  Increment,\r
-  PKSPIN_LOCK  Lock)\r
-{\r
-    return (ULONG)_InterlockedExchangeAdd((PLONG)Addend, Increment);\r
-}\r
-\r
-#undef ExInterlockedIncrementLong\r
-NTKERNELAPI\r
-INTERLOCKED_RESULT\r
-NTAPI\r
-ExInterlockedIncrementLong(\r
-    IN PLONG  Addend,\r
-    IN PKSPIN_LOCK Lock)\r
-{\r
-    return _InterlockedIncrement(Addend);\r
-}\r
-\r
-#undef ExInterlockedDecrementLong\r
-NTKERNELAPI\r
-INTERLOCKED_RESULT\r
-NTAPI\r
-ExInterlockedDecrementLong(\r
-    IN PLONG  Addend,\r
-    IN PKSPIN_LOCK Lock)\r
-{\r
-    return _InterlockedDecrement(Addend);\r
-}\r
-\r
-NTKERNELAPI\r
-ULONG\r
-NTAPI\r
-ExInterlockedExchangeUlong(\r
-  IN PULONG  Target,\r
-  IN ULONG  Value,\r
-  IN PKSPIN_LOCK Lock)\r
-{\r
-    return (ULONG)_InterlockedExchange((PLONG)Target, Value);\r
-}\r
-\r
-NTKERNELAPI\r
-PLIST_ENTRY\r
-NTAPI\r
-ExInterlockedInsertHeadList(\r
-  IN PLIST_ENTRY  ListHead,\r
-  IN PLIST_ENTRY  ListEntry,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    KIRQL OldIrql;\r
-    PLIST_ENTRY OldHead = NULL;\r
-    KeAcquireSpinLock(Lock,&OldIrql);\r
-    if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink;\r
-    InsertHeadList(ListHead, ListEntry);\r
-    KeReleaseSpinLock(Lock, OldIrql);\r
-    return OldHead;\r
-}\r
-\r
-NTKERNELAPI\r
-PLIST_ENTRY\r
-NTAPI\r
-ExInterlockedInsertTailList(\r
-  IN PLIST_ENTRY  ListHead,\r
-  IN PLIST_ENTRY  ListEntry,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    KIRQL OldIrql;\r
-    PLIST_ENTRY OldHead = NULL;\r
-    KeAcquireSpinLock(Lock,&OldIrql);\r
-    if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink;\r
-    InsertTailList(ListHead, ListEntry);\r
-    KeReleaseSpinLock(Lock, OldIrql);\r
-    return OldHead;\r
-}\r
-\r
-NTKERNELAPI\r
-PSINGLE_LIST_ENTRY\r
-NTAPI\r
-ExInterlockedPopEntryList(\r
-  IN PSINGLE_LIST_ENTRY  ListHead,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    return NULL;\r
-}\r
-\r
-NTKERNELAPI\r
-PSINGLE_LIST_ENTRY\r
-NTAPI\r
-ExInterlockedPushEntryList(\r
-  IN PSINGLE_LIST_ENTRY  ListHead,\r
-  IN PSINGLE_LIST_ENTRY  ListEntry,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    return NULL;\r
-}\r
-\r
-NTKERNELAPI\r
-PLIST_ENTRY\r
-NTAPI\r
-ExInterlockedRemoveHeadList(\r
-  IN PLIST_ENTRY  ListHead,\r
-  IN PKSPIN_LOCK  Lock)\r
-{\r
-    return NULL;\r
-}\r
+/*
+ * PROJECT:         ReactOS Kernel
+ * COPYRIGHT:       GPL - See COPYING in the top level directory
+ * FILE:            ntoskrnl/ex/powerpc/fastinterlck.c
+ * PURPOSE:         Executive Atom Functions
+ * PROGRAMMERS:     Art Yerkes
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#include <internal/debug.h>
+
+NTKERNELAPI
+PSLIST_ENTRY
+NTAPI
+InterlockedPushEntrySList(IN PSLIST_HEADER ListHead,
+                          IN PSLIST_ENTRY ListEntry)
+{
+    
+    PSINGLE_LIST_ENTRY FirstEntry, NextEntry, Entry = (PVOID)ListEntry, Head = (PVOID)ListHead;
+    
+    FirstEntry = Head->Next;
+    do
+    {
+        Entry->Next = FirstEntry;
+        NextEntry = FirstEntry;
+        FirstEntry = (PVOID)_InterlockedCompareExchange((PLONG)Head, (LONG)Entry, (LONG)FirstEntry);
+    } while (FirstEntry != NextEntry);
+    
+    return FirstEntry;
+}
+
+NTKERNELAPI
+PSLIST_ENTRY
+NTAPI
+InterlockedPopEntrySList(IN PSLIST_HEADER ListHead)
+{
+    PSINGLE_LIST_ENTRY FirstEntry, NextEntry, Head = (PVOID)ListHead;
+    
+    FirstEntry = Head->Next;
+    do
+    {
+        if (!FirstEntry) return NULL;
+
+        NextEntry = FirstEntry;
+        FirstEntry = (PVOID)_InterlockedCompareExchange((PLONG)Head, (LONG)FirstEntry->Next, (LONG)FirstEntry);
+    } while (FirstEntry != NextEntry);
+
+    return FirstEntry;    
+}
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExInterlockedFlushSList(IN PSLIST_HEADER ListHead)
+{
+    return (PVOID)_InterlockedExchange((PLONG)&ListHead->Next.Next, (LONG)NULL);
+}
+
+#undef ExInterlockedPushEntrySList
+NTKERNELAPI
+PSLIST_ENTRY
+FASTCALL
+ExInterlockedPushEntrySList
+(IN PSLIST_HEADER  ListHead,
+ IN PSLIST_ENTRY  ListEntry)
+{
+    return InterlockedPushEntrySList(ListHead, ListEntry);
+}
+
+#undef ExInterlockedPopEntrySList
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+NTAPI
+ExInterlockedPopEntrySList(
+  IN PSLIST_HEADER  ListHead,
+  IN PKSPIN_LOCK  Lock)
+{
+    return InterlockedPopEntrySList(ListHead);
+}
+
+#undef ExInterlockedAddULong
+NTKERNELAPI
+ULONG
+NTAPI
+ExfInterlockedAddUlong(
+  IN PULONG  Addend,
+  IN ULONG  Increment,
+  PKSPIN_LOCK  Lock)
+{
+    KIRQL OldIrql;
+    KeAcquireSpinLock(Lock, &OldIrql);
+    *Addend += Increment;
+    KeReleaseSpinLock(Lock, OldIrql);
+    return *Addend;
+}
+
+NTKERNELAPI
+LONGLONG
+FASTCALL
+ExfInterlockedCompareExchange64(
+  IN OUT LONGLONG volatile  *Destination,
+  IN PLONGLONG  Exchange,
+  IN PLONGLONG  Comperand)
+{
+    LONGLONG Result;
+    
+    Result = *Destination;
+    if (*Destination == Result) *Destination = *Exchange;
+    return Result;
+}
+
+NTKERNELAPI
+PLIST_ENTRY
+FASTCALL
+ExfInterlockedInsertHeadList(
+  IN PLIST_ENTRY  ListHead,
+  IN PLIST_ENTRY  ListEntry,
+  IN PKSPIN_LOCK  Lock)
+{
+    KIRQL OldIrql;
+    PLIST_ENTRY OldHead = NULL;
+    KeAcquireSpinLock(Lock, &OldIrql);
+    if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink;
+    InsertHeadList(ListHead, ListEntry);
+    KeReleaseSpinLock(Lock, OldIrql);
+    return OldHead;
+}
+
+NTKERNELAPI
+PLIST_ENTRY
+FASTCALL
+ExfInterlockedInsertTailList(
+  IN PLIST_ENTRY  ListHead,
+  IN PLIST_ENTRY  ListEntry,
+  IN PKSPIN_LOCK  Lock)
+{
+    KIRQL OldIrql;
+    PLIST_ENTRY OldHead = NULL;
+    KeAcquireSpinLock(Lock,&OldIrql);
+    if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink;
+    InsertTailList(ListHead, ListEntry);
+    KeReleaseSpinLock(Lock, OldIrql);
+    return OldHead;
+}
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExfInterlockedPopEntryList(
+  IN PSINGLE_LIST_ENTRY  ListHead,
+  IN PKSPIN_LOCK  Lock)
+{
+    return NULL;
+}
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExfInterlockedPushEntryList(
+  IN PSINGLE_LIST_ENTRY  ListHead,
+  IN PSINGLE_LIST_ENTRY  ListEntry,
+  IN PKSPIN_LOCK  Lock)
+{
+    return NULL;
+}
+
+NTKERNELAPI
+PLIST_ENTRY
+FASTCALL
+ExfInterlockedRemoveHeadList(
+  IN PLIST_ENTRY  ListHead,
+  IN PKSPIN_LOCK  Lock)
+{
+    return ExInterlockedRemoveHeadList(ListHead, Lock);
+}
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedIncrementLong(
+  IN PLONG  Addend)
+{
+    return InterlockedIncrement(Addend);
+}
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedDecrementLong(
+  IN PLONG  Addend)
+{
+    return InterlockedDecrement(Addend);
+}
+
+NTKERNELAPI
+ULONG
+FASTCALL
+Exfi386InterlockedExchangeUlong(
+  IN PULONG  Target,
+  IN ULONG  Value)
+{
+    return (ULONG)_InterlockedExchange((PLONG)Target, Value);
+}
+
+NTKERNELAPI
+LARGE_INTEGER
+NTAPI
+ExInterlockedAddLargeInteger(
+  IN PLARGE_INTEGER  Addend,
+  IN LARGE_INTEGER  Increment,
+  IN PKSPIN_LOCK  Lock)
+{
+    LARGE_INTEGER Integer = {{0}};
+    UNIMPLEMENTED;
+    return Integer;
+}
+
+NTKERNELAPI
+ULONG
+NTAPI
+ExInterlockedAddUlong(
+  IN PULONG  Addend,
+  IN ULONG  Increment,
+  PKSPIN_LOCK  Lock)
+{
+    return (ULONG)_InterlockedExchangeAdd((PLONG)Addend, Increment);
+}
+
+#undef ExInterlockedIncrementLong
+NTKERNELAPI
+INTERLOCKED_RESULT
+NTAPI
+ExInterlockedIncrementLong(
+    IN PLONG  Addend,
+    IN PKSPIN_LOCK Lock)
+{
+    return _InterlockedIncrement(Addend);
+}
+
+#undef ExInterlockedDecrementLong
+NTKERNELAPI
+INTERLOCKED_RESULT
+NTAPI
+ExInterlockedDecrementLong(
+    IN PLONG  Addend,
+    IN PKSPIN_LOCK Lock)
+{
+    return _InterlockedDecrement(Addend);
+}
+
+NTKERNELAPI
+ULONG
+NTAPI
+ExInterlockedExchangeUlong(
+  IN PULONG  Target,
+  IN ULONG  Value,
+  IN PKSPIN_LOCK Lock)
+{
+    return (ULONG)_InterlockedExchange((PLONG)Target, Value);
+}
+
+NTKERNELAPI
+PLIST_ENTRY
+NTAPI
+ExInterlockedInsertHeadList(
+  IN PLIST_ENTRY  ListHead,
+  IN PLIST_ENTRY  ListEntry,
+  IN PKSPIN_LOCK  Lock)
+{
+    KIRQL OldIrql;
+    PLIST_ENTRY OldHead = NULL;
+    KeAcquireSpinLock(Lock,&OldIrql);
+    if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink;
+    InsertHeadList(ListHead, ListEntry);
+    KeReleaseSpinLock(Lock, OldIrql);
+    return OldHead;
+}
+
+NTKERNELAPI
+PLIST_ENTRY
+NTAPI
+ExInterlockedInsertTailList(
+  IN PLIST_ENTRY  ListHead,
+  IN PLIST_ENTRY  ListEntry,
+  IN PKSPIN_LOCK  Lock)
+{
+    KIRQL OldIrql;
+    PLIST_ENTRY OldHead = NULL;
+    KeAcquireSpinLock(Lock,&OldIrql);
+    if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink;
+    InsertTailList(ListHead, ListEntry);
+    KeReleaseSpinLock(Lock, OldIrql);
+    return OldHead;
+}
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+NTAPI
+ExInterlockedPopEntryList(
+  IN PSINGLE_LIST_ENTRY  ListHead,
+  IN PKSPIN_LOCK  Lock)
+{
+    KIRQL OldIrql;
+    PSINGLE_LIST_ENTRY OldHead = NULL;
+    KeAcquireSpinLock(Lock,&OldIrql);
+    OldHead = PopEntryList(ListHead);
+    KeReleaseSpinLock(Lock, OldIrql);
+    return OldHead;
+}
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+NTAPI
+ExInterlockedPushEntryList(
+  IN PSINGLE_LIST_ENTRY  ListHead,
+  IN PSINGLE_LIST_ENTRY  ListEntry,
+  IN PKSPIN_LOCK  Lock)
+{
+    KIRQL OldIrql;
+    PSINGLE_LIST_ENTRY OldHead = NULL;
+    KeAcquireSpinLock(Lock,&OldIrql);
+    OldHead = PushEntryList(ListHead, ListEntry);
+    KeReleaseSpinLock(Lock, OldIrql);
+    return OldHead;
+}
+
+NTKERNELAPI
+PLIST_ENTRY
+NTAPI
+ExInterlockedRemoveHeadList(
+  IN PLIST_ENTRY  ListHead,
+  IN PKSPIN_LOCK  Lock)
+{
+    KIRQL OldIrql;
+    PLIST_ENTRY OldHead = NULL;
+    KeAcquireSpinLock(Lock,&OldIrql);
+    OldHead = RemoveHeadList(ListHead);
+    KeReleaseSpinLock(Lock, OldIrql);
+    return OldHead;
+}
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExInterlockedAddLargeStatistic
+(IN PLARGE_INTEGER  Addend,
+ IN ULONG  Increment)
+{
+    UNIMPLEMENTED;
+}
+
+NTKERNELAPI
+LONGLONG
+FASTCALL
+ExInterlockedCompareExchange64(IN OUT PLONGLONG  Destination,
+                               IN PLONGLONG  Exchange,
+                               IN PLONGLONG  Comparand,
+                               IN PKSPIN_LOCK  Lock)
+{
+    KIRQL OldIrql;
+    LONGLONG Result;
+    
+    KeAcquireSpinLock(Lock, &OldIrql);
+    Result = *Destination;
+    if (*Destination == Result) *Destination = *Exchange;
+    KeReleaseSpinLock(Lock, OldIrql);
+    return Result;
+}
index b7e3465..1c1549d 100644 (file)
@@ -1,39 +1,5 @@
 #include <internal/arm/asmmacro.S>
 
-//
-// Interlocked APIs
-//
-GENERATE_ARM_STUB ExInterlockedAddLargeInteger 
-GENERATE_ARM_STUB ExInterlockedAddLargeStatistic 
-GENERATE_ARM_STUB ExInterlockedAddUlong 
-GENERATE_ARM_STUB ExInterlockedCompareExchange64
-GENERATE_ARM_STUB ExInterlockedDecrementLong 
-GENERATE_ARM_STUB ExInterlockedExchangeUlong 
-GENERATE_ARM_STUB ExInterlockedFlushSList 
-GENERATE_ARM_STUB ExInterlockedIncrementLong 
-GENERATE_ARM_STUB ExInterlockedInsertHeadList 
-GENERATE_ARM_STUB ExInterlockedInsertTailList 
-GENERATE_ARM_STUB ExInterlockedPopEntryList 
-GENERATE_ARM_STUB ExInterlockedPopEntrySList 
-GENERATE_ARM_STUB ExInterlockedPushEntryList 
-GENERATE_ARM_STUB ExInterlockedPushEntrySList 
-GENERATE_ARM_STUB ExInterlockedRemoveHeadList 
-GENERATE_ARM_STUB ExfInterlockedAddUlong 
-GENERATE_ARM_STUB ExfInterlockedCompareExchange64
-GENERATE_ARM_STUB ExfInterlockedInsertHeadList 
-GENERATE_ARM_STUB ExfInterlockedInsertTailList 
-GENERATE_ARM_STUB ExfInterlockedPopEntryList 
-GENERATE_ARM_STUB ExfInterlockedPushEntryList 
-GENERATE_ARM_STUB ExfInterlockedRemoveHeadList 
-GENERATE_ARM_STUB Exfi386InterlockedDecrementLong 
-GENERATE_ARM_STUB Exfi386InterlockedExchangeUlong 
-GENERATE_ARM_STUB Exfi386InterlockedIncrementLong 
-GENERATE_ARM_STUB Exi386InterlockedDecrementLong 
-GENERATE_ARM_STUB Exi386InterlockedExchangeUlong 
-GENERATE_ARM_STUB Exi386InterlockedIncrementLong 
-GENERATE_ARM_STUB InterlockedPopEntrySList 
-GENERATE_ARM_STUB InterlockedPushEntrySList 
-
 //
 // Port I/O and Register Access
 //
@@ -50,35 +16,6 @@ GENERATE_ARM_STUB WRITE_REGISTER_UCHAR
 GENERATE_ARM_STUB WRITE_REGISTER_ULONG 
 GENERATE_ARM_STUB WRITE_REGISTER_USHORT 
 
-//
-// CRT APIs implemented in ASM
-//
-GENERATE_ARM_STUB _alldiv 
-GENERATE_ARM_STUB _alldvrm 
-GENERATE_ARM_STUB _allmul 
-GENERATE_ARM_STUB _alloca_probe 
-GENERATE_ARM_STUB _allrem 
-GENERATE_ARM_STUB _allshl 
-GENERATE_ARM_STUB _allshr 
-GENERATE_ARM_STUB _aulldiv 
-GENERATE_ARM_STUB _aulldvrm 
-GENERATE_ARM_STUB _aullrem 
-GENERATE_ARM_STUB _aullshr 
-
-//
-// RTL CRT-like APIs implemented in ASM
-//
-GENERATE_ARM_STUB RtlCompareMemory 
-GENERATE_ARM_STUB RtlCompareMemoryUlong 
-GENERATE_ARM_STUB RtlFillMemory 
-GENERATE_ARM_STUB RtlFillMemoryUlong 
-GENERATE_ARM_STUB RtlMoveMemory 
-GENERATE_ARM_STUB RtlPrefetchMemoryNonTemporal 
-GENERATE_ARM_STUB RtlUlongByteSwap 
-GENERATE_ARM_STUB RtlUlonglongByteSwap 
-GENERATE_ARM_STUB RtlUshortByteSwap 
-GENERATE_ARM_STUB RtlZeroMemory 
-
 //
 // Exceptions
 //
index 7ca1ebb..0a8bdab 100644 (file)
@@ -87,7 +87,7 @@ KeArmInitThreadWithContext(IN PKTHREAD Thread,
         //
         // Set the previous mode as user
         //
-        TrapFrame->PreviousMode = UserMode;
+        //TrapFrame->PreviousMode = UserMode;
         Thread->PreviousMode = UserMode;
         
         //
@@ -112,7 +112,7 @@ KeArmInitThreadWithContext(IN PKTHREAD Thread,
         //
         // Set the previous mode as kernel
         //
-        Thread->PreviousMode = KernelMode;
+        //Thread->PreviousMode = KernelMode;
         
         //
         // Context switch frame to setup below
index a88c8bf..3bae211 100644 (file)
@@ -27,7 +27,7 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame)
     //
     // Check if this is a page fault
     //
-    if (KeArmFaultStatusRegisterGet() == 21)
+    if (KeArmFaultStatusRegisterGet() == 21 || KeArmFaultStatusRegisterGet() == 23)
     {
         Status = MmAccessFault(FALSE,
                                Address,
index ade034c..c4378db 100644 (file)
                <if property="ARCH" value="powerpc">
                        <directory name="powerpc">
                                <file>ioport.s</file>
-                               <file>fastinterlck.c</file>
                        </directory>
+            <file>fastinterlck.c</file>
+               </if>
+               <if property="ARCH" value="arm">
+            <file>fastinterlck.c</file>
                </if>
                <file>atom.c</file>
                <file>callback.c</file>
index 43f8504..59a7420 100644 (file)
@@ -167,12 +167,6 @@ ExfInterlockedCompareExchange64
 ExfInterlockedPopEntryList
 ExfInterlockedPushEntryList
 ExfInterlockedRemoveHeadList
-Exfi386InterlockedDecrementLong
-Exfi386InterlockedExchangeUlong
-Exfi386InterlockedIncrementLong
-Exi386InterlockedDecrementLong
-Exi386InterlockedExchangeUlong
-Exi386InterlockedIncrementLong
 FsRtlAcquireFileExclusive
 ;FsRtlAddBaseMcbEntry
 FsRtlAddLargeMcbEntry
@@ -1435,17 +1429,6 @@ ZwWaitForSingleObject
 ZwWriteFile
 ZwYieldExecution
 _abnormal_termination
-_alldiv
-_allmul
-_alloca_probe
-_allrem
-_allshl
-_allshr
-_alldvrm
-_aulldiv
-_aulldvrm
-_aullrem
-_aullshr
 _except_handler2
 _except_handler3
 _global_unwind2