From a88e28262c33cab39cc91d61309100d2b0c1113c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 19 Sep 2009 20:25:10 +0000 Subject: [PATCH 01/40] update syssetup.spec from trunk svn path=/branches/ros-amd64-bringup/; revision=43083 --- reactos/dll/win32/syssetup/syssetup.spec | 46 +++++++++++++----------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/reactos/dll/win32/syssetup/syssetup.spec b/reactos/dll/win32/syssetup/syssetup.spec index 69d4c8ebcf9..0ef76b05118 100644 --- a/reactos/dll/win32/syssetup/syssetup.spec +++ b/reactos/dll/win32/syssetup/syssetup.spec @@ -1,28 +1,32 @@ -#@ stdcall ApplyAcls -#@ stdcall DevInstallW -#@ stdcall GenerateScsiHwIdList +@ stub ApplyAcls +@ stub AsrAddSifEntryW +@ stub AsrCreateStateFileW +@ stub AsrFreeContext +@ stub AsrRestorePlugPlayRegistryData +@ stub DevInstallW +@ stub GenerateScsiHwIdList @ stdcall InitializeSetupActionLog(long) @ stdcall InstallLiveCD(ptr) @ stdcall InstallReactOS(ptr) @ stdcall KeyboardClassInstaller(long ptr ptr) -#@ stdcall LogItem@8 -#@ stdcall LogItem0 -#@ stdcall LogItem1 -#@ stdcall LogItem2 -#@ stdcall LogItem3 -#@ stdcall LogItemN +@ stub LogItem@8 +@ stub LogItem0 +@ stub LogItem1 +@ stub LogItem2 +@ stub LogItem3 +@ stub LogItemN @ stdcall MouseClassInstaller(long ptr ptr) -#@ stdcall PnPInitializationThread -#@ stdcall RepairStartMenuItems -#@ stdcall ReportError -#@ stdcall ScsiClassInstaller -@ stdcall SetupChangeFontSize(ptr ptr) +@ stub PnPInitializationThread +@ stub RepairStartMenuItems +@ stub ReportError +@ stub ScsiClassInstaller +@ stdcall SetupChangeFontSize(ptr wstr) @ stdcall SetupChangeLocale(ptr long) -@ stdcall SetupChangeLocaleEx(ptr long ptr long long long) -#@ stdcall SetupCreateOptionalComponentsPage -#@ stdcall SetupInfObjectInstallActionW -#@ stdcall SetupSetLargeDialogFont -#@ stdcall TapeClassInstaller +@ stdcall SetupChangeLocaleEx(ptr long wstr str long long) +@ stub SetupCreateOptionalComponentsPage +@ stub SetupInfObjectInstallActionW +@ stub SetupSetLargeDialogFont +@ stub TapeClassInstaller @ stdcall TerminateSetupActionLog() -#@ stdcall UpgradePrinters -#@ stdcall ViewSetupActionLog +@ stub UpgradePrinters +@ stub ViewSetupActionLog From 500fbf596b70aa420f7042b69f479b31bb6a4fef Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 19 Sep 2009 21:21:08 +0000 Subject: [PATCH 02/40] winsta: fix spec file svn path=/branches/ros-amd64-bringup/; revision=43084 --- reactos/dll/win32/winsta/winsta.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/winsta/winsta.spec b/reactos/dll/win32/winsta/winsta.spec index bc35066c763..b41c693b980 100644 --- a/reactos/dll/win32/winsta/winsta.spec +++ b/reactos/dll/win32/winsta/winsta.spec @@ -103,7 +103,7 @@ @ stdcall _WinStationBeepOpen(ptr ptr ptr) @ stdcall _WinStationBreakPoint(ptr ptr ptr) @ stdcall _WinStationCallback(ptr ptr ptr) -@ stdcall _WinStationCheckForApplicationName(ptr) +@ stdcall _WinStationCheckForApplicationName(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) @ stdcall _WinStationFUSCanRemoteUserDisconnect(ptr ptr ptr) @ stdcall _WinStationGetApplicationInfo(ptr ptr ptr ptr) @ stdcall _WinStationNotifyDisconnectPipe() From e4eb3929f7b0e32e7c9562fe4643fdc6558e4635 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 26 Sep 2009 19:54:59 +0000 Subject: [PATCH 03/40] Add global compilerflag to ignore format warnings svn path=/branches/ros-amd64-bringup/; revision=43171 --- reactos/ReactOS-amd64.rbuild | 1 + reactos/base/system/msiexec/msiexec.rbuild | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ReactOS-amd64.rbuild b/reactos/ReactOS-amd64.rbuild index 010a105b191..3b5d058e2d9 100644 --- a/reactos/ReactOS-amd64.rbuild +++ b/reactos/ReactOS-amd64.rbuild @@ -46,6 +46,7 @@ -Wno-strict-aliasing -Wpointer-arith -Wno-multichar + -Wno-format -disable-stdcall-fixup -static diff --git a/reactos/base/system/msiexec/msiexec.rbuild b/reactos/base/system/msiexec/msiexec.rbuild index b9ba21d1a29..4fce3e3531d 100644 --- a/reactos/base/system/msiexec/msiexec.rbuild +++ b/reactos/base/system/msiexec/msiexec.rbuild @@ -1,7 +1,6 @@ - -Wno-format . include/wine From 9e839804dfb7a91492a5dbf68b697b9236f0a395 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Oct 2009 21:58:04 +0000 Subject: [PATCH 04/40] svn repair attempt svn path=/branches/ros-amd64-bringup/; revision=43421 --- .../base/applications/cmdutils/xcopy/rsrc.rc | 38 ------------------- 1 file changed, 38 deletions(-) delete mode 100644 reactos/base/applications/cmdutils/xcopy/rsrc.rc diff --git a/reactos/base/applications/cmdutils/xcopy/rsrc.rc b/reactos/base/applications/cmdutils/xcopy/rsrc.rc deleted file mode 100644 index a62f34cf19a..00000000000 --- a/reactos/base/applications/cmdutils/xcopy/rsrc.rc +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2007 Jason Edmeades - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include - -#include "xcopy.h" - -LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL - -#include "Bg.rc" -#include "Da.rc" -#include "De.rc" -#include "El.rc" -#include "En.rc" -#include "Fr.rc" -#include "It.rc" -#include "Ko.rc" -#include "Nl.rc" -#include "No.rc" -#include "Pl.rc" -#include "Pt.rc" -#include "Ru.rc" -#include "Si.rc" From e98b82455636fa319c33d12cf14ac1b5a8de8017 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Oct 2009 22:16:52 +0000 Subject: [PATCH 05/40] fix the kernel's rbuild file svn path=/branches/ros-amd64-bringup/; revision=43423 --- reactos/ntoskrnl/ntoskrnl-generic.rbuild | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index c7dcf5c263f..d0d8787006c 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -381,16 +381,6 @@ kdlock.c kdprint.c kdtrap.c - - - kd-i386.c - - - - - kd-amd64.c - - From c2cbb8cae74d97e62ce7042bb6ea0eb815a667dd Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Oct 2009 23:10:43 +0000 Subject: [PATCH 06/40] [NDK] add CBSTACK_FRAME_POINTER for amd64 svn path=/branches/ros-amd64-bringup/; revision=43426 --- reactos/include/ndk/amd64/asm.h | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/include/ndk/amd64/asm.h b/reactos/include/ndk/amd64/asm.h index b32d74bdf3d..0636261409a 100644 --- a/reactos/include/ndk/amd64/asm.h +++ b/reactos/include/ndk/amd64/asm.h @@ -246,6 +246,7 @@ Author: #define CBSTACK_RBP 0x18 #define CBSTACK_RESULT 0x20 #define CBSTACK_RESULT_LENGTH 0x28 +#define CBSTACK_FRAME_POINTER CBSTACK_RBP /* Following ones are ASM only! ***********************************************/ From bb37e77d20ed72888163e369a5ed373fe0675785 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Oct 2009 23:26:12 +0000 Subject: [PATCH 07/40] Implement/fix some amd64 Mm macros svn path=/branches/ros-amd64-bringup/; revision=43427 --- reactos/ntoskrnl/include/internal/amd64/mm.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index e9a415f99e7..4530194d0a7 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -18,14 +18,21 @@ MmGetPageDirectory(VOID) #define PAE_PAGE_MASK(x) ((x)&(~0xfffLL)) /* Base addresses of PTE and PDE */ -#define PAGETABLE_MAP (0xc0000000) -#define PAGEDIRECTORY_MAP (0xc0000000 + (PAGETABLE_MAP / (1024))) +//#define PAGETABLE_MAP PTE_BASE +//#define PAGEDIRECTORY_MAP (0xc0000000 + (PAGETABLE_MAP / (1024))) /* Converting address to a corresponding PDE or PTE entry */ +#define MiAddressToPxe(x) \ + ((PMMPTE)(((((ULONG64)(x)) >> PXI_SHIFT) << 3) + PXE_BASE)) +#define MiAddressToPpe(x) \ + ((PMMPTE)(((((ULONG64)(x)) >> PPI_SHIFT) << 3) + PPE_BASE)) #define MiAddressToPde(x) \ - ((PMMPTE)(((((ULONG64)(x)) >> 22) << 2) + PAGEDIRECTORY_MAP)) + ((PMMPTE)(((((ULONG64)(x)) >> PDI_SHIFT) << 3) + PDE_BASE)) #define MiAddressToPte(x) \ - ((PMMPTE)(((((ULONG64)(x)) >> 12) << 2) + PAGETABLE_MAP)) + ((PMMPTE)(((((ULONG64)(x)) >> PTI_SHIFT) << 3) + PTE_BASE)) + +/* Convert a PTE into a corresponding address */ +#define MiPteToAddress(PTE) ((PVOID)((ULONG64)(PTE) << 9)) //#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE)) //#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE))) From ce254278da7beba06c8507a28e5819d66a3b327b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Oct 2009 23:29:14 +0000 Subject: [PATCH 08/40] ARM3 64bit portability fixes. svn path=/branches/ros-amd64-bringup/; revision=43428 --- reactos/ntoskrnl/mm/ARM3/contmem.c | 2 +- reactos/ntoskrnl/mm/ARM3/iosup.c | 6 +++--- reactos/ntoskrnl/mm/ARM3/mdlsup.c | 10 +++++----- reactos/ntoskrnl/mm/ARM3/ncache.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/contmem.c b/reactos/ntoskrnl/mm/ARM3/contmem.c index bc1a18eb3da..3234317cf8b 100644 --- a/reactos/ntoskrnl/mm/ARM3/contmem.c +++ b/reactos/ntoskrnl/mm/ARM3/contmem.c @@ -428,7 +428,7 @@ MmFreeContiguousMemory(IN PVOID BaseAddress) VOID NTAPI MmFreeContiguousMemorySpecifyCache(IN PVOID BaseAddress, - IN ULONG NumberOfBytes, + IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType) { // diff --git a/reactos/ntoskrnl/mm/ARM3/iosup.c b/reactos/ntoskrnl/mm/ARM3/iosup.c index 5d3452b2ad4..ba392c004aa 100644 --- a/reactos/ntoskrnl/mm/ARM3/iosup.c +++ b/reactos/ntoskrnl/mm/ARM3/iosup.c @@ -180,7 +180,7 @@ MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, VOID NTAPI MmUnmapIoSpace(IN PVOID BaseAddress, - IN ULONG NumberOfBytes) + IN SIZE_T NumberOfBytes) { PFN_NUMBER PageCount, Pfn; PMMPTE PointerPte; @@ -229,7 +229,7 @@ MmUnmapIoSpace(IN PVOID BaseAddress, PVOID NTAPI MmMapVideoDisplay(IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberOfBytes, + IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType) { PAGED_CODE(); @@ -246,7 +246,7 @@ MmMapVideoDisplay(IN PHYSICAL_ADDRESS PhysicalAddress, VOID NTAPI MmUnmapVideoDisplay(IN PVOID BaseAddress, - IN ULONG NumberOfBytes) + IN SIZE_T NumberOfBytes) { // // Call the real function diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index 596fef88afb..9f4d23c948a 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -25,9 +25,9 @@ PMDL NTAPI MmCreateMdl(IN PMDL Mdl, IN PVOID Base, - IN ULONG Length) + IN SIZE_T Length) { - ULONG Size; + SIZE_T Size; // // Check if we don't have an MDL built @@ -52,10 +52,10 @@ MmCreateMdl(IN PMDL Mdl, /* * @implemented */ -ULONG +SIZE_T NTAPI MmSizeOfMdl(IN PVOID Base, - IN ULONG Length) + IN SIZE_T Length) { // // Return the MDL size @@ -566,7 +566,7 @@ MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation) { - PPFN_TYPE MdlPages; + PPFN_NUMBER MdlPages; PVOID Base, Address, LastAddress, StartAddress; ULONG LockPages, TotalPages; NTSTATUS Status = STATUS_SUCCESS; diff --git a/reactos/ntoskrnl/mm/ARM3/ncache.c b/reactos/ntoskrnl/mm/ARM3/ncache.c index 7979d391847..15701bed74b 100644 --- a/reactos/ntoskrnl/mm/ARM3/ncache.c +++ b/reactos/ntoskrnl/mm/ARM3/ncache.c @@ -172,7 +172,7 @@ MmAllocateNonCachedMemory(IN ULONG NumberOfBytes) VOID NTAPI MmFreeNonCachedMemory(IN PVOID BaseAddress, - IN ULONG NumberOfBytes) + IN SIZE_T NumberOfBytes) { PMDL Mdl; PMMPTE PointerPte; From 55f70cb149728c0d53f9240096256106419ac44d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 12 Oct 2009 23:32:44 +0000 Subject: [PATCH 09/40] On 64 bit sizeof(POOL_HEADER) != sizeof(LIST_ENTRY)! I have not checked how this stuff works, but this way it's not portable. Comment out the C_ASSERT to make it at least compile on 64 bit. svn path=/branches/ros-amd64-bringup/; revision=43429 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index a3d7c3a5bfd..3d9824c841d 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -81,7 +81,7 @@ typedef struct _POOL_HEADER // Everything depends on this // C_ASSERT(sizeof(POOL_HEADER) == 8); -C_ASSERT(sizeof(POOL_HEADER) == sizeof(LIST_ENTRY)); +//C_ASSERT(sizeof(POOL_HEADER) == sizeof(LIST_ENTRY)); extern POOL_DESCRIPTOR NonPagedPoolDescriptor; From c615edc822ce6e8ab9037c6ecbf3c47d8602b270 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 13 Oct 2009 00:33:04 +0000 Subject: [PATCH 10/40] Add back some stuff that got lost in syncing svn path=/branches/ros-amd64-bringup/; revision=43432 --- reactos/ntoskrnl/kd64/kdapi.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/kd64/kdapi.c b/reactos/ntoskrnl/kd64/kdapi.c index c4a213df3de..77173e20454 100644 --- a/reactos/ntoskrnl/kd64/kdapi.c +++ b/reactos/ntoskrnl/kd64/kdapi.c @@ -179,7 +179,7 @@ KdpRestoreBreakPointEx(IN PDBGKD_MANIPULATE_STATE64 State, VOID NTAPI -DumpTraceData(IN PSTRING TraceData) +DumpTraceData(OUT PSTRING TraceData) { /* Update the buffer */ TraceDataBuffer[0] = TraceDataBufferPosition; @@ -196,7 +196,7 @@ VOID NTAPI KdpSetCommonState(IN ULONG NewState, IN PCONTEXT Context, - IN PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange) + OUT PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange) { USHORT InstructionCount; BOOLEAN HadBreakpoints; @@ -267,6 +267,7 @@ KdpReadVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State, STRING Header; ULONG Length = State->u.ReadMemory.TransferCount; NTSTATUS Status = STATUS_SUCCESS; + ULONG64 TargetBaseAddress = State->u.ReadMemory.TargetBaseAddress; /* Validate length */ if (Length > (PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64))) @@ -284,7 +285,15 @@ KdpReadVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State, } #endif - if (!State->u.ReadMemory.TargetBaseAddress) + // HACK for x64, until KD stops sending bogus addresses to WinDbg + if (TargetBaseAddress < (ULONG_PTR)MM_LOWEST_SYSTEM_ADDRESS) + { + FrLdrDbgPrint("Trying to read memory at 0x%p\n", TargetBaseAddress); +// DPRINT1("Trying to read memory at 0x%p\n", TargetBaseAddress); + TargetBaseAddress = 0; + } + + if (!TargetBaseAddress) { Length = 0; Status = STATUS_UNSUCCESSFUL; @@ -1245,7 +1254,7 @@ KdpReportExceptionStateChange(IN PEXCEPTION_RECORD ExceptionRecord, KdpSetContextState(&WaitStateChange, Context); /* Setup the actual header to send to KD */ - Header.Length = sizeof(DBGKD_WAIT_STATE_CHANGE64); + Header.Length = sizeof(DBGKD_WAIT_STATE_CHANGE64) - sizeof(CONTEXT); Header.Buffer = (PCHAR)&WaitStateChange; /* Setup the trace data */ From 8b716f4e2df4aae43b8201621782aa0d9b378ceb Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 13 Oct 2009 00:52:45 +0000 Subject: [PATCH 11/40] Implement KdpSysGetVersion, KdpGetStateChange, KdpSetContextState, KdpSysReadMsr, KdpSysWriteMsr, KdpSysReadControlSpace for amd64 svn path=/branches/ros-amd64-bringup/; revision=43433 --- reactos/ntoskrnl/kd64/amd64/kdsup.c | 152 ++++++++++++++++++++++++---- 1 file changed, 132 insertions(+), 20 deletions(-) diff --git a/reactos/ntoskrnl/kd64/amd64/kdsup.c b/reactos/ntoskrnl/kd64/amd64/kdsup.c index ba07617060c..24ab1071b6e 100644 --- a/reactos/ntoskrnl/kd64/amd64/kdsup.c +++ b/reactos/ntoskrnl/kd64/amd64/kdsup.c @@ -17,13 +17,68 @@ /* FUNCTIONS *****************************************************************/ +VOID +NTAPI +KdpSysGetVersion(IN PDBGKD_GET_VERSION64 Version) +{ + Version->MajorVersion = 0; + Version->MinorVersion = 0; + Version->ProtocolVersion = DBGKD_64BIT_PROTOCOL_VERSION2; + Version->KdSecondaryVersion = KD_SECONDARY_VERSION_AMD64_CONTEXT; + Version->Flags = DBGKD_VERS_FLAG_PTR64 | DBGKD_VERS_FLAG_DATA; + Version->MachineType = IMAGE_FILE_MACHINE_AMD64; + Version->MaxPacketType = PACKET_TYPE_MAX; + Version->MaxStateChange = 0; + Version->MaxManipulate = 0; + Version->Simulation = DBGKD_SIMULATION_NONE; + Version->Unused[0] = 0; + Version->KernBase = 0xfffff80000800000ULL; + Version->PsLoadedModuleList = (ULONG_PTR)&KeLoaderBlock->LoadOrderListHead; + Version->DebuggerDataList = 0; +} + VOID NTAPI KdpGetStateChange(IN PDBGKD_MANIPULATE_STATE64 State, IN PCONTEXT Context) { - UNIMPLEMENTED; - while (TRUE); + PKPRCB Prcb; + ULONG i; + + /* Check for success */ + if (NT_SUCCESS(State->u.Continue2.ContinueStatus)) + { + /* Check if we're tracing */ + if (State->u.Continue2.ControlSet.TraceFlag) + { + /* Enable TF */ + Context->EFlags |= EFLAGS_TF; + } + else + { + /* Remove it */ + Context->EFlags &= ~EFLAGS_TF; + } + + /* Loop all processors */ + for (i = 0; i < KeNumberProcessors; i++) + { + /* Get the PRCB and update DR7 and DR6 */ + Prcb = KiProcessorBlock[i]; + Prcb->ProcessorState.SpecialRegisters.KernelDr7 = + State->u.Continue2.ControlSet.Dr7; + Prcb->ProcessorState.SpecialRegisters.KernelDr6 = 0; + } + + /* Check if we have new symbol information */ + if (State->u.Continue2.ControlSet.CurrentSymbolStart != 1) + { + /* Update it */ + KdpCurrentSymbolStart = + State->u.Continue2.ControlSet.CurrentSymbolStart; + KdpCurrentSymbolEnd= State->u.Continue2.ControlSet.CurrentSymbolEnd; + } + } } VOID @@ -31,16 +86,29 @@ NTAPI KdpSetContextState(IN PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange, IN PCONTEXT Context) { - UNIMPLEMENTED; - while (TRUE); -} + PKPRCB Prcb = KeGetCurrentPrcb(); -VOID -NTAPI -KdpSysGetVersion(IN PDBGKD_GET_VERSION64 Version) -{ - UNIMPLEMENTED; - while (TRUE); + /* Copy i386 specific debug registers */ + WaitStateChange->ControlReport.Dr6 = Prcb->ProcessorState.SpecialRegisters. + KernelDr6; + WaitStateChange->ControlReport.Dr7 = Prcb->ProcessorState.SpecialRegisters. + KernelDr7; + + /* Copy i386 specific segments */ + WaitStateChange->ControlReport.SegCs = (USHORT)Context->SegCs; + WaitStateChange->ControlReport.SegDs = (USHORT)Context->SegDs; + WaitStateChange->ControlReport.SegEs = (USHORT)Context->SegEs; + WaitStateChange->ControlReport.SegFs = (USHORT)Context->SegFs; + + /* Copy EFlags */ + WaitStateChange->ControlReport.EFlags = Context->EFlags; + + /* Set Report Flags */ + WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_SEGS; + if (WaitStateChange->ControlReport.SegCs == KGDT_64_R0_CODE) + { + WaitStateChange->ControlReport.ReportFlags = REPORT_STANDARD_CS; + } } NTSTATUS @@ -48,9 +116,8 @@ NTAPI KdpSysReadMsr(IN ULONG Msr, OUT PLARGE_INTEGER MsrValue) { - UNIMPLEMENTED; - while (TRUE); - return STATUS_UNSUCCESSFUL; + MsrValue->QuadPart = __readmsr(Msr); + return STATUS_SUCCESS; } NTSTATUS @@ -58,9 +125,8 @@ NTAPI KdpSysWriteMsr(IN ULONG Msr, IN PLARGE_INTEGER MsrValue) { - UNIMPLEMENTED; - while (TRUE); - return STATUS_UNSUCCESSFUL; + __writemsr(Msr, MsrValue->QuadPart); + return STATUS_SUCCESS; } NTSTATUS @@ -101,9 +167,55 @@ KdpSysReadControlSpace(IN ULONG Processor, IN ULONG Length, OUT PULONG ActualLength) { - UNIMPLEMENTED; - while (TRUE); - return STATUS_UNSUCCESSFUL; + PVOID ControlStart; + ULONG RealLength; + + if ((ULONG)BaseAddress <= 2) + { + PKPRCB Prcb = KiProcessorBlock[Processor]; + PKIPCR Pcr = CONTAINING_RECORD(Prcb, KIPCR, Prcb); + + switch ((ULONG_PTR)BaseAddress) + { + case 0: + /* Copy a pointer to the Pcr */ + ControlStart = &Pcr; + RealLength = sizeof(PVOID); + break; + + case 1: + /* Copy a pointer to the Prcb */ + ControlStart = &Prcb; + RealLength = sizeof(PVOID); + break; + + case 2: + /* Copy SpecialRegisters */ + ControlStart = &Prcb->ProcessorState.SpecialRegisters; + RealLength = sizeof(KSPECIAL_REGISTERS); + break; + + default: + RealLength = 0; + ControlStart = NULL; + ASSERT(FALSE); + } + + if (RealLength < Length) Length = RealLength; + + /* Copy the memory */ + RtlCopyMemory(Buffer, ControlStart, Length); + *ActualLength = Length; + + /* Finish up */ + return STATUS_SUCCESS; + } + else + { + /* Invalid request */ + *ActualLength = 0; + return STATUS_UNSUCCESSFUL; + } } NTSTATUS From 6ed81cbca15682d8bf9bba16a124ff99844ef598 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 13 Oct 2009 11:19:07 +0000 Subject: [PATCH 12/40] [Kd64] Copy KdVersionBlock like for x86, fix Value of ReportFlags member in KdpSetContextState for both x86 and amd64 svn path=/branches/ros-amd64-bringup/; revision=43435 --- reactos/ntoskrnl/kd64/amd64/kdsup.c | 18 +++--------------- reactos/ntoskrnl/kd64/i386/kdsup.c | 2 +- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/reactos/ntoskrnl/kd64/amd64/kdsup.c b/reactos/ntoskrnl/kd64/amd64/kdsup.c index 24ab1071b6e..58b981d2e9a 100644 --- a/reactos/ntoskrnl/kd64/amd64/kdsup.c +++ b/reactos/ntoskrnl/kd64/amd64/kdsup.c @@ -21,20 +21,8 @@ VOID NTAPI KdpSysGetVersion(IN PDBGKD_GET_VERSION64 Version) { - Version->MajorVersion = 0; - Version->MinorVersion = 0; - Version->ProtocolVersion = DBGKD_64BIT_PROTOCOL_VERSION2; - Version->KdSecondaryVersion = KD_SECONDARY_VERSION_AMD64_CONTEXT; - Version->Flags = DBGKD_VERS_FLAG_PTR64 | DBGKD_VERS_FLAG_DATA; - Version->MachineType = IMAGE_FILE_MACHINE_AMD64; - Version->MaxPacketType = PACKET_TYPE_MAX; - Version->MaxStateChange = 0; - Version->MaxManipulate = 0; - Version->Simulation = DBGKD_SIMULATION_NONE; - Version->Unused[0] = 0; - Version->KernBase = 0xfffff80000800000ULL; - Version->PsLoadedModuleList = (ULONG_PTR)&KeLoaderBlock->LoadOrderListHead; - Version->DebuggerDataList = 0; + /* Copy the version block */ + RtlCopyMemory(Version, &KdVersionBlock, sizeof(DBGKD_GET_VERSION64)); } VOID @@ -107,7 +95,7 @@ KdpSetContextState(IN PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange, WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_SEGS; if (WaitStateChange->ControlReport.SegCs == KGDT_64_R0_CODE) { - WaitStateChange->ControlReport.ReportFlags = REPORT_STANDARD_CS; + WaitStateChange->ControlReport.ReportFlags |= REPORT_STANDARD_CS; } } diff --git a/reactos/ntoskrnl/kd64/i386/kdsup.c b/reactos/ntoskrnl/kd64/i386/kdsup.c index 69d1f341297..78cfad2e12a 100644 --- a/reactos/ntoskrnl/kd64/i386/kdsup.c +++ b/reactos/ntoskrnl/kd64/i386/kdsup.c @@ -95,7 +95,7 @@ KdpSetContextState(IN PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange, WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_SEGS; if (WaitStateChange->ControlReport.SegCs == KGDT_R0_CODE) { - WaitStateChange->ControlReport.ReportFlags = REPORT_STANDARD_CS; + WaitStateChange->ControlReport.ReportFlags |= REPORT_STANDARD_CS; } } From 3c1b6d34c0f24cd421fae6be35c2365591a2e2e1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 14 Oct 2009 11:23:57 +0000 Subject: [PATCH 13/40] [DDK] Fix MmSizeOfMdl prototype svn path=/branches/ros-amd64-bringup/; revision=43447 --- reactos/include/ddk/winddk.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h index f43603f9952..4bab620ed9f 100644 --- a/reactos/include/ddk/winddk.h +++ b/reactos/include/ddk/winddk.h @@ -9277,7 +9277,7 @@ MmSecureVirtualMemory( IN ULONG ProbeMode); NTKERNELAPI -ULONG +SIZE_T NTAPI MmSizeOfMdl( IN PVOID Base, From b29a47bfdf35fb85d5b5110867b8e6786a920401 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 14 Oct 2009 11:39:59 +0000 Subject: [PATCH 14/40] [KD64] - use SEH in KdpSysReadMsr - use constants for KdpSysReadControlSpace cases (DEBUG_CONTROL_SPACE_KSPECIAL taken from singularity) - implement case DEBUG_CONTROL_SPACE_KTHREAD returning a pointer to the current thread - Implement KdpSysReadIoSpace, KdpSysWriteIoSpace for amd64, can be used for x86, too svn path=/branches/ros-amd64-bringup/; revision=43448 --- reactos/include/reactos/windbgkd.h | 10 ++ reactos/ntoskrnl/include/internal/kd64.h | 4 +- reactos/ntoskrnl/kd64/amd64/kdsup.c | 120 ++++++++++++++++++++--- 3 files changed, 119 insertions(+), 15 deletions(-) diff --git a/reactos/include/reactos/windbgkd.h b/reactos/include/reactos/windbgkd.h index bc88bf590f1..97a6a7696da 100644 --- a/reactos/include/reactos/windbgkd.h +++ b/reactos/include/reactos/windbgkd.h @@ -194,6 +194,16 @@ #define DBGKD_PARTITION_DEFAULT 0x00 #define DBGKD_PARTITION_ALTERNATE 0x01 +// +// Control Space types +// +#define DEBUG_CONTROL_SPACE_KPCR 0 +#define DEBUG_CONTROL_SPACE_KPRCB 1 +#define DEBUG_CONTROL_SPACE_KSPECIAL 2 +#define DEBUG_CONTROL_SPACE_KTHREAD 3 +#define X86_DEBUG_CONTROL_SPACE_KSPECIAL 716 + + // // KD Packet Structure // diff --git a/reactos/ntoskrnl/include/internal/kd64.h b/reactos/ntoskrnl/include/internal/kd64.h index 61d84e55c63..213c83219a1 100644 --- a/reactos/ntoskrnl/include/internal/kd64.h +++ b/reactos/ntoskrnl/include/internal/kd64.h @@ -374,7 +374,7 @@ KdpSysReadIoSpace( IN ULONG BusNumber, IN ULONG AddressSpace, IN ULONG64 IoAddress, - IN PULONG DataValue, + IN PVOID DataValue, IN ULONG DataSize, OUT PULONG ActualDataSize ); @@ -386,7 +386,7 @@ KdpSysWriteIoSpace( IN ULONG BusNumber, IN ULONG AddressSpace, IN ULONG64 IoAddress, - IN PULONG DataValue, + IN PVOID DataValue, IN ULONG DataSize, OUT PULONG ActualDataSize ); diff --git a/reactos/ntoskrnl/kd64/amd64/kdsup.c b/reactos/ntoskrnl/kd64/amd64/kdsup.c index 58b981d2e9a..2f293d7e04b 100644 --- a/reactos/ntoskrnl/kd64/amd64/kdsup.c +++ b/reactos/ntoskrnl/kd64/amd64/kdsup.c @@ -104,7 +104,17 @@ NTAPI KdpSysReadMsr(IN ULONG Msr, OUT PLARGE_INTEGER MsrValue) { - MsrValue->QuadPart = __readmsr(Msr); + /* Use SEH to protect from invalid MSRs */ + _SEH2_TRY + { + MsrValue->QuadPart = __readmsr(Msr); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + _SEH2_YIELD(return STATUS_NO_SUCH_DEVICE); + } + _SEH2_END + return STATUS_SUCCESS; } @@ -113,7 +123,17 @@ NTAPI KdpSysWriteMsr(IN ULONG Msr, IN PLARGE_INTEGER MsrValue) { - __writemsr(Msr, MsrValue->QuadPart); + /* Use SEH to protect from invalid MSRs */ + _SEH2_TRY + { + __writemsr(Msr, MsrValue->QuadPart); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + _SEH2_YIELD(return STATUS_NO_SUCH_DEVICE); + } + _SEH2_END + return STATUS_SUCCESS; } @@ -165,28 +185,35 @@ KdpSysReadControlSpace(IN ULONG Processor, switch ((ULONG_PTR)BaseAddress) { - case 0: + case DEBUG_CONTROL_SPACE_KPCR: /* Copy a pointer to the Pcr */ ControlStart = &Pcr; RealLength = sizeof(PVOID); break; - case 1: + case DEBUG_CONTROL_SPACE_KPRCB: /* Copy a pointer to the Prcb */ ControlStart = &Prcb; RealLength = sizeof(PVOID); break; - case 2: + case DEBUG_CONTROL_SPACE_KSPECIAL: /* Copy SpecialRegisters */ ControlStart = &Prcb->ProcessorState.SpecialRegisters; RealLength = sizeof(KSPECIAL_REGISTERS); break; + case DEBUG_CONTROL_SPACE_KTHREAD: + /* Copy a pointer to the current Thread */ + ControlStart = &Prcb->CurrentThread; + RealLength = sizeof(PVOID); + break; + default: RealLength = 0; ControlStart = NULL; ASSERT(FALSE); + return STATUS_UNSUCCESSFUL; } if (RealLength < Length) Length = RealLength; @@ -225,28 +252,95 @@ KdpSysReadIoSpace(IN ULONG InterfaceType, IN ULONG BusNumber, IN ULONG AddressSpace, IN ULONG64 IoAddress, - IN PULONG DataValue, + OUT PVOID DataValue, IN ULONG DataSize, OUT PULONG ActualDataSize) { - UNIMPLEMENTED; - while (TRUE); - return STATUS_UNSUCCESSFUL; + /* Verify parameters */ + if (InterfaceType != Isa || BusNumber != 0 || AddressSpace != 1) + { + /* No data was read */ + *ActualDataSize = 0; + return STATUS_INVALID_PARAMETER; + } + + switch (DataSize) + { + case sizeof(UCHAR): + /* read one UCHAR */ + *(PUCHAR)DataValue = READ_PORT_UCHAR((PUCHAR)IoAddress); + break; + + case sizeof(USHORT): + /* Read one USHORT */ + *(PUSHORT)DataValue = READ_PORT_USHORT((PUSHORT)IoAddress); + break; + + case sizeof(ULONG): + /* Read one ULONG */ + *(PULONG)DataValue = READ_PORT_ULONG((PULONG)IoAddress); + break; + + default: + /* Invalid data size */ + *ActualDataSize = 0; + return STATUS_UNSUCCESSFUL; + } + + /* Return the size of the data */ + *ActualDataSize = DataSize; + + /* Success! */ + return STATUS_SUCCESS; } + NTSTATUS NTAPI KdpSysWriteIoSpace(IN ULONG InterfaceType, IN ULONG BusNumber, IN ULONG AddressSpace, IN ULONG64 IoAddress, - IN PULONG DataValue, + IN PVOID DataValue, IN ULONG DataSize, OUT PULONG ActualDataSize) { - UNIMPLEMENTED; - while (TRUE); - return STATUS_UNSUCCESSFUL; + /* Verify parameters */ + if (InterfaceType != Isa || BusNumber != 0 || AddressSpace != 1) + { + /* No data was written */ + *ActualDataSize = 0; + return STATUS_INVALID_PARAMETER; + } + + switch (DataSize) + { + case sizeof(UCHAR): + /* read one UCHAR */ + WRITE_PORT_UCHAR((PUCHAR)IoAddress, *(PUCHAR)DataValue); + break; + + case sizeof(USHORT): + /* Read one USHORT */ + WRITE_PORT_USHORT((PUSHORT)IoAddress, *(PUSHORT)DataValue); + break; + + case sizeof(ULONG): + /* Read one ULONG */ + WRITE_PORT_ULONG((PULONG)IoAddress, *(PULONG)DataValue); + break; + + default: + /* Invalid data size */ + *ActualDataSize = 0; + return STATUS_UNSUCCESSFUL; + } + + /* Return the size of the data */ + *ActualDataSize = DataSize; + + /* Success! */ + return STATUS_SUCCESS; } NTSTATUS From c321e5764503f0d1ce9d86dfb3e8843fed4d20d1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 14 Oct 2009 11:53:30 +0000 Subject: [PATCH 15/40] prefix DEBUG_CONTROL constants with AMD64 as they are architecture specific svn path=/branches/ros-amd64-bringup/; revision=43449 --- reactos/include/reactos/windbgkd.h | 11 +++++------ reactos/ntoskrnl/kd64/amd64/kdsup.c | 8 ++++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/reactos/include/reactos/windbgkd.h b/reactos/include/reactos/windbgkd.h index 97a6a7696da..19e804d52ee 100644 --- a/reactos/include/reactos/windbgkd.h +++ b/reactos/include/reactos/windbgkd.h @@ -195,13 +195,12 @@ #define DBGKD_PARTITION_ALTERNATE 0x01 // -// Control Space types +// AMD64 Control Space types // -#define DEBUG_CONTROL_SPACE_KPCR 0 -#define DEBUG_CONTROL_SPACE_KPRCB 1 -#define DEBUG_CONTROL_SPACE_KSPECIAL 2 -#define DEBUG_CONTROL_SPACE_KTHREAD 3 -#define X86_DEBUG_CONTROL_SPACE_KSPECIAL 716 +#define AMD64_DEBUG_CONTROL_SPACE_KPCR 0 +#define AMD64_DEBUG_CONTROL_SPACE_KPRCB 1 +#define AMD64_DEBUG_CONTROL_SPACE_KSPECIAL 2 +#define AMD64_DEBUG_CONTROL_SPACE_KTHREAD 3 // diff --git a/reactos/ntoskrnl/kd64/amd64/kdsup.c b/reactos/ntoskrnl/kd64/amd64/kdsup.c index 2f293d7e04b..2a3dcacdd3c 100644 --- a/reactos/ntoskrnl/kd64/amd64/kdsup.c +++ b/reactos/ntoskrnl/kd64/amd64/kdsup.c @@ -185,25 +185,25 @@ KdpSysReadControlSpace(IN ULONG Processor, switch ((ULONG_PTR)BaseAddress) { - case DEBUG_CONTROL_SPACE_KPCR: + case AMD64_DEBUG_CONTROL_SPACE_KPCR: /* Copy a pointer to the Pcr */ ControlStart = &Pcr; RealLength = sizeof(PVOID); break; - case DEBUG_CONTROL_SPACE_KPRCB: + case AMD64_DEBUG_CONTROL_SPACE_KPRCB: /* Copy a pointer to the Prcb */ ControlStart = &Prcb; RealLength = sizeof(PVOID); break; - case DEBUG_CONTROL_SPACE_KSPECIAL: + case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL: /* Copy SpecialRegisters */ ControlStart = &Prcb->ProcessorState.SpecialRegisters; RealLength = sizeof(KSPECIAL_REGISTERS); break; - case DEBUG_CONTROL_SPACE_KTHREAD: + case AMD64_DEBUG_CONTROL_SPACE_KTHREAD: /* Copy a pointer to the current Thread */ ControlStart = &Prcb->CurrentThread; RealLength = sizeof(PVOID); From 0239d1ae8522f70430c692b6980adb625b7c9a73 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 14 Oct 2009 11:56:36 +0000 Subject: [PATCH 16/40] fix copy paste error svn path=/branches/ros-amd64-bringup/; revision=43450 --- reactos/ntoskrnl/kd64/amd64/kdsup.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/kd64/amd64/kdsup.c b/reactos/ntoskrnl/kd64/amd64/kdsup.c index 2a3dcacdd3c..c870e2cc41d 100644 --- a/reactos/ntoskrnl/kd64/amd64/kdsup.c +++ b/reactos/ntoskrnl/kd64/amd64/kdsup.c @@ -267,7 +267,7 @@ KdpSysReadIoSpace(IN ULONG InterfaceType, switch (DataSize) { case sizeof(UCHAR): - /* read one UCHAR */ + /* Read one UCHAR */ *(PUCHAR)DataValue = READ_PORT_UCHAR((PUCHAR)IoAddress); break; @@ -316,17 +316,17 @@ KdpSysWriteIoSpace(IN ULONG InterfaceType, switch (DataSize) { case sizeof(UCHAR): - /* read one UCHAR */ + /* Write one UCHAR */ WRITE_PORT_UCHAR((PUCHAR)IoAddress, *(PUCHAR)DataValue); break; case sizeof(USHORT): - /* Read one USHORT */ + /* Write one USHORT */ WRITE_PORT_USHORT((PUSHORT)IoAddress, *(PUSHORT)DataValue); break; case sizeof(ULONG): - /* Read one ULONG */ + /* Write one ULONG */ WRITE_PORT_ULONG((PULONG)IoAddress, *(PULONG)DataValue); break; From 84770fa03a6ff7304b909b673fea02cd50ab0887 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 14 Oct 2009 13:25:30 +0000 Subject: [PATCH 17/40] Fix NtGetWriteWatch and NtResetWriteWatch parameters svn path=/branches/ros-amd64-bringup/; revision=43451 --- reactos/ntoskrnl/mm/virtual.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index 8c199fa5f76..80581b59aad 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -1245,9 +1245,9 @@ NTAPI NtGetWriteWatch(IN HANDLE ProcessHandle, IN ULONG Flags, IN PVOID BaseAddress, - IN ULONG RegionSize, + IN SIZE_T RegionSize, IN PVOID *UserAddressArray, - OUT PULONG EntriesInUserAddressArray, + OUT PULONG_PTR EntriesInUserAddressArray, OUT PULONG Granularity) { if (!EntriesInUserAddressArray || !Granularity) @@ -1279,7 +1279,7 @@ NTSTATUS NTAPI NtResetWriteWatch(IN HANDLE ProcessHandle, IN PVOID BaseAddress, - IN ULONG RegionSize) + IN SIZE_T RegionSize) { if (!RegionSize) { From fccc4f0a40bac185df331503278f371c7ad843e9 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 14 Oct 2009 16:32:41 +0000 Subject: [PATCH 18/40] Update MMPTE_HARDWARE svn path=/branches/ros-amd64-bringup/; revision=43454 --- reactos/include/ndk/amd64/mmtypes.h | 69 +++++++++++------------------ 1 file changed, 26 insertions(+), 43 deletions(-) diff --git a/reactos/include/ndk/amd64/mmtypes.h b/reactos/include/ndk/amd64/mmtypes.h index 3f8a66a4ad2..a9200786e78 100644 --- a/reactos/include/ndk/amd64/mmtypes.h +++ b/reactos/include/ndk/amd64/mmtypes.h @@ -49,22 +49,22 @@ C_ASSERT(MM_ALLOCATION_GRANULARITY >= PAGE_SIZE); // typedef struct _HARDWARE_PTE { - ULONG64 Valid:1; - ULONG64 Write:1; - ULONG64 Owner:1; - ULONG64 WriteThrough:1; - ULONG64 CacheDisable:1; - ULONG64 Accessed:1; - ULONG64 Dirty:1; - ULONG64 LargePage:1; - ULONG64 Global:1; - ULONG64 CopyOnWrite:1; - ULONG64 Prototype:1; - ULONG64 reserved0:1; - ULONG64 PageFrameNumber:28; - ULONG64 reserved1:12; - ULONG64 SoftwareWsIndex:11; - ULONG64 NoExecute:1; + ULONG64 Valid:1; + ULONG64 Write:1; + ULONG64 Owner:1; + ULONG64 WriteThrough:1; + ULONG64 CacheDisable:1; + ULONG64 Accessed:1; + ULONG64 Dirty:1; + ULONG64 LargePage:1; + ULONG64 Global:1; + ULONG64 CopyOnWrite:1; + ULONG64 Prototype:1; + ULONG64 reserved0:1; + ULONG64 PageFrameNumber:28; + ULONG64 reserved1:12; + ULONG64 SoftwareWsIndex:11; + ULONG64 NoExecute:1; } HARDWARE_PTE, *PHARDWARE_PTE; typedef struct _MMPTE_SOFTWARE @@ -131,37 +131,17 @@ typedef struct _MMPTE_LIST ULONG64 NextEntry:32; } MMPTE_LIST; -#ifndef CONFIG_SMP - -typedef struct _MMPTE_HARDWARE -{ - ULONG64 Valid:1; - ULONG64 Write:1; - ULONG64 Owner:1; - ULONG64 WriteThrough:1; - ULONG64 CacheDisable:1; - ULONG64 Accessed:1; - ULONG64 Dirty:1; - ULONG64 LargePage:1; - ULONG64 Global:1; - ULONG64 CopyOnWrite:1; - ULONG64 Prototype:1; - ULONG64 reserved0:1; - ULONG64 PageFrameNumber:28; - ULONG64 reserved1:12; - ULONG64 SoftwareWsIndex:11; - ULONG64 NoExecute:1; -} MMPTE_HARDWARE, *PMMPTE_HARDWARE; - -#else - typedef struct _MMPTE_HARDWARE { ULONG64 Valid:1; #if (NTDDI_VERSION >= NTDDI_LONGHORN) ULONG64 Dirty1:1; #else +#ifdef CONFIG_SMP ULONG64 Writable:1; +#else + ULONG64 Write:1; +#endif #endif ULONG64 Owner:1; ULONG64 WriteThrough:1; @@ -172,11 +152,16 @@ typedef struct _MMPTE_HARDWARE ULONG64 Global:1; ULONG64 CopyOnWrite:1; ULONG64 Prototype:1; - ULONG64 Write:1; #if (NTDDI_VERSION >= NTDDI_LONGHORN) + ULONG64 Write:1; ULONG64 PageFrameNumber:36; ULONG64 reserved1:4; #else +#ifdef CONFIG_SMP + ULONG64 Write:1; +#else + ULONG64 reserved0:1; +#endif ULONG64 PageFrameNumber:28; ULONG64 reserved1:12; #endif @@ -184,8 +169,6 @@ typedef struct _MMPTE_HARDWARE ULONG64 NoExecute:1; } MMPTE_HARDWARE, *PMMPTE_HARDWARE; -#endif - typedef struct _MMPTE_HARDWARE_LARGEPAGE { ULONG64 Valid:1; From 0d7713ac091867a75724fac9d5faf47deb46489a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 19:20:57 +0000 Subject: [PATCH 19/40] Add some stuff needed for the ARM3 code svn path=/branches/ros-amd64-bringup/; revision=43490 --- reactos/ntoskrnl/mm/amd64/init.c | 62 ++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 reactos/ntoskrnl/mm/amd64/init.c diff --git a/reactos/ntoskrnl/mm/amd64/init.c b/reactos/ntoskrnl/mm/amd64/init.c new file mode 100644 index 00000000000..60cb584bfcf --- /dev/null +++ b/reactos/ntoskrnl/mm/amd64/init.c @@ -0,0 +1,62 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/mm/amd64/init.c + * PURPOSE: Memory Manager Initialization for amd64 + * + * PROGRAMMERS: Timo kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ***************************************************************/ + +#include +#define NDEBUG +#include + +#include "../ARM3/miarm.h" + + +/* GLOBALS *****************************************************************/ + +ULONG MmMaximumNonPagedPoolPercent; +ULONG MmSizeOfNonPagedPoolInBytes; +ULONG MmMaximumNonPagedPoolInBytes; + +ULONG64 MmUserProbeAddress; +PVOID MmHighestUserAddress; +PVOID MmSystemRangeStart; + +ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage = -1; + +ULONG MmBootImageSize; + +PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock; + +RTL_BITMAP MiPfnBitMap; + +PVOID MmNonPagedSystemStart; +PVOID MmNonPagedPoolStart; +PVOID MmNonPagedPoolExpansionStart; +PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END; + +PVOID MmPagedPoolStart = MI_PAGED_POOL_START; +PVOID MmPagedPoolEnd; + +ULONG MmSizeOfPagedPoolInBytes = MI_MIN_INIT_PAGED_POOLSIZE; + +PVOID MmSessionBase; +ULONG MmSessionSize; + +PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; +MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; + + +NTSTATUS +NTAPI +MmArmInitSystem(IN ULONG Phase, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + From 2ead68a924b4caa81109d553810c6722686495d5 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 19:22:09 +0000 Subject: [PATCH 20/40] Add some missing macros svn path=/branches/ros-amd64-bringup/; revision=43491 --- reactos/ntoskrnl/include/internal/amd64/ke.h | 25 ++++++++++++++++++++ reactos/ntoskrnl/include/internal/amd64/mm.h | 10 ++++++++ 2 files changed, 35 insertions(+) diff --git a/reactos/ntoskrnl/include/internal/amd64/ke.h b/reactos/ntoskrnl/include/internal/amd64/ke.h index 3bf8fd6da05..3610cf533d5 100644 --- a/reactos/ntoskrnl/include/internal/amd64/ke.h +++ b/reactos/ntoskrnl/include/internal/amd64/ke.h @@ -76,6 +76,31 @@ extern ULONG Ke386CacheAlignment; #define KD_BREAKPOINT_SIZE sizeof(UCHAR) #define KD_BREAKPOINT_VALUE 0xCC +// +// Macros for getting and setting special purpose registers in portable code +// +#define KeGetContextPc(Context) \ + ((Context)->Rip) + +#define KeSetContextPc(Context, ProgramCounter) \ + ((Context)->Rip = (ProgramCounter)) + +#define KeGetTrapFramePc(TrapFrame) \ + ((TrapFrame)->Rip) + +#define KeGetContextReturnRegister(Context) \ + ((Context)->Rax) + +#define KeSetContextReturnRegister(Context, ReturnValue) \ + ((Context)->Rax = (ReturnValue)) + +// +// Returns the Interrupt State from a Trap Frame. +// ON = TRUE, OFF = FALSE +// +#define KeGetTrapFrameInterruptState(TrapFrame) \ + BooleanFlagOn((TrapFrame)->EFlags, EFLAGS_INTERRUPT_MASK) + struct _KPCR; VOID diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index 4530194d0a7..99cc8e14ec3 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -47,4 +47,14 @@ MmGetPageDirectory(VOID) /* Easy accessing PFN in PTE */ #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber) +// FIXME, only copied from x86 +#define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.Global = 0) +#define MI_MAKE_DIRTY_PAGE(x) ((x)->u.Hard.Dirty = 1) +#define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.CacheDisable = 1) +#define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.WriteThrough = 1) +#define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.WriteThrough = 0) +#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.Write == 1) +#define MI_IS_PAGE_COPY_ON_WRITE(x)((x)->u.Hard.CopyOnWrite == 1) +#define MI_IS_PAGE_DIRTY(x) ((x)->u.Hard.Dirty == 1) + #endif /* __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H */ From 7c5c4c6f3b98526f721a375b647d02813c1cd7cd Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 19:23:49 +0000 Subject: [PATCH 21/40] - Add CPUID - rename Ke386InitThreadWithContext to KiInitializeContextThread svn path=/branches/ros-amd64-bringup/; revision=43492 --- reactos/ntoskrnl/ke/amd64/cpu.c | 22 ++++++++++++++++++++++ reactos/ntoskrnl/ke/amd64/thrdini.c | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/amd64/cpu.c b/reactos/ntoskrnl/ke/amd64/cpu.c index 1c0ac237f4b..ed3c0f0b437 100644 --- a/reactos/ntoskrnl/ke/amd64/cpu.c +++ b/reactos/ntoskrnl/ke/amd64/cpu.c @@ -54,6 +54,28 @@ static const CHAR CmpTransmetaID[] = "GenuineTMx86"; static const CHAR CmpCentaurID[] = "CentaurHauls"; static const CHAR CmpRiseID[] = "RiseRiseRise"; +/* SUPPORT ROUTINES FOR MSVC COMPATIBILITY ***********************************/ + +VOID +NTAPI +CPUID(IN ULONG InfoType, + OUT PULONG CpuInfoEax, + OUT PULONG CpuInfoEbx, + OUT PULONG CpuInfoEcx, + OUT PULONG CpuInfoEdx) +{ + ULONG CpuInfo[4]; + + /* Perform the CPUID Operation */ + __cpuid((int*)CpuInfo, InfoType); + + /* Return the results */ + *CpuInfoEax = CpuInfo[0]; + *CpuInfoEbx = CpuInfo[1]; + *CpuInfoEcx = CpuInfo[2]; + *CpuInfoEdx = CpuInfo[3]; +} + /* FUNCTIONS *****************************************************************/ VOID diff --git a/reactos/ntoskrnl/ke/amd64/thrdini.c b/reactos/ntoskrnl/ke/amd64/thrdini.c index 199dc769fc0..6fde324983e 100644 --- a/reactos/ntoskrnl/ke/amd64/thrdini.c +++ b/reactos/ntoskrnl/ke/amd64/thrdini.c @@ -46,13 +46,13 @@ typedef struct _KKINIT_FRAME VOID NTAPI -Ke386InitThreadWithContext(IN PKTHREAD Thread, +KiInitializeContextThread(IN PKTHREAD Thread, IN PKSYSTEM_ROUTINE SystemRoutine, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext, IN PCONTEXT ContextPointer) { - FrLdrDbgPrint("Ke386InitThreadWithContext stub\n"); + FrLdrDbgPrint("KiInitializeContextThread stub\n"); #if 0 PFX_SAVE_AREA FxSaveArea; PFXSAVE_FORMAT FxSaveFormat; From dbdde58daee43a379da61b4e63fba826a9aa5573 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 19:24:21 +0000 Subject: [PATCH 22/40] reenable some spinlock code svn path=/branches/ros-amd64-bringup/; revision=43493 --- reactos/ntoskrnl/ke/spinlock.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/spinlock.c b/reactos/ntoskrnl/ke/spinlock.c index c2343e2b928..399800b53c7 100644 --- a/reactos/ntoskrnl/ke/spinlock.c +++ b/reactos/ntoskrnl/ke/spinlock.c @@ -140,7 +140,6 @@ KeReleaseQueuedSpinLockFromDpcLevel(IN PKSPIN_LOCK_QUEUE LockHandle) /* PUBLIC FUNCTIONS **********************************************************/ -#ifdef _X86_ /* * @implemented */ @@ -183,7 +182,6 @@ _KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock) /* Clear it */ *SpinLock = 0; } -#endif /* * @implemented From 3458af75ee9844a1c1e618d8f5ee8dccdf0a206f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 19:55:06 +0000 Subject: [PATCH 23/40] EPROCESS.Session is a PVOID not an ULONG svn path=/branches/ros-amd64-bringup/; revision=43497 --- reactos/include/ndk/pstypes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/ndk/pstypes.h b/reactos/include/ndk/pstypes.h index 1e3f2f2ce81..3bd6f2c41bb 100644 --- a/reactos/include/ndk/pstypes.h +++ b/reactos/include/ndk/pstypes.h @@ -1283,7 +1283,7 @@ typedef struct _EPROCESS HARDWARE_PTE PageDirectoryPte; ULONGLONG Filler; }; - ULONG Session; + PVOID Session; CHAR ImageFileName[16]; LIST_ENTRY JobLinks; PVOID LockedPagesList; From d8aabb38fb579f3012612f683f9a36049637adad Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 19:58:43 +0000 Subject: [PATCH 24/40] add init.c to the build svn path=/branches/ros-amd64-bringup/; revision=43498 --- reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index d0d8787006c..46e2ce3737b 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -412,6 +412,7 @@ + init.c page.c From 5b70ecbdd39f0a4802b508b5890ffc4a06f32145 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 20:02:41 +0000 Subject: [PATCH 25/40] Fix a typo svn path=/branches/ros-amd64-bringup/; revision=43500 --- reactos/ntoskrnl/mm/amd64/page.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/amd64/page.c b/reactos/ntoskrnl/mm/amd64/page.c index ecb6a113abd..526a378d561 100644 --- a/reactos/ntoskrnl/mm/amd64/page.c +++ b/reactos/ntoskrnl/mm/amd64/page.c @@ -1,7 +1,7 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/i386/page.c + * FILE: ntoskrnl/mm/amd64/page.c * PURPOSE: Low level memory managment manipulation * * PROGRAMMERS: David Welch (welch@cwcom.net) From d9f7e0d792142342e67bc5b7712117b75c5a82c3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 20:07:47 +0000 Subject: [PATCH 26/40] The SessionId is not the same as the session pointer. Add fixed code for PsGetThreadSessionId, commented out as we don't have support for Sessions anyway. svn path=/branches/ros-amd64-bringup/; revision=43501 --- reactos/ntoskrnl/ps/thread.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index d5e3be4b048..78269bc8eac 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -736,6 +736,11 @@ NTAPI PsGetThreadSessionId(IN PETHREAD Thread) { return (HANDLE)Thread->ThreadsProcess->Session; +#if 0 + // Should probably return a DWORD + PMM_SESSION_SPACE Session = Thread->ThreadsProcess->Session; + return Session->SessionId; +#endif } /* From c269c1f512423d2b9bc103d57630780ec2e66b15 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 21:40:00 +0000 Subject: [PATCH 27/40] [HAL] - Implement HalpQuery8254Counter - replace Ke386HaltProcessor() with __halt() - remove excess #endif svn path=/branches/ros-amd64-bringup/; revision=43504 --- reactos/hal/halamd64/generic/systimer.S | 28 +++++++++++++++++++++++++ reactos/hal/halamd64/up/processor.c | 2 +- reactos/hal/halx86/mp/apic.c | 1 - 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/reactos/hal/halamd64/generic/systimer.S b/reactos/hal/halamd64/generic/systimer.S index 298cea2619f..79d282a56ff 100644 --- a/reactos/hal/halamd64/generic/systimer.S +++ b/reactos/hal/halamd64/generic/systimer.S @@ -53,6 +53,34 @@ Done: ret 4 .endfunc + +.globl _HalpQuery8254Counter +.func HalpQuery8254Counter +_HalpQuery8254Counter: + + /* Save EFLAGS and disable interrupts */ + pushfq + cli + + /* Set timer data */ + mov al, 0 + out 0x43, al + jmp $+2 + + /* Read current timer */ + in al, 0x40 + jmp $+2 + movzx ecx, al + in al, 0x40 + mov ch, al + + /* Return it and restore interrupt state */ + mov eax, ecx + popfq + ret +.endfunc + + .global _KeQueryPerformanceCounter .func KeQueryPerformanceCounter _KeQueryPerformanceCounter: diff --git a/reactos/hal/halamd64/up/processor.c b/reactos/hal/halamd64/up/processor.c index 669c82b5910..1104ed3aa0c 100644 --- a/reactos/hal/halamd64/up/processor.c +++ b/reactos/hal/halamd64/up/processor.c @@ -70,7 +70,7 @@ HalProcessorIdle(VOID) { /* Enable interrupts and halt the processor */ _enable(); - Ke386HaltProcessor(); + __halt(); } /* diff --git a/reactos/hal/halx86/mp/apic.c b/reactos/hal/halx86/mp/apic.c index 0702a34e12d..f7c6e60f3fd 100644 --- a/reactos/hal/halx86/mp/apic.c +++ b/reactos/hal/halx86/mp/apic.c @@ -882,7 +882,6 @@ SetInterruptGate(ULONG index, ULONG_PTR address) idt->Access = Access.Value; idt->ExtendedOffset = (USHORT)(address >> 16); #endif -#endif } VOID HaliInitBSP(VOID) From 97750a3d39ebf8e8c0b564c7ea387dc843265479 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 21:50:51 +0000 Subject: [PATCH 28/40] Update MMPTE svn path=/branches/ros-amd64-bringup/; revision=43505 --- reactos/include/ndk/mmtypes.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/reactos/include/ndk/mmtypes.h b/reactos/include/ndk/mmtypes.h index fcc8faad6c2..e4dec2fb57f 100644 --- a/reactos/include/ndk/mmtypes.h +++ b/reactos/include/ndk/mmtypes.h @@ -321,14 +321,21 @@ typedef struct _MMPTE { union { - ULONG Long; + ULONG_PTR Long; HARDWARE_PTE Flush; MMPTE_HARDWARE Hard; +#ifdef _M_AMD64 + MMPTE_HARDWARE_LARGEPAGE HardLarge; +#endif MMPTE_PROTOTYPE Proto; MMPTE_SOFTWARE Soft; MMPTE_TRANSITION Trans; MMPTE_SUBSECTION Subsect; MMPTE_LIST List; +#if (NTDDI_VERSION >= NTDDI_LONGHORN) + volatile ULONG_PTR VolatileLong; + MMPTE_TIMESTAMP TimeStamp; +#endif } u; } MMPTE, *PMMPTE; From 036ea51418187187036001e72cd1807ee6fc71c4 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 15 Oct 2009 21:54:39 +0000 Subject: [PATCH 29/40] Fix definition of CryptReleaseContext svn path=/branches/ros-amd64-bringup/; revision=43506 --- reactos/include/psdk/wincrypt.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/include/psdk/wincrypt.h b/reactos/include/psdk/wincrypt.h index e0a393068be..b4d3f5a66c3 100644 --- a/reactos/include/psdk/wincrypt.h +++ b/reactos/include/psdk/wincrypt.h @@ -3822,7 +3822,11 @@ WINADVAPI BOOL WINAPI CryptGetUserKey (HCRYPTPROV, DWORD, HCRYPTKEY *); WINADVAPI BOOL WINAPI CryptHashData (HCRYPTHASH, CONST BYTE *, DWORD, DWORD); WINADVAPI BOOL WINAPI CryptHashSessionKey (HCRYPTHASH, HCRYPTKEY, DWORD); WINADVAPI BOOL WINAPI CryptImportKey (HCRYPTPROV, CONST BYTE *, DWORD, HCRYPTKEY, DWORD, HCRYPTKEY *); +#if (NTDDI_VERSION >= NTDDI_WINXP) +WINADVAPI BOOL WINAPI CryptReleaseContext (HCRYPTPROV, DWORD); +#else WINADVAPI BOOL WINAPI CryptReleaseContext (HCRYPTPROV, ULONG_PTR); +#endif WINADVAPI BOOL WINAPI CryptSetHashParam (HCRYPTHASH, DWORD, CONST BYTE *, DWORD); WINADVAPI BOOL WINAPI CryptSetKeyParam (HCRYPTKEY, DWORD, CONST BYTE *, DWORD); WINADVAPI BOOL WINAPI CryptSetProviderA (LPCSTR, DWORD); From 0fb6c8265cceb0b6a2245ae37a0d2c067c0e6c89 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 14:18:42 +0000 Subject: [PATCH 30/40] Cleanup kernel init code a bit svn path=/branches/ros-amd64-bringup/; revision=43552 --- .../include/internal/amd64/asmmacro.S | 81 ------------ reactos/ntoskrnl/include/internal/amd64/ke.h | 6 +- reactos/ntoskrnl/ke/amd64/cpu.c | 6 +- reactos/ntoskrnl/ke/amd64/kiinit.c | 121 +++++++----------- 4 files changed, 51 insertions(+), 163 deletions(-) delete mode 100644 reactos/ntoskrnl/include/internal/amd64/asmmacro.S diff --git a/reactos/ntoskrnl/include/internal/amd64/asmmacro.S b/reactos/ntoskrnl/include/internal/amd64/asmmacro.S deleted file mode 100644 index 9d7a1807321..00000000000 --- a/reactos/ntoskrnl/include/internal/amd64/asmmacro.S +++ /dev/null @@ -1,81 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel - * FILE: ntoskrnl/include/amd64/asmmacro.S - * PURPOSE: Macros for x64 assembly - * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) - */ - -.intel_syntax noprefix -.code64 - -/* Macros for x64 stack unwind OPs */ - -.macro .proc name - .func name - .global _\name - _\name: - .cfi_startproc - .equ cfa_current_offset, -8 -.endm - -.macro .endproc - .cfi_endproc - .endfunc -.endm - -.macro .allocstack size - .cfi_adjust_cfa_offset \size - .set cfa_current_offset, cfa_current_offset - \size -.endm - -.macro .pushframe code - .if (\code == 0) - .cfi_adjust_cfa_offset 0x28 - .set cfa_current_offset, cfa_current_offset - 0x28 - .else - .cfi_adjust_cfa_offset 0x30 - .set cfa_current_offset, cfa_current_offset - 0x30 - .endif -.endm - -.macro .pushreg reg - .cfi_adjust_cfa_offset 8 - .equ cfa_current_offset, cfa_current_offset - 8 - .cfi_offset \reg, cfa_current_offset -.endm - -.macro .savereg reg, offset - // checkme!!! - .cfi_offset \reg, \offset -.endm - -.macro .savexmm128 reg, offset - // checkme!!! - .cfi_offset \reg, \offset -.endm - -.macro .setframe reg, offset - .cfi_def_cfa reg, \offset - .equ cfa_current_offset, \offset -.endm - -.macro .endprolog -.endm - -.macro UNIMPLEMENTED2 line, func - jmp 3f - .equ expr, 12 -1: .asciz "\func" -2: .asciz __FILE__ -3: - sub rsp, 0x20 - lea rcx, _MsgUnimplemented[rip] - lea rdx, 1b[rip] - lea r8, 2b[rip] - mov r9, \line - call _DbgPrint - add rsp, 0x20 -.endm -#define UNIMPLEMENTED UNIMPLEMENTED2 __LINE__, - diff --git a/reactos/ntoskrnl/include/internal/amd64/ke.h b/reactos/ntoskrnl/include/internal/amd64/ke.h index 3610cf533d5..e14fe445964 100644 --- a/reactos/ntoskrnl/include/internal/amd64/ke.h +++ b/reactos/ntoskrnl/include/internal/amd64/ke.h @@ -108,12 +108,14 @@ KiInitializeGdt(struct _KPCR* Pcr); VOID Ki386ApplicationProcessorInitializeTSS(VOID); +// Hack +VOID KiRosPrepareForSystemStartup(ULONG, PROS_LOADER_PARAMETER_BLOCK); + VOID FASTCALL Ki386InitializeTss( IN PKTSS Tss, - IN PKIDTENTRY Idt, - IN PKGDTENTRY Gdt, + IN PVOID GdtBase, IN UINT64 Stack ); diff --git a/reactos/ntoskrnl/ke/amd64/cpu.c b/reactos/ntoskrnl/ke/amd64/cpu.c index ed3c0f0b437..81261baf759 100644 --- a/reactos/ntoskrnl/ke/amd64/cpu.c +++ b/reactos/ntoskrnl/ke/amd64/cpu.c @@ -387,18 +387,16 @@ KiGetCacheInformation(VOID) } } - VOID FASTCALL Ki386InitializeTss(IN PKTSS64 Tss, - IN PKIDTENTRY Idt, - IN PKGDTENTRY Gdt, + IN PVOID GdtBase, IN UINT64 Stack) { PKGDTENTRY64 TssEntry; /* Initialize the TSS descriptor entry */ - TssEntry = (PVOID)((ULONG64)Gdt + KGDT_TSS); + TssEntry = (PVOID)((ULONG64)GdtBase + KGDT_TSS); TssEntry->Bits.Type = 9;//AMD64_TSS; TssEntry->Bits.Dpl = 0; TssEntry->Bits.Present = 1; diff --git a/reactos/ntoskrnl/ke/amd64/kiinit.c b/reactos/ntoskrnl/ke/amd64/kiinit.c index 0fe10f85d02..6f1b42b0262 100644 --- a/reactos/ntoskrnl/ke/amd64/kiinit.c +++ b/reactos/ntoskrnl/ke/amd64/kiinit.c @@ -328,18 +328,17 @@ KiInitMachineDependent(VOID) VOID NTAPI -KiInitializePcr(IN ULONG ProcessorNumber, - IN PKIPCR Pcr, - IN PKIDTENTRY Idt, - IN PKGDTENTRY Gdt, - IN PKTSS Tss, +KiInitializePcr(IN PKIPCR Pcr, + IN ULONG ProcessorNumber, IN PKTHREAD IdleThread, IN PVOID DpcStack) { - RtlZeroMemory(Pcr, PAGE_SIZE); + KDESCRIPTOR GdtDescriptor = {{0},0,0}, IdtDescriptor = {{0},0,0}; + KGDTENTRY64 TssSelector; + USHORT Tr = 0; - /* Set the Current Thread */ - Pcr->Prcb.CurrentThread = IdleThread; + /* Zero out the PCR */ + RtlZeroMemory(Pcr, PAGE_SIZE); /* Set pointers to ourselves */ Pcr->Self = (PKPCR)Pcr; @@ -349,7 +348,7 @@ KiInitializePcr(IN ULONG ProcessorNumber, Pcr->MajorVersion = PCR_MAJOR_VERSION; Pcr->MinorVersion = PCR_MINOR_VERSION; - /* Set the PCRB Version */ + /* Set the PRCB Version */ Pcr->Prcb.MajorVersion = 1; Pcr->Prcb.MinorVersion = 1; @@ -366,27 +365,44 @@ KiInitializePcr(IN ULONG ProcessorNumber, Pcr->Prcb.Number = (UCHAR)ProcessorNumber; Pcr->Prcb.SetMember = 1 << ProcessorNumber; - /* Set the PRCB for this Processor */ - KiProcessorBlock[ProcessorNumber] = &Pcr->Prcb; + /* Get GDT and IDT descriptors */ + __sgdt(&GdtDescriptor.Limit); + __sidt(&IdtDescriptor.Limit); + Pcr->GdtBase = (PVOID)GdtDescriptor.Base; + Pcr->IdtBase = (PKIDTENTRY)IdtDescriptor.Base; - /* Start us out at PASSIVE_LEVEL */ -// Pcr->Irql = PASSIVE_LEVEL; - KeSetCurrentIrql(PASSIVE_LEVEL); + /* Get TSS Selector */ + Ke386GetTr(Tr); // <- FIXME: this is ugly! + if (Tr != KGDT_TSS) Tr = KGDT_TSS; // FIXME: HACKHACK - /* Set the GDT, IDT, TSS and DPC Stack */ - Pcr->GdtBase = (PVOID)Gdt; - Pcr->IdtBase = Idt; - Pcr->TssBase = Tss; + /* Get TSS Selector, mask it and get its GDT Entry */ + TssSelector = *(PKGDTENTRY)((ULONG_PTR)Pcr->GdtBase + (Tr & ~RPL_MASK)); + + /* Get the KTSS itself */ + Pcr->TssBase = (PKTSS)(ULONG_PTR)(TssSelector.BaseLow | + TssSelector.Bytes.BaseMiddle << 16 | + TssSelector.Bytes.BaseHigh << 24 | + (ULONG64)TssSelector.BaseUpper << 32); + + Pcr->Prcb.RspBase = Pcr->TssBase->Rsp0; + + /* Set DPC Stack */ Pcr->Prcb.DpcStack = DpcStack; - Pcr->Prcb.RspBase = Tss->Rsp0; - /* Setup the processor set */ Pcr->Prcb.MultiThreadProcessorSet = Pcr->Prcb.SetMember; /* Clear DR6/7 to cleanup bootloader debugging */ Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr6 = 0; Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr7 = 0; + + /* Set the Current Thread */ + Pcr->Prcb.CurrentThread = IdleThread; + + /* Start us out at PASSIVE_LEVEL */ +// Pcr->Irql = PASSIVE_LEVEL; + KeSetCurrentIrql(PASSIVE_LEVEL); + } VOID @@ -600,42 +616,6 @@ KiInitializeKernel(IN PKPROCESS InitProcess, LoaderBlock->Prcb = 0; } -VOID -FASTCALL -KiGetMachineBootPointers(IN PKGDTENTRY *Gdt, - IN PKIDTENTRY *Idt, - IN PKIPCR *Pcr, - IN PKTSS *Tss) -{ - KDESCRIPTOR GdtDescriptor = {{0},0,0}, IdtDescriptor = {{0},0,0}; - KGDTENTRY64 TssSelector; - USHORT Tr = 0; - - /* Get GDT and IDT descriptors */ - __sgdt(&GdtDescriptor.Limit); - __sidt(&IdtDescriptor.Limit); - - /* Save IDT and GDT */ - *Gdt = (PKGDTENTRY)GdtDescriptor.Base; - *Idt = (PKIDTENTRY)IdtDescriptor.Base; - - /* Get TSS and FS Selectors */ - Ke386GetTr(Tr); - if (Tr != KGDT_TSS) Tr = KGDT_TSS; // FIXME: HACKHACK - - /* Get TSS Selector, mask it and get its GDT Entry */ - TssSelector = *(PKGDTENTRY)((ULONG_PTR)*Gdt + (Tr & ~RPL_MASK)); - - /* Get the KTSS itself */ - *Tss = (PKTSS)(ULONG_PTR)(TssSelector.BaseLow | - TssSelector.Bytes.BaseMiddle << 16 | - TssSelector.Bytes.BaseHigh << 24 | - (ULONG64)TssSelector.BaseUpper << 32); -} - -// Hack -VOID KiRosPrepareForSystemStartup(ULONG, PROS_LOADER_PARAMETER_BLOCK); - VOID NTAPI KiSystemStartup(IN ULONG_PTR Dummy, @@ -652,21 +632,16 @@ KiSystemStartupReal(IN PLOADER_PARAMETER_BLOCK LoaderBlock) ULONG Cpu; PKTHREAD InitialThread; ULONG64 InitialStack; - PKGDTENTRY Gdt; - PKIDTENTRY Idt; -// KIDTENTRY NmiEntry, DoubleFaultEntry; - PKTSS Tss; PKIPCR Pcr; - /* Save the loader block and get the current CPU */ + /* Save the loader block */ KeLoaderBlock = LoaderBlock; /* Get the current CPU number */ - Cpu = KeNumberProcessors; + Cpu = KeNumberProcessors++; /* Set active processors */ KeActiveProcessors |= 1 << Cpu; - KeNumberProcessors++; /* LoaderBlock initialization for Cpu 0 */ if (Cpu == 0) @@ -681,6 +656,9 @@ KiSystemStartupReal(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Get Pcr from loader block */ Pcr = CONTAINING_RECORD(LoaderBlock->Prcb, KIPCR, Prcb); + /* Set the PRCB for this Processor */ + KiProcessorBlock[Cpu] = &Pcr->Prcb; + /* Set GS base */ __writemsr(X86_MSR_GSBASE, (ULONG64)Pcr); __writemsr(X86_MSR_KERNEL_GSBASE, (ULONG64)Pcr); @@ -706,23 +684,14 @@ KiSystemStartupReal(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Set us as the current process */ InitialThread->ApcState.Process = (PVOID)LoaderBlock->Process; - /* Get GDT, IDT, PCR and TSS pointers */ - KiGetMachineBootPointers(&Gdt, &Idt, &Pcr, &Tss); - /* Initialize the PCR */ - KiInitializePcr(Cpu, - Pcr, - Idt, - Gdt, - Tss, - InitialThread, - KiDoubleFaultStack); + KiInitializePcr(Pcr, Cpu, InitialThread, KiDoubleFaultStack); - /* Skip initial setup if this isn't the Boot CPU */ + /* Initial setup for the boot CPU */ if (Cpu == 0) { /* Setup the TSS descriptors and entries */ - Ki386InitializeTss(Tss, Idt, Gdt, InitialStack); + Ki386InitializeTss(Pcr->TssBase, Pcr->GdtBase, InitialStack); /* Setup the IDT */ KeInitExceptions(); @@ -749,7 +718,7 @@ KiSystemStartupReal(IN PLOADER_PARAMETER_BLOCK LoaderBlock) LoaderBlock->NtBootPathName); } - DPRINT1("Gdt = %p, Idt = %p, Pcr = %p, Tss = %p\n", Gdt, Idt, Pcr, Tss); +// DPRINT1("Gdt = %p, Idt = %p, Pcr = %p, Tss = %p\n", Gdt, Idt, Pcr, Tss); /* Initialize the Processor with HAL */ HalInitializeProcessor(Cpu, KeLoaderBlock); From d901cd4fbef4e86d82aa821c3f80bae617ec22ff Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 14:36:03 +0000 Subject: [PATCH 31/40] Add alignment checks to KdpSysReadIoSpace and KdpSysWriteIoSpace svn path=/branches/ros-amd64-bringup/; revision=43554 --- reactos/ntoskrnl/kd64/amd64/kdsup.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/kd64/amd64/kdsup.c b/reactos/ntoskrnl/kd64/amd64/kdsup.c index c870e2cc41d..7b991f14979 100644 --- a/reactos/ntoskrnl/kd64/amd64/kdsup.c +++ b/reactos/ntoskrnl/kd64/amd64/kdsup.c @@ -264,6 +264,14 @@ KdpSysReadIoSpace(IN ULONG InterfaceType, return STATUS_INVALID_PARAMETER; } + /* Check for correct alignment */ + if ((IoAddress & (DataSize - 1))) + { + /* Invalid alignment */ + *ActualDataSize = 0; + return STATUS_DATATYPE_MISALIGNMENT; + } + switch (DataSize) { case sizeof(UCHAR): @@ -284,7 +292,7 @@ KdpSysReadIoSpace(IN ULONG InterfaceType, default: /* Invalid data size */ *ActualDataSize = 0; - return STATUS_UNSUCCESSFUL; + return STATUS_INVALID_PARAMETER; } /* Return the size of the data */ @@ -313,6 +321,14 @@ KdpSysWriteIoSpace(IN ULONG InterfaceType, return STATUS_INVALID_PARAMETER; } + /* Check for correct alignment */ + if ((IoAddress & (DataSize - 1))) + { + /* Invalid alignment */ + *ActualDataSize = 0; + return STATUS_DATATYPE_MISALIGNMENT; + } + switch (DataSize) { case sizeof(UCHAR): @@ -333,7 +349,7 @@ KdpSysWriteIoSpace(IN ULONG InterfaceType, default: /* Invalid data size */ *ActualDataSize = 0; - return STATUS_UNSUCCESSFUL; + return STATUS_INVALID_PARAMETER; } /* Return the size of the data */ From 3213daec4acef006c18b853eef9483d6111ba81c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 15:47:57 +0000 Subject: [PATCH 32/40] comment out audio_test for now svn path=/branches/ros-amd64-bringup/; revision=43557 --- reactos/drivers/wdm/audio/backpln/directory.rbuild | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/directory.rbuild b/reactos/drivers/wdm/audio/backpln/directory.rbuild index e65bc580a61..1234e09d00f 100644 --- a/reactos/drivers/wdm/audio/backpln/directory.rbuild +++ b/reactos/drivers/wdm/audio/backpln/directory.rbuild @@ -1,9 +1,9 @@ - + From 16ab8ad03bf5427409fe3a35090d923619cc3384 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 15:52:07 +0000 Subject: [PATCH 33/40] build cardlib only if USERMODE = 1 svn path=/branches/ros-amd64-bringup/; revision=43558 --- reactos/ReactOS-amd64.rbuild | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/ReactOS-amd64.rbuild b/reactos/ReactOS-amd64.rbuild index 149506bda87..12575ef87bf 100644 --- a/reactos/ReactOS-amd64.rbuild +++ b/reactos/ReactOS-amd64.rbuild @@ -221,9 +221,11 @@ + + From cadb3cfe49fac0e416fd9b16f92d7092ed9c2455 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 16:08:31 +0000 Subject: [PATCH 34/40] Comment out mmebuddy, I currently see no chance compiling this for 64 bit. Please someone fix this. svn path=/branches/ros-amd64-bringup/; revision=43559 --- reactos/lib/drivers/sound/sound.rbuild | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/drivers/sound/sound.rbuild b/reactos/lib/drivers/sound/sound.rbuild index 7255a8747ed..b4dbcbc7601 100644 --- a/reactos/lib/drivers/sound/sound.rbuild +++ b/reactos/lib/drivers/sound/sound.rbuild @@ -13,9 +13,9 @@ - + From b6930d4c8d722d77391d032180e6945487eb9228 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 16:39:24 +0000 Subject: [PATCH 35/40] ULONG -> ULONG_PTR svn path=/branches/ros-amd64-bringup/; revision=43560 --- .../drivers/wdm/audio/legacy/wdmaud/mixer.c | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c index d61638f0f6d..cb46456f337 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c @@ -1789,7 +1789,7 @@ WdmAudGetLineInfo( if (DeviceInfo->Flags == MIXER_GETLINEINFOF_DESTINATION) { - if ((ULONG)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) + if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) { /* invalid parameter */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); @@ -1800,7 +1800,7 @@ WdmAudGetLineInfo( /* invalid parameter */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); } - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DESTINATION_LINE); + MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DESTINATION_LINE); ASSERT(MixerLineSrc); /* copy cached data */ @@ -1809,13 +1809,13 @@ WdmAudGetLineInfo( } else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_SOURCE) { - if ((ULONG)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) + if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) { /* invalid parameter */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); } - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DESTINATION_LINE); + MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DESTINATION_LINE); ASSERT(MixerLineSrc); if (DeviceInfo->u.MixLine.dwSource >= MixerLineSrc->Line.cConnections) @@ -1825,7 +1825,7 @@ WdmAudGetLineInfo( return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); } - MixerLineSrc = GetSourceMixerLine(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwSource); + MixerLineSrc = GetSourceMixerLine(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwSource); if (MixerLineSrc) { DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName); @@ -1835,13 +1835,13 @@ WdmAudGetLineInfo( } else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_LINEID) { - if ((ULONG)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) + if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) { /* invalid parameter */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); } - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwLineID); + MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwLineID); if (!MixerLineSrc) { DPRINT1("Failed to find Line with id %u\n", DeviceInfo->u.MixLine.dwLineID); @@ -1854,13 +1854,13 @@ WdmAudGetLineInfo( } else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_COMPONENTTYPE) { - if ((ULONG)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) + if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) { /* invalid parameter */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); } - MixerLineSrc = GetSourceMixerLineByComponentType(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwComponentType); + MixerLineSrc = GetSourceMixerLineByComponentType(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwComponentType); ASSERT(MixerLineSrc); /* copy cached data */ @@ -1897,13 +1897,13 @@ WdmAudGetLineControls( if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ALL) { - if ((ULONG)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) + if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) { /* invalid parameter */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); } - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID); + MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID); ASSERT(MixerLineSrc); if (MixerLineSrc) { @@ -1913,13 +1913,13 @@ WdmAudGetLineControls( } else if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ONEBYTYPE) { - if ((ULONG)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) + if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) { /* invalid parameter */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); } - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID); + MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID); ASSERT(MixerLineSrc); Index = 0; @@ -1937,13 +1937,13 @@ WdmAudGetLineControls( } else if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ONEBYID) { - if ((ULONG)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) + if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) { /* invalid parameter */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); } - DPRINT1("MixerId %u ControlId %u\n",(ULONG)DeviceInfo->hDevice, DeviceInfo->u.MixControls.dwControlID); - Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwControlID, NULL, &MixerControl, NULL); + DPRINT1("MixerId %u ControlId %u\n",(ULONG_PTR)DeviceInfo->hDevice, DeviceInfo->u.MixControls.dwControlID); + Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwControlID, NULL, &MixerControl, NULL); if (NT_SUCCESS(Status)) { RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, MixerControl, sizeof(MIXERCONTROLW)); @@ -2147,7 +2147,7 @@ WdmAudSetControlDetails( DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; /* get mixer control */ - Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId); + Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId); if (!NT_SUCCESS(Status)) { @@ -2199,7 +2199,7 @@ WdmAudGetControlDetails( DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; /* get mixer control */ - Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId); + Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId); if (!NT_SUCCESS(Status)) { From 29106f47ec490f1a276a59bb1247a27c9882852f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 17:25:59 +0000 Subject: [PATCH 36/40] fix MmSetAddressRangeModified prototype svn path=/branches/ros-amd64-bringup/; revision=43563 --- reactos/include/ddk/ntifs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 62d29154029..ae1e5025ecf 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -4513,7 +4513,7 @@ BOOLEAN NTAPI MmSetAddressRangeModified ( IN PVOID Address, - IN ULONG Length + IN SIZE_T Length ); NTKERNELAPI From 3405cb47286621cd5658c09daa30d0a26989caef Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 18:15:52 +0000 Subject: [PATCH 37/40] Add HYPER_SPACE, MI_MAKE_OWNER_PAGE, MI_MAKE_WRITE_PAGE and some globals svn path=/branches/ros-amd64-bringup/; revision=43564 --- reactos/ntoskrnl/include/internal/amd64/mm.h | 4 ++++ reactos/ntoskrnl/mm/amd64/init.c | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index 99cc8e14ec3..5776d3c83c9 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -17,6 +17,8 @@ MmGetPageDirectory(VOID) #define PAGE_MASK(x) ((x)&(~0xfff)) #define PAE_PAGE_MASK(x) ((x)&(~0xfffLL)) +#define HYPER_SPACE 0xFFFFF70000000000ULL + /* Base addresses of PTE and PDE */ //#define PAGETABLE_MAP PTE_BASE //#define PAGEDIRECTORY_MAP (0xc0000000 + (PAGETABLE_MAP / (1024))) @@ -56,5 +58,7 @@ MmGetPageDirectory(VOID) #define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.Write == 1) #define MI_IS_PAGE_COPY_ON_WRITE(x)((x)->u.Hard.CopyOnWrite == 1) #define MI_IS_PAGE_DIRTY(x) ((x)->u.Hard.Dirty == 1) +#define MI_MAKE_OWNER_PAGE(x) ((x)->u.Hard.Owner = 1) +#define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.Write = 1) #endif /* __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H */ diff --git a/reactos/ntoskrnl/mm/amd64/init.c b/reactos/ntoskrnl/mm/amd64/init.c index 60cb584bfcf..8f190154999 100644 --- a/reactos/ntoskrnl/mm/amd64/init.c +++ b/reactos/ntoskrnl/mm/amd64/init.c @@ -22,6 +22,8 @@ ULONG MmMaximumNonPagedPoolPercent; ULONG MmSizeOfNonPagedPoolInBytes; ULONG MmMaximumNonPagedPoolInBytes; +PVOID MiSessionSpaceEnd; // 0xC0000000 + ULONG64 MmUserProbeAddress; PVOID MmHighestUserAddress; PVOID MmSystemRangeStart; @@ -50,6 +52,10 @@ ULONG MmSessionSize; PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; +PMMPTE MmSystemPagePtes; +ULONG MxPfnAllocation; +PVOID MiSystemViewStart; +ULONG MmSystemViewSize; NTSTATUS NTAPI From 5fb8f749c4a30a8b3812abe886e22cbe486058a5 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 18:29:25 +0000 Subject: [PATCH 38/40] [FREELDR] - move wlmemory.c into arch specific folder - add elmemory.c and ntsetup.c for amd64 (stubbed) svn path=/branches/ros-amd64-bringup/; revision=43566 --- .../boot/freeldr/freeldr/freeldr_arch.rbuild | 7 + .../boot/freeldr/freeldr/freeldr_base.rbuild | 9 +- .../freeldr/freeldr/windows/amd64/ntsetup.c | 44 +++++ .../freeldr/freeldr/windows/amd64/wlmemory.c | 169 ++++++++++++++++++ .../freeldr/windows/{ => i386}/wlmemory.c | 0 5 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 reactos/boot/freeldr/freeldr/windows/amd64/ntsetup.c create mode 100644 reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c rename reactos/boot/freeldr/freeldr/windows/{ => i386}/wlmemory.c (100%) diff --git a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild index 805f59fe782..968a027c581 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild @@ -105,6 +105,13 @@ ntsetup.c + wlmemory.c + + + + + ntsetup.c + wlmemory.c diff --git a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild index c13ad4436ad..42a13495c76 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild @@ -73,7 +73,14 @@ conversion.c peloader.c winldr.c - wlmemory.c + wlregistry.c + + + + + conversion.c + peloader.c + winldr.c wlregistry.c diff --git a/reactos/boot/freeldr/freeldr/windows/amd64/ntsetup.c b/reactos/boot/freeldr/freeldr/windows/amd64/ntsetup.c new file mode 100644 index 00000000000..67d10579a64 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/windows/amd64/ntsetup.c @@ -0,0 +1,44 @@ +/* + * PROJECT: EFI Windows Loader + * LICENSE: GPL - See COPYING in the top level directory + * FILE: freeldr/windows/i386/ntsetup.c + * PURPOSE: i386-specific setup for Windows boot + * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org) + */ + +/* INCLUDES ***************************************************************/ + +#include +#include + +// this is needed for new IDT filling +#if 0 +extern ULONG_PTR i386DivideByZero; +extern ULONG_PTR i386DebugException; +extern ULONG_PTR i386NMIException; +extern ULONG_PTR i386Breakpoint; +extern ULONG_PTR i386Overflow; +extern ULONG_PTR i386BoundException; +extern ULONG_PTR i386InvalidOpcode; +extern ULONG_PTR i386FPUNotAvailable; +extern ULONG_PTR i386DoubleFault; +extern ULONG_PTR i386CoprocessorSegment; +extern ULONG_PTR i386InvalidTSS; +extern ULONG_PTR i386SegmentNotPresent; +extern ULONG_PTR i386StackException; +extern ULONG_PTR i386GeneralProtectionFault; +extern ULONG_PTR i386PageFault; // exc 14 +extern ULONG_PTR i386CoprocessorError; // exc 16 +extern ULONG_PTR i386AlignmentCheck; // exc 17 +#endif + +/* FUNCTIONS **************************************************************/ + +// Last step before going virtual +void WinLdrSetupForNt(PLOADER_PARAMETER_BLOCK LoaderBlock, + PVOID *GdtIdt, + ULONG *PcrBasePage, + ULONG *TssBasePage) +{ + +} diff --git a/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c new file mode 100644 index 00000000000..bd111ef09bf --- /dev/null +++ b/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c @@ -0,0 +1,169 @@ +/* + * PROJECT: EFI Windows Loader + * LICENSE: GPL - See COPYING in the top level directory + * FILE: freeldr/winldr/wlmemory.c + * PURPOSE: Memory related routines + * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org) + */ + +/* INCLUDES ***************************************************************/ + +#include + +#include +#include + +extern ULONG TotalNLSSize; +extern ULONG LoaderPagesSpanned; + +// This is needed because headers define wrong one for ReactOS +#undef KIP0PCRADDRESS +#define KIP0PCRADDRESS 0xffdff000 + +#define HYPER_SPACE_ENTRY 0x300 + +PCHAR MemTypeDesc[] = { + "ExceptionBlock ", // ? + "SystemBlock ", // ? + "Free ", + "Bad ", // used + "LoadedProgram ", // == Free + "FirmwareTemporary ", // == Free + "FirmwarePermanent ", // == Bad + "OsloaderHeap ", // used + "OsloaderStack ", // == Free + "SystemCode ", + "HalCode ", + "BootDriver ", // not used + "ConsoleInDriver ", // ? + "ConsoleOutDriver ", // ? + "StartupDpcStack ", // ? + "StartupKernelStack", // ? + "StartupPanicStack ", // ? + "StartupPcrPage ", // ? + "StartupPdrPage ", // ? + "RegistryData ", // used + "MemoryData ", // not used + "NlsData ", // used + "SpecialMemory ", // == Bad + "BBTMemory " // == Bad + }; + +VOID +WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock); + + +VOID +MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + ULONG BasePage, + ULONG PageCount, + ULONG Type); +VOID +WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor); + +VOID +WinLdrRemoveDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR Descriptor); + +VOID +WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss); + +// This is needed only for SetProcessorContext routine +#pragma pack(2) + typedef struct + { + USHORT Limit; + ULONG Base; + } GDTIDT; +#pragma pack(4) + +/* GLOBALS ***************************************************************/ + +PHARDWARE_PTE PDE; +PHARDWARE_PTE HalPageTable; + +PUCHAR PhysicalPageTablesBuffer; +PUCHAR KernelPageTablesBuffer; +ULONG PhysicalPageTables; +ULONG KernelPageTables; + +MEMORY_ALLOCATION_DESCRIPTOR *Mad; +ULONG MadCount = 0; + + +/* FUNCTIONS **************************************************************/ + +BOOLEAN +MempAllocatePageTables() +{ + + return TRUE; +} + +VOID +MempAllocatePTE(ULONG Entry, PHARDWARE_PTE *PhysicalPT, PHARDWARE_PTE *KernelPT) +{ + +} + +BOOLEAN +MempSetupPaging(IN ULONG StartPage, + IN ULONG NumberOfPages) +{ + + return TRUE; +} + +VOID +MempDisablePages() +{ + +} + +VOID +MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + ULONG BasePage, + ULONG PageCount, + ULONG Type) +{ + +} + +#ifdef _M_IX86 +VOID +WinLdrpMapApic() +{ + +} +#else +VOID +WinLdrpMapApic() +{ + /* Implement it for another arch */ +} +#endif + +BOOLEAN +WinLdrTurnOnPaging(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + ULONG PcrBasePage, + ULONG TssBasePage, + PVOID GdtIdt) +{ +return 1; +} + +// Two special things this func does: it sorts descriptors, +// and it merges free ones +VOID +WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor) +{ + +} + +VOID +WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss) +{ + +} + diff --git a/reactos/boot/freeldr/freeldr/windows/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/i386/wlmemory.c similarity index 100% rename from reactos/boot/freeldr/freeldr/windows/wlmemory.c rename to reactos/boot/freeldr/freeldr/windows/i386/wlmemory.c From 9e1db2627d25374abe1c0a8ee4bc1026d99531e9 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 18 Oct 2009 18:54:40 +0000 Subject: [PATCH 39/40] enable winldr style boot svn path=/branches/ros-amd64-bringup/; revision=43574 --- reactos/boot/freeldr/freeldr/bootmgr.c | 4 +--- reactos/boot/freeldr/freeldr/setupldr_main.rbuild | 13 +++++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/bootmgr.c b/reactos/boot/freeldr/freeldr/bootmgr.c index 15863838731..eaa69ebb158 100644 --- a/reactos/boot/freeldr/freeldr/bootmgr.c +++ b/reactos/boot/freeldr/freeldr/bootmgr.c @@ -143,13 +143,11 @@ VOID RunLoader(VOID) // to have different install methods, etc. LoadReactOSSetup(); } -#ifdef __i386__ +#if defined(__i386__) || defined(__x86_64__) else if (_stricmp(SettingValue, "ReactOSSetup2") == 0) { -#ifdef __i386__ // WinLdr-style boot LoadReactOSSetup2(); -#endif } #endif #endif diff --git a/reactos/boot/freeldr/freeldr/setupldr_main.rbuild b/reactos/boot/freeldr/freeldr/setupldr_main.rbuild index 4d7e5714544..c89e46ba0c5 100644 --- a/reactos/boot/freeldr/freeldr/setupldr_main.rbuild +++ b/reactos/boot/freeldr/freeldr/setupldr_main.rbuild @@ -20,8 +20,13 @@ setupldr.c - - setupldr2.c - - + + setupldr2.c + + + + + setupldr2.c + + From 2a3e82aae5e540942e2023a5c8056124396f0298 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Oct 2009 11:29:10 +0000 Subject: [PATCH 40/40] [FREELDR] - Split wlmemory into portable and arch specific code - Partly implement amd64 version, doesn't work correctly yet svn path=/branches/ros-amd64-bringup/; revision=43598 --- .../boot/freeldr/freeldr/freeldr_base.rbuild | 2 + .../freeldr/freeldr/windows/amd64/wlmemory.c | 328 ++++++++---- .../freeldr/freeldr/windows/i386/wlmemory.c | 477 ++---------------- .../boot/freeldr/freeldr/windows/wlmemory.c | 432 ++++++++++++++++ 4 files changed, 720 insertions(+), 519 deletions(-) create mode 100644 reactos/boot/freeldr/freeldr/windows/wlmemory.c diff --git a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild index 42a13495c76..19842ed4ef6 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild @@ -73,6 +73,7 @@ conversion.c peloader.c winldr.c + wlmemory.c wlregistry.c @@ -81,6 +82,7 @@ conversion.c peloader.c winldr.c + wlmemory.c wlregistry.c diff --git a/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c index bd111ef09bf..ef6a18dfdfb 100644 --- a/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/amd64/wlmemory.c @@ -1,9 +1,9 @@ /* * PROJECT: EFI Windows Loader * LICENSE: GPL - See COPYING in the top level directory - * FILE: freeldr/winldr/wlmemory.c + * FILE: freeldr/amd64/wlmemory.c * PURPOSE: Memory related routines - * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org) + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) */ /* INCLUDES ***************************************************************/ @@ -13,8 +13,7 @@ #include #include -extern ULONG TotalNLSSize; -extern ULONG LoaderPagesSpanned; +//extern ULONG LoaderPagesSpanned; // This is needed because headers define wrong one for ReactOS #undef KIP0PCRADDRESS @@ -22,52 +21,6 @@ extern ULONG LoaderPagesSpanned; #define HYPER_SPACE_ENTRY 0x300 -PCHAR MemTypeDesc[] = { - "ExceptionBlock ", // ? - "SystemBlock ", // ? - "Free ", - "Bad ", // used - "LoadedProgram ", // == Free - "FirmwareTemporary ", // == Free - "FirmwarePermanent ", // == Bad - "OsloaderHeap ", // used - "OsloaderStack ", // == Free - "SystemCode ", - "HalCode ", - "BootDriver ", // not used - "ConsoleInDriver ", // ? - "ConsoleOutDriver ", // ? - "StartupDpcStack ", // ? - "StartupKernelStack", // ? - "StartupPanicStack ", // ? - "StartupPcrPage ", // ? - "StartupPdrPage ", // ? - "RegistryData ", // used - "MemoryData ", // not used - "NlsData ", // used - "SpecialMemory ", // == Bad - "BBTMemory " // == Bad - }; - -VOID -WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock); - - -VOID -MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - ULONG BasePage, - ULONG PageCount, - ULONG Type); -VOID -WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor); - -VOID -WinLdrRemoveDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR Descriptor); - -VOID -WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss); - // This is needed only for SetProcessorContext routine #pragma pack(2) typedef struct @@ -79,91 +32,284 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss); /* GLOBALS ***************************************************************/ -PHARDWARE_PTE PDE; -PHARDWARE_PTE HalPageTable; - -PUCHAR PhysicalPageTablesBuffer; -PUCHAR KernelPageTablesBuffer; -ULONG PhysicalPageTables; -ULONG KernelPageTables; - -MEMORY_ALLOCATION_DESCRIPTOR *Mad; -ULONG MadCount = 0; +//PHARDWARE_PTE PDE; +//PHARDWARE_PTE HalPageTable; +PPAGE_DIRECTORY_AMD64 pPML4; /* FUNCTIONS **************************************************************/ BOOLEAN MempAllocatePageTables() { + ULONG KernelPages; + PVOID UserSharedData; + + DPRINTM(DPRINT_WINDOWS,">>> MempAllocatePageTables\n"); + + /* Allocate a page for the PML4 */ + pPML4 = MmAllocateMemoryWithType(PAGE_SIZE, LoaderMemoryData); + if (!pPML4) + { + DPRINTM(DPRINT_WINDOWS,"failed to allocate PML4\n"); + return FALSE; + } + + // FIXME: Physical PTEs = FirmwareTemporary ? + + /* Zero the PML4 */ + RtlZeroMemory(pPML4, PAGE_SIZE); + + /* The page tables are located at 0xfffff68000000000 + * We create a recursive self mapping through all 4 levels at + * virtual address 0xfffff6fb7dbedf68 */ + pPML4->Pde[VAtoPXI(PXE_BASE)].Valid = 1; + pPML4->Pde[VAtoPXI(PXE_BASE)].Write = 1; + pPML4->Pde[VAtoPXI(PXE_BASE)].PageFrameNumber = PtrToPfn(pPML4); + + // FIXME: map PDE's for hals memory mapping + + DPRINTM(DPRINT_WINDOWS,">>> leave MempAllocatePageTables\n"); return TRUE; } -VOID -MempAllocatePTE(ULONG Entry, PHARDWARE_PTE *PhysicalPT, PHARDWARE_PTE *KernelPT) +PPAGE_DIRECTORY_AMD64 +MempGetOrCreatePageDir(PPAGE_DIRECTORY_AMD64 pDir, ULONG Index) { + PPAGE_DIRECTORY_AMD64 pSubDir; + if (!pDir) + return NULL; + + if (!pDir->Pde[Index].Valid) + { + pSubDir = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); + if (!pSubDir) + return NULL; + RtlZeroMemory(pSubDir, PAGE_SIZE); + pDir->Pde[Index].PageFrameNumber = PtrToPfn(pSubDir); + pDir->Pde[Index].Valid = 1; + pDir->Pde[Index].Write = 1; + } + else + { + pSubDir = (PPAGE_DIRECTORY_AMD64)((ULONGLONG)(pDir->Pde[Index].PageFrameNumber) * PAGE_SIZE); + } + return pSubDir; +} + +BOOLEAN +MempMapSinglePage(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress) +{ + PPAGE_DIRECTORY_AMD64 pDir3, pDir2, pDir1; + ULONG Index; + + pDir3 = MempGetOrCreatePageDir(pPML4, VAtoPXI(VirtualAddress)); + pDir2 = MempGetOrCreatePageDir(pDir3, VAtoPPI(VirtualAddress)); + pDir1 = MempGetOrCreatePageDir(pDir2, VAtoPDI(VirtualAddress)); + + if (!pDir1) + return FALSE; + + Index = VAtoPTI(VirtualAddress); + if (pDir1->Pde[Index].Valid) + { + return FALSE; + } + + pDir1->Pde[Index].Valid = 1; + pDir1->Pde[Index].Write = 1; + pDir1->Pde[Index].PageFrameNumber = PhysicalAddress / PAGE_SIZE; + + return TRUE; +} + +ULONG +MempMapRangeOfPages(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress, ULONG cPages) +{ + ULONG i; + + for (i = 0; i < cPages; i++) + { + if (!FrLdrMapSinglePage(VirtualAddress, PhysicalAddress)) + { + return i; + } + VirtualAddress += PAGE_SIZE; + PhysicalAddress += PAGE_SIZE; + } + return i; } BOOLEAN MempSetupPaging(IN ULONG StartPage, IN ULONG NumberOfPages) { + DPRINTM(DPRINT_WINDOWS,">>> MempSetupPaging(0x%lx, %ld)\n", StartPage, NumberOfPages); + + if (MempMapRangeOfPages(StartPage * PAGE_SIZE, + StartPage * PAGE_SIZE, + NumberOfPages) != NumberOfPages) + { + DPRINTM(DPRINT_WINDOWS,"Failed to map pages\n"); + return FALSE; + } return TRUE; } VOID -MempDisablePages() +MempUnmapPage(ULONG Page) { - + // DPRINTM(DPRINT_WINDOWS,">>> MempUnmapPage\n"); } -VOID -MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - ULONG BasePage, - ULONG PageCount, - ULONG Type) -{ - -} - -#ifdef _M_IX86 VOID WinLdrpMapApic() { + BOOLEAN LocalAPIC; + LARGE_INTEGER MsrValue; + ULONG CpuInfo[4]; + ULONG64 APICAddress; + DPRINTM(DPRINT_WINDOWS,">>> WinLdrpMapApic\n"); + + /* Check if we have a local APIC */ + __cpuid((int*)CpuInfo, 1); + LocalAPIC = (((CpuInfo[3] >> 9) & 1) != 0); + + /* If there is no APIC, just return */ + if (!LocalAPIC) + { + DPRINTM(DPRINT_WINDOWS,"No APIC found.\n"); + return; + } + + /* Read the APIC Address */ + MsrValue.QuadPart = __readmsr(0x1B); + APICAddress = (MsrValue.LowPart & 0xFFFFF000); + + DPRINTM(DPRINT_WINDOWS, "Local APIC detected at address 0x%x\n", + APICAddress); + + /* Map it */ + MempMapSinglePage(APIC_BASE, APICAddress); } -#else -VOID -WinLdrpMapApic() -{ - /* Implement it for another arch */ -} -#endif BOOLEAN -WinLdrTurnOnPaging(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - ULONG PcrBasePage, - ULONG TssBasePage, - PVOID GdtIdt) +WinLdrMapSpecialPages(ULONG PcrBasePage) { -return 1; + /* Map the PCR page */ + if (!MempMapSinglePage(PcrBasePage * PAGE_SIZE, KIP0PCRADDRESS)) + { + DPRINTM(DPRINT_WINDOWS, "Could not map PCR @ %lx\n", PcrBasePage); + return FALSE; + } + + /* Map KI_USER_SHARED_DATA */ + if (!MempMapSinglePage((PcrBasePage+1) * PAGE_SIZE, KI_USER_SHARED_DATA)) + { + DPRINTM(DPRINT_WINDOWS, "Could not map KI_USER_SHARED_DATA\n"); + return FALSE; + } + + /* Map the APIC page */ + WinLdrpMapApic(); + + return TRUE; } -// Two special things this func does: it sorts descriptors, -// and it merges free ones VOID -WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor) +WinLdrSetupGdt(PVOID GdtBase, ULONG64 TssBase) { + PKGDTENTRY64 Entry; + KDESCRIPTOR GdtDesc; + + /* Setup KGDT_64_R0_CODE */ + Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_CODE); + *(PULONG64)Entry = 0x00209b0000000000ULL; + + /* Setup KGDT_64_R0_SS */ + Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_SS); + *(PULONG64)Entry = 0x00cf93000000ffffULL; + + /* Setup KGDT_64_DATA */ + Entry = KiGetGdtEntry(GdtBase, KGDT_64_DATA); + *(PULONG64)Entry = 0x00cff3000000ffffULL; + + /* Setup KGDT_64_R3_CODE */ + Entry = KiGetGdtEntry(GdtBase, KGDT_64_R3_CODE); + *(PULONG64)Entry = 0x0020fb0000000000ULL; + + /* Setup KGDT_32_R3_TEB */ + Entry = KiGetGdtEntry(GdtBase, KGDT_32_R3_TEB); + *(PULONG64)Entry = 0xff40f3fd50003c00ULL; + + /* Setup TSS entry */ + Entry = KiGetGdtEntry(GdtBase, KGDT_TSS); + KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0); + + /* Setup GDT descriptor */ + GdtDesc.Base = GdtBase; + GdtDesc.Limit = NUM_GDT * sizeof(KGDTENTRY) - 1; + + /* Set the new Gdt */ + __lgdt(&GdtDesc.Limit); + DbgPrint("Gdtr.Base = %p, num = %ld\n", GdtDesc.Base, NUM_GDT); } VOID -WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss) +WinLdrSetupIdt(PVOID IdtBase) { + KDESCRIPTOR IdtDesc, OldIdt; + + /* Get old IDT */ + __sidt(&OldIdt); + + /* Copy the old IDT */ + RtlCopyMemory(IdtBase, (PVOID)OldIdt.Base, OldIdt.Limit + 1); + + /* Setup the new IDT descriptor */ + IdtDesc.Base = IdtBase; + IdtDesc.Limit = NUM_IDT * sizeof(KIDTENTRY) - 1; + + /* Set the new IDT */ + __lidt(&IdtDesc.Limit); + DbgPrint("Idtr.Base = %p\n", IdtDesc.Base); } +VOID +WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG64 Pcr, IN ULONG64 Tss) +{ + /* Disable Interrupts */ + _disable(); + + /* Re-initalize EFLAGS */ + __writeeflags(0); + + /* Set the new PML4 */ + __writecr3((ULONGLONG)pPML4); + + // Enable paging by modifying CR0 + __writecr0(__readcr0() | CR0_PG); + + // Kernel expects the PCR to be zero-filled on startup + // FIXME: Why zero it here when we can zero it right after allocation? + RtlZeroMemory((PVOID)Pcr, MM_PAGE_SIZE); //FIXME: Why zero only 1 page when we allocate 2? + + RtlZeroMemory(GdtIdt, PAGE_SIZE); + + WinLdrSetupGdt(GdtIdt, Tss); + + WinLdrSetupIdt(GdtIdt); + +} + +VOID +MempDump() +{ +} + diff --git a/reactos/boot/freeldr/freeldr/windows/i386/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/i386/wlmemory.c index 313413e5451..6eb8b34224f 100644 --- a/reactos/boot/freeldr/freeldr/windows/i386/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/i386/wlmemory.c @@ -1,7 +1,7 @@ /* * PROJECT: EFI Windows Loader * LICENSE: GPL - See COPYING in the top level directory - * FILE: freeldr/winldr/wlmemory.c + * FILE: freeldr/winldr/i386/wlmemory.c * PURPOSE: Memory related routines * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org) */ @@ -22,52 +22,6 @@ extern ULONG LoaderPagesSpanned; #define HYPER_SPACE_ENTRY 0x300 -PCHAR MemTypeDesc[] = { - "ExceptionBlock ", // ? - "SystemBlock ", // ? - "Free ", - "Bad ", // used - "LoadedProgram ", // == Free - "FirmwareTemporary ", // == Free - "FirmwarePermanent ", // == Bad - "OsloaderHeap ", // used - "OsloaderStack ", // == Free - "SystemCode ", - "HalCode ", - "BootDriver ", // not used - "ConsoleInDriver ", // ? - "ConsoleOutDriver ", // ? - "StartupDpcStack ", // ? - "StartupKernelStack", // ? - "StartupPanicStack ", // ? - "StartupPcrPage ", // ? - "StartupPdrPage ", // ? - "RegistryData ", // used - "MemoryData ", // not used - "NlsData ", // used - "SpecialMemory ", // == Bad - "BBTMemory " // == Bad - }; - -VOID -WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock); - - -VOID -MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - ULONG BasePage, - ULONG PageCount, - ULONG Type); -VOID -WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor); - -VOID -WinLdrRemoveDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR Descriptor); - -VOID -WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss); - // This is needed only for SetProcessorContext routine #pragma pack(2) typedef struct @@ -87,10 +41,6 @@ PUCHAR KernelPageTablesBuffer; ULONG PhysicalPageTables; ULONG KernelPageTables; -MEMORY_ALLOCATION_DESCRIPTOR *Mad; -ULONG MadCount = 0; - - /* FUNCTIONS **************************************************************/ BOOLEAN @@ -253,133 +203,24 @@ MempSetupPaging(IN ULONG StartPage, } VOID -MempDisablePages() +MempUnmapPage(ULONG Page) { - ULONG i; + PHARDWARE_PTE KernelPT; + ULONG Entry = (Page >> 10) + (KSEG0_BASE >> 22); - // - // We need to delete kernel mapping from memory areas which are - // marked as Special or Permanent memory (thus non-accessible) - // + if (PDE[Entry].Valid) + { + KernelPT = (PHARDWARE_PTE)(PDE[Entry].PageFrameNumber << MM_PAGE_SHIFT); - for (i=0; i LoaderPagesSpanned) - EndPage = LoaderPagesSpanned; - } - - for (Page = StartPage; Page < EndPage; Page++) - { - PHARDWARE_PTE KernelPT; - ULONG Entry = (Page >> 10) + (KSEG0_BASE >> 22); - - if (PDE[Entry].Valid) - { - KernelPT = (PHARDWARE_PTE)(PDE[Entry].PageFrameNumber << MM_PAGE_SHIFT); - - if (KernelPT) - { - KernelPT[Page & 0x3ff].PageFrameNumber = 0; - KernelPT[Page & 0x3ff].Valid = 0; - KernelPT[Page & 0x3ff].Write = 0; - } - } - } - } - } + if (KernelPT) + { + KernelPT[Page & 0x3ff].PageFrameNumber = 0; + KernelPT[Page & 0x3ff].Valid = 0; + KernelPT[Page & 0x3ff].Write = 0; + } + } } -VOID -MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - ULONG BasePage, - ULONG PageCount, - ULONG Type) -{ - BOOLEAN Status; - - // - // Check for some weird stuff at the top - // - if (BasePage + PageCount > 0xF0000) - { - // - // Just skip this, without even adding to MAD list - // - return; - } - - // - // Set Base page, page count and type - // - Mad[MadCount].BasePage = BasePage; - Mad[MadCount].PageCount = PageCount; - Mad[MadCount].MemoryType = Type; - - // - // Check if it's more than the allowed for OS loader - // if yes - don't map the pages, just add as FirmwareTemporary - // - if (BasePage + PageCount > LoaderPagesSpanned) - { - if (Mad[MadCount].MemoryType != LoaderSpecialMemory && - Mad[MadCount].MemoryType != LoaderFirmwarePermanent && - Mad[MadCount].MemoryType != LoaderFree) - { - DPRINTM(DPRINT_WINDOWS, "Setting page %x %x to Temporary from %d\n", - BasePage, PageCount, Mad[MadCount].MemoryType); - Mad[MadCount].MemoryType = LoaderFirmwareTemporary; - } - - WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); - MadCount++; - - return; - } - - // - // Add descriptor - // - WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); - MadCount++; - - // - // Map it (don't map low 1Mb because it was already contigiously - // mapped in WinLdrTurnOnPaging) - // - if (BasePage >= 0x100) - { - Status = MempSetupPaging(BasePage, PageCount); - if (!Status) - { - DPRINTM(DPRINT_WINDOWS, "Error during MempSetupPaging\n"); - return; - } - } -} - -#ifdef _M_IX86 VOID WinLdrpMapApic() { @@ -410,149 +251,10 @@ WinLdrpMapApic() HalPageTable[(APIC_BASE - 0xFFC00000) >> MM_PAGE_SHIFT].WriteThrough = 1; HalPageTable[(APIC_BASE - 0xFFC00000) >> MM_PAGE_SHIFT].CacheDisable = 1; } -#else -VOID -WinLdrpMapApic() -{ - /* Implement it for another arch */ -} -#endif BOOLEAN -WinLdrTurnOnPaging(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - ULONG PcrBasePage, - ULONG TssBasePage, - PVOID GdtIdt) +WinLdrMapSpecialPages(ULONG PcrBasePage) { - ULONG i, PagesCount, MemoryMapSizeInPages; - ULONG LastPageIndex, LastPageType, MemoryMapStartPage; - PPAGE_LOOKUP_TABLE_ITEM MemoryMap; - ULONG NoEntries; - PKTSS Tss; - BOOLEAN Status; - - // - // Creating a suitable memory map for the Windows can be tricky, so let's - // give a few advices: - // 1) One must not map the whole available memory pages to PDE! - // Map only what's needed - 16Mb, 24Mb, 32Mb max I think, - // thus occupying 4, 6 or 8 PDE entries for identical mapping, - // the same quantity for KSEG0_BASE mapping, one more entry for - // hyperspace and one more entry for HAL physical pages mapping. - // 2) Memory descriptors must map *the whole* physical memory - // showing any memory above 16/24/32 as FirmwareTemporary - // - // 3) Overall memory blocks count must not exceed 30 (?? why?) - // - - // - // During MmInitMachineDependent, the kernel zeroes PDE at the following address - // 0xC0300000 - 0xC03007FC - // - // Then it finds the best place for non-paged pool: - // StartPde C0300F70, EndPde C0300FF8, NumberOfPages C13, NextPhysPage 3AD - // - - // Before we start mapping pages, create a block of memory, which will contain - // PDE and PTEs - if (MempAllocatePageTables() == FALSE) - return FALSE; - - // Allocate memory for memory allocation descriptors - Mad = MmHeapAlloc(sizeof(MEMORY_ALLOCATION_DESCRIPTOR) * 1024); - - // Setup an entry for each descriptor - MemoryMap = MmGetMemoryMap(&NoEntries); - if (MemoryMap == NULL) - { - UiMessageBox("Can not retrieve the current memory map"); - return FALSE; - } - - // Calculate parameters of the memory map - MemoryMapStartPage = (ULONG_PTR)MemoryMap >> MM_PAGE_SHIFT; - MemoryMapSizeInPages = NoEntries * sizeof(PAGE_LOOKUP_TABLE_ITEM); - - DPRINTM(DPRINT_WINDOWS, "Got memory map with %d entries\n", NoEntries); - - // Always contigiously map low 1Mb of memory - Status = MempSetupPaging(0, 0x100); - if (!Status) - { - DPRINTM(DPRINT_WINDOWS, "Error during MempSetupPaging of low 1Mb\n"); - return FALSE; - } - - // Construct a good memory map from what we've got, - // but mark entries which the memory allocation bitmap takes - // as free entries (this is done in order to have the ability - // to place mem alloc bitmap outside lower 16Mb zone) - PagesCount = 1; - LastPageIndex = 0; - LastPageType = MemoryMap[0].PageAllocated; - for(i=1;i= MemoryMapStartPage && - i < (MemoryMapStartPage+MemoryMapSizeInPages)) - { - // Exclude it if current page belongs to the memory map - MemoryMap[i].PageAllocated = LoaderFree; - } - - // Process entry - if (MemoryMap[i].PageAllocated == LastPageType && - (i != NoEntries-1) ) - { - PagesCount++; - } - else - { - // Add the resulting region - MempAddMemoryBlock(LoaderBlock, LastPageIndex, PagesCount, LastPageType); - - // Reset our counter vars - LastPageIndex = i; - LastPageType = MemoryMap[i].PageAllocated; - PagesCount = 1; - } - } - - // TEMP, DEBUG! - // adding special reserved memory zones for vmware workstation -#if 0 - { - Mad[MadCount].BasePage = 0xfec00; - Mad[MadCount].PageCount = 0x10; - Mad[MadCount].MemoryType = LoaderSpecialMemory; - WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); - MadCount++; - - Mad[MadCount].BasePage = 0xfee00; - Mad[MadCount].PageCount = 0x1; - Mad[MadCount].MemoryType = LoaderSpecialMemory; - WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); - MadCount++; - - Mad[MadCount].BasePage = 0xfffe0; - Mad[MadCount].PageCount = 0x20; - Mad[MadCount].MemoryType = LoaderSpecialMemory; - WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); - MadCount++; - } -#endif - - DPRINTM(DPRINT_WINDOWS, "MadCount: %d\n", MadCount); - - WinLdrpDumpMemoryDescriptors(LoaderBlock); //FIXME: Delete! - - // Map our loader image, so we can continue running - /*Status = MempSetupPaging(OsLoaderBase >> MM_PAGE_SHIFT, OsLoaderSize >> MM_PAGE_SHIFT); - if (!Status) - { - UiMessageBox("Error during MempSetupPaging"); - return; - }*/ //VideoDisplayString(L"Hello from VGA, going into the kernel\n"); DPRINTM(DPRINT_WINDOWS, "HalPageTable: 0x%X\n", HalPageTable); @@ -574,37 +276,21 @@ WinLdrTurnOnPaging(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, //VideoMemoryBase = MmMapIoSpace(0xb8000, 4000, MmNonCached); //DPRINTM(DPRINT_WINDOWS, "VideoMemoryBase: 0x%X\n", VideoMemoryBase); - Tss = (PKTSS)(KSEG0_BASE | (TssBasePage << MM_PAGE_SHIFT)); + return TRUE; +} - // Unmap what is not needed from kernel page table - MempDisablePages(); - // Fill the memory descriptor list and - //PrepareMemoryDescriptorList(); - DPRINTM(DPRINT_WINDOWS, "Memory Descriptor List prepared, printing PDE\n"); - List_PaToVa(&LoaderBlock->MemoryDescriptorListHead); - -#if DBG - { - ULONG *PDE_Addr=(ULONG *)PDE;//0xC0300000; - int j; - - DPRINTM(DPRINT_WINDOWS, "\nPDE\n"); - - for (i=0; i<128; i++) - { - DPRINTM(DPRINT_WINDOWS, "0x%04X | ", i*8); - - for (j=0; j<8; j++) - { - DPRINTM(DPRINT_WINDOWS, "0x%08X ", PDE_Addr[i*8+j]); - } - - DPRINTM(DPRINT_WINDOWS, "\n"); - } - } -#endif +VOID +WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss) +{ + GDTIDT GdtDesc, IdtDesc, OldIdt; + PKGDTENTRY pGdt; + PKIDTENTRY pIdt; + ULONG Ldt = 0; + //ULONG i; + DPRINTM(DPRINT_WINDOWS, "GDtIdt %p, Pcr %p, Tss 0x%08X\n", + GdtIdt, Pcr, Tss); // Enable paging //BS->ExitBootServices(ImageHandle,MapKey); @@ -621,93 +307,6 @@ WinLdrTurnOnPaging(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, // Enable paging by modifying CR0 __writecr0(__readcr0() | CR0_PG); - // Set processor context - WinLdrSetProcessorContext(GdtIdt, KIP0PCRADDRESS, KSEG0_BASE | (TssBasePage << MM_PAGE_SHIFT)); - - // Zero KI_USER_SHARED_DATA page - memset((PVOID)KI_USER_SHARED_DATA, 0, MM_PAGE_SIZE); - - return TRUE; -} - -// Two special things this func does: it sorts descriptors, -// and it merges free ones -VOID -WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor) -{ - PLIST_ENTRY ListHead = &LoaderBlock->MemoryDescriptorListHead; - PLIST_ENTRY PreviousEntry, NextEntry; - PMEMORY_ALLOCATION_DESCRIPTOR PreviousDescriptor = NULL, NextDescriptor = NULL; - - DPRINTM(DPRINT_WINDOWS, "BP=0x%X PC=0x%X %s\n", NewDescriptor->BasePage, - NewDescriptor->PageCount, MemTypeDesc[NewDescriptor->MemoryType]); - - /* Find a place where to insert the new descriptor to */ - PreviousEntry = ListHead; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - NextDescriptor = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if (NewDescriptor->BasePage < NextDescriptor->BasePage) - break; - - PreviousEntry = NextEntry; - PreviousDescriptor = NextDescriptor; - NextEntry = NextEntry->Flink; - } - - /* Don't forget about merging free areas */ - if (NewDescriptor->MemoryType != LoaderFree) - { - /* Just insert, nothing to merge */ - InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry); - } - else - { - /* Previous block also free? */ - if ((PreviousEntry != ListHead) && (PreviousDescriptor->MemoryType == LoaderFree) && - ((PreviousDescriptor->BasePage + PreviousDescriptor->PageCount) == - NewDescriptor->BasePage)) - { - /* Just enlarge previous descriptor's PageCount */ - PreviousDescriptor->PageCount += NewDescriptor->PageCount; - NewDescriptor = PreviousDescriptor; - } - else - { - /* Nope, just insert */ - InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry); - } - - /* Next block is free ?*/ - if ((NextEntry != ListHead) && - (NextDescriptor->MemoryType == LoaderFree) && - ((NewDescriptor->BasePage + NewDescriptor->PageCount) == NextDescriptor->BasePage)) - { - /* Enlarge next descriptor's PageCount */ - NewDescriptor->PageCount += NextDescriptor->PageCount; - RemoveEntryList(&NextDescriptor->ListEntry); - } - } - - return; -} - -VOID -WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss) -{ - GDTIDT GdtDesc, IdtDesc, OldIdt; - PKGDTENTRY pGdt; - PKIDTENTRY pIdt; - ULONG Ldt = 0; - //ULONG i; - - DPRINTM(DPRINT_WINDOWS, "GDtIdt %p, Pcr %p, Tss 0x%08X\n", - GdtIdt, Pcr, Tss); - // Kernel expects the PCR to be zero-filled on startup // FIXME: Why zero it here when we can zero it right after allocation? RtlZeroMemory((PVOID)Pcr, MM_PAGE_SIZE); //FIXME: Why zero only 1 page when we allocate 2? @@ -937,3 +536,25 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss) ret */ } + +VOID +MempDump() +{ + ULONG *PDE_Addr=(ULONG *)PDE;//0xC0300000; + int j; + + DPRINTM(DPRINT_WINDOWS, "\nPDE\n"); + + for (i=0; i<128; i++) + { + DPRINTM(DPRINT_WINDOWS, "0x%04X | ", i*8); + + for (j=0; j<8; j++) + { + DPRINTM(DPRINT_WINDOWS, "0x%08X ", PDE_Addr[i*8+j]); + } + + DPRINTM(DPRINT_WINDOWS, "\n"); + } +} + diff --git a/reactos/boot/freeldr/freeldr/windows/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/wlmemory.c new file mode 100644 index 00000000000..2ed849ad545 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/windows/wlmemory.c @@ -0,0 +1,432 @@ +/* + * PROJECT: EFI Windows Loader + * LICENSE: GPL - See COPYING in the top level directory + * FILE: freeldr/winldr/wlmemory.c + * PURPOSE: Memory related routines + * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org) + */ + +/* INCLUDES ***************************************************************/ + +#include + +#include +#include + +extern ULONG LoaderPagesSpanned; + +// This is needed because headers define wrong one for ReactOS +#undef KIP0PCRADDRESS +#define KIP0PCRADDRESS 0xffdff000 + +PCHAR MemTypeDesc[] = { + "ExceptionBlock ", // ? + "SystemBlock ", // ? + "Free ", + "Bad ", // used + "LoadedProgram ", // == Free + "FirmwareTemporary ", // == Free + "FirmwarePermanent ", // == Bad + "OsloaderHeap ", // used + "OsloaderStack ", // == Free + "SystemCode ", + "HalCode ", + "BootDriver ", // not used + "ConsoleInDriver ", // ? + "ConsoleOutDriver ", // ? + "StartupDpcStack ", // ? + "StartupKernelStack", // ? + "StartupPanicStack ", // ? + "StartupPcrPage ", // ? + "StartupPdrPage ", // ? + "RegistryData ", // used + "MemoryData ", // not used + "NlsData ", // used + "SpecialMemory ", // == Bad + "BBTMemory " // == Bad + }; + +VOID +WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock); + + +VOID +MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + ULONG BasePage, + ULONG PageCount, + ULONG Type); +VOID +WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor); + +VOID +WinLdrRemoveDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR Descriptor); + +VOID +WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss); + +BOOLEAN +MempAllocatePageTables(); + +BOOLEAN +MempSetupPaging(IN ULONG StartPage, + IN ULONG NumberOfPages); + +BOOLEAN +WinLdrMapSpecialPages(ULONG PcrBasePage); + +VOID +MempUnmapPage(ULONG Page); + +VOID +MempDump(); + +/* GLOBALS ***************************************************************/ + +MEMORY_ALLOCATION_DESCRIPTOR *Mad; +ULONG MadCount = 0; + +/* FUNCTIONS **************************************************************/ + +VOID +MempDisablePages() +{ + ULONG i; + + // + // We need to delete kernel mapping from memory areas which are + // marked as Special or Permanent memory (thus non-accessible) + // + + for (i=0; i LoaderPagesSpanned) + EndPage = LoaderPagesSpanned; + } + + for (Page = StartPage; Page < EndPage; Page++) + { + MempUnmapPage(Page); + } + } + } +} + +VOID +MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + ULONG BasePage, + ULONG PageCount, + ULONG Type) +{ + BOOLEAN Status; + + // + // Check for some weird stuff at the top + // + if (BasePage + PageCount > 0xF0000) + { + // + // Just skip this, without even adding to MAD list + // + return; + } + + // + // Set Base page, page count and type + // + Mad[MadCount].BasePage = BasePage; + Mad[MadCount].PageCount = PageCount; + Mad[MadCount].MemoryType = Type; + + // + // Check if it's more than the allowed for OS loader + // if yes - don't map the pages, just add as FirmwareTemporary + // + if (BasePage + PageCount > LoaderPagesSpanned) + { + if (Mad[MadCount].MemoryType != LoaderSpecialMemory && + Mad[MadCount].MemoryType != LoaderFirmwarePermanent && + Mad[MadCount].MemoryType != LoaderFree) + { + DPRINTM(DPRINT_WINDOWS, "Setting page %x %x to Temporary from %d\n", + BasePage, PageCount, Mad[MadCount].MemoryType); + Mad[MadCount].MemoryType = LoaderFirmwareTemporary; + } + + WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); + MadCount++; + + return; + } + + // + // Add descriptor + // + WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); + MadCount++; + + // + // Map it (don't map low 1Mb because it was already contigiously + // mapped in WinLdrTurnOnPaging) + // + if (BasePage >= 0x100) + { + Status = MempSetupPaging(BasePage, PageCount); + if (!Status) + { + DPRINTM(DPRINT_WINDOWS, "Error during MempSetupPaging\n"); + return; + } + } +} + +BOOLEAN +WinLdrTurnOnPaging(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + ULONG PcrBasePage, + ULONG TssBasePage, + PVOID GdtIdt) +{ + ULONG i, PagesCount, MemoryMapSizeInPages; + ULONG LastPageIndex, LastPageType, MemoryMapStartPage; + PPAGE_LOOKUP_TABLE_ITEM MemoryMap; + ULONG NoEntries; + PKTSS Tss; + BOOLEAN Status; + + // + // Creating a suitable memory map for the Windows can be tricky, so let's + // give a few advices: + // 1) One must not map the whole available memory pages to PDE! + // Map only what's needed - 16Mb, 24Mb, 32Mb max I think, + // thus occupying 4, 6 or 8 PDE entries for identical mapping, + // the same quantity for KSEG0_BASE mapping, one more entry for + // hyperspace and one more entry for HAL physical pages mapping. + // 2) Memory descriptors must map *the whole* physical memory + // showing any memory above 16/24/32 as FirmwareTemporary + // + // 3) Overall memory blocks count must not exceed 30 (?? why?) + // + + // + // During MmInitMachineDependent, the kernel zeroes PDE at the following address + // 0xC0300000 - 0xC03007FC + // + // Then it finds the best place for non-paged pool: + // StartPde C0300F70, EndPde C0300FF8, NumberOfPages C13, NextPhysPage 3AD + // + + // Before we start mapping pages, create a block of memory, which will contain + // PDE and PTEs + if (MempAllocatePageTables() == FALSE) + return FALSE; + + // Allocate memory for memory allocation descriptors + Mad = MmHeapAlloc(sizeof(MEMORY_ALLOCATION_DESCRIPTOR) * 1024); + + // Setup an entry for each descriptor + MemoryMap = MmGetMemoryMap(&NoEntries); + if (MemoryMap == NULL) + { + UiMessageBox("Can not retrieve the current memory map"); + return FALSE; + } + + // Calculate parameters of the memory map + MemoryMapStartPage = (ULONG_PTR)MemoryMap >> MM_PAGE_SHIFT; + MemoryMapSizeInPages = NoEntries * sizeof(PAGE_LOOKUP_TABLE_ITEM); + + DPRINTM(DPRINT_WINDOWS, "Got memory map with %d entries\n", NoEntries); + + // Always contigiously map low 1Mb of memory + Status = MempSetupPaging(0, 0x100); + if (!Status) + { + DPRINTM(DPRINT_WINDOWS, "Error during MempSetupPaging of low 1Mb\n"); + return FALSE; + } + + // Construct a good memory map from what we've got, + // but mark entries which the memory allocation bitmap takes + // as free entries (this is done in order to have the ability + // to place mem alloc bitmap outside lower 16Mb zone) + PagesCount = 1; + LastPageIndex = 0; + LastPageType = MemoryMap[0].PageAllocated; + for(i=1;i= MemoryMapStartPage && + i < (MemoryMapStartPage+MemoryMapSizeInPages)) + { + // Exclude it if current page belongs to the memory map + MemoryMap[i].PageAllocated = LoaderFree; + } + + // Process entry + if (MemoryMap[i].PageAllocated == LastPageType && + (i != NoEntries-1) ) + { + PagesCount++; + } + else + { + // Add the resulting region + MempAddMemoryBlock(LoaderBlock, LastPageIndex, PagesCount, LastPageType); + + // Reset our counter vars + LastPageIndex = i; + LastPageType = MemoryMap[i].PageAllocated; + PagesCount = 1; + } + } + + // TEMP, DEBUG! + // adding special reserved memory zones for vmware workstation +#if 0 + { + Mad[MadCount].BasePage = 0xfec00; + Mad[MadCount].PageCount = 0x10; + Mad[MadCount].MemoryType = LoaderSpecialMemory; + WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); + MadCount++; + + Mad[MadCount].BasePage = 0xfee00; + Mad[MadCount].PageCount = 0x1; + Mad[MadCount].MemoryType = LoaderSpecialMemory; + WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); + MadCount++; + + Mad[MadCount].BasePage = 0xfffe0; + Mad[MadCount].PageCount = 0x20; + Mad[MadCount].MemoryType = LoaderSpecialMemory; + WinLdrInsertDescriptor(LoaderBlock, &Mad[MadCount]); + MadCount++; + } +#endif + + DPRINTM(DPRINT_WINDOWS, "MadCount: %d\n", MadCount); + + WinLdrpDumpMemoryDescriptors(LoaderBlock); //FIXME: Delete! + + // Map our loader image, so we can continue running + /*Status = MempSetupPaging(OsLoaderBase >> MM_PAGE_SHIFT, OsLoaderSize >> MM_PAGE_SHIFT); + if (!Status) + { + UiMessageBox("Error during MempSetupPaging"); + return; + }*/ + + /* Map stuff like PCR, KI_USER_SHARED_DATA and Apic */ + WinLdrMapSpecialPages(PcrBasePage); + + Tss = (PKTSS)(KSEG0_BASE | (TssBasePage << MM_PAGE_SHIFT)); + + // Unmap what is not needed from kernel page table + MempDisablePages(); + + // Fill the memory descriptor list and + //PrepareMemoryDescriptorList(); + DPRINTM(DPRINT_WINDOWS, "Memory Descriptor List prepared, printing PDE\n"); + List_PaToVa(&LoaderBlock->MemoryDescriptorListHead); + +#if DBG + MempDump(); +#endif + + // Set processor context + WinLdrSetProcessorContext(GdtIdt, KIP0PCRADDRESS, KSEG0_BASE | (TssBasePage << MM_PAGE_SHIFT)); + + // Zero KI_USER_SHARED_DATA page + memset((PVOID)KI_USER_SHARED_DATA, 0, MM_PAGE_SIZE); + + return TRUE; +} + +// Two special things this func does: it sorts descriptors, +// and it merges free ones +VOID +WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor) +{ + PLIST_ENTRY ListHead = &LoaderBlock->MemoryDescriptorListHead; + PLIST_ENTRY PreviousEntry, NextEntry; + PMEMORY_ALLOCATION_DESCRIPTOR PreviousDescriptor = NULL, NextDescriptor = NULL; + + DPRINTM(DPRINT_WINDOWS, "BP=0x%X PC=0x%X %s\n", NewDescriptor->BasePage, + NewDescriptor->PageCount, MemTypeDesc[NewDescriptor->MemoryType]); + + /* Find a place where to insert the new descriptor to */ + PreviousEntry = ListHead; + NextEntry = ListHead->Flink; + while (NextEntry != ListHead) + { + NextDescriptor = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if (NewDescriptor->BasePage < NextDescriptor->BasePage) + break; + + PreviousEntry = NextEntry; + PreviousDescriptor = NextDescriptor; + NextEntry = NextEntry->Flink; + } + + /* Don't forget about merging free areas */ + if (NewDescriptor->MemoryType != LoaderFree) + { + /* Just insert, nothing to merge */ + InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry); + } + else + { + /* Previous block also free? */ + if ((PreviousEntry != ListHead) && (PreviousDescriptor->MemoryType == LoaderFree) && + ((PreviousDescriptor->BasePage + PreviousDescriptor->PageCount) == + NewDescriptor->BasePage)) + { + /* Just enlarge previous descriptor's PageCount */ + PreviousDescriptor->PageCount += NewDescriptor->PageCount; + NewDescriptor = PreviousDescriptor; + } + else + { + /* Nope, just insert */ + InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry); + } + + /* Next block is free ?*/ + if ((NextEntry != ListHead) && + (NextDescriptor->MemoryType == LoaderFree) && + ((NewDescriptor->BasePage + NewDescriptor->PageCount) == NextDescriptor->BasePage)) + { + /* Enlarge next descriptor's PageCount */ + NewDescriptor->PageCount += NextDescriptor->PageCount; + RemoveEntryList(&NextDescriptor->ListEntry); + } + } + + return; +} +