From: Frediano Ziglio <frediano.ziglio@cloud.com>
To: xen-devel@lists.xenproject.org
Cc: "Frediano Ziglio" <frediano.ziglio@cloud.com>,
"Jan Beulich" <jbeulich@suse.com>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [PATCH v3 2/4] x86/boot: Refactor BIOS/PVH start
Date: Tue, 24 Sep 2024 11:28:09 +0100 [thread overview]
Message-ID: <20240924102811.86884-3-frediano.ziglio@cloud.com> (raw)
In-Reply-To: <20240924102811.86884-1-frediano.ziglio@cloud.com>
The 2 code paths were sharing quite some common code, reuse it instead
of having duplications.
Use %dl register to store boot type before running common code.
Using a 8 bit register reduces code size.
Signed-off-by: Frediano Ziglio <frediano.ziglio@cloud.com>
---
Changes since v1:
- use %dl instead of %ebp to reduce code size;
- fold cli instruction;
- update some comments.
---
xen/arch/x86/boot/head.S | 117 +++++++++++++++------------------------
1 file changed, 45 insertions(+), 72 deletions(-)
diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S
index fa21024042..80bba6ff21 100644
--- a/xen/arch/x86/boot/head.S
+++ b/xen/arch/x86/boot/head.S
@@ -25,6 +25,9 @@
#define MB2_HT(name) (MULTIBOOT2_HEADER_TAG_##name)
#define MB2_TT(name) (MULTIBOOT2_TAG_TYPE_##name)
+#define BOOT_TYPE_BIOS 1
+#define BOOT_TYPE_PVH 2
+
.macro mb2ht_args arg:req, args:vararg
.long \arg
.ifnb \args
@@ -409,17 +412,31 @@ cs32_switch:
ELFNOTE(Xen, XEN_ELFNOTE_PHYS32_ENTRY, .long sym_offs(__pvh_start))
__pvh_start:
- cld
+ mov $BOOT_TYPE_PVH, %dl
+ jmp .Lcommon_bios_pvh
+#endif /* CONFIG_PVH_GUEST */
+
+__start:
+ mov $BOOT_TYPE_BIOS, %dl
+
+.Lcommon_bios_pvh:
cli
+ cld
/*
- * We need one call (i.e. push) to determine the load address. See
- * __start for a discussion on how to do this safely using the PVH
- * info structure.
+ * Multiboot (both 1 and 2) and PVH specify the stack pointer as
+ * undefined. This is unhelpful for relocatable images, where one
+ * call (i.e. push) is required to calculate the image's load address.
+ *
+ * Durig BIOS boot, there is one area of memory we know about with
+ * reasonable confidence that it isn't overlapped by Xen, and that's
+ * the Multiboot info structure in %ebx. Use it as a temporary stack.
+ *
+ * During PVH boot use info structure in %ebx.
*/
/* Preserve the field we're about to clobber. */
- mov (%ebx), %edx
+ mov (%ebx), %ecx
lea 4(%ebx), %esp
/* Calculate the load base address. */
@@ -428,19 +445,12 @@ __pvh_start:
sub $sym_offs(1b), %esi
/* Restore the clobbered field. */
- mov %edx, (%ebx)
+ mov %ecx, (%ebx)
/* Set up stack. */
lea STACK_SIZE - CPUINFO_sizeof + sym_esi(cpu0_stack), %esp
- call .Linitialise_bss
-
- mov %ebx, sym_esi(pvh_start_info_pa)
-
- /* Force xen console. Will revert to user choice in init code. */
- movb $-1, sym_esi(opt_console_xen)
-
- /* Prepare gdt and segments */
+ /* Initialize GDTR and basic data segments. */
add %esi, sym_esi(gdt_boot_base)
lgdt sym_esi(gdt_boot_descr)
@@ -449,62 +459,40 @@ __pvh_start:
mov %ecx, %es
mov %ecx, %ss
- /* Skip bootloader setup and bios setup, go straight to trampoline */
- movb $1, sym_esi(pvh_boot)
- movb $1, sym_esi(skip_realmode)
-
- /* Set trampoline_phys to use mfn 1 to avoid having a mapping at VA 0 */
- movw $0x1000, sym_esi(trampoline_phys)
- mov (%ebx), %eax /* mov $XEN_HVM_START_MAGIC_VALUE, %eax */
- jmp trampoline_setup
-
-#endif /* CONFIG_PVH_GUEST */
+ /* Load null selector to unused segment registers. */
+ xor %ecx, %ecx
+ mov %ecx, %fs
+ mov %ecx, %gs
-.Linitialise_bss:
/* Initialise the BSS. */
- mov %eax, %edx
-
+ mov %eax, %ebp
lea sym_esi(__bss_start), %edi
lea sym_esi(__bss_end), %ecx
sub %edi, %ecx
xor %eax, %eax
shr $2, %ecx
rep stosl
+ mov %ebp, %eax
- mov %edx, %eax
- ret
-
-__start:
- cld
- cli
-
- /*
- * Multiboot (both 1 and 2) specify the stack pointer as undefined
- * when entering in BIOS circumstances. This is unhelpful for
- * relocatable images, where one call (i.e. push) is required to
- * calculate the image's load address.
- *
- * This early in boot, there is one area of memory we know about with
- * reasonable confidence that it isn't overlapped by Xen, and that's
- * the Multiboot info structure in %ebx. Use it as a temporary stack.
- */
-
- /* Preserve the field we're about to clobber. */
- mov (%ebx), %edx
- lea 4(%ebx), %esp
+#ifdef CONFIG_PVH_GUEST
+ cmp $BOOT_TYPE_PVH, %dl
+ jne 1f
- /* Calculate the load base address. */
- call 1f
-1: pop %esi
- sub $sym_offs(1b), %esi
+ mov %ebx, sym_esi(pvh_start_info_pa)
- /* Restore the clobbered field. */
- mov %edx, (%ebx)
+ /* Force xen console. Will revert to user choice in init code. */
+ movb $-1, sym_esi(opt_console_xen)
- /* Set up stack. */
- lea STACK_SIZE - CPUINFO_sizeof + sym_esi(cpu0_stack), %esp
+ /* Skip bootloader setup and bios setup, go straight to trampoline */
+ movb $1, sym_esi(pvh_boot)
+ movb $1, sym_esi(skip_realmode)
- call .Linitialise_bss
+ /* Set trampoline_phys to use mfn 1 to avoid having a mapping at VA 0 */
+ movl $PAGE_SIZE, sym_esi(trampoline_phys)
+ mov (%ebx), %eax /* mov $XEN_HVM_START_MAGIC_VALUE, %eax */
+ jmp trampoline_setup
+1:
+#endif /* CONFIG_PVH_GUEST */
/* Bootloaders may set multiboot{1,2}.mem_lower to a nonzero value. */
xor %edx,%edx
@@ -563,22 +551,7 @@ __start:
trampoline_bios_setup:
/*
* Called on legacy BIOS platforms only.
- *
- * Initialize GDTR and basic data segments.
*/
- add %esi,sym_esi(gdt_boot_base)
- lgdt sym_esi(gdt_boot_descr)
-
- mov $BOOT_DS,%ecx
- mov %ecx,%ds
- mov %ecx,%es
- mov %ecx,%ss
- /* %esp is initialized later. */
-
- /* Load null descriptor to unused segment registers. */
- xor %ecx,%ecx
- mov %ecx,%fs
- mov %ecx,%gs
/* Set up trampoline segment 64k below EBDA */
movzwl 0x40e,%ecx /* EBDA segment */
--
2.34.1
next prev parent reply other threads:[~2024-09-24 10:28 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-24 10:28 [PATCH v3 0/4] x86/boot: Reduce assembly code Frediano Ziglio
2024-09-24 10:28 ` [PATCH v3 1/4] x86/boot: Initialise BSS sooner Frediano Ziglio
2024-09-24 12:47 ` Andrew Cooper
2024-09-24 10:28 ` Frediano Ziglio [this message]
2024-09-24 13:25 ` [PATCH v3 2/4] x86/boot: Refactor BIOS/PVH start Andrew Cooper
2024-09-24 13:30 ` Andrew Cooper
2024-09-24 13:45 ` Andrew Cooper
2024-09-24 10:28 ` [PATCH v3 3/4] x86/boot: Rewrite EFI/MBI2 code partly in C Frediano Ziglio
2024-09-24 14:08 ` Andrew Cooper
2024-09-24 14:17 ` Jan Beulich
2024-09-24 14:28 ` Frediano Ziglio
2024-09-24 14:42 ` Jan Beulich
2024-09-24 10:28 ` [PATCH v3 4/4] x86/boot: Improve MBI2 structure check Frediano Ziglio
2024-09-24 14:15 ` Andrew Cooper
2024-09-24 14:20 ` Frediano Ziglio
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=20240924102811.86884-3-frediano.ziglio@cloud.com \
--to=frediano.ziglio@cloud.com \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=roger.pau@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.