s390/mm,gmap: don't use pte_val()/pXd_val() as lvalue
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 21 Feb 2022 20:25:09 +0000 (21:25 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Tue, 1 Mar 2022 20:05:10 +0000 (21:05 +0100)
Convert pgtable code so pte_val()/pXd_val() aren't used as lvalue
anymore. This allows in later step to convert pte_val()/pXd_val() to
functions, which in turn makes it impossible to use these macros to
modify page table entries like they have been used before.

Therefore a construct like this:

        pte_val(*pte) = __pa(addr) | prot;

which would directly write into a page table, isn't possible anymore
with the last step of this series.

Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/mm/gmap.c

index 8cdc77f..a57224a 100644 (file)
@@ -974,13 +974,13 @@ static int gmap_protect_pmd(struct gmap *gmap, unsigned long gaddr,
                return -EAGAIN;
 
        if (prot == PROT_NONE && !pmd_i) {
-               pmd_val(new) |= _SEGMENT_ENTRY_INVALID;
+               new = set_pmd_bit(new, __pgprot(_SEGMENT_ENTRY_INVALID));
                gmap_pmdp_xchg(gmap, pmdp, new, gaddr);
        }
 
        if (prot == PROT_READ && !pmd_p) {
-               pmd_val(new) &= ~_SEGMENT_ENTRY_INVALID;
-               pmd_val(new) |= _SEGMENT_ENTRY_PROTECT;
+               new = clear_pmd_bit(new, __pgprot(_SEGMENT_ENTRY_INVALID));
+               new = set_pmd_bit(new, __pgprot(_SEGMENT_ENTRY_PROTECT));
                gmap_pmdp_xchg(gmap, pmdp, new, gaddr);
        }
 
@@ -2294,7 +2294,7 @@ static void gmap_pmdp_xchg(struct gmap *gmap, pmd_t *pmdp, pmd_t new,
 {
        gaddr &= HPAGE_MASK;
        pmdp_notify_gmap(gmap, pmdp, gaddr);
-       pmd_val(new) &= ~_SEGMENT_ENTRY_GMAP_IN;
+       new = clear_pmd_bit(new, __pgprot(_SEGMENT_ENTRY_GMAP_IN));
        if (MACHINE_HAS_TLB_GUEST)
                __pmdp_idte(gaddr, (pmd_t *)pmdp, IDTE_GUEST_ASCE, gmap->asce,
                            IDTE_GLOBAL);