261 lines
8.5 KiB
C
261 lines
8.5 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1990 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
dataia64.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains the private hardware specific global storage for
|
||
|
the memory management subsystem.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Lou Perazzoli (loup) 22-Jan-1990
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Koichi Yamada (kyamada) 9-Jan-1996 : IA64 version based on i386 version
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "mi.h"
|
||
|
|
||
|
|
||
|
//
|
||
|
// A zero Pte.
|
||
|
//
|
||
|
|
||
|
const MMPTE ZeroPte = { 0 };
|
||
|
|
||
|
|
||
|
//
|
||
|
// A kernel zero PTE.
|
||
|
//
|
||
|
|
||
|
const MMPTE ZeroKernelPte = {0x0};
|
||
|
|
||
|
|
||
|
MMPTE ValidKernelPte = { MM_PTE_VALID_MASK |
|
||
|
MM_PTE_CACHE |
|
||
|
MM_PTE_WRITE_MASK |
|
||
|
MM_PTE_EXECUTE_MASK |
|
||
|
MM_PTE_ACCESS_MASK |
|
||
|
MM_PTE_DIRTY_MASK |
|
||
|
MM_PTE_EXC_DEFER};
|
||
|
|
||
|
const MMPTE ValidKernelPteLocal = { MM_PTE_VALID_MASK |
|
||
|
MM_PTE_CACHE |
|
||
|
MM_PTE_WRITE_MASK |
|
||
|
MM_PTE_ACCESS_MASK |
|
||
|
MM_PTE_DIRTY_MASK |
|
||
|
MM_PTE_EXC_DEFER};
|
||
|
|
||
|
|
||
|
const MMPTE ValidUserPte = { MM_PTE_VALID_MASK |
|
||
|
MM_PTE_CACHE |
|
||
|
MM_PTE_WRITE_MASK |
|
||
|
MM_PTE_OWNER_MASK |
|
||
|
MM_PTE_ACCESS_MASK |
|
||
|
MM_PTE_DIRTY_MASK |
|
||
|
MM_PTE_EXC_DEFER};
|
||
|
|
||
|
|
||
|
const MMPTE ValidPtePte = { MM_PTE_VALID_MASK |
|
||
|
MM_PTE_CACHE |
|
||
|
MM_PTE_WRITE_MASK |
|
||
|
MM_PTE_ACCESS_MASK |
|
||
|
MM_PTE_DIRTY_MASK };
|
||
|
|
||
|
|
||
|
const MMPTE ValidPdePde = { MM_PTE_VALID_MASK |
|
||
|
MM_PTE_CACHE |
|
||
|
MM_PTE_WRITE_MASK |
|
||
|
MM_PTE_ACCESS_MASK |
|
||
|
MM_PTE_DIRTY_MASK };
|
||
|
|
||
|
|
||
|
MMPTE ValidKernelPde = { MM_PTE_VALID_MASK |
|
||
|
MM_PTE_CACHE |
|
||
|
MM_PTE_WRITE_MASK |
|
||
|
MM_PTE_ACCESS_MASK |
|
||
|
MM_PTE_DIRTY_MASK };
|
||
|
|
||
|
const MMPTE ValidKernelPdeLocal = { MM_PTE_VALID_MASK |
|
||
|
MM_PTE_CACHE |
|
||
|
MM_PTE_WRITE_MASK |
|
||
|
MM_PTE_ACCESS_MASK |
|
||
|
MM_PTE_DIRTY_MASK };
|
||
|
|
||
|
MMPTE ValidPpePte = { MM_PTE_VALID_MASK |
|
||
|
MM_PTE_CACHE |
|
||
|
MM_PTE_WRITE_MASK |
|
||
|
MM_PTE_ACCESS_MASK |
|
||
|
MM_PTE_DIRTY_MASK };
|
||
|
|
||
|
|
||
|
MMPTE DemandZeroPde = { MM_READWRITE << MM_PROTECT_FIELD_SHIFT };
|
||
|
|
||
|
|
||
|
const MMPTE DemandZeroPte = { MM_READWRITE << MM_PROTECT_FIELD_SHIFT };
|
||
|
|
||
|
|
||
|
const MMPTE TransitionPde = { MM_PTE_TRANSITION_MASK |
|
||
|
MM_READWRITE << MM_PROTECT_FIELD_SHIFT };
|
||
|
|
||
|
|
||
|
MMPTE PrototypePte = { MI_PTE_LOOKUP_NEEDED << 32 |
|
||
|
MM_PTE_PROTOTYPE_MASK |
|
||
|
MM_READWRITE << MM_PROTECT_FIELD_SHIFT };
|
||
|
|
||
|
//
|
||
|
// PTE which generates an access violation when referenced.
|
||
|
//
|
||
|
|
||
|
const MMPTE NoAccessPte = {MM_NOACCESS << MM_PROTECT_FIELD_SHIFT};
|
||
|
|
||
|
//
|
||
|
// Pool start and end.
|
||
|
//
|
||
|
|
||
|
PVOID MmNonPagedPoolStart;
|
||
|
|
||
|
PVOID MmNonPagedPoolEnd = (PVOID)MM_NONPAGED_POOL_END;
|
||
|
|
||
|
PVOID MmPagedPoolStart = (PVOID)MM_PAGED_POOL_START;
|
||
|
|
||
|
PVOID MmPagedPoolEnd;
|
||
|
|
||
|
ULONG_PTR MmKseg2Frame = 0;
|
||
|
|
||
|
//
|
||
|
// Color tables for free and zeroed pages.
|
||
|
//
|
||
|
|
||
|
#if MM_MAXIMUM_NUMBER_OF_COLORS > 1
|
||
|
MMPFNLIST MmFreePagesByPrimaryColor[2][MM_MAXIMUM_NUMBER_OF_COLORS];
|
||
|
#endif
|
||
|
|
||
|
PMMCOLOR_TABLES MmFreePagesByColor[2];
|
||
|
|
||
|
//
|
||
|
// Color tables for modified pages destined for the paging file.
|
||
|
//
|
||
|
|
||
|
MMPFNLIST MmModifiedPageListByColor[MM_MAXIMUM_NUMBER_OF_COLORS] = {
|
||
|
0, ModifiedPageList, MM_EMPTY_LIST, MM_EMPTY_LIST};
|
||
|
|
||
|
|
||
|
//
|
||
|
// Count of the number of modified pages destined for the paging file.
|
||
|
//
|
||
|
|
||
|
PFN_NUMBER MmTotalPagesForPagingFile = 0;
|
||
|
|
||
|
//
|
||
|
// Pte reserved for mapping pages for the debugger.
|
||
|
//
|
||
|
|
||
|
PMMPTE MmDebugPte;
|
||
|
|
||
|
//
|
||
|
// 16 PTEs reserved for mapping MDLs (64k max).
|
||
|
//
|
||
|
|
||
|
PMMPTE MmCrashDumpPte;
|
||
|
|
||
|
//
|
||
|
// Maximum size of system cache
|
||
|
//
|
||
|
|
||
|
ULONG MiMaximumSystemCacheSize;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Supported Page Size Information
|
||
|
//
|
||
|
|
||
|
ULONGLONG MmPageSizeInfo = 0;
|
||
|
|
||
|
#if defined(_MIALT4K_)
|
||
|
|
||
|
//
|
||
|
// Map a IA32 compatible PTE protection from Pte.Protect field
|
||
|
//
|
||
|
|
||
|
ULONG MmProtectToPteMaskForIA32[32] = {
|
||
|
MM_PTE_NOACCESS,
|
||
|
MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_READWRITE | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_WRITECOPY | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_READWRITE | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_WRITECOPY | MM_PTE_CACHE,
|
||
|
MM_PTE_NOACCESS,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READWRITE,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_WRITECOPY,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READWRITE,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_WRITECOPY,
|
||
|
MM_PTE_NOACCESS,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READWRITE | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_WRITECOPY | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READWRITE | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_WRITECOPY | MM_PTE_CACHE,
|
||
|
MM_PTE_NOACCESS,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READWRITE,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_WRITECOPY,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READWRITE,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_WRITECOPY
|
||
|
};
|
||
|
|
||
|
ULONG MmProtectToPteMaskForSplit[32] = {
|
||
|
MM_PTE_NOACCESS,
|
||
|
MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_WRITECOPY | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_EXECUTE_WRITECOPY | MM_PTE_CACHE,
|
||
|
MM_PTE_NOACCESS,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_WRITECOPY,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_READWRITE,
|
||
|
MM_PTE_NOCACHE | MM_PTE_EXECUTE_WRITECOPY,
|
||
|
MM_PTE_NOACCESS,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_WRITECOPY | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_READ | MM_PTE_CACHE,
|
||
|
MM_PTE_GUARD | MM_PTE_EXECUTE_WRITECOPY | MM_PTE_CACHE,
|
||
|
MM_PTE_NOACCESS,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_WRITECOPY,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_READ,
|
||
|
MM_PTE_NOCACHE | MM_PTE_GUARD | MM_PTE_EXECUTE_WRITECOPY
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|