Author: aandrejevic Date: Fri Nov 7 00:00:17 2014 New Revision: 65304
URL: http://svn.reactos.org/svn/reactos?rev=65304&view=rev Log: [FAST486] Store the faulting address in CR2 (PFLA) when a page fault occurs.
Modified: trunk/reactos/lib/fast486/common.inl
Modified: trunk/reactos/lib/fast486/common.inl URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fast486/common.inl?rev=... ============================================================================== --- trunk/reactos/lib/fast486/common.inl [iso-8859-1] (original) +++ trunk/reactos/lib/fast486/common.inl [iso-8859-1] Fri Nov 7 00:00:17 2014 @@ -170,21 +170,23 @@ /* Get the table entry */ TableEntry.Value = Fast486GetPageTableEntry(State, Page, FALSE);
+ /* Check if this is the first page */ + if (Page == PAGE_ALIGN(LinearAddress)) + { + /* Start reading from the offset from the beginning of the page */ + PageOffset = PAGE_OFFSET(LinearAddress); + PageLength -= PageOffset; + } + if (!TableEntry.Present || (!TableEntry.Usermode && (Cpl > 0))) { + State->ControlRegisters[FAST486_REG_CR2] = Page + PageOffset; + /* Exception */ Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_PF, TableEntry.Present | (State->Cpl ? 0x04 : 0)); return FALSE; - } - - /* Check if this is the first page */ - if (Page == PAGE_ALIGN(LinearAddress)) - { - /* Start reading from the offset from the beginning of the page */ - PageOffset = PAGE_OFFSET(LinearAddress); - PageLength -= PageOffset; }
/* Check if this is the last page */ @@ -237,23 +239,25 @@ /* Get the table entry */ TableEntry.Value = Fast486GetPageTableEntry(State, Page, TRUE);
+ /* Check if this is the first page */ + if (Page == PAGE_ALIGN(LinearAddress)) + { + /* Start writing from the offset from the beginning of the page */ + PageOffset = PAGE_OFFSET(LinearAddress); + PageLength -= PageOffset; + } + if ((!TableEntry.Present || (!TableEntry.Usermode && (Cpl > 0))) || ((State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_WP) && !TableEntry.Writeable)) { + State->ControlRegisters[FAST486_REG_CR2] = Page + PageOffset; + /* Exception */ Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_PF, TableEntry.Present | 0x02 | (State->Cpl ? 0x04 : 0)); return FALSE; - } - - /* Check if this is the first page */ - if (Page == PAGE_ALIGN(LinearAddress)) - { - /* Start writing from the offset from the beginning of the page */ - PageOffset = PAGE_OFFSET(LinearAddress); - PageLength -= PageOffset; }
/* Check if this is the last page */