270 lines
7.4 KiB
C
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);
|
|
}
|
|
|
|
|
|
}
|