s390/mm,hugetlb: don't use pte_val()/pXd_val() as lvalue
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>
This commit is contained in:
Родитель
869a9dbc10
Коммит
933b7253ad
|
@ -73,8 +73,8 @@ static inline unsigned long __pte_to_rste(pte_t pte)
|
|||
|
||||
static inline pte_t __rste_to_pte(unsigned long rste)
|
||||
{
|
||||
unsigned long pteval;
|
||||
int present;
|
||||
pte_t pte;
|
||||
|
||||
if ((rste & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3)
|
||||
present = pud_present(__pud(rste));
|
||||
|
@ -102,29 +102,21 @@ static inline pte_t __rste_to_pte(unsigned long rste)
|
|||
* u unused, l large
|
||||
*/
|
||||
if (present) {
|
||||
pte_val(pte) = rste & _SEGMENT_ENTRY_ORIGIN_LARGE;
|
||||
pte_val(pte) |= _PAGE_LARGE | _PAGE_PRESENT;
|
||||
pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_READ,
|
||||
_PAGE_READ);
|
||||
pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_WRITE,
|
||||
_PAGE_WRITE);
|
||||
pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_INVALID,
|
||||
_PAGE_INVALID);
|
||||
pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_PROTECT,
|
||||
_PAGE_PROTECT);
|
||||
pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_DIRTY,
|
||||
_PAGE_DIRTY);
|
||||
pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_YOUNG,
|
||||
_PAGE_YOUNG);
|
||||
pteval = rste & _SEGMENT_ENTRY_ORIGIN_LARGE;
|
||||
pteval |= _PAGE_LARGE | _PAGE_PRESENT;
|
||||
pteval |= move_set_bit(rste, _SEGMENT_ENTRY_READ, _PAGE_READ);
|
||||
pteval |= move_set_bit(rste, _SEGMENT_ENTRY_WRITE, _PAGE_WRITE);
|
||||
pteval |= move_set_bit(rste, _SEGMENT_ENTRY_INVALID, _PAGE_INVALID);
|
||||
pteval |= move_set_bit(rste, _SEGMENT_ENTRY_PROTECT, _PAGE_PROTECT);
|
||||
pteval |= move_set_bit(rste, _SEGMENT_ENTRY_DIRTY, _PAGE_DIRTY);
|
||||
pteval |= move_set_bit(rste, _SEGMENT_ENTRY_YOUNG, _PAGE_YOUNG);
|
||||
#ifdef CONFIG_MEM_SOFT_DIRTY
|
||||
pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_SOFT_DIRTY,
|
||||
_PAGE_SOFT_DIRTY);
|
||||
pteval |= move_set_bit(rste, _SEGMENT_ENTRY_SOFT_DIRTY, _PAGE_SOFT_DIRTY);
|
||||
#endif
|
||||
pte_val(pte) |= move_set_bit(rste, _SEGMENT_ENTRY_NOEXEC,
|
||||
_PAGE_NOEXEC);
|
||||
pteval |= move_set_bit(rste, _SEGMENT_ENTRY_NOEXEC, _PAGE_NOEXEC);
|
||||
} else
|
||||
pte_val(pte) = _PAGE_INVALID;
|
||||
return pte;
|
||||
pteval = _PAGE_INVALID;
|
||||
return __pte(pteval);
|
||||
}
|
||||
|
||||
static void clear_huge_pte_skeys(struct mm_struct *mm, unsigned long rste)
|
||||
|
|
Загрузка…
Ссылка в новой задаче