From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Daniel Kiper <daniel.kiper@oracle.com>
Cc: jgross@suse.com, grub-devel@gnu.org, keir@xen.org,
ian.campbell@citrix.com, phcoder@gmail.com,
stefano.stabellini@eu.citrix.com, roy.franz@linaro.org,
ning.sun@intel.com, david.vrabel@citrix.com, jbeulich@suse.com,
xen-devel@lists.xenproject.org, qiaowei.ren@intel.com,
richard.l.maliszewski@intel.com, gang.wei@intel.com,
fu.wei@linaro.org
Subject: Re: [PATCH 18/18] x86: add multiboot2 protocol support for EFI platforms
Date: Sat, 31 Jan 2015 00:47:44 +0000 [thread overview]
Message-ID: <54CC2630.3050806@citrix.com> (raw)
In-Reply-To: <20150130234346.GG29167@olila.local.net-space.pl>
On 30/01/2015 23:43, Daniel Kiper wrote:
> On Fri, Jan 30, 2015 at 07:06:53PM +0000, Andrew Cooper wrote:
>> On 30/01/15 17:54, Daniel Kiper wrote:
>>> +
>>> +efi_multiboot2_proto:
>>> + /* Skip Multiboot2 information fixed part */
>>> + lea MB2_fixed_sizeof(%ebx),%ecx
>>> +
>>> +0:
>>> + /* Get mem_lower from Multiboot2 information */
>>> + cmpl $MULTIBOOT2_TAG_TYPE_BASIC_MEMINFO,(%ecx)
>>> + jne 1f
>>> +
>>> + mov MB2_mem_lower(%ecx),%edx
>>> + jmp 4f
>>> +
>>> +1:
>>> + /* Get EFI SystemTable address from Multiboot2 information */
>>> + cmpl $MULTIBOOT2_TAG_TYPE_EFI64,(%ecx)
>>> + jne 2f
>>> +
>>> + lea MB2_efi64_st(%ecx),%esi
>>> + lea efi_st(%rip),%edi
>>> + movsq
>> This is complete overkill for copying a 64bit variable out of the tag
>> and into a local variable. Just use a plain 64bit load and store.
> I am not sure what do you mean by "64bit load and store" but I have
> just realized that we do not need these variables. They are remnants
> from early developments when I thought that we need ImageHandle
> and SystemTable here and later somewhere else.
mov MB2_efi64_st(%rcx), %rdi
mov %rdi, efi_st(%rip)
But if they are not needed, drop the code completely.
>>> + jmp 4f
>>> +
>>> +3:
>>> + /* Is it the end of Multiboot2 information? */
>>> + cmpl $MULTIBOOT2_TAG_TYPE_END,(%ecx)
>>> + je run_bs
>>> +
>>> +4:
>>> + /* Go to next Multiboot2 information tag */
>>> + add MB2_tag_size(%ecx),%ecx
>>> + add $(MULTIBOOT2_TAG_ALIGN-1),%ecx
>>> + and $~(MULTIBOOT2_TAG_ALIGN-1),%ecx
>>> + jmp 0b
>>> +
>>> +run_bs:
>>> + push %rax
>>> + push %rdx
>> Does the EFI spec guarantee that we have a good stack to use at this point?
> Unified Extensible Firmware Interface Specification, Version 2.4 Errata B,
> section 2.3.4, x64 Platforms says: During boot services time the processor
> is in the following execution mode: ..., 128 KiB, or more, of available
> stack space. GRUB2 uses this stack too and do not move it to different
> memory region. So, I think that here we are on safe side.
Sounds ok then.
>
>>> + /* Initialize BSS (no nasty surprises!) */
>>> + lea __bss_start(%rip),%rdi
>>> + lea _end(%rip),%rcx
>>> + sub %rdi,%rcx
>>> + xor %rax,%rax
>> xor %eax,%eax is shorter.
>>
>>> + rep stosb
>> It would be more efficient to make sure that the linker aligns
>> __bss_start and _end on 8 byte boundaries, and use stosq instead.
> Right but just for this. Is it pays? We do this only once.
The BSS in Xen is 300k. It is absolutely better to clear it 8 bytes at
a time rather than 1.
> However, if you wish...
>
>>> + mov efi_ih(%rip),%rdi /* EFI ImageHandle */
>>> + mov efi_st(%rip),%rsi /* EFI SystemTable */
>>> + call efi_multiboot2
>>> +
>>> + pop %rcx
>>> + pop %rax
>>> +
>>> + shl $10-4,%rcx /* Convert multiboot2.mem_lower to bytes/16 */
>>> +
>>> + cli
>> This looks suspiciously out of place. Surely the EFI spec doesn't
>> permit entry with interrupts enabled?
> Unified Extensible Firmware Interface Specification, Version 2.4 Errata B,
> section 2.3.4, x64 Platforms says: During boot services time the processor
> is in the following execution mode: ..., Interrupts are enabled–though no
> interrupt services are supported other than the UEFI boot services timer
> functions (All loaded device drivers are serviced synchronously by “polling.”).
> So, I think that we should use BS with interrupts enabled and disable
> them after ExitBootServices(). Hmmm... Now I think that we should use
> cli immediately after efi_multiboot2() call.
I presume then that the firmware has set up a valid idt somewhere and is
actually serving any interrupts we get.
> diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
> index f8be3dd..c5725ca 100644
> --- a/xen/common/efi/boot.c
> +++ b/xen/common/efi/boot.c
> @@ -75,6 +75,17 @@ static size_t wstrlen(const CHAR16 * s);
> static int set_color(u32 mask, int bpp, u8 *pos, u8 *sz);
> static bool_t match_guid(const EFI_GUID *guid1, const EFI_GUID *guid2);
>
> +static void efi_init(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable);
> +static void efi_console_set_mode(void);
> +static EFI_GRAPHICS_OUTPUT_PROTOCOL *efi_get_gop(void);
> +static UINTN efi_find_gop_mode(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop,
> + UINTN cols, UINTN rows, UINTN depth);
> +static void efi_tables(void);
> +static void setup_efi_pci(void);
> +static void efi_variables(void);
> +static void efi_set_gop_mode(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop, UINTN gop_mode);
> +static void efi_exit_boot(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable);
> +
>> If any of these forward declarations are needed, they should be
> They are needed because efi-boot.h is included before above
> mentioned functions definitions.
>
>> introduced in the appropriate create efi_$FOO patch. However, I can't
> I thought about that during development. However, I stated that if I do what
> you suggest then it is not clear who needs/uses these forward declarations.
>
>> spot a need for any of them.
> efi-boot.h:efi_multiboot2() uses them.
Ah - I see now.
~Andrew
next prev parent reply other threads:[~2015-01-31 0:47 UTC|newest]
Thread overview: 166+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-30 17:54 [PATCH 00/18] x86: multiboot2 protocol support Daniel Kiper
2015-01-30 17:54 ` [PATCH 01/18] x86/boot/reloc: mask out MBI_BOOTDEV from mbi flags Daniel Kiper
2015-01-30 17:54 ` Daniel Kiper
2015-01-30 17:59 ` Andrew Cooper
2015-01-30 17:59 ` [Xen-devel] " Andrew Cooper
2015-01-30 17:54 ` [PATCH 02/18] x86/boot/reloc: create generic alloc and copy functions Daniel Kiper
2015-01-30 17:54 ` Daniel Kiper
2015-01-30 18:02 ` Andrew Cooper
2015-01-30 18:02 ` Andrew Cooper
2015-02-03 10:13 ` Jan Beulich
2015-02-03 10:13 ` Jan Beulich
2015-01-30 17:54 ` [PATCH 03/18] x86/boot: use %ecx instead of %eax Daniel Kiper
2015-01-30 17:54 ` Daniel Kiper
2015-02-03 10:02 ` Jan Beulich
2015-02-03 10:02 ` Jan Beulich
2015-02-03 17:43 ` Daniel Kiper
2015-02-03 17:43 ` Daniel Kiper
2015-01-30 17:54 ` [PATCH 04/18] xen/x86: add multiboot2 protocol support Daniel Kiper
2015-01-30 17:54 ` Daniel Kiper
2015-01-30 18:11 ` Andrew Cooper
2015-01-30 18:11 ` Andrew Cooper
2015-02-20 16:06 ` Jan Beulich
2015-03-27 10:56 ` Daniel Kiper
2015-03-27 11:20 ` Jan Beulich
2015-03-27 12:22 ` Daniel Kiper
2015-03-27 12:22 ` Daniel Kiper
2015-03-27 12:42 ` Jan Beulich
2015-03-27 12:42 ` Jan Beulich
2015-03-27 11:20 ` Jan Beulich
2015-03-27 10:56 ` Daniel Kiper
2015-01-30 17:54 ` [PATCH 05/18] efi: split efi_enabled to efi_platform and efi_loader Daniel Kiper
2015-01-30 17:54 ` Daniel Kiper
2015-02-20 16:17 ` Jan Beulich
2015-02-20 16:17 ` Jan Beulich
2015-03-27 13:32 ` Daniel Kiper
2015-03-27 13:43 ` Jan Beulich
2015-03-27 13:43 ` Jan Beulich
2015-03-27 13:53 ` Andrew Cooper
2015-03-27 14:04 ` Jan Beulich
2015-03-27 14:04 ` Jan Beulich
2015-03-27 14:09 ` Lennart Sorensen
2015-03-27 14:19 ` [Xen-devel] " Jan Beulich
2015-03-27 14:21 ` Lennart Sorensen
2015-03-27 14:21 ` [Xen-devel] " Lennart Sorensen
2015-03-27 14:19 ` Jan Beulich
2015-03-27 14:09 ` Lennart Sorensen
2015-03-27 13:53 ` Andrew Cooper
2015-03-27 13:32 ` Daniel Kiper
2015-03-02 17:21 ` Stefano Stabellini
2015-03-02 18:43 ` Roy Franz
2015-03-02 23:40 ` Roy Franz
2015-03-03 8:49 ` Jan Beulich
2015-03-03 8:49 ` Jan Beulich
2015-03-02 23:40 ` Roy Franz
2015-03-02 17:21 ` Stefano Stabellini
2015-01-30 17:54 ` [PATCH 06/18] x86: remove commented out stale references to efi_enabled Daniel Kiper
2015-01-30 17:54 ` [PATCH 07/18] efi: run EFI specific code on EFI platform only Daniel Kiper
2015-02-20 16:47 ` Jan Beulich
2015-02-20 16:47 ` Jan Beulich
2015-01-30 17:54 ` [PATCH 08/18] efi: build xen.gz with EFI code Daniel Kiper
2015-03-02 16:14 ` Jan Beulich
2015-03-27 11:14 ` Daniel Kiper
2015-03-27 11:14 ` Daniel Kiper
2015-03-27 11:46 ` Jan Beulich
2015-03-27 11:46 ` Jan Beulich
2015-03-27 11:54 ` Andrew Cooper
2015-03-27 11:54 ` Andrew Cooper
2015-03-02 16:14 ` Jan Beulich
2015-01-30 17:54 ` [PATCH 09/18] efi: create efi_init() Daniel Kiper
2015-01-30 17:54 ` [PATCH 10/18] efi: create efi_console_set_mode() Daniel Kiper
2015-01-30 17:54 ` [PATCH 11/18] efi: create efi_get_gop() Daniel Kiper
2015-01-30 17:54 ` [PATCH 12/18] efi: create efi_find_gop_mode() Daniel Kiper
2015-01-30 17:54 ` Daniel Kiper
2015-01-30 17:54 ` [PATCH 13/18] efi: create efi_tables() Daniel Kiper
2015-01-30 17:54 ` [PATCH 14/18] efi: create efi_variables() Daniel Kiper
2015-01-30 17:54 ` [PATCH 15/18] efi: create efi_set_gop_mode() Daniel Kiper
2015-01-30 17:54 ` [PATCH 16/18] efi: create efi_exit_boot() Daniel Kiper
2015-03-02 16:45 ` Jan Beulich
2015-03-02 16:45 ` Jan Beulich
2015-03-27 12:00 ` Daniel Kiper
2015-03-27 12:10 ` Jan Beulich
2015-03-27 12:43 ` Daniel Kiper
2015-03-27 13:17 ` Ian Campbell
2015-03-27 13:17 ` Ian Campbell
2015-03-27 12:43 ` Daniel Kiper
2015-03-27 12:10 ` Jan Beulich
2015-03-27 12:00 ` Daniel Kiper
2015-01-30 17:54 ` [PATCH 17/18] x86/efi: create new early memory allocator Daniel Kiper
2015-03-02 17:23 ` Jan Beulich
2015-03-02 20:25 ` Roy Franz
2015-03-03 8:04 ` Jan Beulich
2015-03-03 9:39 ` Daniel Kiper
2015-03-03 9:39 ` Daniel Kiper
2015-03-03 8:04 ` Jan Beulich
2015-03-27 12:57 ` Daniel Kiper
2015-03-27 12:57 ` Daniel Kiper
2015-03-27 13:35 ` Jan Beulich
2015-03-27 14:28 ` Daniel Kiper
2015-03-27 14:28 ` Daniel Kiper
2015-03-27 13:35 ` Jan Beulich
2015-03-02 17:23 ` Jan Beulich
2015-01-30 17:54 ` [PATCH 18/18] x86: add multiboot2 protocol support for EFI platforms Daniel Kiper
2015-01-30 19:06 ` Andrew Cooper
2015-01-30 19:06 ` Andrew Cooper
2015-01-30 23:43 ` Daniel Kiper
2015-01-30 23:43 ` Daniel Kiper
2015-01-31 0:47 ` Andrew Cooper [this message]
2015-01-31 0:47 ` Andrew Cooper
2015-02-10 21:27 ` Daniel Kiper
2015-02-10 22:41 ` Andrew Cooper
2015-02-10 22:41 ` Andrew Cooper
2015-02-11 8:20 ` Jan Beulich
2015-02-11 8:20 ` Jan Beulich
2015-02-14 17:23 ` Andrei Borzenkov
2015-02-14 17:23 ` Andrei Borzenkov
2015-02-15 21:00 ` Daniel Kiper
2015-02-15 21:00 ` Daniel Kiper
2015-02-10 21:27 ` Daniel Kiper
2015-03-17 10:32 ` Jan Beulich
2015-03-17 12:47 ` Daniel Kiper
2015-03-17 12:47 ` Daniel Kiper
2015-03-27 13:06 ` Daniel Kiper
2015-03-27 13:36 ` Jan Beulich
2015-03-27 14:26 ` Daniel Kiper
2015-03-27 14:26 ` Daniel Kiper
2015-03-27 14:34 ` Jan Beulich
2015-03-27 14:57 ` Daniel Kiper
2015-03-27 14:57 ` Daniel Kiper
2015-03-27 15:06 ` Jan Beulich
2015-03-27 15:06 ` Jan Beulich
2015-03-27 15:10 ` Daniel Kiper
2015-03-27 15:10 ` Daniel Kiper
2015-03-27 13:36 ` Jan Beulich
2015-03-27 13:06 ` Daniel Kiper
2015-03-17 10:32 ` Jan Beulich
2015-01-30 18:04 ` [PATCH 00/18] x86: multiboot2 protocol support Daniel Kiper
2015-01-30 18:04 ` Daniel Kiper
2015-01-31 7:22 ` João Jerónimo
2015-02-02 9:28 ` Jan Beulich
2015-02-02 9:28 ` Jan Beulich
2015-02-03 17:14 ` Daniel Kiper
2015-02-04 9:04 ` Andrew Cooper
2015-02-04 9:51 ` Jan Beulich
2015-02-04 9:51 ` Jan Beulich
2015-02-05 10:59 ` Andrew Cooper
2015-02-05 10:59 ` Andrew Cooper
2015-02-05 11:50 ` Vladimir 'phcoder' Serbinenko
2015-02-05 11:50 ` Vladimir 'phcoder' Serbinenko
2015-02-05 12:00 ` Jan Beulich
2015-02-05 12:00 ` Jan Beulich
2015-02-04 9:04 ` Andrew Cooper
2015-02-03 17:14 ` Daniel Kiper
2015-02-09 17:59 ` Daniel Kiper
2015-02-09 17:59 ` Daniel Kiper
2015-02-10 9:05 ` Jan Beulich
2015-02-10 9:05 ` Jan Beulich
2015-03-03 12:10 ` Ian Campbell
2015-03-03 12:36 ` Daniel Kiper
2015-03-03 12:39 ` Ian Campbell
2015-03-03 12:51 ` Daniel Kiper
2015-03-03 12:51 ` Daniel Kiper
2015-03-03 12:39 ` Ian Campbell
2015-03-03 12:36 ` Daniel Kiper
2015-03-03 12:10 ` Ian Campbell
2015-03-27 10:59 ` Daniel Kiper
2015-03-27 10:59 ` Daniel Kiper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54CC2630.3050806@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=daniel.kiper@oracle.com \
--cc=david.vrabel@citrix.com \
--cc=fu.wei@linaro.org \
--cc=gang.wei@intel.com \
--cc=grub-devel@gnu.org \
--cc=ian.campbell@citrix.com \
--cc=jbeulich@suse.com \
--cc=jgross@suse.com \
--cc=keir@xen.org \
--cc=ning.sun@intel.com \
--cc=phcoder@gmail.com \
--cc=qiaowei.ren@intel.com \
--cc=richard.l.maliszewski@intel.com \
--cc=roy.franz@linaro.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.