[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4782b7f3ab858d51ab375b9fc52a1900@ispras.ru>
Date: Thu, 09 Mar 2023 20:05:53 +0300
From: Evgeniy Baskov <baskov@...ras.ru>
To: Ard Biesheuvel <ardb@...nel.org>
Cc: Borislav Petkov <bp@...en8.de>, Andy Lutomirski <luto@...nel.org>,
Dave Hansen <dave.hansen@...ux.intel.com>,
Ingo Molnar <mingo@...hat.com>,
Peter Zijlstra <peterz@...radead.org>,
Thomas Gleixner <tglx@...utronix.de>,
Alexey Khoroshilov <khoroshilov@...ras.ru>,
Peter Jones <pjones@...hat.com>,
"Limonciello, Mario" <mario.limonciello@....com>,
joeyli <jlee@...e.com>, lvc-project@...uxtesting.org,
x86@...nel.org, linux-efi@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-hardening@...r.kernel.org
Subject: Re: [PATCH v4 15/26] efi/x86: Support extracting kernel from libstub
On 2023-03-09 19:00, Ard Biesheuvel wrote:
> On Thu, 15 Dec 2022 at 13:40, Evgeniy Baskov <baskov@...ras.ru> wrote:
>>
>> Doing it that way allows setting up stricter memory attributes,
>> simplifies boot code path and removes potential relocation
>> of kernel image.
>>
>> Wire up required interfaces and minimally initialize zero page
>> fields needed for it to function correctly.
>>
>> Tested-by: Peter Jones <pjones@...hat.com>
>> Signed-off-by: Evgeniy Baskov <baskov@...ras.ru>
>> ---
>> arch/x86/boot/compressed/head_32.S | 50 ++++-
>> arch/x86/boot/compressed/head_64.S | 58 ++++-
>> drivers/firmware/efi/Kconfig | 2 +
>> drivers/firmware/efi/libstub/Makefile | 2 +-
>> .../firmware/efi/libstub/x86-extract-direct.c | 208
>> ++++++++++++++++++
>> drivers/firmware/efi/libstub/x86-stub.c | 119 +---------
>> drivers/firmware/efi/libstub/x86-stub.h | 14 ++
>> 7 files changed, 338 insertions(+), 115 deletions(-)
>> create mode 100644 drivers/firmware/efi/libstub/x86-extract-direct.c
>> create mode 100644 drivers/firmware/efi/libstub/x86-stub.h
>>
>> diff --git a/arch/x86/boot/compressed/head_32.S
>> b/arch/x86/boot/compressed/head_32.S
>> index ead6007df1e5..0be75e5072ae 100644
>> --- a/arch/x86/boot/compressed/head_32.S
>> +++ b/arch/x86/boot/compressed/head_32.S
>> @@ -152,11 +152,57 @@ SYM_FUNC_END(startup_32)
>>
>> #ifdef CONFIG_EFI_STUB
>> SYM_FUNC_START(efi32_stub_entry)
>> +/*
>> + * Calculate the delta between where we were compiled to run
>> + * at and where we were actually loaded at. This can only be done
>> + * with a short local call on x86. Nothing else will tell us what
>> + * address we are running at. The reserved chunk of the real-mode
>> + * data at 0x1e4 (defined as a scratch field) are used as the stack
>> + * for this calculation. Only 4 bytes are needed.
>> + */
>
> Please drop this comment
Will do.
>
>> + call 1f
>> +1: popl %ebx
>> + addl $_GLOBAL_OFFSET_TABLE_+(.-1b), %ebx
>
> Please drop this and ...
>
>> +
>> + /* Clear BSS */
>> + xorl %eax, %eax
>> + leal _bss@...OFF(%ebx), %edi
>> + leal _ebss@...OFF(%ebx), %ecx
>
> just use (_bss - 1b) here (etc)
I was trying to be consistent with the code below, but it will
indeed be better to do this like that. I guess, this will be
fine to stop putting GOT address to the %ebx, since the extraction
code does not use calls via PLT?
>
>> + subl %edi, %ecx
>> + shrl $2, %ecx
>> + rep stosl
>> +
>> add $0x4, %esp
>> movl 8(%esp), %esi /* save boot_params pointer */
>> + movl %edx, %edi /* save GOT address */
>
> What does this do?
Hmm... It seems to be a remnant of the previous implementation
that I forgot to remove. I will remove that in the v5.
>
>> call efi_main
>> - /* efi_main returns the possibly relocated address of
>> startup_32 */
>> - jmp *%eax
>> + movl %eax, %ecx
>> +
>> + /*
>> + * efi_main returns the possibly
>> + * relocated address of extracted kernel entry point.
>> + */
>> +
>> + cli
>> +
>> + /* Load new GDT */
>> + leal gdt@...OFF(%ebx), %eax
>> + movl %eax, 2(%eax)
>> + lgdt (%eax)
>> +
>> + /* Load segment registers with our descriptors */
>> + movl $__BOOT_DS, %eax
>> + movl %eax, %ds
>> + movl %eax, %es
>> + movl %eax, %fs
>> + movl %eax, %gs
>> + movl %eax, %ss
>> +
>> + /* Zero EFLAGS */
>> + pushl $0
>> + popfl
>> +
>> + jmp *%ecx
>> SYM_FUNC_END(efi32_stub_entry)
>> SYM_FUNC_ALIAS(efi_stub_entry, efi32_stub_entry)
>> #endif
> ...
Thanks,
Evgeniy Baskov
Powered by blists - more mailing lists