From: "David Hildenbrand (Arm)" <[email protected]> We don't want pgd_t to be an array, as it prohibits returning it from a function, like pgdp_get().
So let's just use an u64, and extract the right 32bit value in pgd_val(). Leave the STRICT_MM_TYPECHECKS case alone for now. As an alternative, we could use the STRICT_MM_TYPECHECKS approach here as well, but using an u64 looks conceptually cleaner, even though pgd_val() gets a bit more involved. Signed-off-by: David Hildenbrand (Arm) <[email protected]> --- arch/arm/include/asm/pgtable-2level-types.h | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/arch/arm/include/asm/pgtable-2level-types.h b/arch/arm/include/asm/pgtable-2level-types.h index 650e793f4142..7f85384ac386 100644 --- a/arch/arm/include/asm/pgtable-2level-types.h +++ b/arch/arm/include/asm/pgtable-2level-types.h @@ -25,7 +25,7 @@ typedef struct { pteval_t pgprot; } pgprot_t; #define pte_val(x) ((x).pte) #define pmd_val(x) ((x).pmd) -#define pgd_val(x) ((x).pgd[0]) +#define pgd_val(x) ((x).pgd[0]) #define pgprot_val(x) ((x).pgprot) #define __pte(x) ((pte_t) { (x) } ) @@ -36,14 +36,32 @@ typedef struct { pteval_t pgprot; } pgprot_t; /* * .. while these make it easier on the compiler */ +typedef u64 pgdval_t; + typedef pteval_t pte_t; typedef pmdval_t pmd_t; -typedef pmdval_t pgd_t[2]; +typedef pgdval_t pgd_t; typedef pteval_t pgprot_t; #define pte_val(x) (x) #define pmd_val(x) (x) -#define pgd_val(x) ((x)[0]) + +static inline pmdval_t pgd_val(pgd_t pgd) +{ + /* + * The lower and higher pmdval_t values point to the same page. + * the only difference is their offset within that page. + * Therefore, whichever value is returned, the behavior of pmd_pfn(), + * pmd_page(), and other users of pgd_val() remains unchanged. + * + * However, pgd_val() has historically returned the lower pmdval_t, so + * keep returning the lower one. + * + * See the comments in include/asm/pgtable-2level. + */ + return (*(pmdval_t (*)[2])&pgd)[0]; +} + #define pgprot_val(x) (x) #define __pte(x) (x) -- 2.43.0

