Current reloc() call method makes confusion and does not scale well
for more arguments. And subsequent patch adding multiboot2 protocol
support have to pass 3 arguments instead of 2. Hence, move reloc()
call to stdcall calling convention. One may argue that we should use
standard cdecl calling convention. However, stdcall is better here
than cdecl because we do not need to remove "manually" arguments from
stack in xen/arch/x86/boot/head.S assembly file.
Suggested-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
/* Save the Multiboot info struct (after relocation) for later use. */
mov $sym_phys(cpu0_stack)+1024,%esp
- push %ebx
+ push %eax /* Boot trampoline address. */
+ push %ebx /* Multiboot information address. */
call reloc
mov %eax,sym_phys(multiboot_ptr)
* Keir Fraser <keir@xen.org>
*/
-/* entered with %eax = BOOT_TRAMPOLINE */
+/*
+ * This entry point is entered from xen/arch/x86/boot/head.S with:
+ * - 0x4(%esp) = MULTIBOOT_INFORMATION_ADDRESS,
+ * - 0x8(%esp) = BOOT_TRAMPOLINE_ADDRESS.
+ */
asm (
" .text \n"
" .globl _start \n"
"_start: \n"
- " push %eax \n"
- " push 0x8(%esp) \n"
- " call reloc \n"
- " ret $0x4 \n"
+ " jmp reloc \n"
);
typedef unsigned int u32;