On Mon, Jul 27, 2020 at 07:07:59PM -0400, Arvind Sankar wrote:
> Short-circuit the whole function on 32-bit.
>
> Replace the loop to determine the number of 1Gb pages with arithmetic.
>
> Fix one minor bug: if the end of the region is aligned on a 1Gb
> boundary, the current code will not use the last available 1Gb page due
> to an off-by-one error.
>
> Signed-off-by: Arvind Sankar <[email protected]>
Can you add some KUnit tests could be written to do validation of the
refactorings? Touching this code is so painful. :)
-Kees
> +++ b/arch/x86/boot/compressed/kaslr.c
> @@ -546,49 +546,43 @@ static void store_slot_info(struct mem_vector *region,
> unsigned long image_size)
> static void
> process_gb_huge_pages(struct mem_vector *region, unsigned long image_size)
> {
> - unsigned long addr, size = 0;
> + unsigned long pud_start, pud_end, gb_huge_pages;
> struct mem_vector tmp;
> - int i = 0;
>
> - if (!max_gb_huge_pages) {
> + if (IS_ENABLED(CONFIG_X86_32) || !max_gb_huge_pages) {
> store_slot_info(region, image_size);
> return;
> }
Won't max_gb_huge_pages always be false for 32-bit?
--
Kees Cook