[FAST486]

Fix linear memory access when paging is enabled.


svn path=/branches/ntvdm/; revision=61274
This commit is contained in:
Aleksandar Andrejevic 2013-12-15 04:15:03 +00:00
parent efcf73c467
commit 4c80791d47

View file

@ -128,6 +128,7 @@ Fast486ReadLinearMemory(PFAST486_STATE State,
ULONG Page; ULONG Page;
FAST486_PAGE_TABLE TableEntry; FAST486_PAGE_TABLE TableEntry;
INT Cpl = Fast486GetCurrentPrivLevel(State); INT Cpl = Fast486GetCurrentPrivLevel(State);
ULONG BufferOffset = 0;
for (Page = PAGE_ALIGN(LinearAddress); for (Page = PAGE_ALIGN(LinearAddress);
Page <= PAGE_ALIGN(LinearAddress + Size - 1); Page <= PAGE_ALIGN(LinearAddress + Size - 1);
@ -152,6 +153,7 @@ Fast486ReadLinearMemory(PFAST486_STATE State,
{ {
/* Start reading from the offset from the beginning of the page */ /* Start reading from the offset from the beginning of the page */
PageOffset = PAGE_OFFSET(LinearAddress); PageOffset = PAGE_OFFSET(LinearAddress);
PageLength -= PageOffset;
} }
/* Check if this is the last page */ /* Check if this is the last page */
@ -164,8 +166,10 @@ Fast486ReadLinearMemory(PFAST486_STATE State,
/* Read the memory */ /* Read the memory */
State->MemReadCallback(State, State->MemReadCallback(State,
(TableEntry.Address << 12) | PageOffset, (TableEntry.Address << 12) | PageOffset,
Buffer, (PVOID)((ULONG_PTR)Buffer + BufferOffset),
PageLength); PageLength);
BufferOffset += PageLength;
} }
} }
else else
@ -190,6 +194,7 @@ Fast486WriteLinearMemory(PFAST486_STATE State,
ULONG Page; ULONG Page;
FAST486_PAGE_TABLE TableEntry; FAST486_PAGE_TABLE TableEntry;
INT Cpl = Fast486GetCurrentPrivLevel(State); INT Cpl = Fast486GetCurrentPrivLevel(State);
ULONG BufferOffset = 0;
for (Page = PAGE_ALIGN(LinearAddress); for (Page = PAGE_ALIGN(LinearAddress);
Page <= PAGE_ALIGN(LinearAddress + Size - 1); Page <= PAGE_ALIGN(LinearAddress + Size - 1);
@ -216,6 +221,7 @@ Fast486WriteLinearMemory(PFAST486_STATE State,
{ {
/* Start writing from the offset from the beginning of the page */ /* Start writing from the offset from the beginning of the page */
PageOffset = PAGE_OFFSET(LinearAddress); PageOffset = PAGE_OFFSET(LinearAddress);
PageLength -= PageOffset;
} }
/* Check if this is the last page */ /* Check if this is the last page */
@ -228,8 +234,10 @@ Fast486WriteLinearMemory(PFAST486_STATE State,
/* Write the memory */ /* Write the memory */
State->MemWriteCallback(State, State->MemWriteCallback(State,
(TableEntry.Address << 12) | PageOffset, (TableEntry.Address << 12) | PageOffset,
Buffer, (PVOID)((ULONG_PTR)Buffer + BufferOffset),
PageLength); PageLength);
BufferOffset += PageLength;
} }
} }
else else