mirror of
https://github.com/reactos/reactos.git
synced 2025-05-13 14:20:31 +00:00
[NTVDM]
- cpu.c: Convert the faulting address to "real" (VM) address before calling the exception handler. - ems.c: Simplify code by using ARRAY_INDEX; some poiters should point to physical memory. - ems.c: Memory hook addresses should be "real". - memory.c: Remove an extra MemFastMoveMemory call; really use IsListEmpty (was commented by error in my previous commit). svn path=/trunk/; revision=66671
This commit is contained in:
parent
c73bb5a49f
commit
c80f97eea6
3 changed files with 15 additions and 18 deletions
|
@ -139,7 +139,7 @@ VOID CpuSimulate(VOID)
|
||||||
EXCEPTION_EXECUTE_HANDLER)
|
EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
BOOLEAN Writing = (LocalExceptionRecord.ExceptionInformation[0] == 1);
|
BOOLEAN Writing = (LocalExceptionRecord.ExceptionInformation[0] == 1);
|
||||||
ULONG FaultAddress = (ULONG)LocalExceptionRecord.ExceptionInformation[1];
|
ULONG FaultAddress = (ULONG)PHYS_TO_REAL(LocalExceptionRecord.ExceptionInformation[1]);
|
||||||
|
|
||||||
/* Make sure this was an access violation */
|
/* Make sure this was an access violation */
|
||||||
ASSERT(LocalExceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION);
|
ASSERT(LocalExceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION);
|
||||||
|
|
|
@ -23,7 +23,7 @@ static RTL_BITMAP AllocBitmap;
|
||||||
static ULONG BitmapBuffer[(EMS_TOTAL_PAGES + sizeof(ULONG) - 1) / sizeof(ULONG)];
|
static ULONG BitmapBuffer[(EMS_TOTAL_PAGES + sizeof(ULONG) - 1) / sizeof(ULONG)];
|
||||||
static EMS_PAGE PageTable[EMS_TOTAL_PAGES];
|
static EMS_PAGE PageTable[EMS_TOTAL_PAGES];
|
||||||
static EMS_HANDLE HandleTable[EMS_MAX_HANDLES];
|
static EMS_HANDLE HandleTable[EMS_MAX_HANDLES];
|
||||||
static PVOID Mapping[EMS_PHYSICAL_PAGES] = { NULL };
|
static PVOID Mapping[EMS_PHYSICAL_PAGES] = {{NULL}};
|
||||||
|
|
||||||
/* PRIVATE FUNCTIONS **********************************************************/
|
/* PRIVATE FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ static USHORT EmsFree(USHORT Handle)
|
||||||
Entry = Entry->Flink)
|
Entry = Entry->Flink)
|
||||||
{
|
{
|
||||||
PEMS_PAGE PageEntry = (PEMS_PAGE)CONTAINING_RECORD(Entry, EMS_PAGE, Entry);
|
PEMS_PAGE PageEntry = (PEMS_PAGE)CONTAINING_RECORD(Entry, EMS_PAGE, Entry);
|
||||||
ULONG PageNumber = (ULONG)(((ULONG_PTR)PageEntry - (ULONG_PTR)PageTable) / sizeof(EMS_PAGE));
|
ULONG PageNumber = ARRAY_INDEX(PageEntry, PageTable);
|
||||||
|
|
||||||
/* Free the page */
|
/* Free the page */
|
||||||
RtlClearBits(&AllocBitmap, PageNumber, 1);
|
RtlClearBits(&AllocBitmap, PageNumber, 1);
|
||||||
|
@ -223,10 +223,10 @@ static VOID WINAPI EmsIntHandler(LPWORD Stack)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SourcePtr = (PUCHAR)(EMS_ADDRESS
|
SourcePtr = (PUCHAR)REAL_TO_PHYS(EMS_ADDRESS
|
||||||
+ ARRAY_INDEX(PageEntry, PageTable)
|
+ ARRAY_INDEX(PageEntry, PageTable)
|
||||||
* EMS_PAGE_SIZE
|
* EMS_PAGE_SIZE
|
||||||
+ Data->SourceOffset);
|
+ Data->SourceOffset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -253,10 +253,10 @@ static VOID WINAPI EmsIntHandler(LPWORD Stack)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
DestPtr = (PUCHAR)(EMS_ADDRESS
|
DestPtr = (PUCHAR)REAL_TO_PHYS(EMS_ADDRESS
|
||||||
+ ARRAY_INDEX(PageEntry, PageTable)
|
+ ARRAY_INDEX(PageEntry, PageTable)
|
||||||
* EMS_PAGE_SIZE
|
* EMS_PAGE_SIZE
|
||||||
+ Data->DestOffset);
|
+ Data->DestOffset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -324,7 +324,7 @@ VOID EmsInitialize(VOID)
|
||||||
InitializeListHead(&HandleTable[i].PageList);
|
InitializeListHead(&HandleTable[i].PageList);
|
||||||
}
|
}
|
||||||
|
|
||||||
MemInstallFastMemoryHook(SEG_OFF_TO_PTR(EMS_SEGMENT, 0),
|
MemInstallFastMemoryHook((PVOID)TO_LINEAR(EMS_SEGMENT, 0),
|
||||||
EMS_PHYSICAL_PAGES * EMS_PAGE_SIZE,
|
EMS_PHYSICAL_PAGES * EMS_PAGE_SIZE,
|
||||||
EmsReadMemory,
|
EmsReadMemory,
|
||||||
EmsWriteMemory);
|
EmsWriteMemory);
|
||||||
|
@ -334,6 +334,6 @@ VOID EmsInitialize(VOID)
|
||||||
|
|
||||||
VOID EmsCleanup(VOID)
|
VOID EmsCleanup(VOID)
|
||||||
{
|
{
|
||||||
MemRemoveFastMemoryHook(SEG_OFF_TO_PTR(EMS_SEGMENT, 0),
|
MemRemoveFastMemoryHook((PVOID)TO_LINEAR(EMS_SEGMENT, 0),
|
||||||
EMS_PHYSICAL_PAGES * EMS_PAGE_SIZE);
|
EMS_PHYSICAL_PAGES * EMS_PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ typedef struct _MEM_HOOK
|
||||||
} MEM_HOOK, *PMEM_HOOK;
|
} MEM_HOOK, *PMEM_HOOK;
|
||||||
|
|
||||||
static LIST_ENTRY HookList;
|
static LIST_ENTRY HookList;
|
||||||
static PMEM_HOOK PageTable[TOTAL_PAGES];
|
static PMEM_HOOK PageTable[TOTAL_PAGES] = {{NULL}};
|
||||||
|
|
||||||
/* PRIVATE FUNCTIONS **********************************************************/
|
/* PRIVATE FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
|
@ -145,8 +145,6 @@ MemRead(ULONG Address, PVOID Buffer, ULONG Size)
|
||||||
ULONG FirstPage = Address >> 12;
|
ULONG FirstPage = Address >> 12;
|
||||||
ULONG LastPage = (Address + Size - 1) >> 12;
|
ULONG LastPage = (Address + Size - 1) >> 12;
|
||||||
|
|
||||||
MemFastMoveMemory(Buffer, REAL_TO_PHYS(Address), Size);
|
|
||||||
|
|
||||||
if (FirstPage == LastPage)
|
if (FirstPage == LastPage)
|
||||||
{
|
{
|
||||||
ReadPage(PageTable[FirstPage], Address, Buffer, Size);
|
ReadPage(PageTable[FirstPage], Address, Buffer, Size);
|
||||||
|
@ -538,8 +536,7 @@ MemCleanup(VOID)
|
||||||
SIZE_T MemorySize = MAX_ADDRESS;
|
SIZE_T MemorySize = MAX_ADDRESS;
|
||||||
PLIST_ENTRY Pointer;
|
PLIST_ENTRY Pointer;
|
||||||
|
|
||||||
// while (!IsListEmpty(&HookList))
|
while (!IsListEmpty(&HookList))
|
||||||
while (HookList.Flink != &HookList)
|
|
||||||
{
|
{
|
||||||
Pointer = RemoveHeadList(&HookList);
|
Pointer = RemoveHeadList(&HookList);
|
||||||
RtlFreeHeap(RtlGetProcessHeap(), 0, CONTAINING_RECORD(Pointer, MEM_HOOK, Entry));
|
RtlFreeHeap(RtlGetProcessHeap(), 0, CONTAINING_RECORD(Pointer, MEM_HOOK, Entry));
|
||||||
|
|
Loading…
Reference in a new issue