Message ID | 1542765966-20244-6-git-send-email-lizhijian@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2,1/5] unify len and addr type for memory/address APIs | expand |
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 <pbonzini@redhat.com> > CC: Richard Henderson <rth@twiddle.net> > CC: Eduardo Habkost <ehabkost@redhat.com> > CC: "Michael S. Tsirkin" <mst@redhat.com> > CC: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> > Signed-off-by: Li Zhijian <lizhijian@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
On 11/30/2018 10:53 PM, Michael S. Tsirkin wrote: > 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 okay, thanks > >> initrd_max to 4G - 1 simply is enough if >> this bit is set. >> >> CC: Paolo Bonzini <pbonzini@redhat.com> >> CC: Richard Henderson <rth@twiddle.net> >> CC: Eduardo Habkost <ehabkost@redhat.com> >> CC: "Michael S. Tsirkin" <mst@redhat.com> >> CC: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> >> Signed-off-by: Li Zhijian <lizhijian@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? Okay, i will import this header at V3 > > >> >> 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 Okay > >> + 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 ... Got it, thanks again Thanks Zhijian > >> 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 > > . >
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) struct e820_entry { uint64_t address; @@ -916,6 +917,17 @@ static void load_linux(PCMachineState *pcms, } else { initrd_max = 0x37ffffff; } + if (protocol >= 0x20c) { + unsigned int xloadflags = lduw_p(header+0x236); + if (xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G_MASK) { + /* + * Although kernel allow initrd loading to above 4G, here we + * limit initrd_max to 4G -1 due to current QEMU always loads + * initrd 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;
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. Current QEMU always load initrd below below_4g_mem_size which always less than 4G, so here limit initrd_max to 4G - 1 simply is enough if this bit is set. CC: Paolo Bonzini <pbonzini@redhat.com> CC: Richard Henderson <rth@twiddle.net> CC: Eduardo Habkost <ehabkost@redhat.com> CC: "Michael S. Tsirkin" <mst@redhat.com> CC: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com> --- hw/i386/pc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)