[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Coreboot + Linux + kexec + Xen
On Mon, 2016-08-08 at 18:54 +0000, Trammell Hudson wrote: > Keir Fraser replied to Ward's follow up question: > > > > Is there a significant difference between booting 3.1.4 and > > > 3.2.1 with kexec in terms of BIOS requirements? > > > > If you specify no-real-mode in both cases then there > > should be no difference. If Xen does not drop back into > > real mode then it cannot make use of any legacy BIOS > > services. > > After some tracing, I determined that this is not enitrely accurate and > likely the cause of Ward's failure to boot 3.2.1 on real hardware. > Xen assumes that there is an Extended BIOS Data Area (EBDA), which is > not the case for the Linux-as-bootloader configuration. The parameters > have not been parsed at this time in the boot code, so it always trusts > that it can find this structure. > > Patching xen/arch/x86/boot/head.S to set trampoline_phys to point to > the end of MB_mem_lower (as it was done in 3.1.0) and also passing in > "no-real-mode" allows 4.6.3 to boot on the Coreboot system with Linux > payload. This appears to be true for the general case of kexec into Xen from Linux (or from Xen, once I get round to dealing with the separate issues that exist there). However... > > diff --recursive -u > /home/hudson/build/clean/xen-4.6.3/xen/arch/x86/boot/head.S > ./xen/arch/x86/boot/head.S > --- /home/hudson/build/clean/xen-4.6.3/xen/arch/x86/boot/head.S > 2016-06-20 08:08:22.000000000 -0400 > +++ ./xen/arch/x86/boot/head.S 2016-08-03 17:56:37.511121443 -0400 > @@ -86,6 +86,8 @@ > cmp $MULTIBOOT_BOOTLOADER_MAGIC,%eax > jne not_multiboot > > +#if 0 > + > /* Set up trampoline segment 64k below EBDA */ > movzwl 0x40e,%eax /* EBDA segment */ > cmp $0xa000,%eax /* sanity check (high) */ > @@ -108,6 +110,12 @@ > shl $10-4,%edx > cmp %eax,%edx /* compare with BDA value */ > cmovb %edx,%eax /* and use the smaller */ > +#else > + // coreboot does not provide an Extended BIOS Data Area pointer > + // just stash things the Multiboot structure, adjusted to bytes > + mov MB_mem_lower(%ebx),%eax > + shl $10-4,%eax > +#endif > > 2: /* Reserve 64kb for the trampoline */ > sub $0x1000,%eax That much is overkill if the page has just been zeroed. This (along with "no-real-mode") suffices to get Xen booting for me: --- a/xen/arch/x86/boot/head.S +++ b/xen/arch/x86/boot/head.S @@ -541,6 +541,8 @@ trampoline_bios_setup: cmp $0x100,%edx /* is the multiboot value too small? */ jb 2f /* if so, do not use it */ shl $10-4,%edx + or %ecx,%ecx /* Don't use the BDA value if it's zero */ + cmovz %edx, %ecx cmp %ecx,%edx /* compare with BDA value */ cmovb %edx,%ecx /* and use the smaller */ Not sure if we can trust that it's always actually zero, though. Before I contrive other options like checking it for sanity as we do for the multiboot value, or actually checking (from asm) the command line for no-real-mode and avoiding the BDA completely.... what *is* the reason we don't trust the multiboot data? Did bootloaders really lie to us? If I'm about to update kexec to support multiboot2 anyway, because I want the relocation support (and I note Xen's MB2 image doesn't provide a non-UEFI entry point, so I'll need to work on that too)... perhaps it makes sense to trust the information we get from MB2 and never look at the BDA in *that* case? Attachment:
smime.p7s _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |