Author: ros-arm-bringup Date: Wed Mar 12 13:17:55 2008 New Revision: 32666
URL: http://svn.reactos.org/svn/reactos?rev=3D32666&view=3Drev Log: - We now define a much simpler system call interface -- instead of using in= terrupt 2E with the system call ID in the ip register, we use the system ca= ll ID as the interrupt number! On ARM, all software interrupts have a gener= ic handler, so ANY software interrupt will be a system call, and the interr= upt number is the system call ID! - Removed a bunch more i386-only exports from the ARM kernel. - Implemented all the READ/WRITE_REGISTER* routines for ARM/PPC. - Implement half of KiSoftwareInterruptException, which calls KiSoftwareInt= erruptHandler, which calls KiSystemService. We now reach the first kernel-m= ode system call! (ZwClose from PspInitPhase0). - Reformat fastinterlck.c and change the way it's included per-architecture.
Modified: trunk/reactos/ntoskrnl/ex/exintrin.c trunk/reactos/ntoskrnl/ex/fastinterlck.c trunk/reactos/ntoskrnl/ex/init.c trunk/reactos/ntoskrnl/include/internal/arm/ksarm.h 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 trunk/reactos/ntoskrnl/ntoskrnl_arm.def trunk/reactos/tools/nci/ncitool.c
Modified: trunk/reactos/ntoskrnl/ex/exintrin.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/exintrin.= c?rev=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/ex/exintrin.c (original) +++ trunk/reactos/ntoskrnl/ex/exintrin.c Wed Mar 12 13:17:55 2008 @@ -17,6 +17,11 @@ #undef InterlockedCompareExchange #undef InterlockedExchangeAdd #undef InterlockedExchange + +// +// HAL Port to Inlined Port +// +#define H2I(Port) PtrToUshort(Port) =
/* FUNCTIONS *************************************************************= *****/ =
Modified: trunk/reactos/ntoskrnl/ex/fastinterlck.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/fastinter= lck.c?rev=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/ex/fastinterlck.c (original) +++ trunk/reactos/ntoskrnl/ex/fastinterlck.c Wed Mar 12 13:17:55 2008 @@ -1,37 +1,49 @@ /* * 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 + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ex/fastinterlck.c + * PURPOSE: Portable Ex*Interlocked and REGISTER routines for non-= x86 + * PROGRAMMERS: ReactOS Portable Systems Group */ =
-/* INCLUDES **************************************************************= ***/ +/* INCLUDES **************************************************************= *****/ + +#if defined(_ARM_) || defined(_PPC_) || defined(NTOS_USE_GENERICS) =
#include <ntoskrnl.h> -#include <internal/debug.h> - -NTKERNELAPI +#define NDEBUG +#include <debug.h> + +#undef ExInterlockedPushEntrySList +#undef ExInterlockedPopEntrySList +#undef ExInterlockedAddULong +#undef ExInterlockedIncrementLong +#undef ExInterlockedDecrementLong + +/* FUNCTIONS *************************************************************= *****/ + PSLIST_ENTRY NTAPI InterlockedPushEntrySList(IN PSLIST_HEADER ListHead, IN PSLIST_ENTRY ListEntry) { =
- PSINGLE_LIST_ENTRY FirstEntry, NextEntry, Entry =3D (PVOID)ListEntry, = Head =3D (PVOID)ListHead; + PSINGLE_LIST_ENTRY FirstEntry, NextEntry; + PSINGLE_LIST_ENTRY Entry =3D (PVOID)ListEntry, Head =3D (PVOID)ListHea= d; =
FirstEntry =3D Head->Next; do { Entry->Next =3D FirstEntry; NextEntry =3D FirstEntry; - FirstEntry =3D (PVOID)_InterlockedCompareExchange((PLONG)Head, (LO= NG)Entry, (LONG)FirstEntry); + FirstEntry =3D (PVOID)_InterlockedCompareExchange((PLONG)Head, + (LONG)Entry, + (LONG)FirstEntry); } while (FirstEntry !=3D NextEntry); =
return FirstEntry; } =
-NTKERNELAPI PSLIST_ENTRY NTAPI InterlockedPopEntrySList(IN PSLIST_HEADER ListHead) @@ -44,13 +56,14 @@ if (!FirstEntry) return NULL; =
NextEntry =3D FirstEntry; - FirstEntry =3D (PVOID)_InterlockedCompareExchange((PLONG)Head, (LO= NG)FirstEntry->Next, (LONG)FirstEntry); + FirstEntry =3D (PVOID)_InterlockedCompareExchange((PLONG)Head, + (LONG)FirstEntry->= Next, + (LONG)FirstEntry); } while (FirstEntry !=3D NextEntry); =
return FirstEntry; =
} =
-NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedFlushSList(IN PSLIST_HEADER ListHead) @@ -58,36 +71,27 @@ return (PVOID)_InterlockedExchange((PLONG)&ListHead->Next.Next, (LONG)= NULL); } =
-#undef ExInterlockedPushEntrySList -NTKERNELAPI PSLIST_ENTRY FASTCALL -ExInterlockedPushEntrySList -(IN PSLIST_HEADER ListHead, - IN PSLIST_ENTRY ListEntry) +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) +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) +ExfInterlockedAddUlong(IN PULONG Addend, + IN ULONG Increment, + PKSPIN_LOCK Lock) { KIRQL OldIrql; KeAcquireSpinLock(Lock, &OldIrql); @@ -96,13 +100,11 @@ return *Addend; } =
-NTKERNELAPI LONGLONG FASTCALL -ExfInterlockedCompareExchange64( - IN OUT LONGLONG volatile *Destination, - IN PLONGLONG Exchange, - IN PLONGLONG Comperand) +ExfInterlockedCompareExchange64(IN OUT LONGLONG volatile *Destination, + IN PLONGLONG Exchange, + IN PLONGLONG Comperand) { LONGLONG Result; =
@@ -111,13 +113,11 @@ return Result; } =
-NTKERNELAPI -PLIST_ENTRY -FASTCALL -ExfInterlockedInsertHeadList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) +PLIST_ENTRY +FASTCALL +ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock) { KIRQL OldIrql; PLIST_ENTRY OldHead =3D NULL; @@ -128,13 +128,11 @@ return OldHead; } =
-NTKERNELAPI -PLIST_ENTRY -FASTCALL -ExfInterlockedInsertTailList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) +PLIST_ENTRY +FASTCALL +ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock) { KIRQL OldIrql; PLIST_ENTRY OldHead =3D NULL; @@ -145,129 +143,83 @@ return OldHead; } =
-NTKERNELAPI -PSINGLE_LIST_ENTRY -FASTCALL -ExfInterlockedPopEntryList( - IN PSINGLE_LIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) -{ +PSINGLE_LIST_ENTRY +FASTCALL +ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead, + IN PKSPIN_LOCK Lock) +{ + UNIMPLEMENTED; return NULL; } =
-NTKERNELAPI -PSINGLE_LIST_ENTRY -FASTCALL -ExfInterlockedPushEntryList( - IN PSINGLE_LIST_ENTRY ListHead, - IN PSINGLE_LIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ +PSINGLE_LIST_ENTRY +FASTCALL +ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead, + IN PSINGLE_LIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock) +{ + UNIMPLEMENTED; return NULL; } =
-NTKERNELAPI -PLIST_ENTRY -FASTCALL -ExfInterlockedRemoveHeadList( - IN PLIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) +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) +ExInterlockedAddLargeInteger(IN PLARGE_INTEGER Addend, + IN LARGE_INTEGER Increment, + IN PKSPIN_LOCK Lock) { LARGE_INTEGER Integer =3D {{0}}; UNIMPLEMENTED; return Integer; } =
-NTKERNELAPI ULONG NTAPI -ExInterlockedAddUlong( - IN PULONG Addend, - IN ULONG Increment, - PKSPIN_LOCK Lock) +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) +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) +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) +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) +PLIST_ENTRY +NTAPI +ExInterlockedInsertHeadList(IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock) { KIRQL OldIrql; PLIST_ENTRY OldHead =3D NULL; @@ -278,13 +230,11 @@ return OldHead; } =
-NTKERNELAPI -PLIST_ENTRY -NTAPI -ExInterlockedInsertTailList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) +PLIST_ENTRY +NTAPI +ExInterlockedInsertTailList(IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY ListEntry, + IN PKSPIN_LOCK Lock) { KIRQL OldIrql; PLIST_ENTRY OldHead =3D NULL; @@ -295,12 +245,10 @@ return OldHead; } =
-NTKERNELAPI -PSINGLE_LIST_ENTRY -NTAPI -ExInterlockedPopEntryList( - IN PSINGLE_LIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) +PSINGLE_LIST_ENTRY +NTAPI +ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead, + IN PKSPIN_LOCK Lock) { KIRQL OldIrql; PSINGLE_LIST_ENTRY OldHead =3D NULL; @@ -310,13 +258,11 @@ return OldHead; } =
-NTKERNELAPI -PSINGLE_LIST_ENTRY -NTAPI -ExInterlockedPushEntryList( - IN PSINGLE_LIST_ENTRY ListHead, - IN PSINGLE_LIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) +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 =3D NULL; @@ -326,12 +272,10 @@ return OldHead; } =
-NTKERNELAPI -PLIST_ENTRY -NTAPI -ExInterlockedRemoveHeadList( - IN PLIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) +PLIST_ENTRY +NTAPI +ExInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead, + IN PKSPIN_LOCK Lock) { KIRQL OldIrql; PLIST_ENTRY OldHead =3D NULL; @@ -341,23 +285,20 @@ return OldHead; } =
-NTKERNELAPI -VOID -FASTCALL -ExInterlockedAddLargeStatistic -(IN PLARGE_INTEGER Addend, - IN ULONG Increment) +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) +ExInterlockedCompareExchange64(IN OUT PLONGLONG Destination, + IN PLONGLONG Exchange, + IN PLONGLONG Comparand, + IN PKSPIN_LOCK Lock) { KIRQL OldIrql; LONGLONG Result; @@ -368,3 +309,149 @@ KeReleaseSpinLock(Lock, OldIrql); return Result; } + +VOID +NTAPI +READ_REGISTER_BUFFER_UCHAR(IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count) +{ + PUCHAR registerBuffer =3D Register; + PUCHAR readBuffer =3D Buffer; + ULONG readCount; + =
+ for (readCount =3D Count; readCount--; readBuffer++, registerBuffer++) + { + *readBuffer =3D *(volatile UCHAR * const)registerBuffer; + } +} + +VOID +NTAPI +READ_REGISTER_BUFFER_ULONG(IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count) +{ + PULONG registerBuffer =3D Register; + PULONG readBuffer =3D Buffer; + ULONG readCount; + =
+ for (readCount =3D Count; readCount--; readBuffer++, registerBuffer++) + { + *readBuffer =3D *(volatile ULONG * const)registerBuffer; + } +} + +VOID +NTAPI +READ_REGISTER_BUFFER_USHORT(IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count) +{ + PUSHORT registerBuffer =3D Register; + PUSHORT readBuffer =3D Buffer; + ULONG readCount; + =
+ for (readCount =3D Count; readCount--; readBuffer++, registerBuffer++) + { + *readBuffer =3D *(volatile USHORT * const)registerBuffer; + } +} + +UCHAR +NTAPI +READ_REGISTER_UCHAR(IN PUCHAR Register) +{ + return *(volatile UCHAR * const)Register; +} + +ULONG +NTAPI +READ_REGISTER_ULONG(IN PULONG Register) +{ + return *(volatile ULONG * const)Register; +} + +USHORT +NTAPI +READ_REGISTER_USHORT(IN PUSHORT Register) +{ + return *(volatile USHORT * const)Register; =
+} + +VOID +NTAPI +WRITE_REGISTER_BUFFER_UCHAR(IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count) +{ + PUCHAR registerBuffer =3D Register; + PUCHAR writeBuffer =3D Buffer; + ULONG writeCount; + for (writeCount =3D Count; writeCount--; writeBuffer++, registerBuffer= ++) + { + *(volatile UCHAR * const)registerBuffer =3D *writeBuffer; + } + KeFlushWriteBuffer(); +} + +VOID +NTAPI +WRITE_REGISTER_BUFFER_ULONG(IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count) +{ + PULONG registerBuffer =3D Register; + PULONG writeBuffer =3D Buffer; + ULONG writeCount; + for (writeCount =3D Count; writeCount--; writeBuffer++, registerBuffer= ++) + { + *(volatile ULONG * const)registerBuffer =3D *writeBuffer; + } + KeFlushWriteBuffer(); +} + +VOID +NTAPI +WRITE_REGISTER_BUFFER_USHORT(IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count) +{ + PUSHORT registerBuffer =3D Register; + PUSHORT writeBuffer =3D Buffer; + ULONG writeCount; + for (writeCount =3D Count; writeCount--; writeBuffer++, registerBuffer= ++) + { + *(volatile USHORT * const)registerBuffer =3D *writeBuffer; + } + KeFlushWriteBuffer(); +} + +VOID +NTAPI +WRITE_REGISTER_UCHAR(IN PUCHAR Register, + IN UCHAR Value) +{ + *(volatile UCHAR * const)Register =3D Value; + KeFlushWriteBuffer(); =
+} + +VOID +NTAPI +WRITE_REGISTER_ULONG(IN PULONG Register, + IN ULONG Value) +{ + *(volatile ULONG * const)Register =3D Value; + KeFlushWriteBuffer(); =
+} + +VOID +NTAPI +WRITE_REGISTER_USHORT(IN PUSHORT Register, + IN USHORT Value) +{ + *(volatile USHORT * const)Register =3D Value; + KeFlushWriteBuffer(); =
+} + +#endif
Modified: trunk/reactos/ntoskrnl/ex/init.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/init.c?re= v=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/ex/init.c (original) +++ trunk/reactos/ntoskrnl/ex/init.c Wed Mar 12 13:17:55 2008 @@ -1841,7 +1841,9 @@ InbvUpdateProgressBar(80); =
/* Initialize VDM support */ +#ifdef i386 KeI386VdmInitialize(); +#endif =
/* Initialize Power Subsystem in Phase 1*/ if (!PoInitSystem(1, AcpiTableDetected)) KeBugCheck(INTERNAL_POWER_ERR= OR);
Modified: trunk/reactos/ntoskrnl/include/internal/arm/ksarm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/inte= rnal/arm/ksarm.h?rev=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/include/internal/arm/ksarm.h (original) +++ trunk/reactos/ntoskrnl/include/internal/arm/ksarm.h Wed Mar 12 13:17:55= 2008 @@ -1,9 +1,20 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/include/internal/arm/ksarm.h + * PURPOSE: Definitions and offsets for ARM Assembly and C code + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +#ifdef _ASM_ + /* * CPSR Values */ .equ CPSR_THUMB_ENABLE, 0x20 =
.equ CPSR_FIQ_DISABLE, 0x40 .equ CPSR_IRQ_DISABLE, 0x80 +.equ CPSR_USER_MODE, 0x10 .equ CPSR_FIQ_MODE, 0x11 .equ CPSR_IRQ_MODE, 0x12 .equ CPSR_SVC_MODE, 0x13 @@ -38,3 +49,21 @@ * PCR */ .equ KiPcr, 0xFFFFF000 + +#else + +/* + * CPSR Values + */ +#define CPSR_THUMB_ENABLE 0x20 =
+#define CPSR_FIQ_DISABLE 0x40 +#define CPSR_IRQ_DISABLE 0x80 +#define CPSR_USER_MODE 0x10 +#define CPSR_FIQ_MODE 0x11 +#define CPSR_IRQ_MODE 0x12 +#define CPSR_SVC_MODE 0x13 +#define CPSR_ABORT_MODE 0x17 +#define CPSR_UND_MODE 0x1B +#define CPSR_MODES 0x1F + +#endif
Modified: trunk/reactos/ntoskrnl/ke/arm/stubs_asm.s URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/stubs= _asm.s?rev=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/ke/arm/stubs_asm.s (original) +++ trunk/reactos/ntoskrnl/ke/arm/stubs_asm.s Wed Mar 12 13:17:55 2008 @@ -1,20 +1,4 @@ #include <internal/arm/asmmacro.S> - -// -// Port I/O and Register Access -// -GENERATE_ARM_STUB READ_REGISTER_BUFFER_UCHAR =
-GENERATE_ARM_STUB READ_REGISTER_BUFFER_ULONG =
-GENERATE_ARM_STUB READ_REGISTER_BUFFER_USHORT =
-GENERATE_ARM_STUB READ_REGISTER_UCHAR =
-GENERATE_ARM_STUB READ_REGISTER_ULONG =
-GENERATE_ARM_STUB READ_REGISTER_USHORT =
-GENERATE_ARM_STUB WRITE_REGISTER_BUFFER_UCHAR =
-GENERATE_ARM_STUB WRITE_REGISTER_BUFFER_ULONG =
-GENERATE_ARM_STUB WRITE_REGISTER_BUFFER_USHORT =
-GENERATE_ARM_STUB WRITE_REGISTER_UCHAR =
-GENERATE_ARM_STUB WRITE_REGISTER_ULONG =
-GENERATE_ARM_STUB WRITE_REGISTER_USHORT =
=
// // Exceptions @@ -30,31 +14,22 @@ // GENERATE_ARM_STUB KiSwapContext GENERATE_ARM_STUB DbgBreakPointWithStatus =
-GENERATE_ARM_STUB Ke386CallBios =
GENERATE_ARM_STUB KeConnectInterrupt =
GENERATE_ARM_STUB KeDcacheFlushCount =
GENERATE_ARM_STUB KeDisconnectInterrupt =
GENERATE_ARM_STUB KeFlushEntireTb =
GENERATE_ARM_STUB KeGetRecommendedSharedDataAlignment =
-GENERATE_ARM_STUB KeI386AllocateGdtSelectors =
-GENERATE_ARM_STUB KeI386FlatToGdtSelector =
-GENERATE_ARM_STUB KeI386ReleaseGdtSelectors =
GENERATE_ARM_STUB KeIcacheFlushCount =
GENERATE_ARM_STUB KeInitializeInterrupt =
GENERATE_ARM_STUB KeNumberProcessors =
GENERATE_ARM_STUB KeQueryActiveProcessors =
GENERATE_ARM_STUB KeRaiseUserException =
-GENERATE_ARM_STUB KeRestoreFloatingPointState =
-GENERATE_ARM_STUB KeSaveFloatingPointState =
GENERATE_ARM_STUB KeSaveStateForHibernate =
GENERATE_ARM_STUB KeSetDmaIoCoherency =
GENERATE_ARM_STUB KeSynchronizeExecution =
GENERATE_ARM_STUB KeUpdateRunTime =
GENERATE_ARM_STUB KeUpdateSystemTime =
GENERATE_ARM_STUB KeUserModeCallback =
-GENERATE_ARM_STUB Kei386EoiHelper =
-GENERATE_ARM_STUB KiCoprocessorError =
-GENERATE_ARM_STUB KiDispatchInterrupt =
GENERATE_ARM_STUB NtSetLdtEntries GENERATE_ARM_STUB NtRaiseException GENERATE_ARM_STUB NtCallbackReturn @@ -66,12 +41,12 @@ // // Internal Ke Arch-Specific Helpers // +GENERATE_ARM_STUB KiDispatchInterrupt GENERATE_ARM_STUB KiSaveProcessorControlState GENERATE_ARM_STUB KiInitializeUserApc GENERATE_ARM_STUB KeDisableInterrupts GENERATE_ARM_STUB KiDispatchException GENERATE_ARM_STUB KiSwapProcess -GENERATE_ARM_STUB KeI386VdmInitialize GENERATE_ARM_STUB KeSwitchKernelStack GENERATE_ARM_STUB KiInitMachineDependent GENERATE_ARM_STUB KiComputeTimerTableIndex
Modified: trunk/reactos/ntoskrnl/ke/arm/trap.s URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/trap.= s?rev=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/ke/arm/trap.s (original) +++ trunk/reactos/ntoskrnl/ke/arm/trap.s Wed Mar 12 13:17:55 2008 @@ -44,10 +44,35 @@ PROLOG_END KiSoftwareInterruptException =
// - // FIXME: TODO - // - b . - =
+ // Save return address + // + str lr, [sp, #-4]! + =
+ // + // Make space for trap frame + // + sub sp, sp, #(4*17) + =
+ // + // 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 + // + mov r0, sp + bl KiSoftwareInterruptHandler + ENTRY_END KiSoftwareInterruptException =
NESTED_ENTRY KiPrefetchAbortException @@ -125,6 +150,7 @@ stmia sp, {r0-r12} add r0, sp, #(4*13) stmia r0, {r13-r14}^ + mov r0, r0 =
// // Save SPSR
Modified: trunk/reactos/ntoskrnl/ke/arm/trapc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/trapc= .c?rev=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/ke/arm/trapc.c (original) +++ trunk/reactos/ntoskrnl/ke/arm/trapc.c Wed Mar 12 13:17:55 2008 @@ -9,10 +9,14 @@ /* INCLUDES **************************************************************= *****/ =
#include <ntoskrnl.h> +#include <internal/arm/ksarm.h> #define NDEBUG #include <debug.h> =
/* GLOBALS ***************************************************************= *****/ + +#define KiGetPreviousMode(tf) \ + ((tf->Spsr & CPSR_MODES) =3D=3D CPSR_USER_MODE) ? UserMode: KernelMode =
/* FUNCTIONS *************************************************************= *****/ =
@@ -41,3 +45,60 @@ return STATUS_SUCCESS; } =
+NTSTATUS +KiSystemService(IN PKTHREAD Thread, + IN PKTRAP_FRAME TrapFrame, + IN ULONG Instruction) +{ + ULONG Id; + PKPCR Pcr; + =
+ // + // Increase count of system calls + // + Pcr =3D (PKPCR)KeGetPcr(); + Pcr->Prcb->KeSystemCalls++; + =
+ // + // Get the system call ID + // + Id =3D Instruction & 0xFFFFF; + DPRINT1("System call (%X) from thread: %p \n", Id, Thread); =
+ while (TRUE); + return STATUS_SUCCESS; +} + +NTSTATUS +KiSoftwareInterruptHandler(IN PKTRAP_FRAME TrapFrame) +{ + PKTHREAD Thread; + KPROCESSOR_MODE PreviousMode; + ULONG Instruction; + DPRINT1("SWI @ %p %p \n", TrapFrame->Pc, TrapFrame->UserLr); + =
+ // + // Get the current thread + // + Thread =3D KeGetCurrentThread(); + =
+ // + // Isolate previous mode + // + PreviousMode =3D KiGetPreviousMode(TrapFrame); + =
+ // + // Save previous mode and trap frame + // + Thread->TrapFrame =3D TrapFrame; + Thread->PreviousMode =3D PreviousMode; + =
+ // + // Read the opcode + // + Instruction =3D *(PULONG)(TrapFrame->Pc - sizeof(ULONG)); + =
+ // + // Call the service call dispatcher + // + return KiSystemService(Thread, TrapFrame, Instruction); +}
Modified: trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl-gen= eric.rbuild?rev=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild (original) +++ trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild Wed Mar 12 13:17:55 2008 @@ -166,17 +166,8 @@ <directory name=3D"i386"> <file>interlck_asm.S</file> <file>fastinterlck_asm.S</file> - <file>ioport.S</file> - </directory> - </if> - <if property=3D"ARCH" value=3D"powerpc"> - <directory name=3D"powerpc"> - <file>ioport.s</file> - </directory> - <file>fastinterlck.c</file> - </if> - <if property=3D"ARCH" value=3D"arm"> - <file>fastinterlck.c</file> + <file>ioport.s</file> + </directory> </if> <file>atom.c</file> <file>callback.c</file> @@ -185,6 +176,7 @@ <file>event.c</file> <file>evtpair.c</file> <file>exintrin.c</file> + <file>fastinterlck.c</file> <file>fmutex.c</file> <file>handle.c</file> <file>harderr.c</file>
Modified: trunk/reactos/ntoskrnl/ntoskrnl_arm.def URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl_arm= .def?rev=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/ntoskrnl_arm.def (original) +++ trunk/reactos/ntoskrnl/ntoskrnl_arm.def Wed Mar 12 13:17:55 2008 @@ -518,7 +518,6 @@ KdPollBreakIn KdPowerTransition KdSystemDebugControl -Ke386CallBios KeAcquireGuardedMutex KeAcquireGuardedMutexUnsafe KeAcquireSpinLockAtDpcLevel @@ -550,16 +549,6 @@ KeGetCurrentThread KeGetPreviousMode KeGetRecommendedSharedDataAlignment -;KeI386AbiosCall -KeI386AllocateGdtSelectors -;KeI386Call16BitCStyleFunction -;KeI386Call16BitFunction -KeI386FlatToGdtSelector -;KeI386GetLid -;KeI386MachineType DATA -KeI386ReleaseGdtSelectors -;KeI386ReleaseLid -;KeI386SetGdtSelector KeIcacheFlushCount DATA KeInitializeApc KeInitializeDeviceQueue @@ -621,10 +610,8 @@ KeRemoveQueueDpc KeRemoveSystemServiceTable KeResetEvent -KeRestoreFloatingPointState KeRevertToUserAffinityThread KeRundownQueue -KeSaveFloatingPointState KeSaveStateForHibernate KeServiceDescriptorTable DATA KeSetAffinityThread @@ -658,13 +645,10 @@ KeWaitForSingleObject KefAcquireSpinLockAtDpcLevel KefReleaseSpinLockFromDpcLevel -Kei386EoiHelper KiAcquireSpinLock ;KiBugCheckData DATA -KiCoprocessorError KiCheckForKernelApcDelivery KiDeliverApc -KiDispatchInterrupt KiEnableTimerWatchdog KiIpiServiceRoutine KiReleaseSpinLock
Modified: trunk/reactos/tools/nci/ncitool.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/nci/ncitool.c?r= ev=3D32666&r1=3D32665&r2=3D32666&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/tools/nci/ncitool.c (original) +++ trunk/reactos/tools/nci/ncitool.c Wed Mar 12 13:17:55 2008 @@ -68,11 +68,7 @@ " j $8\n" \ " nop\n" =
-// -// For now, only supports 0-4 arguments -// -#define UserModeStub_arm " ldr r12, =3D%x\n" \ - " swi #0x2E\n" \ +#define UserModeStub_arm " swi #0x%x\n" \ " bx lr\n\n" =
#elif defined(_MSC_VER) @@ -104,8 +100,7 @@ #define KernelModeStub_mips " j KiSystemService\n" \ " nop\n" =
-#define KernelModeStub_arm " ldr r12, =3D0x%x\n" \ - " swi #0x2E\n" \ +#define KernelModeStub_arm " swi #0x%x\n" \ " bx lr\n\n" =
#elif defined(_MSC_VER)