diff --git a/reactos/ntoskrnl/ke/arm/exp.c b/reactos/ntoskrnl/ke/arm/exp.c new file mode 100644 index 00000000000..82e0028a466 --- /dev/null +++ b/reactos/ntoskrnl/ke/arm/exp.c @@ -0,0 +1,30 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ke/arm/exp.c + * PURPOSE: Implements exception helper routines for ARM machines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +KeContextToTrapFrame(IN PCONTEXT Context, + IN OUT PKEXCEPTION_FRAME ExceptionFrame, + IN OUT PKTRAP_FRAME TrapFrame, + IN ULONG ContextFlags, + IN KPROCESSOR_MODE PreviousMode) +{ + UNIMPLEMENTED; + return; +} diff --git a/reactos/ntoskrnl/ke/arm/stubs_asm.s b/reactos/ntoskrnl/ke/arm/stubs_asm.s index e3e11cac3f4..732d4032575 100644 --- a/reactos/ntoskrnl/ke/arm/stubs_asm.s +++ b/reactos/ntoskrnl/ke/arm/stubs_asm.s @@ -1,7 +1,8 @@ #include -GENERATE_ARM_STUB KiSwapContext -GENERATE_ARM_STUB DbgBreakPointWithStatus +// +// Interlocked APIs +// GENERATE_ARM_STUB ExInterlockedAddLargeInteger GENERATE_ARM_STUB ExInterlockedAddLargeStatistic GENERATE_ARM_STUB ExInterlockedAddUlong @@ -37,6 +38,66 @@ GENERATE_ARM_STUB InterlockedExchangeAdd GENERATE_ARM_STUB InterlockedIncrement GENERATE_ARM_STUB InterlockedPopEntrySList GENERATE_ARM_STUB InterlockedPushEntrySList + +// +// 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 + +// +// 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 +// +GENERATE_ARM_STUB _abnormal_termination +GENERATE_ARM_STUB _except_handler2 +GENERATE_ARM_STUB _except_handler3 +GENERATE_ARM_STUB _global_unwind2 +GENERATE_ARM_STUB _local_unwind2 + +// +// Exported Ke Arch-Specific APIs +// +GENERATE_ARM_STUB KiSwapContext +GENERATE_ARM_STUB DbgBreakPointWithStatus GENERATE_ARM_STUB Ke386CallBios GENERATE_ARM_STUB KeConnectInterrupt GENERATE_ARM_STUB KeDcacheFlushCount @@ -62,69 +123,33 @@ GENERATE_ARM_STUB KeUserModeCallback GENERATE_ARM_STUB Kei386EoiHelper GENERATE_ARM_STUB KiCoprocessorError GENERATE_ARM_STUB KiDispatchInterrupt -GENERATE_ARM_STUB KiApcInterrupt -GENERATE_ARM_STUB KiPassiveRelease -GENERATE_ARM_STUB KiInterruptTemplate -GENERATE_ARM_STUB KiUnexpectedInterrupt -GENERATE_ARM_STUB MmGetPhysicalAddress -GENERATE_ARM_STUB NtVdmControl -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 RtlCaptureContext -GENERATE_ARM_STUB RtlCompareMemory -GENERATE_ARM_STUB RtlCompareMemoryUlong -GENERATE_ARM_STUB RtlFillMemory -GENERATE_ARM_STUB RtlFillMemoryUlong -GENERATE_ARM_STUB RtlGetCallersAddress -GENERATE_ARM_STUB RtlMoveMemory -GENERATE_ARM_STUB RtlPrefetchMemoryNonTemporal -GENERATE_ARM_STUB RtlUlongByteSwap -GENERATE_ARM_STUB RtlUlonglongByteSwap -GENERATE_ARM_STUB RtlUnwind -GENERATE_ARM_STUB RtlUshortByteSwap -GENERATE_ARM_STUB RtlZeroMemory -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 -GENERATE_ARM_STUB _abnormal_termination -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 -GENERATE_ARM_STUB _except_handler2 -GENERATE_ARM_STUB _except_handler3 -GENERATE_ARM_STUB _global_unwind2 -GENERATE_ARM_STUB _local_unwind2 -GENERATE_ARM_STUB KiSaveProcessorControlState -GENERATE_ARM_STUB KiInitializeUserApc -GENERATE_ARM_STUB KeDisableInterrupts -GENERATE_ARM_STUB KeContextToTrapFrame -GENERATE_ARM_STUB KiDispatchException GENERATE_ARM_STUB NtSetLdtEntries GENERATE_ARM_STUB NtRaiseException GENERATE_ARM_STUB NtCallbackReturn GENERATE_ARM_STUB NtContinue +GENERATE_ARM_STUB NtVdmControl +GENERATE_ARM_STUB RtlCreateUserThread +GENERATE_ARM_STUB RtlInitializeContext + +// +// Internal Ke Arch-Specific Helpers +// +GENERATE_ARM_STUB KiSaveProcessorControlState +GENERATE_ARM_STUB KiInitializeUserApc +GENERATE_ARM_STUB KeDisableInterrupts +GENERATE_ARM_STUB KiDispatchException GENERATE_ARM_STUB KiSwapProcess -GENERATE_ARM_STUB MmUpdatePageDir -GENERATE_ARM_STUB KeArmInitThreadWithContext -GENERATE_ARM_STUB MmGetPfnForProcess -GENERATE_ARM_STUB MmCreateVirtualMapping -GENERATE_ARM_STUB CmpInitializeMachineDependentConfiguration GENERATE_ARM_STUB KeI386VdmInitialize +GENERATE_ARM_STUB KeSwitchKernelStack +GENERATE_ARM_STUB KiInitMachineDependent +GENERATE_ARM_STUB KiComputeTimerTableIndex +GENERATE_ARM_STUB CmpInitializeMachineDependentConfiguration + + +// +// Memory Manager Arch-Specific +// +GENERATE_ARM_STUB MmGetPhysicalAddress GENERATE_ARM_STUB MmSetDirtyPage GENERATE_ARM_STUB MmSetCleanPage GENERATE_ARM_STUB MmIsDirtyPage @@ -143,13 +168,8 @@ GENERATE_ARM_STUB MmCreateVirtualMappingUnsafe GENERATE_ARM_STUB MmInitializeHandBuiltProcess GENERATE_ARM_STUB MmCreateProcessAddressSpace GENERATE_ARM_STUB Mmi386ReleaseMmInfo -GENERATE_ARM_STUB RtlCreateUserThread -GENERATE_ARM_STUB RtlInitializeContext -GENERATE_ARM_STUB RtlpGetExceptionAddress -GENERATE_ARM_STUB RtlDispatchException -GENERATE_ARM_STUB DebugService2 -GENERATE_ARM_STUB KdpGdbStubInit -GENERATE_ARM_STUB KeSwitchKernelStack +GENERATE_ARM_STUB MmGetPfnForProcess +GENERATE_ARM_STUB MmCreateVirtualMapping GENERATE_ARM_STUB MiInitPageDirectoryMap GENERATE_ARM_STUB MmGetPageDirectory GENERATE_ARM_STUB MmInitGlobalKernelPageDirectory @@ -157,12 +177,20 @@ GENERATE_ARM_STUB MmDeletePageTable GENERATE_ARM_STUB MmGetPageProtect GENERATE_ARM_STUB MmCreateVirtualMappingForKernel GENERATE_ARM_STUB MiGetUserPageDirectoryCount -GENERATE_ARM_STUB RtlpGetStackLimits -GENERATE_ARM_STUB KiInitMachineDependent -GENERATE_ARM_STUB KiComputeTimerTableIndex -GENERATE_ARM_STUB _SEHCurrentRegistration -GENERATE_ARM_STUB _SEHUnregisterFrame -GENERATE_ARM_STUB _SEHRegisterFrame -GENERATE_ARM_STUB _SEHCleanHandlerEnvironment -GENERATE_ARM_STUB _SEHGlobalUnwind +// +// Traps, Debugging and Execeptions +// +GENERATE_ARM_STUB KiApcInterrupt +GENERATE_ARM_STUB KiPassiveRelease +GENERATE_ARM_STUB KiInterruptTemplate +GENERATE_ARM_STUB KiUnexpectedInterrupt +GENERATE_ARM_STUB RtlCaptureContext +GENERATE_ARM_STUB RtlGetCallersAddress +GENERATE_ARM_STUB RtlUnwind +GENERATE_ARM_STUB RtlpGetExceptionAddress +GENERATE_ARM_STUB RtlDispatchException +GENERATE_ARM_STUB DebugService2 +GENERATE_ARM_STUB RtlpGetStackLimits + +GENERATE_ARM_STUB KdpGdbStubInit diff --git a/reactos/ntoskrnl/ke/arm/thrdini.c b/reactos/ntoskrnl/ke/arm/thrdini.c new file mode 100644 index 00000000000..7ca1ebb3786 --- /dev/null +++ b/reactos/ntoskrnl/ke/arm/thrdini.c @@ -0,0 +1,141 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ke/arm/thrdini.c + * PURPOSE: Implements thread context setup and startup for ARM machines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +typedef struct _KUINIT_FRAME +{ + KEXCEPTION_FRAME CtxSwitchFrame; + KEXCEPTION_FRAME ExceptionFrame; + KTRAP_FRAME TrapFrame; +} KUINIT_FRAME, *PKUINIT_FRAME; + +typedef struct _KKINIT_FRAME +{ + KEXCEPTION_FRAME CtxSwitchFrame; +} KKINIT_FRAME, *PKKINIT_FRAME; + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +KiThreadStartup(IN PKSYSTEM_ROUTINE SystemRoutine, + IN PKSTART_ROUTINE StartRoutine, + IN PVOID StartContext, + IN BOOLEAN UserThread, + IN KTRAP_FRAME TrapFrame) +{ + UNIMPLEMENTED; + return; +} + +VOID +NTAPI +KeArmInitThreadWithContext(IN PKTHREAD Thread, + IN PKSYSTEM_ROUTINE SystemRoutine, + IN PKSTART_ROUTINE StartRoutine, + IN PVOID StartContext, + IN PCONTEXT ContextPointer) +{ + PKTRAP_FRAME TrapFrame; + PKEXCEPTION_FRAME ExceptionFrame = NULL, CtxSwitchFrame; + + // + // Check if this is a user thread + // + if (ContextPointer) + { + // + // Setup the initial frame + // + PKUINIT_FRAME InitFrame; + InitFrame = (PKUINIT_FRAME)((ULONG_PTR)Thread->InitialStack - + sizeof(KUINIT_FRAME)); + + // + // Setup the Trap Frame and Exception frame + // + TrapFrame = &InitFrame->TrapFrame; + ExceptionFrame = &InitFrame->ExceptionFrame; + + /// + // Zero out the trap frame and exception frame + // + RtlZeroMemory(TrapFrame, sizeof(KTRAP_FRAME)); + RtlZeroMemory(ExceptionFrame, sizeof(KEXCEPTION_FRAME)); + + // + // Set up a trap frame from the context + // + KeContextToTrapFrame(ContextPointer, + ExceptionFrame, + TrapFrame, + ContextPointer->ContextFlags | CONTEXT_CONTROL, + UserMode); + + // + // Set the previous mode as user + // + TrapFrame->PreviousMode = UserMode; + Thread->PreviousMode = UserMode; + + // + // Clear the return address + // + ExceptionFrame->Lr = 0; + + // + // Context switch frame to setup below + // + CtxSwitchFrame = &InitFrame->CtxSwitchFrame; + } + else + { + // + // Set up the Initial Frame for the system thread + // + PKKINIT_FRAME InitFrame; + InitFrame = (PKKINIT_FRAME)((ULONG_PTR)Thread->InitialStack - + sizeof(KKINIT_FRAME)); + + // + // Set the previous mode as kernel + // + Thread->PreviousMode = KernelMode; + + // + // Context switch frame to setup below + // + CtxSwitchFrame = &InitFrame->CtxSwitchFrame; + } + + // + // Now setup the context switch frame + // + CtxSwitchFrame->SwapReturn = (ULONG)KiThreadStartup; + CtxSwitchFrame->R11 = (ULONG)(ExceptionFrame ? ExceptionFrame : CtxSwitchFrame); + + // + // Set the parameters + // + CtxSwitchFrame->R4 = (ULONG)ContextPointer; + CtxSwitchFrame->R5 = (ULONG)StartContext; + CtxSwitchFrame->R6 = (ULONG)StartRoutine; + CtxSwitchFrame->R7 = (ULONG)SystemRoutine; + + // + // Save back the new value of the kernel stack + // + Thread->KernelStack = (PVOID)CtxSwitchFrame; +} diff --git a/reactos/ntoskrnl/mm/arm/stubs.c b/reactos/ntoskrnl/mm/arm/stubs.c new file mode 100644 index 00000000000..5e31c352bd5 --- /dev/null +++ b/reactos/ntoskrnl/mm/arm/stubs.c @@ -0,0 +1,33 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/mm/arm/stubs.c + * PURPOSE: ARM Memory Manager + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include +/* GLOBALS ********************************************************************/ + +// +// METAFIXME: We need to stop using 1MB Section Entry TTEs! +// + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +MmUpdatePageDir(IN PEPROCESS Process, + IN PVOID Address, + IN ULONG Size) +{ + // + // Nothing to do + // + UNIMPLEMENTED; + return; +} diff --git a/reactos/ntoskrnl/ntoskrnl.rbuild b/reactos/ntoskrnl/ntoskrnl.rbuild index 3bc074af151..e8d0dc1e5c9 100644 --- a/reactos/ntoskrnl/ntoskrnl.rbuild +++ b/reactos/ntoskrnl/ntoskrnl.rbuild @@ -62,9 +62,11 @@ boot.s arm_kprintf.c cpu.c + exp.c kiinit.c stubs_asm.s stubs.c + thrdini.c @@ -332,6 +334,11 @@ page.c + + + stubs.c + + pfault.c