windows-nt/Source/XPSP1/NT/base/wow64/mscpu/cpumain/config.c
2020-09-26 16:20:57 +08:00

270 lines
7.4 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
config.c
Abstract:
This module implements the configuration support for the CPU.
Author:
13-Jun-1996 BarryBo
Revision History:
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdio.h>
#define _WX86CPUAPI_
#include "wx86.h"
#include "wx86nt.h"
#include "wx86cpu.h"
#include "cpuassrt.h"
#include "config.h"
#include "entrypt.h"
#include "instr.h"
#include "compiler.h"
ASSERTNAME;
char *szBadVarMsg="%Ws value out-of-range - replacing with 0x%x.\n";
//
// The list of all configurable variables in the CPU. All are initialized
// to their default values.
//
DWORD CpuCacheReserve = 6144*1024;
DWORD CpuCacheCommit = MAX_PROLOG_SIZE;
DWORD CpuCacheGrowTicks = 200;
DWORD CpuCacheShrinkTicks = 1000;
DWORD CpuCacheChunkMin = 32*1024;
DWORD CpuCacheChunkMax = 512*1024;
DWORD CpuCacheChunkSize = 64*1024;
LARGE_INTEGER MrswTimeout;
DWORD CompilerFlags = COMPFL_FAST;
DWORD fUseNPXEM = FALSE;
DWORD CpuMaxAllocRetries = 4;
DWORD CpuWaitForMemoryTime = 200;
DWORD CpuInstructionLookahead = MAX_INSTR_COUNT;
DWORD CpuDisableDynamicCache = FALSE;
DWORD CpuEntryPointReserve = 0x1000000;
DWORD CpuDisableRegCache = FALSE;
DWORD CpuDisableNoFlags = FALSE;
DWORD CpuDisableEbpAlign = FALSE;
DWORD CpuSniffWritableCode = FALSE;
#define IsPowerOfTwo(x) (((x) & ((x)-1)) == 0)
VOID
GetConfigurationData(
VOID
)
/*++
Routine Description:
Overrides any variable(s) listed above with values from the Registry.
Arguments:
None
Return Value:
None
--*/
{
PCONFIGVAR pcfg;
pcfg = Wx86FetchConfigVar(STR_CACHE_RESERVE);
if (pcfg) {
if (pcfg->Data < MAX_PROLOG_SIZE) {
CpuCacheReserve = MAX_PROLOG_SIZE;
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_RESERVE, CpuCacheReserve));
} else {
CpuCacheReserve = pcfg->Data;
}
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CACHE_COMMIT);
if (pcfg) {
if (pcfg->Data < MAX_PROLOG_SIZE) {
CpuCacheCommit = MAX_PROLOG_SIZE;
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_COMMIT, CpuCacheCommit));
} else {
CpuCacheCommit = pcfg->Data;
}
Wx86FreeConfigVar(pcfg);
}
if (CpuCacheCommit > CpuCacheReserve) {
CpuCacheCommit = CpuCacheReserve;
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_COMMIT, CpuCacheCommit));
}
pcfg = Wx86FetchConfigVar(STR_CACHE_GROW_TICKS);
if (pcfg) {
CpuCacheGrowTicks = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CACHE_SHRINK_TICKS);
if (pcfg) {
CpuCacheShrinkTicks = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
if (CpuCacheShrinkTicks < CpuCacheGrowTicks) {
CpuCacheShrinkTicks = CpuCacheGrowTicks;
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_SHRINK_TICKS, CpuCacheGrowTicks));
}
pcfg = Wx86FetchConfigVar(STR_CACHE_CHUNKMIN);
if (pcfg) {
if (!IsPowerOfTwo(pcfg->Data) ||
pcfg->Data < MAX_PROLOG_SIZE ||
pcfg->Data > CpuCacheReserve) {
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_CHUNKMIN, CpuCacheChunkMin));
} else {
CpuCacheChunkMin = pcfg->Data;
}
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CACHE_CHUNKMAX);
if (pcfg) {
if (!IsPowerOfTwo(pcfg->Data)) {
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_CHUNKMAX, CpuCacheChunkMax));
} else {
CpuCacheChunkMax = pcfg->Data;
}
Wx86FreeConfigVar(pcfg);
}
if (CpuCacheChunkMax < CpuCacheChunkMin) {
CpuCacheChunkMax = CpuCacheChunkMin;
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_CHUNKMAX, CpuCacheChunkMax));
} else if (CpuCacheChunkMax > CpuCacheReserve) {
CpuCacheChunkMax = CpuCacheReserve;
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_CHUNKMAX, CpuCacheChunkMax));
}
pcfg = Wx86FetchConfigVar(STR_CACHE_CHUNKSIZE);
if (pcfg) {
if (!IsPowerOfTwo(pcfg->Data)) {
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_CHUNKSIZE, CpuCacheChunkSize));
} else {
CpuCacheChunkSize = pcfg->Data;
}
Wx86FreeConfigVar(pcfg);
}
if (CpuCacheChunkSize < CpuCacheChunkMin) {
CpuCacheChunkSize = CpuCacheChunkMin;
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_CHUNKSIZE, CpuCacheChunkSize));
} else if (CpuCacheChunkSize > CpuCacheChunkMax) {
CpuCacheChunkSize = CpuCacheChunkMax;
LOGPRINT((TRACELOG, szBadVarMsg, STR_CACHE_CHUNKSIZE, CpuCacheChunkSize));
}
pcfg = Wx86FetchConfigVar(STR_MRSW_TIMEOUT);
if (pcfg) {
if (pcfg->Data & 0x80000000) {
//
// Value is negative - use a big negative value to wait forever
//
MrswTimeout.LowPart = 0x00000000;
MrswTimeout.HighPart = 0x80000000;
} else {
//
// Multiply the time in ms by -10000 to convert into a relative
// time usable by NtWaitForSingleObject().
//
MrswTimeout.QuadPart = Int32x32To64(pcfg->Data, -10000);
}
Wx86FreeConfigVar(pcfg);
} else {
//
// Initialize MrswTimeout to be 3 times PEB->CriticalSectionTimeout
//
MrswTimeout.QuadPart = NtCurrentPeb()->CriticalSectionTimeout.QuadPart * 3;
}
pcfg = Wx86FetchConfigVar(STR_COMPILERFLAGS);
if (pcfg) {
if ( (pcfg->Data & (COMPFL_FAST|COMPFL_SLOW)) == (COMPFL_FAST|COMPFL_SLOW)) {
LOGPRINT((TRACELOG, szBadVarMsg, STR_COMPILERFLAGS, CompilerFlags));
} else {
CompilerFlags = pcfg->Data;
}
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_USEWINPXEM);
if (pcfg) {
fUseNPXEM = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CPU_MAX_ALLOC_RETRIES);
if (pcfg) {
CpuMaxAllocRetries = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CPU_WAIT_FOR_MEMORY_TIME);
if (pcfg) {
CpuWaitForMemoryTime = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CPU_MAX_INSTRUCTIONS);
if (pcfg) {
if (pcfg->Data > MAX_INSTR_COUNT) {
LOGPRINT((TRACELOG, szBadVarMsg, STR_CPU_MAX_INSTRUCTIONS, CpuInstructionLookahead));
} else {
CpuInstructionLookahead = pcfg->Data;
}
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CPU_DISABLE_DYNCACHE);
if (pcfg) {
CpuDisableDynamicCache = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CPU_DISABLE_REGCACHE);
if (pcfg) {
CpuDisableRegCache = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CPU_DISABLE_NOFLAGS);
if (pcfg) {
CpuDisableNoFlags = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CPU_DISABLE_EBPALIGN);
if (pcfg) {
CpuDisableEbpAlign = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
pcfg = Wx86FetchConfigVar(STR_CPU_SNIFF_WRITABLE_CODE);
if (pcfg) {
CpuSniffWritableCode = pcfg->Data;
Wx86FreeConfigVar(pcfg);
}
}