From 0bbdcf4d8b31deafd6a5aad8658af02894bd9152 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 25 Jul 2010 00:50:03 +0000 Subject: [PATCH] [NTOSKRNL] Make MmIsAddressValid portable by using _MI_PAGING_LEVELS macro. svn path=/trunk/; revision=48238 --- reactos/ntoskrnl/include/internal/amd64/mm.h | 2 ++ reactos/ntoskrnl/include/internal/i386/mm.h | 6 ++++ reactos/ntoskrnl/mm/ARM3/mmsup.c | 34 +++++++++++--------- reactos/ntoskrnl/mm/amd64/page.c | 12 ------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index 889c43e9684..c52132db0f6 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -4,6 +4,8 @@ #pragma once +#define _MI_PAGING_LEVELS 4 + /* Helper macros */ #define PAGE_MASK(x) ((x)&(~0xfff)) #define PAE_PAGE_MASK(x) ((x)&(~0xfffLL)) diff --git a/reactos/ntoskrnl/include/internal/i386/mm.h b/reactos/ntoskrnl/include/internal/i386/mm.h index edd86bbaab4..1014884b099 100644 --- a/reactos/ntoskrnl/include/internal/i386/mm.h +++ b/reactos/ntoskrnl/include/internal/i386/mm.h @@ -7,6 +7,12 @@ struct _EPROCESS; PULONG MmGetPageDirectory(VOID); +#ifdef _PAE_ +#define _MI_PAGING_LEVELS 3 +#else +#define _MI_PAGING_LEVELS 2 +#endif + #define PAGE_MASK(x) ((x)&(~0xfff)) #define PAE_PAGE_MASK(x) ((x)&(~0xfffLL)) diff --git a/reactos/ntoskrnl/mm/ARM3/mmsup.c b/reactos/ntoskrnl/mm/ARM3/mmsup.c index b84c7a0492b..4410a390249 100644 --- a/reactos/ntoskrnl/mm/ARM3/mmsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mmsup.c @@ -64,22 +64,26 @@ BOOLEAN NTAPI MmIsAddressValid(IN PVOID VirtualAddress) { - // - // Just check the Valid bit in the Address' PDE and PTE - // - if ((MiAddressToPde(VirtualAddress)->u.Hard.Valid == 0) || - (MiAddressToPte(VirtualAddress)->u.Hard.Valid == 0)) - { - // - // Attempting to access this page is guranteed to result in a page fault - // - return FALSE; - } +#if _MI_PAGING_LEVELS >= 4 + /* Check if the PXE is valid */ + if (MiAddressToPxe(VirtualAddress)->u.Hard.Valid == 0) return FALSE; +#endif - // - // This address is valid now, but it will only stay so if the caller holds - // the PFN lock - // +#if _MI_PAGING_LEVELS >= 3 + /* Check if the PPE is valid */ + if (MiAddressToPpe(VirtualAddress)->u.Hard.Valid == 0) return FALSE; +#endif + +#if _MI_PAGING_LEVELS >= 2 + /* Check if the PDE is valid */ + if (MiAddressToPde(VirtualAddress)->u.Hard.Valid == 0) return FALSE; +#endif + + /* Check if the PTE is valid */ + if (MiAddressToPte(VirtualAddress)->u.Hard.Valid == 0) return FALSE; + + /* This address is valid now, but it will only stay so if the caller holds + * the PFN lock */ return TRUE; } diff --git a/reactos/ntoskrnl/mm/amd64/page.c b/reactos/ntoskrnl/mm/amd64/page.c index d9830b409e8..33cdeeb6c83 100644 --- a/reactos/ntoskrnl/mm/amd64/page.c +++ b/reactos/ntoskrnl/mm/amd64/page.c @@ -519,16 +519,4 @@ MmCreateProcessAddressSpace(IN ULONG MinWs, return 0; } -BOOLEAN -NTAPI -_MmIsAddressValid(IN PVOID VirtualAddress) -{ - /* Check all four page table levels */ - return (MiAddressToPxe(VirtualAddress)->u.Hard.Valid != 0 && - MiAddressToPpe(VirtualAddress)->u.Hard.Valid != 0 && - MiAddressToPde(VirtualAddress)->u.Hard.Valid != 0 && - MiAddressToPte(VirtualAddress)->u.Hard.Valid != 0); -} - - /* EOF */ -- 2.17.1