mirror of
https://github.com/torvalds/linux.git
synced 2025-08-15 14:11:42 +02:00
arm64/mm: define ptdesc_t
Define ptdesc_t type which describes the basic page table descriptor layout on arm64 platform. Subsequently all level specific pxxval_t descriptors are derived from ptdesc_t thus establishing a common original format, which can also be appropriate for page table entries, masks and protection values etc which are used at all page table levels. Link: https://lkml.kernel.org/r/20250407053113.746295-4-anshuman.khandual@arm.com Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> Suggested-by: Ryan Roberts <ryan.roberts@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will@kernel.org> Cc: Ard Biesheuvel <ardb@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Madhavan Srinivasan <maddy@linux.ibm.com> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Palmer Dabbelt <palmer@dabbelt.com> Cc: Paul Walmsley <paul.walmsley@sifive.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
08978fc3b0
commit
dbb9c166a0
8 changed files with 26 additions and 18 deletions
|
@ -11,11 +11,19 @@
|
|||
|
||||
#include <asm/types.h>
|
||||
|
||||
typedef u64 pteval_t;
|
||||
typedef u64 pmdval_t;
|
||||
typedef u64 pudval_t;
|
||||
typedef u64 p4dval_t;
|
||||
typedef u64 pgdval_t;
|
||||
/*
|
||||
* Page Table Descriptor
|
||||
*
|
||||
* Generic page table descriptor format from which
|
||||
* all level specific descriptors can be derived.
|
||||
*/
|
||||
typedef u64 ptdesc_t;
|
||||
|
||||
typedef ptdesc_t pteval_t;
|
||||
typedef ptdesc_t pmdval_t;
|
||||
typedef ptdesc_t pudval_t;
|
||||
typedef ptdesc_t p4dval_t;
|
||||
typedef ptdesc_t pgdval_t;
|
||||
|
||||
/*
|
||||
* These are used to make use of C type-checking..
|
||||
|
@ -46,7 +54,7 @@ typedef struct { pgdval_t pgd; } pgd_t;
|
|||
#define pgd_val(x) ((x).pgd)
|
||||
#define __pgd(x) ((pgd_t) { (x) } )
|
||||
|
||||
typedef struct { pteval_t pgprot; } pgprot_t;
|
||||
typedef struct { ptdesc_t pgprot; } pgprot_t;
|
||||
#define pgprot_val(x) ((x).pgprot)
|
||||
#define __pgprot(x) ((pgprot_t) { (x) } )
|
||||
|
||||
|
|
|
@ -24,8 +24,8 @@ struct ptdump_info {
|
|||
};
|
||||
|
||||
struct ptdump_prot_bits {
|
||||
u64 mask;
|
||||
u64 val;
|
||||
ptdesc_t mask;
|
||||
ptdesc_t val;
|
||||
const char *set;
|
||||
const char *clear;
|
||||
};
|
||||
|
@ -34,7 +34,7 @@ struct ptdump_pg_level {
|
|||
const struct ptdump_prot_bits *bits;
|
||||
char name[4];
|
||||
int num;
|
||||
u64 mask;
|
||||
ptdesc_t mask;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -51,7 +51,7 @@ struct ptdump_pg_state {
|
|||
const struct mm_struct *mm;
|
||||
unsigned long start_address;
|
||||
int level;
|
||||
u64 current_prot;
|
||||
ptdesc_t current_prot;
|
||||
bool check_wx;
|
||||
unsigned long wx_pages;
|
||||
unsigned long uxn_pages;
|
||||
|
|
|
@ -29,7 +29,7 @@ static bool region_is_misaligned(const efi_memory_desc_t *md)
|
|||
* executable, everything else can be mapped with the XN bits
|
||||
* set. Also take the new (optional) RO/XP bits into account.
|
||||
*/
|
||||
static __init pteval_t create_mapping_protection(efi_memory_desc_t *md)
|
||||
static __init ptdesc_t create_mapping_protection(efi_memory_desc_t *md)
|
||||
{
|
||||
u64 attr = md->attribute;
|
||||
u32 type = md->type;
|
||||
|
@ -83,7 +83,7 @@ static __init pteval_t create_mapping_protection(efi_memory_desc_t *md)
|
|||
|
||||
int __init efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md)
|
||||
{
|
||||
pteval_t prot_val = create_mapping_protection(md);
|
||||
ptdesc_t prot_val = create_mapping_protection(md);
|
||||
bool page_mappings_only = (md->type == EFI_RUNTIME_SERVICES_CODE ||
|
||||
md->type == EFI_RUNTIME_SERVICES_DATA);
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ static void noinline __section(".idmap.text") set_ttbr0_for_lpa2(u64 ttbr)
|
|||
static void __init remap_idmap_for_lpa2(void)
|
||||
{
|
||||
/* clear the bits that change meaning once LPA2 is turned on */
|
||||
pteval_t mask = PTE_SHARED;
|
||||
ptdesc_t mask = PTE_SHARED;
|
||||
|
||||
/*
|
||||
* We have to clear bits [9:8] in all block or page descriptors in the
|
||||
|
|
|
@ -30,7 +30,7 @@ void __init map_range(u64 *pte, u64 start, u64 end, u64 pa, pgprot_t prot,
|
|||
int level, pte_t *tbl, bool may_use_cont, u64 va_offset)
|
||||
{
|
||||
u64 cmask = (level == 3) ? CONT_PTE_SIZE - 1 : U64_MAX;
|
||||
pteval_t protval = pgprot_val(prot) & ~PTE_TYPE_MASK;
|
||||
ptdesc_t protval = pgprot_val(prot) & ~PTE_TYPE_MASK;
|
||||
int lshift = (3 - level) * PTDESC_TABLE_SHIFT;
|
||||
u64 lmask = (PAGE_SIZE << lshift) - 1;
|
||||
|
||||
|
@ -87,7 +87,7 @@ void __init map_range(u64 *pte, u64 start, u64 end, u64 pa, pgprot_t prot,
|
|||
}
|
||||
}
|
||||
|
||||
asmlinkage u64 __init create_init_idmap(pgd_t *pg_dir, pteval_t clrmask)
|
||||
asmlinkage u64 __init create_init_idmap(pgd_t *pg_dir, ptdesc_t clrmask)
|
||||
{
|
||||
u64 ptep = (u64)pg_dir + PAGE_SIZE;
|
||||
pgprot_t text_prot = PAGE_KERNEL_ROX;
|
||||
|
|
|
@ -33,4 +33,4 @@ void map_range(u64 *pgd, u64 start, u64 end, u64 pa, pgprot_t prot,
|
|||
|
||||
asmlinkage void early_map_kernel(u64 boot_status, void *fdt);
|
||||
|
||||
asmlinkage u64 create_init_idmap(pgd_t *pgd, pteval_t clrmask);
|
||||
asmlinkage u64 create_init_idmap(pgd_t *pgd, ptdesc_t clrmask);
|
||||
|
|
|
@ -83,7 +83,7 @@ arch_initcall(adjust_protection_map);
|
|||
|
||||
pgprot_t vm_get_page_prot(unsigned long vm_flags)
|
||||
{
|
||||
pteval_t prot;
|
||||
ptdesc_t prot;
|
||||
|
||||
/* Short circuit GCS to avoid bloating the table. */
|
||||
if (system_supports_gcs() && (vm_flags & VM_SHADOW_STACK)) {
|
||||
|
|
|
@ -194,7 +194,7 @@ void note_page(struct ptdump_state *pt_st, unsigned long addr, int level,
|
|||
struct ptdump_pg_state *st = container_of(pt_st, struct ptdump_pg_state, ptdump);
|
||||
struct ptdump_pg_level *pg_level = st->pg_level;
|
||||
static const char units[] = "KMGTPE";
|
||||
u64 prot = 0;
|
||||
ptdesc_t prot = 0;
|
||||
|
||||
/* check if the current level has been folded dynamically */
|
||||
if (st->mm && ((level == 1 && mm_p4d_folded(st->mm)) ||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue