2019-06-03 07:44:50 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2012-03-05 11:49:27 +00:00
/*
* Based on arch / arm / include / asm / pgalloc . h
*
* Copyright ( C ) 2000 - 2001 Russell King
* Copyright ( C ) 2012 ARM Ltd .
*/
# ifndef __ASM_PGALLOC_H
# define __ASM_PGALLOC_H
# include <asm/pgtable-hwdef.h>
# include <asm/processor.h>
# include <asm/cacheflush.h>
# include <asm/tlbflush.h>
2020-08-06 23:22:47 -07:00
# define __HAVE_ARCH_PGD_FREE
2020-08-06 23:22:39 -07:00
# include <asm-generic/pgalloc.h>
2019-07-11 20:58:02 -07:00
2015-10-12 18:52:57 +03:00
# define PGD_SIZE (PTRS_PER_PGD * sizeof(pgd_t))
2014-11-19 17:44:12 +00:00
2015-04-14 15:45:39 -07:00
# if CONFIG_PGTABLE_LEVELS > 2
2012-03-05 11:49:27 +00:00
2018-02-15 11:14:56 +00:00
static inline void __pud_populate ( pud_t * pudp , phys_addr_t pmdp , pudval_t prot )
2012-03-05 11:49:27 +00:00
{
2018-02-15 11:14:56 +00:00
set_pud ( pudp , __pud ( __phys_to_pud_val ( pmdp ) | prot ) ) ;
2012-03-05 11:49:27 +00:00
}
2018-02-15 11:14:56 +00:00
static inline void pud_populate ( struct mm_struct * mm , pud_t * pudp , pmd_t * pmdp )
2016-01-25 11:45:06 +00:00
{
2021-03-10 11:49:42 +01:00
pudval_t pudval = PUD_TYPE_TABLE ;
pudval | = ( mm = = & init_mm ) ? PUD_TABLE_UXN : PUD_TABLE_PXN ;
__pud_populate ( pudp , __pa ( pmdp ) , pudval ) ;
2016-01-25 11:45:06 +00:00
}
# else
2018-02-15 11:14:56 +00:00
static inline void __pud_populate ( pud_t * pudp , phys_addr_t pmdp , pudval_t prot )
2016-01-25 11:45:06 +00:00
{
BUILD_BUG ( ) ;
}
2015-04-14 15:45:39 -07:00
# endif /* CONFIG_PGTABLE_LEVELS > 2 */
2012-03-05 11:49:27 +00:00
2015-04-14 15:45:39 -07:00
# if CONFIG_PGTABLE_LEVELS > 3
2014-05-12 18:40:51 +09:00
2020-06-04 16:46:23 -07:00
static inline void __p4d_populate ( p4d_t * p4dp , phys_addr_t pudp , p4dval_t prot )
2014-05-12 18:40:51 +09:00
{
2020-06-04 16:46:23 -07:00
set_p4d ( p4dp , __p4d ( __phys_to_p4d_val ( pudp ) | prot ) ) ;
2014-05-12 18:40:51 +09:00
}
2020-06-04 16:46:23 -07:00
static inline void p4d_populate ( struct mm_struct * mm , p4d_t * p4dp , pud_t * pudp )
2016-01-25 11:45:06 +00:00
{
2021-03-10 11:49:42 +01:00
p4dval_t p4dval = P4D_TYPE_TABLE ;
p4dval | = ( mm = = & init_mm ) ? P4D_TABLE_UXN : P4D_TABLE_PXN ;
__p4d_populate ( p4dp , __pa ( pudp ) , p4dval ) ;
2016-01-25 11:45:06 +00:00
}
# else
2020-06-04 16:46:23 -07:00
static inline void __p4d_populate ( p4d_t * p4dp , phys_addr_t pudp , p4dval_t prot )
2016-01-25 11:45:06 +00:00
{
BUILD_BUG ( ) ;
}
2015-04-14 15:45:39 -07:00
# endif /* CONFIG_PGTABLE_LEVELS > 3 */
2014-05-12 18:40:51 +09:00
2012-03-05 11:49:27 +00:00
extern pgd_t * pgd_alloc ( struct mm_struct * mm ) ;
2018-02-15 11:14:56 +00:00
extern void pgd_free ( struct mm_struct * mm , pgd_t * pgdp ) ;
2012-03-05 11:49:27 +00:00
2018-02-15 11:14:56 +00:00
static inline void __pmd_populate ( pmd_t * pmdp , phys_addr_t ptep ,
2012-03-05 11:49:27 +00:00
pmdval_t prot )
{
2018-02-15 11:14:56 +00:00
set_pmd ( pmdp , __pmd ( __phys_to_pmd_val ( ptep ) | prot ) ) ;
2012-03-05 11:49:27 +00:00
}
/*
* Populate the pmdp entry with a pointer to the pte . This pmd is part
* of the mm address space .
*/
static inline void
pmd_populate_kernel ( struct mm_struct * mm , pmd_t * pmdp , pte_t * ptep )
{
2021-11-12 13:22:14 +08:00
VM_BUG_ON ( mm & & mm ! = & init_mm ) ;
2021-03-10 11:49:42 +01:00
__pmd_populate ( pmdp , __pa ( ptep ) , PMD_TYPE_TABLE | PMD_TABLE_UXN ) ;
2012-03-05 11:49:27 +00:00
}
static inline void
pmd_populate ( struct mm_struct * mm , pmd_t * pmdp , pgtable_t ptep )
{
2021-03-10 11:49:42 +01:00
VM_BUG_ON ( mm = = & init_mm ) ;
__pmd_populate ( pmdp , page_to_phys ( ptep ) , PMD_TYPE_TABLE | PMD_TABLE_PXN ) ;
2012-03-05 11:49:27 +00:00
}
# endif