diff options
author | Jan Beulich <jbeulich@novell.com> | 2011-06-28 09:19:35 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@novell.com> | 2011-06-28 09:19:35 +0100 |
commit | bf6501a62e80ec1cf756290d4c3ec4991455f64e (patch) | |
tree | fdd62100f57c6cd816e1f7cef369ced44f991027 /xen/arch/x86/xen.lds.S | |
parent | f402de45cd8b93cc41fff6f0666b1cdd3d765909 (diff) | |
download | xen-bf6501a62e80ec1cf756290d4c3ec4991455f64e.tar.gz xen-bf6501a62e80ec1cf756290d4c3ec4991455f64e.tar.bz2 xen-bf6501a62e80ec1cf756290d4c3ec4991455f64e.zip |
x86-64: EFI boot code
Besides introducing the relevant code paralleling parts of what is
under xen/arch/x86/boot/, this adjusts the build logic so that with a
single compilation two images (gzip-compressed ELF and EFI
application)
can get created. The EFI part of this depends on a new enough compiler
(supposedly gcc 4.4.x and above, but so far only tested to work with
4.5.x) and a properly configured linker (must support the i386pep
emulation). If either functionality is found to not be available, the
EFI part of the build will simply be skipped.
The patch adds all code to allow Xen and the (accordingly enabled)
Dom0 kernel to boot, but doesn't allow Dom0 to make use of EFI
runtime calls (this will be the subject of the next patch).
Parts of the code were lifted from an earlier never published OS
project of ours - whether respective license information needs to be
added to the respective source file is unclear to me (I was told
internally that adding a GPLv2 license header can be done if needed by
the community).
Open issues (not preventing this from being committed imo):
The trampoline allocation and initialization isn't really nice. This
is due to the trampoline needing to be placed at a fixed address, and
hence making the trampoline relocatable would seem desirable here (as
well as for BIOS-based booting, where the trampoline location needed
to be adjusted a number of time already in the past, due to it
colliding with firmware data).
By excluding mem.S, edd.S, and video.S from copied trampoline (i.e.
moving up wakeup.S? and making sure none of the symbols are used from
EFI code), the effective trampoline size could at least be reduced.
Should the mappings of [__XEN_VIRT_START, mbi.mem_upper) and
[_end, __XEN_VIRT_START+BOOTSTRAP_MAP_BASE) be destroyed, despite
non-EFI code also keeping them?
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Diffstat (limited to 'xen/arch/x86/xen.lds.S')
-rw-r--r-- | xen/arch/x86/xen.lds.S | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 16e710c3fd..7679202d50 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -8,15 +8,34 @@ #undef ENTRY #undef ALIGN +#ifdef EFI + +#define FORMAT "pei-x86-64" +#undef __XEN_VIRT_START +#define __XEN_VIRT_START __image_base__ + +ENTRY(efi_start) + +#else /* !EFI */ + +#ifdef __x86_64__ +#define FORMAT "elf64-x86-64" +#else +#define FORMAT "elf32-i386" +#endif + +ENTRY(start) + +#endif /* EFI */ + +OUTPUT_FORMAT(FORMAT, FORMAT, FORMAT) + #ifdef __x86_64__ -OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") OUTPUT_ARCH(i386:x86-64) #else -OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) #endif -ENTRY(start) PHDRS { text PT_LOAD ; @@ -122,12 +141,29 @@ SECTIONS } :text _end = . ; +#ifdef EFI + . = ALIGN(4); + .reloc : { + *(.reloc) + } :text + /* Trick the linker into setting the image size to exactly 16Mb. */ + . = ALIGN(__section_alignment__); + .pad : { + . = ALIGN(0x1000000); + } :text +#else + efi = .; +#endif + /* Sections to be discarded */ /DISCARD/ : { *(.exit.text) *(.exit.data) *(.exitcall.exit) *(.eh_frame) +#ifdef EFI + *(.comment) +#endif } /* Stabs debugging sections. */ |