Re: [PATCH 1/5] x86/boot/compressed/32: Save the output address instead of recalculating it

From: Ard Biesheuvel
Date: Tue Mar 03 2020 - 14:11:01 EST


On Mon, 2 Mar 2020 at 00:05, Arvind Sankar <nivedita@xxxxxxxxxxxx> wrote:
>
> In preparation for being able to decompress starting at a different
> address than startup_32, save the calculated output address instead of
> recalculating it later.
>

Could you expand this a bit? Are you talking about *running* the
decompressor code at another offset? Or about the space it uses. I
think I know but I'd like to be sure :-)


> We now keep track of three addresses:
> %edx: startup_32 as we were loaded by bootloader
> %ebx: new location of compressed kernel
> %ebp: start of decompression buffer
>
> Signed-off-by: Arvind Sankar <nivedita@xxxxxxxxxxxx>
> ---
> arch/x86/boot/compressed/head_32.S | 25 ++++++++++++-------------
> 1 file changed, 12 insertions(+), 13 deletions(-)
>
> diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
> index 46bbe7ab4adf..894182500606 100644
> --- a/arch/x86/boot/compressed/head_32.S
> +++ b/arch/x86/boot/compressed/head_32.S
> @@ -75,11 +75,11 @@ SYM_FUNC_START(startup_32)
> */
> leal (BP_scratch+4)(%esi), %esp
> call 1f
> -1: popl %ebp
> - subl $1b, %ebp
> +1: popl %edx
> + subl $1b, %edx
>
> /* Load new GDT */
> - leal gdt(%ebp), %eax
> + leal gdt(%edx), %eax
> movl %eax, 2(%eax)
> lgdt (%eax)
>
> @@ -92,13 +92,14 @@ SYM_FUNC_START(startup_32)
> movl %eax, %ss
>
> /*
> - * %ebp contains the address we are loaded at by the boot loader and %ebx
> + * %edx contains the address we are loaded at by the boot loader and %ebx
> * contains the address where we should move the kernel image temporarily
> - * for safe in-place decompression.
> + * for safe in-place decompression. %ebp contains the address that the kernel
> + * will be decompressed to.
> */
>
> #ifdef CONFIG_RELOCATABLE
> - movl %ebp, %ebx
> + movl %edx, %ebx
> movl BP_kernel_alignment(%esi), %eax
> decl %eax
> addl %eax, %ebx
> @@ -110,10 +111,10 @@ SYM_FUNC_START(startup_32)
> movl $LOAD_PHYSICAL_ADDR, %ebx
> 1:
>
> + movl %ebx, %ebp // Save the output address for later
> /* Target address to relocate to for decompression */
> - movl BP_init_size(%esi), %eax
> - subl $_end, %eax
> - addl %eax, %ebx
> + addl BP_init_size(%esi), %ebx
> + subl $_end, %ebx
>
> /* Set up the stack */
> leal boot_stack_end(%ebx), %esp
> @@ -127,7 +128,7 @@ SYM_FUNC_START(startup_32)
> * where decompression in place becomes safe.
> */
> pushl %esi
> - leal (_bss-4)(%ebp), %esi
> + leal (_bss-4)(%edx), %esi
> leal (_bss-4)(%ebx), %edi
> movl $(_bss - startup_32), %ecx
> shrl $2, %ecx
> @@ -196,9 +197,7 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
> /* push arguments for extract_kernel: */
> pushl $z_output_len /* decompressed length, end of relocs */
>
> - leal _end(%ebx), %eax
> - subl BP_init_size(%esi), %eax
> - pushl %eax /* output address */
> + pushl %ebp /* output address */
>
> pushl $z_input_len /* input_len */
> leal input_data(%ebx), %eax
> --
> 2.24.1
>