On Wed, Nov 21, 2018 at 10:06:06AM +0800, Li Zhijian wrote: > a new field xloadflags was added to recent x86 linux, and BIT 1: > XLF_CAN_BE_LOADED_ABOVE_4G is used to tell bootload that where initrd can be > loaded saftly.
safely > > Current QEMU always load loads > initrd below below_4g_mem_size which is > always > less than 4G, so here limit limiting > initrd_max to 4G - 1 simply is enough if > this bit is set. > > CC: Paolo Bonzini <pbonz...@redhat.com> > CC: Richard Henderson <r...@twiddle.net> > CC: Eduardo Habkost <ehabk...@redhat.com> > CC: "Michael S. Tsirkin" <m...@redhat.com> > CC: Marcel Apfelbaum <marcel.apfelb...@gmail.com> > Signed-off-by: Li Zhijian <lizhij...@cn.fujitsu.com> > --- > hw/i386/pc.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > index 2ffe6fb..6d4b973 100644 > --- a/hw/i386/pc.c > +++ b/hw/i386/pc.c > @@ -92,6 +92,7 @@ > #define FW_CFG_HPET (FW_CFG_ARCH_LOCAL + 4) > > #define E820_NR_ENTRIES 16 > +#define XLF_CAN_BE_LOADED_ABOVE_4G_MASK (1 << 1) why not XLF_CAN_BE_LOADED_ABOVE_4G to be consistent with Linux? In fact let's import include/uapi/asm/bootparam.h into standard-headers, and use the macro from there? > > struct e820_entry { > uint64_t address; > @@ -916,6 +917,17 @@ static void load_linux(PCMachineState *pcms, > } else { > initrd_max = 0x37ffffff; > } > + if (protocol >= 0x20c) { Let's move it above so we have if (protocol >= 20c) else if 0x203 else > + unsigned int xloadflags = lduw_p(header+0x236); > + if (xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G_MASK) { > + /* > + * Although kernel allow allows > initrd loading to above 4G, here we > + * limit initrd_max to 4G -1 Well not really, it just makes it as large as possible while still staying below 4G. > due to since > current QEMU always loads > + * initrd It's not QEMU, is it? It's actually the bios ... > below pcms->below_4g_mem_size > + */ > + initrd_max = UINT32_MAX; > + } > + } > > if (initrd_max >= pcms->below_4g_mem_size - pcmc->acpi_data_size) { > initrd_max = pcms->below_4g_mem_size - pcmc->acpi_data_size - 1; > -- > 2.7.4