lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20160108120008.GF16432@e104818-lin.cambridge.arm.com>
Date:	Fri, 8 Jan 2016 12:00:08 +0000
From:	Catalin Marinas <catalin.marinas@....com>
To:	Ard Biesheuvel <ard.biesheuvel@...aro.org>
Cc:	linux-arm-kernel@...ts.infradead.org,
	kernel-hardening@...ts.openwall.com, will.deacon@....com,
	mark.rutland@....com, leif.lindholm@...aro.org,
	keescook@...omium.org, linux-kernel@...r.kernel.org, arnd@...db.de,
	bhupesh.sharma@...escale.com, stuart.yoder@...escale.com,
	marc.zyngier@....com, christoffer.dall@...aro.org
Subject: Re: [PATCH v2 04/13] arm64: decouple early fixmap init from linear
 mapping

On Wed, Dec 30, 2015 at 04:26:03PM +0100, Ard Biesheuvel wrote:
> @@ -583,33 +555,42 @@ void __init early_fixmap_init(void)
>  	unsigned long addr = FIXADDR_START;
>  
>  	pgd = pgd_offset_k(addr);
> -	pgd_populate(&init_mm, pgd, bm_pud);
> -	pud = pud_offset(pgd, addr);
> -	pud_populate(&init_mm, pud, bm_pmd);
> -	pmd = pmd_offset(pud, addr);
> -	pmd_populate_kernel(&init_mm, pmd, bm_pte);
> +#if CONFIG_PGTABLE_LEVELS > 3
> +	if (pgd_none(*pgd)) {
> +		static pud_t bm_pud[PTRS_PER_PUD] __pgdir;
> +
> +		pgd_populate(&init_mm, pgd, bm_pud);
> +		memblock_reserve(__pa(bm_pud), sizeof(bm_pud));
> +	}
> +	pud = (pud_t *)__phys_to_kimg(pud_offset_phys(pgd, addr));
> +#else
> +	pud = (pud_t *)pgd;
> +#endif
> +#if CONFIG_PGTABLE_LEVELS > 2
> +	if (pud_none(*pud)) {
> +		static pmd_t bm_pmd[PTRS_PER_PMD] __pgdir;
> +
> +		pud_populate(&init_mm, pud, bm_pmd);
> +		memblock_reserve(__pa(bm_pmd), sizeof(bm_pmd));
> +	}
> +	pmd = (pmd_t *)__phys_to_kimg(pmd_offset_phys(pud, addr));
> +#else
> +	pmd = (pmd_t *)pud;
> +#endif
> +	if (pmd_none(*pmd)) {
> +		static pte_t bm_pte[PTRS_PER_PTE] __pgdir;
> +
> +		pmd_populate_kernel(&init_mm, pmd, bm_pte);
> +		memblock_reserve(__pa(bm_pte), sizeof(bm_pte));
> +	}
> +	__fixmap_pte = (pte_t *)__phys_to_kimg(pmd_page_paddr(*pmd));

I haven't tried but could you not avoid the #if and just rely on the
pud_none() etc. definitions to be 0 and the compiler+linker optimising
the irrelevant code out?

-- 
Catalin

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ