Author: fireball Date: Sat Jan 20 00:37:25 2007 New Revision: 25537
URL: http://svn.reactos.org/svn/reactos?rev=25537&view=rev Log: - Add MempDisablePages() which unmaps non-accessible memory areas from KSEG0 page table.
Modified: branches/winldr/windows/wlmemory.c
Modified: branches/winldr/windows/wlmemory.c URL: http://svn.reactos.org/svn/reactos/branches/winldr/windows/wlmemory.c?rev=25... ============================================================================== --- branches/winldr/windows/wlmemory.c (original) +++ branches/winldr/windows/wlmemory.c Sat Jan 20 00:37:25 2007 @@ -262,6 +262,56 @@ }
VOID +MempDisablePages() +{ + int 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<MadCount; i++) + { + if (Mad[i].MemoryType == LoaderFirmwarePermanent || + Mad[i].MemoryType == LoaderSpecialMemory) + { + ULONG StartPage, EndPage, Page; + + StartPage = Mad[i].BasePage; + EndPage = Mad[i].BasePage + Mad[i].PageCount; + + // + // But, the first megabyte of memory always stays! + // And, to tell the truth, we don't care about what's higher + // than LOADER_HIGH_ZONE + if (StartPage < 0x100) + StartPage = 0x100; + + if (EndPage > LOADER_HIGH_ZONE) + EndPage = LOADER_HIGH_ZONE; + + + 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); + + 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, @@ -423,6 +473,30 @@ } }
+ // 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 + DbgPrint((DPRINT_WINDOWS, "MadCount: %d\n", MadCount));
WinLdrpDumpMemoryDescriptors(LoaderBlock); //FIXME: Delete! @@ -453,6 +527,9 @@ //DbgPrint((DPRINT_WINDOWS, "VideoMemoryBase: 0x%X\n", VideoMemoryBase));
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(); @@ -655,7 +732,7 @@ // // TSS Selector (0x28) // - pGdt[5].LimitLow = 0x78-1; // 60 dwords + pGdt[5].LimitLow = 0x78-1; //FIXME: Check this pGdt[5].BaseLow = (USHORT)(Tss & 0xffff); pGdt[5].HighWord.Bytes.BaseMid = (UCHAR)((Tss >> 16) & 0xff); pGdt[5].HighWord.Bytes.Flags1 = 0x89;