Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3f72966 authored by Borislav Petkov's avatar Borislav Petkov Committed by Matt Fleming
Browse files

x86/mm/pageattr: Add a PGD pagetable populating function



This allocates, if necessary, and populates the corresponding PGD entry
with a PUD page. The next population level is a dummy macro which will
be removed by the next patch and it is added here to keep the patch
small and easily reviewable but not break bisection, at the same time.

Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
parent 0fd64c23
Loading
Loading
Loading
Loading
+39 −0
Original line number Original line Diff line number Diff line
@@ -666,6 +666,45 @@ static int split_large_page(pte_t *kpte, unsigned long address)
	return 0;
	return 0;
}
}


#define populate_pud(cpa, addr, pgd, pgprot)	(-1)

/*
 * Restrictions for kernel page table do not necessarily apply when mapping in
 * an alternate PGD.
 */
static int populate_pgd(struct cpa_data *cpa, unsigned long addr)
{
	pgprot_t pgprot = __pgprot(_KERNPG_TABLE);
	bool allocd_pgd = false;
	pgd_t *pgd_entry;
	pud_t *pud = NULL;	/* shut up gcc */
	int ret;

	pgd_entry = cpa->pgd + pgd_index(addr);

	/*
	 * Allocate a PUD page and hand it down for mapping.
	 */
	if (pgd_none(*pgd_entry)) {
		pud = (pud_t *)get_zeroed_page(GFP_KERNEL | __GFP_NOTRACK);
		if (!pud)
			return -1;

		set_pgd(pgd_entry, __pgd(__pa(pud) | _KERNPG_TABLE));
		allocd_pgd = true;
	}

	pgprot_val(pgprot) &= ~pgprot_val(cpa->mask_clr);
	pgprot_val(pgprot) |=  pgprot_val(cpa->mask_set);

	ret = populate_pud(cpa, addr, pgd_entry, pgprot);
	if (ret < 0)
		return ret;

	cpa->numpages = ret;
	return 0;
}

static int __cpa_process_fault(struct cpa_data *cpa, unsigned long vaddr,
static int __cpa_process_fault(struct cpa_data *cpa, unsigned long vaddr,
			       int primary)
			       int primary)
{
{